@qoder-ai/qoder-agent-sdk 1.0.55 → 1.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/daemon/daemon-connection.d.ts +20 -1
- package/dist/daemon/global-daemon.d.ts +2 -0
- package/dist/daemon/ndjson.d.ts +12 -0
- package/dist/daemon/protocol.d.ts +36 -1
- package/dist/daemon/start-daemon.d.ts +31 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +36 -33
- package/dist/protocol/control.d.ts +9 -0
- package/dist/protocol/index.d.ts +1 -1
- package/dist/protocol/messages.d.ts +25 -1
- package/dist/query/query-runner.d.ts +3 -0
- package/dist/runtime-manifest.json +5 -5
- package/dist/types/messages.d.ts +1 -1
- package/dist/types/options.d.ts +2 -0
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,40 +1,43 @@
|
|
|
1
|
-
var $r=Object.defineProperty;var zr=(n,e)=>{for(var t in e)$r(n,t,{get:e[t],enumerable:!0})};import{spawn as Ci}from"child_process";import{createInterface as Pi}from"readline";var Qr=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Gr=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],ne=2e3,rs=5e3;var ft="1.0.55";var Ce=41,ss=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],os=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Hr="QODER_FEATURE_TASKS";function is(n){let e=n[Hr];if(e!=="0"&&e!=="false")return[...ss];let t=new Set(os);return ss.flatMap(s=>s===os[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as ps,mkdtemp as oi,rm as ms,writeFile as ri}from"fs/promises";import{existsSync as St,mkdtempSync as ii,readFileSync as ai,rmSync as ui,writeFileSync as ci}from"fs";import{homedir as li,tmpdir as fs}from"os";import{dirname as bs,join as H}from"path";import{fileURLToPath as di}from"url";var Wr=/^[A-Za-z0-9_-]{1,64}$/,Jr=new Set(["mcp_list","mcp_get","mcp_call"]);function Yt(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(!Wr.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Jr.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Xt(n,e){let t={};for(let s of e)Yt(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 Zt(n,e,t=e.tools??[]){let{tools:s,...o}=e,r=Xt(n,t);return{...o,...r?{toolOverrides:r}:{}}}function as(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 o=s.tools??[],r=o.find(i=>i.permission_policy!==void 0);if(r)throw new Error(`MCP tool "${t}/${r.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=Zt(t,s,o)}return e}var Vr="global",us=Vr==="cn",Yr=us?"QODERCN_":"QODER_",en=`${Yr}VPC_ENDPOINT`,w=us?{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 cs=w.accessTokenEnv,gt=w.serviceAccountEnv;function Xr(n){return{type:"accessToken",accessToken:n}}function Zr(n=cs){return{type:"accessToken",accessToken:{envVar:n}}}function ei(){return{type:"qodercli"}}function ti(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 ni(n=gt){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function si(n){return{type:"jobToken",fetchJobToken:n}}var ls=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function ds(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(ls),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 ls){let o=n[s];if(o!==void 0&&typeof o!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var gs="QODER_AGENT_SDK_ENTRYPOINT",hs="QODER_AGENT_SDK_VERSION",ys="QODER_SDK_AUTH_PAYLOAD_FILE",pi="sdk-ts",mi=di(import.meta.url),Ss=bs(mi),ht=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"}},yt=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 se(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function oe(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=fi();if(n)return n;let e=gi();if(St(e))return e;let t=hi();return t||w.cliCommands[0]}function fi(){for(let n of ks())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=H(n,"dist","_bundled",t);if(St(s))return s}return null}function gi(){for(let n of ks())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[H(n,"node_modules",".bin",t),H(n,"..","..",".bin",t)];for(let o of s)if(St(o))return o}return w.cliCommands[0]}function hi(){let n=process.env[w.cliHomeEnv]??li();for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=H(n,w.configDirName,"local",t);if(St(s))return s}return null}function ks(){let n=[H(Ss,".."),H(Ss,"..","..")];return[...new Set(n)]}function yi(){return{allow:[],ask:[],deny:[]}}function vs(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=vs(n),s=e==="*"?"*":vs(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function ws(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 vi(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 U=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{ui(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupLaunchArtifacts(){this.cleanupGeneratedSettings(),await this.cleanupAuthPayload()}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=bs(this.authPayloadPath);try{await ms(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,o]of Object.entries(e))o!==void 0&&(t[s]=o);delete t[gs],delete t[hs],delete t[ys];for(let s of this.serviceAccountCredentialEnvVars())ki(t,s);if(t[gs]=pi,t[hs]=ft,this.authPayloadPath&&(t[ys]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[en]=s:delete t[en]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[gt];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 r of t.allowedTools)e.push("--allowed-tools",r);if(t.disallowedTools&&t.disallowedTools.length>0)for(let r of t.disallowedTools)e.push("--disallowed-tools",r);let s=t.tools??is(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 r of t.extensions)e.push("--extensions",r);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 r of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",r);t.strictMcpConfig&&e.push("--strict-mcp-config");let o=this.buildSettingsArg();if(o!==void 0&&e.push("--settings",o),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let r of t.additionalDirectories)e.push("--add-dir",r);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 r of t.plugins)r.type==="local"&&e.push("--plugin-dir",r.path);if(t.extraArgs)for(let[r,i]of Object.entries(t.extraArgs))e.push(`--${r}`),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 r=this.readSettingsFile(e);this.applySettingsCompatibility(r),this.applyAdditionalDirectories(r),this.applyMcpPolicyRules(r,t),this.applySecurityScanSetting(r);let i=this.applyFileCheckpointingSetting(r);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 o=this.applyFileCheckpointingSetting(s);return Object.keys(o).length>0?JSON.stringify(o):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?vi(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=ds(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},o=this.toQoderDefaultPermissionMode(t.defaultMode);o!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=o),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:{},o=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];ws(o,t),s.additionalDirectories=o,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,o]of Object.entries(e)){let r=this.options.mcpToolPolicies?.[s]??o.tools??[];t[s]=Zt(s,o,r)}return t}collectMcpPolicyPermissionRules(){let e=yi(),t=new Map;for(let[s,o]of Object.entries(this.options.mcpToolPolicies??{}))o.length>0&&t.set(s,o);for(let[s,o]of Object.entries(this.options.mcpServers??{})){let r=o.tools;Array.isArray(r)&&r.length>0&&t.set(s,[...t.get(s)??[],...r])}for(let[s,o]of t)for(let r of o){let i=Si(s,r.name);switch(r.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 o of["allow","ask","deny"]){let r=Array.isArray(s[o])?[...s[o]]:[];ws(r,t[o]),s[o]=r}}readSettingsFile(e){let t=ai(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=ii(H(fs(),"qoder-agent-sdk-settings-"));let t=H(this.generatedSettingsDir,"settings.json");return ci(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=vt(e,this.options.env),s=await oi(H(fs(),"qoder-sdk-auth-"));try{await ps(s,448);let o=H(s,"payload.json");return await ri(o,JSON.stringify(t),{mode:384}),await ps(o,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${o}`),o}catch(o){throw await ms(s,{recursive:!0,force:!0}).catch(()=>{}),o}}};function vt(n,e){switch(n.type){case"accessToken":return{type:"accessToken",accessToken:bi(n,e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=n.serviceAccountKey!==void 0,s=typeof n.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:wi(n,e)}}}}function wi(n,e){if(!n.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof n.serviceAccountKey=="string")return n.serviceAccountKey;let t=n.serviceAccountKey.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new yt(t);return s}function bi(n,e){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 ht(t);return s}function ki(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 wt(n,e){let t={...n};for(let[s,o]of Object.entries(e))o!==void 0&&(t[s]=o);return t}var _i=new Set(["--mcp-config","--proxy","--settings"]);function bt(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),_i.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as Ri}from"node:stream";var W=class extends Error{constructor(t,s,o,r,i){super(`${r} exceeded the ${s}-byte frame limit`+(t==="input"?". Reduce the input text or remove attachments and try again.":""));this.direction=t;this.limit=s;this.actualBytes=o;this.source=r;this.inputMessageUuid=i;this.name="FrameTooLargeError",this.code=t==="input"?"SDK_INPUT_TOO_LARGE":"SDK_OUTPUT_TOO_LARGE"}code},Pe=class extends Error{code;result;constructor(e){let t=e.subtype==="success"?e.result:e.errors?.filter(s=>s.trim().length>0).join(`
|
|
2
|
-
`);super(t?.trim()?t:"Qoder CLI initialization failed."),this.name="QoderCliInitializationError",this.code=e.error_code,this.result=e}},E=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},
|
|
3
|
-
`)?n.slice(0,-1):n,r=Buffer.byteLength(o,"utf8");if(r>e)throw new W("input",e,r,t,s)}var
|
|
1
|
+
var Jr=Object.defineProperty;var Vr=(n,e)=>{for(var t in e)Jr(n,t,{get:e[t],enumerable:!0})};import{spawn as Ii}from"child_process";import{createInterface as Di}from"readline";var Yr=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Xr=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],ne=2e3,is=5e3;var yt="1.0.56";var Ce=41,os=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],rs=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Zr="QODER_FEATURE_TASKS";function as(n){let e=n[Zr];if(e!=="0"&&e!=="false")return[...os];let t=new Set(rs);return os.flatMap(s=>s===rs[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as ms,mkdtemp as li,rm as fs,writeFile as di}from"fs/promises";import{existsSync as bt,mkdtempSync as pi,readFileSync as mi,rmSync as fi,writeFileSync as gi}from"fs";import{homedir as hi,tmpdir as gs}from"os";import{dirname as _s,join as H}from"path";import{fileURLToPath as yi}from"url";var ei=/^[A-Za-z0-9_-]{1,64}$/,ti=new Set(["mcp_list","mcp_get","mcp_call"]);function en(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(!ei.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(ti.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function tn(n,e){let t={};for(let s of e)en(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 nn(n,e,t=e.tools??[]){let{tools:s,...o}=e,r=tn(n,t);return{...o,...r?{toolOverrides:r}:{}}}function us(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 o=s.tools??[],r=o.find(i=>i.permission_policy!==void 0);if(r)throw new Error(`MCP tool "${t}/${r.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=nn(t,s,o)}return e}var ni="global",cs=ni==="cn",si=cs?"QODERCN_":"QODER_",sn=`${si}VPC_ENDPOINT`,w=cs?{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 ls=w.accessTokenEnv,St=w.serviceAccountEnv;function oi(n){return{type:"accessToken",accessToken:n}}function ri(n=ls){return{type:"accessToken",accessToken:{envVar:n}}}function ii(){return{type:"qodercli"}}function ai(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 ui(n=St){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function ci(n){return{type:"jobToken",fetchJobToken:n}}var ds=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function ps(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(ds),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 ds){let o=n[s];if(o!==void 0&&typeof o!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var hs="QODER_AGENT_SDK_ENTRYPOINT",ys="QODER_AGENT_SDK_VERSION",Ss="QODER_SDK_AUTH_PAYLOAD_FILE",Si="sdk-ts",vi=yi(import.meta.url),vs=_s(vi),vt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},wt=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 se(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function oe(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=wi();if(n)return n;let e=bi();if(bt(e))return e;let t=_i();return t||w.cliCommands[0]}function wi(){for(let n of ks())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=H(n,"dist","_bundled",t);if(bt(s))return s}return null}function bi(){for(let n of ks())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[H(n,"node_modules",".bin",t),H(n,"..","..",".bin",t)];for(let o of s)if(bt(o))return o}return w.cliCommands[0]}function _i(){let n=process.env[w.cliHomeEnv]??hi();for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=H(n,w.configDirName,"local",t);if(bt(s))return s}return null}function ks(){let n=[H(vs,".."),H(vs,"..","..")];return[...new Set(n)]}function ki(){return{allow:[],ask:[],deny:[]}}function ws(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=ws(n),s=e==="*"?"*":ws(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function bs(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 Pi(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 K=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{fi(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupLaunchArtifacts(){this.cleanupGeneratedSettings(),await this.cleanupAuthPayload()}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=_s(this.authPayloadPath);try{await fs(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,o]of Object.entries(e))o!==void 0&&(t[s]=o);delete t[hs],delete t[ys],delete t[Ss];for(let s of this.serviceAccountCredentialEnvVars())Ti(t,s);if(t[hs]=Si,t[ys]=yt,this.authPayloadPath&&(t[Ss]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[sn]=s:delete t[sn]}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 r of t.allowedTools)e.push("--allowed-tools",r);if(t.disallowedTools&&t.disallowedTools.length>0)for(let r of t.disallowedTools)e.push("--disallowed-tools",r);let s=t.tools??as(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 r of t.extensions)e.push("--extensions",r);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 r of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",r);t.strictMcpConfig&&e.push("--strict-mcp-config");let o=this.buildSettingsArg();if(o!==void 0&&e.push("--settings",o),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let r of t.additionalDirectories)e.push("--add-dir",r);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 r of t.plugins)r.type==="local"&&e.push("--plugin-dir",r.path);if(t.extraArgs)for(let[r,i]of Object.entries(t.extraArgs))e.push(`--${r}`),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 r=this.readSettingsFile(e);this.applySettingsCompatibility(r),this.applyAdditionalDirectories(r),this.applyMcpPolicyRules(r,t),this.applySecurityScanSetting(r);let i=this.applyFileCheckpointingSetting(r);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 o=this.applyFileCheckpointingSetting(s);return Object.keys(o).length>0?JSON.stringify(o):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?Pi(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=ps(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},o=this.toQoderDefaultPermissionMode(t.defaultMode);o!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=o),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:{},o=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];bs(o,t),s.additionalDirectories=o,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,o]of Object.entries(e)){let r=this.options.mcpToolPolicies?.[s]??o.tools??[];t[s]=nn(s,o,r)}return t}collectMcpPolicyPermissionRules(){let e=ki(),t=new Map;for(let[s,o]of Object.entries(this.options.mcpToolPolicies??{}))o.length>0&&t.set(s,o);for(let[s,o]of Object.entries(this.options.mcpServers??{})){let r=o.tools;Array.isArray(r)&&r.length>0&&t.set(s,[...t.get(s)??[],...r])}for(let[s,o]of t)for(let r of o){let i=Ri(s,r.name);switch(r.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 o of["allow","ask","deny"]){let r=Array.isArray(s[o])?[...s[o]]:[];bs(r,t[o]),s[o]=r}}readSettingsFile(e){let t=mi(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=pi(H(gs(),"qoder-agent-sdk-settings-"));let t=H(this.generatedSettingsDir,"settings.json");return gi(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=_t(e,this.options.env),s=await li(H(gs(),"qoder-sdk-auth-"));try{await ms(s,448);let o=H(s,"payload.json");return await di(o,JSON.stringify(t),{mode:384}),await ms(o,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${o}`),o}catch(o){throw await fs(s,{recursive:!0,force:!0}).catch(()=>{}),o}}};function _t(n,e){switch(n.type){case"accessToken":return{type:"accessToken",accessToken:Ei(n,e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=n.serviceAccountKey!==void 0,s=typeof n.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:Ci(n,e)}}}}function Ci(n,e){if(!n.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof n.serviceAccountKey=="string")return n.serviceAccountKey;let t=n.serviceAccountKey.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new wt(t);return s}function Ei(n,e){if(typeof n.accessToken=="string")return n.accessToken;let t=n.accessToken.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new vt(t);return s}function Ti(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function kt(n,e){let t={...n};for(let[s,o]of Object.entries(e))o!==void 0&&(t[s]=o);return t}var Ai=new Set(["--mcp-config","--proxy","--settings"]);function Rt(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 Mi}from"node:stream";var W=class extends Error{constructor(t,s,o,r,i){super(`${r} exceeded the ${s}-byte frame limit`+(t==="input"?". Reduce the input text or remove attachments and try again.":""));this.direction=t;this.limit=s;this.actualBytes=o;this.source=r;this.inputMessageUuid=i;this.name="FrameTooLargeError",this.code=t==="input"?"SDK_INPUT_TOO_LARGE":"SDK_OUTPUT_TOO_LARGE"}code},Ee=class extends Error{code;result;constructor(e){let t=e.subtype==="success"?e.result:e.errors?.filter(s=>s.trim().length>0).join(`
|
|
2
|
+
`);super(t?.trim()?t:"Qoder CLI initialization failed."),this.name="QoderCliInitializationError",this.code=e.error_code,this.result=e}},E=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},We=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}},B=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}},$=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}},on="CONTROL_REQUEST_TIMEOUT",Te=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 J=64*1024*1024,re=class extends Mi{constructor(t=J,s="SDK output"){super();this.maxLineBytes=t;this.source=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,o){let r=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<r.length;a+=1)if(r[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){o(new W("output",this.maxLineBytes,this.bytesSinceNewline,this.source));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=r.length-i,this.bytesSinceNewline>this.maxLineBytes){o(new W("output",this.maxLineBytes,this.bytesSinceNewline,this.source));return}o(void 0,r)}};function Ae(n,e=J,t="SDK input",s){let o=n.endsWith(`
|
|
3
|
+
`)?n.slice(0,-1):n,r=Buffer.byteLength(o,"utf8");if(r>e)throw new W("input",e,r,t,s)}var Rs=8192,O=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}},Me=class n{static default=new n;process=null;customHandle=null;options;ready=!1;closed=!1;shutdownStarted=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;processStopped=!1;closeTimer;killTimer;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new K(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(kt(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupLaunchArtifacts();return}let s=e.env,{command:o,commandArgs:r}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${o} ${Rt(r)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:o,args:r,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,this.observeProcess(i)}else this.process=Ii(o,r,{cwd:this.options.cwd,env:s,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.observeProcess(this.process),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!this.closed&&!this.shutdownStarted&&!this.processStopped,this.flushPendingInput()}catch(e){throw this.process||this.customHandle?this.shutdownProcess():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
4
4
|
`)?e:e+`
|
|
5
|
-
`;if(Te(t,J,"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 re(J,"SDK process output");e.pipe(t);let s=Pi({input:t,crlfDelay:1/0});try{for await(let o of s){if(this.closed)break;let r=o.trim();if(r)try{yield JSON.parse(r)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){this.closed||(this.closed=!0,this.shutdownProcess())}shutdownProcess(){if(this.shutdownStarted)return;this.shutdownStarted=!0,this.ready=!1,this.pendingInput=[];let e=this.process??this.customHandle;if(!e)return;if(this.hasProcessStopped()){this.finishProcess();return}if(this.endInput(),this.hasProcessStopped()){this.finishProcess();return}let t=o=>{try{e.kill(o)}catch(r){this.diagnostics?.record(`[ProcessTransport] Failed to send ${o}:`,r)}},s=this.options.closeGraceMs??ne;this.closeTimer=setTimeout(()=>{this.closeTimer=void 0,!this.hasProcessStopped()&&(t("SIGTERM"),!this.hasProcessStopped()&&(this.killTimer=setTimeout(()=>{this.killTimer=void 0,this.hasProcessStopped()||t("SIGKILL")},rs),this.killTimer.unref()))},s),this.closeTimer.unref()}hasProcessStopped(){let e=this.process??this.customHandle;return this.processStopped||e!==null&&e.exitCode!==null||this.process!==null&&this.process.signalCode!==null}finishProcess(){this.processStopped||(this.processStopped=!0,this.ready=!1,clearTimeout(this.closeTimer),clearTimeout(this.killTimer),this.closeTimer=void 0,this.killTimer=void 0,this.cleanupLaunchArtifacts().catch(()=>{}))}observeProcess(e){e.on("error",t=>{this.ready=!1,this.closed||(this.processExitError??=this.createSpawnError(t)),this.diagnostics?.record("[ProcessTransport] Process error:",t),this.hasProcessStopped()?this.finishProcess():this.shutdownProcess()}),e.once("exit",(t,s)=>{if(this.finishProcess(),this.diagnostics?.record(`[ProcessTransport] Process exited: code=${t}, signal=${s}`),!this.closed&&!this.processExitError){t===Ce&&this.fireAuthExpired();let o=this.createProcessExitError(t,s);o&&(this.processExitError=o)}})}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>_s&&(this.stderrTail=this.stderrTail.slice(-_s))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",o=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new O(o,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==Ce){if(e!==0&&e!==null)return new O(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new O(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(this.hasProcessStopped()){let t=this.createProcessExitError(e.exitCode,this.process?.signalCode??null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let o=(i,a)=>{if(e.off("error",r),this.closed){t();return}let u=this.processExitError??this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},r=i=>{if(e.off("exit",o),this.closed){t();return}let a=this.processExitError??this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",o),e.once("error",r)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??oe();if(se(t)){let s=this.options.executable??"node",o=this.options.executableArgs??[];return{command:s,commandArgs:[...o,t,...e]}}return{command:t,commandArgs:e}}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function Ei(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ge=Ei();function Rs(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function kt(n,e){return n.create(e)}import{performance as Cs}from"node:perf_hooks";async function T(n,e,t,s){let o=Cs.now(),r=i=>{try{n?.recordClose?.({component:e,stage:t,outcome:i,elapsedMs:Math.max(0,Math.round(Cs.now()-o)),...i==="failed"?{errorCode:"SDK_CLOSE_STAGE_FAILED"}:{}})}catch{}};r("started");try{let i=await s();return r("completed"),i}catch(i){throw r("failed"),i}}import{existsSync as Xi}from"fs";import{createInterface as Zi}from"readline";import{Worker as ea}from"worker_threads";import{createHash as Ti}from"node:crypto";import{existsSync as Mi}from"node:fs";import{chmod as Ai,lstat as Ii,mkdir as He,readFile as Ps,readdir as Di,readlink as xi,rename as Oi,rm as _t,stat as qi,symlink as Ni,writeFile as Es}from"node:fs/promises";import{tmpdir as ji,userInfo as Fi}from"node:os";import{basename as Ts,dirname as Ae,join as V,relative as Li}from"node:path";var Ui="QODER_WORKER_RUNTIME_ASSET_ROOT",Ms=/(^|[\\/])app\.asar([\\/]|$)/,sn=".qoder-worker-runtime-ready";function As(n){return Ms.test(n)}function on(n){return As(n)?n.replace(Ms,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function Ie(n,e={}){let t=on(n);if(!e.forceMaterialize&&t){let u=Ae(t);if(Mi(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),nn(t,u,!1,Ae(n))}if(!(e.forceMaterialize||As(n))){let u=Ae(n);return nn(n,u,!1)}let o=Ae(n),r=await Ki(o,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=Li(o,n)||Ts(n),a=V(r,i);return nn(a,r,!0,o)}function nn(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[Ui]:e}}}async function Ki(n,e,t){let s=await Bi(n,e),o=t.cacheDir??Qi(),r=V(o,s),i=V(r,sn);if(await Ds(i)===s)return r;let a=V(o,`.setup-${s}-${process.pid}-${Date.now()}`);await He(o,{recursive:!0,mode:448}),await _t(a,{recursive:!0,force:!0}),await _t(r,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${r}`);try{return await He(a,{recursive:!0,mode:448}),await Is(n,a),await Es(V(a,sn),s,{mode:384}),await zi(a,r,s),r}catch(u){throw await _t(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Bi(n,e){let t=Ti("sha256");t.update("qoder-worker-runtime-v1\0");let s=await xs(V(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let o=await qi(e).catch(()=>null);o&&t.update(`${o.size}\0${o.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function Is(n,e){let t=await Di(n,{withFileTypes:!0});await He(e,{recursive:!0,mode:448});for(let s of t){let o=V(n,s.name),r=V(e,s.name);if(s.isDirectory()){await Is(o,r);continue}if(s.isSymbolicLink()){await He(Ae(r),{recursive:!0,mode:448}),await Ni(await xi(o),r);continue}if(!s.isFile())continue;let i=await $i(o);await He(Ae(r),{recursive:!0,mode:448}),await Es(r,await Ps(o),{mode:i}),process.platform!=="win32"&&await Ai(r,i)}}async function $i(n){let e=((await Ii(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=Ts(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function zi(n,e,t){try{await Oi(n,e)}catch(s){if(await Ds(V(e,sn))===t){await _t(n,{recursive:!0,force:!0});return}throw s}}async function Ds(n){let e=await xs(n);return e?e.toString("utf8"):null}async function xs(n){try{return await Ps(n)}catch{return null}}function Qi(){let n=Gi(Fi().username||process.env.USER||process.env.USERNAME||"user");return V(ji(),`qoder-sdk-worker-runtime-${n}`)}function Gi(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Hi="QODER_WORKER_CWD";function Rt(n,e){return{env:{...e.env,[Hi]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as rn}from"node:fs";import{dirname as Wi,join as he}from"node:path";import{fileURLToPath as Ji}from"node:url";var Vi=Ji(import.meta.url),an=Wi(Vi);function ie(n){if(n)return n;let e=[];for(let t of Yi())e.push(he(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),he(t,"dist","_worker","qoder-worker-runtime.mjs"),he(t,"_worker","qoder-worker-runtime.obf.mjs"),he(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(rn(t))return t;return e[0]??he(an,"..","_worker","qoder-worker-runtime.obf.mjs")}function Os(n){let e=ie(n);if(rn(e))return!0;let t=on(e);return t!==null&&rn(t)}function Yi(){let n=[he(an,".."),he(an,"..","..")];return[...new Set(n)]}var qs=8192,ye=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}},De=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new un(wt(this.options,e))}},un=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;closePromise;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new U(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupLaunchArtifacts();return}let t=ie(this.options.pathToQoderWorkerRuntime),s;try{s=await Ie(t,{diagnostics:this.diagnostics})}catch(a){throw new ye(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let o=s.runtimePath;if(!Xi(o))throw new ye(`Qoder worker runtime not found: ${o}`);if(this.closed){await this.cleanupLaunchArtifacts();return}let r=this.options.cwd??process.cwd(),i=Rt(s,{cwd:r,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${o}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${r}`),this.diagnostics?.record(`[WorkerTransport] Args: ${bt(e.args)}`),this.worker=new ea(o,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.on("message",a=>{if(!this.closed||this.options.closeGraceMs!==void 0||typeof a!="object"||a===null||!("type"in a)||a.type!=="qoder.runtime.closing"||!("timeoutMs"in a)||typeof a.timeoutMs!="number"||!Number.isFinite(a.timeoutMs)||a.timeoutMs<0||this.observedExitCode!==null)return;this.clearCloseTimer();let u=this.worker;this.closeTimer=setTimeout(()=>{u?.terminate().catch(()=>{})},Math.min(12e4,Math.max(ne,a.timeoutMs+1e3))),this.closeTimer.unref?.()}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker)}),this.worker.once("exit",a=>{this.ready=!1,this.observedExitCode=a;try{this.diagnostics?.recordClose?.({component:"worker",stage:"worker_exit_observed",outcome:"completed",elapsedMs:0,exitCode:a})}catch{}if(this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupLaunchArtifacts().catch(()=>{});return}a===Ce&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupLaunchArtifacts().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!this.closed,this.ready&&this.flushPendingInput()}catch(e){throw this.worker?this.close():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
5
|
+
`;if(Ae(t,J,"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 re(J,"SDK process output");e.pipe(t);let s=Di({input:t,crlfDelay:1/0});try{for await(let o of s){if(this.closed)break;let r=o.trim();if(r)try{yield JSON.parse(r)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){this.closed||(this.closed=!0,this.shutdownProcess())}shutdownProcess(){if(this.shutdownStarted)return;this.shutdownStarted=!0,this.ready=!1,this.pendingInput=[];let e=this.process??this.customHandle;if(!e)return;if(this.hasProcessStopped()){this.finishProcess();return}if(this.endInput(),this.hasProcessStopped()){this.finishProcess();return}let t=o=>{try{e.kill(o)}catch(r){this.diagnostics?.record(`[ProcessTransport] Failed to send ${o}:`,r)}},s=this.options.closeGraceMs??ne;this.closeTimer=setTimeout(()=>{this.closeTimer=void 0,!this.hasProcessStopped()&&(t("SIGTERM"),!this.hasProcessStopped()&&(this.killTimer=setTimeout(()=>{this.killTimer=void 0,this.hasProcessStopped()||t("SIGKILL")},is),this.killTimer.unref()))},s),this.closeTimer.unref()}hasProcessStopped(){let e=this.process??this.customHandle;return this.processStopped||e!==null&&e.exitCode!==null||this.process!==null&&this.process.signalCode!==null}finishProcess(){this.processStopped||(this.processStopped=!0,this.ready=!1,clearTimeout(this.closeTimer),clearTimeout(this.killTimer),this.closeTimer=void 0,this.killTimer=void 0,this.cleanupLaunchArtifacts().catch(()=>{}))}observeProcess(e){e.on("error",t=>{this.ready=!1,this.closed||(this.processExitError??=this.createSpawnError(t)),this.diagnostics?.record("[ProcessTransport] Process error:",t),this.hasProcessStopped()?this.finishProcess():this.shutdownProcess()}),e.once("exit",(t,s)=>{if(this.finishProcess(),this.diagnostics?.record(`[ProcessTransport] Process exited: code=${t}, signal=${s}`),!this.closed&&!this.processExitError){t===Ce&&this.fireAuthExpired();let o=this.createProcessExitError(t,s);o&&(this.processExitError=o)}})}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>Rs&&(this.stderrTail=this.stderrTail.slice(-Rs))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",o=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new O(o,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==Ce){if(e!==0&&e!==null)return new O(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new O(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(this.hasProcessStopped()){let t=this.createProcessExitError(e.exitCode,this.process?.signalCode??null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let o=(i,a)=>{if(e.off("error",r),this.closed){t();return}let u=this.processExitError??this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},r=i=>{if(e.off("exit",o),this.closed){t();return}let a=this.processExitError??this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",o),e.once("error",r)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??oe();if(se(t)){let s=this.options.executable??"node",o=this.options.executableArgs??[];return{command:s,commandArgs:[...o,t,...e]}}return{command:t,commandArgs:e}}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function xi(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ge=xi();function Ps(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function Pt(n,e){return n.create(e)}import{performance as Cs}from"node:perf_hooks";async function T(n,e,t,s){let o=Cs.now(),r=i=>{try{n?.recordClose?.({component:e,stage:t,outcome:i,elapsedMs:Math.max(0,Math.round(Cs.now()-o)),...i==="failed"?{errorCode:"SDK_CLOSE_STAGE_FAILED"}:{}})}catch{}};r("started");try{let i=await s();return r("completed"),i}catch(i){throw r("failed"),i}}import{existsSync as oa}from"fs";import{createInterface as ra}from"readline";import{Worker as ia}from"worker_threads";import{createHash as Oi}from"node:crypto";import{existsSync as qi}from"node:fs";import{chmod as Ni,lstat as ji,mkdir as Je,readFile as Es,readdir as Fi,readlink as Li,rename as Ui,rm as Ct,stat as Ki,symlink as Bi,writeFile as Ts}from"node:fs/promises";import{tmpdir as $i,userInfo as zi}from"node:os";import{basename as As,dirname as Ie,join as V,relative as Qi}from"node:path";var Gi="QODER_WORKER_RUNTIME_ASSET_ROOT",Ms=/(^|[\\/])app\.asar([\\/]|$)/,an=".qoder-worker-runtime-ready";function Is(n){return Ms.test(n)}function un(n){return Is(n)?n.replace(Ms,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function De(n,e={}){let t=un(n);if(!e.forceMaterialize&&t){let u=Ie(t);if(qi(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),rn(t,u,!1,Ie(n))}if(!(e.forceMaterialize||Is(n))){let u=Ie(n);return rn(n,u,!1)}let o=Ie(n),r=await Hi(o,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=Qi(o,n)||As(n),a=V(r,i);return rn(a,r,!0,o)}function rn(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[Gi]:e}}}async function Hi(n,e,t){let s=await Wi(n,e),o=t.cacheDir??Yi(),r=V(o,s),i=V(r,an);if(await xs(i)===s)return r;let a=V(o,`.setup-${s}-${process.pid}-${Date.now()}`);await Je(o,{recursive:!0,mode:448}),await Ct(a,{recursive:!0,force:!0}),await Ct(r,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${r}`);try{return await Je(a,{recursive:!0,mode:448}),await Ds(n,a),await Ts(V(a,an),s,{mode:384}),await Vi(a,r,s),r}catch(u){throw await Ct(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Wi(n,e){let t=Oi("sha256");t.update("qoder-worker-runtime-v1\0");let s=await Os(V(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let o=await Ki(e).catch(()=>null);o&&t.update(`${o.size}\0${o.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function Ds(n,e){let t=await Fi(n,{withFileTypes:!0});await Je(e,{recursive:!0,mode:448});for(let s of t){let o=V(n,s.name),r=V(e,s.name);if(s.isDirectory()){await Ds(o,r);continue}if(s.isSymbolicLink()){await Je(Ie(r),{recursive:!0,mode:448}),await Bi(await Li(o),r);continue}if(!s.isFile())continue;let i=await Ji(o);await Je(Ie(r),{recursive:!0,mode:448}),await Ts(r,await Es(o),{mode:i}),process.platform!=="win32"&&await Ni(r,i)}}async function Ji(n){let e=((await ji(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=As(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Vi(n,e,t){try{await Ui(n,e)}catch(s){if(await xs(V(e,an))===t){await Ct(n,{recursive:!0,force:!0});return}throw s}}async function xs(n){let e=await Os(n);return e?e.toString("utf8"):null}async function Os(n){try{return await Es(n)}catch{return null}}function Yi(){let n=Xi(zi().username||process.env.USER||process.env.USERNAME||"user");return V($i(),`qoder-sdk-worker-runtime-${n}`)}function Xi(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Zi="QODER_WORKER_CWD";function Et(n,e){return{env:{...e.env,[Zi]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as cn}from"node:fs";import{dirname as ea,join as he}from"node:path";import{fileURLToPath as ta}from"node:url";var na=ta(import.meta.url),ln=ea(na);function ie(n){if(n)return n;let e=[];for(let t of sa())e.push(he(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),he(t,"dist","_worker","qoder-worker-runtime.mjs"),he(t,"_worker","qoder-worker-runtime.obf.mjs"),he(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(cn(t))return t;return e[0]??he(ln,"..","_worker","qoder-worker-runtime.obf.mjs")}function qs(n){let e=ie(n);if(cn(e))return!0;let t=un(e);return t!==null&&cn(t)}function sa(){let n=[he(ln,".."),he(ln,"..","..")];return[...new Set(n)]}var Ns=8192,ye=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}},xe=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new dn(kt(this.options,e))}},dn=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;closePromise;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new K(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupLaunchArtifacts();return}let t=ie(this.options.pathToQoderWorkerRuntime),s;try{s=await De(t,{diagnostics:this.diagnostics})}catch(a){throw new ye(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let o=s.runtimePath;if(!oa(o))throw new ye(`Qoder worker runtime not found: ${o}`);if(this.closed){await this.cleanupLaunchArtifacts();return}let r=this.options.cwd??process.cwd(),i=Et(s,{cwd:r,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${o}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${r}`),this.diagnostics?.record(`[WorkerTransport] Args: ${Rt(e.args)}`),this.worker=new ia(o,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.on("message",a=>{if(!this.closed||this.options.closeGraceMs!==void 0||typeof a!="object"||a===null||!("type"in a)||a.type!=="qoder.runtime.closing"||!("timeoutMs"in a)||typeof a.timeoutMs!="number"||!Number.isFinite(a.timeoutMs)||a.timeoutMs<0||this.observedExitCode!==null)return;this.clearCloseTimer();let u=this.worker;this.closeTimer=setTimeout(()=>{u?.terminate().catch(()=>{})},Math.min(12e4,Math.max(ne,a.timeoutMs+1e3))),this.closeTimer.unref?.()}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker)}),this.worker.once("exit",a=>{this.ready=!1,this.observedExitCode=a;try{this.diagnostics?.recordClose?.({component:"worker",stage:"worker_exit_observed",outcome:"completed",elapsedMs:0,exitCode:a})}catch{}if(this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupLaunchArtifacts().catch(()=>{});return}a===Ce&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupLaunchArtifacts().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!this.closed,this.ready&&this.flushPendingInput()}catch(e){throw this.worker?this.close():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
6
6
|
`)?e:e+`
|
|
7
|
-
`;if(
|
|
7
|
+
`;if(Ae(t,J,"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 re(J,"SDK Worker output");e.pipe(t);let s=ra({input:t,crlfDelay:1/0});try{for await(let o of s){if(this.closed)break;let r=o.trim();if(r)try{yield JSON.parse(r)}catch{}}this.closed||await this.waitForWorkerExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){return this.closePromise||(this.closePromise=T(this.diagnostics,"worker","close",()=>this.performClose()),this.closePromise.catch(()=>{})),this.closePromise}async performClose(){this.closed||(this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupAbortListener()),this.initializePromise&&await T(this.diagnostics,"worker","initialize",()=>this.initializePromise).catch(()=>{});let e=this.worker;if(!e){await T(this.diagnostics,"worker","artifacts",()=>this.cleanupLaunchArtifacts());return}if(this.observedExitCode===null){e.postMessage({type:"qoder.runtime.close"}),this.endInput();let t=this.options.closeGraceMs??ne;this.closeTimer=setTimeout(()=>{T(this.diagnostics,"worker","terminate",()=>e.terminate()).catch(()=>{})},t),this.closeTimer.unref?.(),await T(this.diagnostics,"worker","worker_exit",()=>new Promise(s=>{if(this.observedExitCode!==null){s();return}e.once("exit",()=>s())}))}this.clearCloseTimer(),await T(this.diagnostics,"worker","artifacts",()=>this.cleanupLaunchArtifacts())}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>Ns&&(this.stderrTail=this.stderrTail.slice(-Ns))}createWorkerError(e){return new ye(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===Ce))return new ye(`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 o=i=>{if(e.off("error",r),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,s(a)):t()},r=i=>{if(e.off("exit",o),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,s(a)};e.once("exit",o),e.once("error",r)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};var Tt=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 aa,mkdirSync as ua}from"fs";import{dirname as ca}from"path";import{randomUUID as la}from"node:crypto";var da="QODER_AGENT_SDK_DEBUG";function pa(n){return n.debugFile?!0:n.debug===!0||fa(process.env[da])}function ma(n){if(n.debugFile)return n.debugFile}function fa(n){if(n===void 0)return!1;let e=n.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var ae=class{correlationId=la();onCloseDiagnostic;enabled;debugFile;stderr;constructor(e={}){this.onCloseDiagnostic=e.onCloseDiagnostic,this.enabled=pa(e),this.debugFile=ma(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let s=this.formatLine(e,t),o=this.debugFile;if(o){this.writeToFile(o,s);return}this.writeToStderr(s)}recordClose(e){let t=Object.freeze({...e,correlationId:this.correlationId});this.record(`[SDK close] ${JSON.stringify(t)}`),queueMicrotask(()=>{try{Promise.resolve(this.onCloseDiagnostic?.(t)).catch(()=>{})}catch{}})}get filePath(){return this.debugFile}writeToFile(e,t){try{ua(ca(e),{recursive:!0}),aa(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(),o=this.formatError(t);return`${s} ${e}${o}
|
|
8
8
|
`}formatError(e){if(e===void 0)return"";if(e instanceof Error)return`
|
|
9
|
-
${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};import{randomUUID as Ja}from"node:crypto";var Ns=["copy_text","helpful","not_helpful","create_branch_task","copy_markdown","add_reply_to_task"];var js=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Fs(n){if(!js.test(n.uuid))throw new Error("uuid must be a UUID");if(!n.sessionId.trim())throw new Error("sessionId is required");if(!js.test(n.parentResultUuid))throw new Error("parentResultUuid must be a UUID");if(!Ns.includes(n.action))throw new Error("action is not supported");return{type:"feedback",subtype:"action",uuid:n.uuid,action:n.action,session_id:n.sessionId,parent_result_uuid:n.parentResultUuid}}var ue=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};import{isAbsolute as ca}from"node:path";function cn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function We(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-empty string`);return t}function Ls(n,e){let t=n[e];if(t!==void 0){if(typeof t!="string")throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a string`);return t}}function Us(n,e){let t=n[e];if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-negative finite number`);return t}}function Ks(n,e){let t=n[e];if(!Number.isSafeInteger(t)||t<0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-negative safe integer`);return t}function la(n){if(!cn(n))throw new TypeError("resolveSessionArtifacts result artifacts must contain objects");let e=We(n,"path");if(!ca(e))throw new TypeError('resolveSessionArtifacts result field "path" must be absolute');let t=We(n,"displayPath"),s=We(n,"name"),o=Ls(n,"relativePath"),r=Ls(n,"mime"),i=Us(n,"size"),a=Us(n,"mtime"),u;if(n.group!==void 0){if(!cn(n.group))throw new TypeError('resolveSessionArtifacts result field "group" must be an object');u={key:We(n.group,"key"),name:We(n.group,"name")}}let c={path:e,displayPath:t,name:s,...u?{group:u}:{},...o!==void 0?{relativePath:o}:{},...i!==void 0?{size:i}:{},...r!==void 0?{mime:r}:{},...a!==void 0?{mtime:a}:{}};if(n.kind==="presented")return{...c,kind:"presented"};if(n.kind!=="changed")throw new TypeError('resolveSessionArtifacts result field "kind" must be "presented" or "changed"');if(typeof n.isNew!="boolean")throw new TypeError('resolveSessionArtifacts result field "isNew" must be a boolean');return{...c,kind:"changed",additions:Ks(n,"additions"),deletions:Ks(n,"deletions"),isNew:n.isNew}}function Bs(n){if(!cn(n)||!Array.isArray(n.artifacts))throw new TypeError("resolveSessionArtifacts must return an object with an artifacts array");return{artifacts:n.artifacts.map(la)}}var ln="1.5.0";import{createInterface as Sa}from"node:readline";var Ve="daemon_queries_v1",xe="daemon_validate_plugins_v1",Se="daemon_proxy_v1",h=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function fn(n){if(n.trim().length===0)throw new h("daemon protocol line must not be empty");let e;try{e=JSON.parse(n)}catch{throw new h("daemon protocol line must contain valid JSON")}let t=_(e,"daemon protocol frame");if(Object.hasOwn(t,"frame_type")||Object.hasOwn(t,"protocol_version")&&!Object.hasOwn(t,"type"))throw new h("daemon v1 frame envelopes are not supported on the v2 wire");switch(t.type){case"control_request":pa(t);break;case"control_response":ma(t);break;case"status_event":da(t);break;case"keep_alive":C(t,["type"],"keep_alive frame");break;case"session_input":case"session_output":throw new h(`${String(t.type)} is not supported on the v2 wire`);default:if(P(t,"type"),!ga(t.type))throw new h(`unknown daemon message type: ${String(t.type)}`);fa(t),gn(t)}return t}function Qs(n){let e=JSON.stringify(n);return fn(e),e}function Gs(n,e){let t=e.response.response;switch(n){case"initialize":{A(e,"initialize response");let s=_(t,"initialize response");if(C(s,["daemon_protocol_version","daemon_version","capabilities"],"initialize response"),s.daemon_protocol_version!==2)throw new h(`unsupported daemon_protocol_version: ${String(s.daemon_protocol_version)}`);return P(s,"daemon_version"),ha(s,"capabilities"),s}case"open_session":{let s=pn(e,"open_session response");return dn(t,"open_session"),{session_id:s}}case"list_sessions":{A(e,"list_sessions response");let s=_(t,"list_sessions response");C(s,["sessions"],"list_sessions response");let o=s.sessions;if(!Array.isArray(o))throw new h("sessions must be an array");for(let[r,i]of o.entries())zs(_(i,`sessions[${r}]`),`sessions[${r}]`);return s}case"rename_session":{pn(e,"rename_session response");let s=_(t,"rename_session response");return C(s,["session"],"rename_session response"),zs(_(s.session,"rename_session session"),"rename_session session"),s}case"close_session":return pn(e,`${n} response`),dn(t,n),null;case"delete_session":case"shutdown":case"update_byok_config":case"delete_byok_config":return A(e,`${n} response`),dn(t,n),null;case"authenticate":{A(e,`${n} response`);let s=_(t,"authenticate response");if(C(s,["authenticated"],"authenticate response"),typeof s.authenticated!="boolean")throw new h("authenticated must be a boolean");return s}case"get_models":return A(e,`${n} response`),Je(t,n,"models");case"get_byok_config":return A(e,`${n} response`),Je(t,n,"providers");case"list_byok_configs":return A(e,`${n} response`),Je(t,n,"configs");case"list_plugins":return A(e,`${n} response`),Je(t,n,"plugins");case"validate_plugins":return A(e,`${n} response`),Je(t,n,"reports");case"setproxy":{A(e,`${n} response`);let s=_(t,`${n} response`);if(C(s,["proxy"],`${n} response`),s.proxy!==null&&typeof s.proxy!="string")throw new h(`${n} response proxy must be a string or null`);return s}case"validate_byok_model":{A(e,`${n} response`);let s=_(t,`${n} response`);return C(s,["success"],`${n} response`),mn(s,"success"),s}case"create_byok_config":{A(e,`${n} response`);let s=_(t,`${n} response`);return C(s,["config"],`${n} response`),_(s.config,`${n} response config`),s}case"account_info":{A(e,`${n} response`);let s=_(t,`${n} response`);return C(s,["account"],`${n} response`),_(s.account,`${n} response account`),s}case"check_byok_config":{A(e,`${n} response`);let s=_(t,`${n} response`);return C(s,["success","error","code","requestId","details"],`${n} response`),mn(s,"success"),$s(s,["error","code","requestId"]),s.details!==void 0&&_(s.details,`${n} response details`),s}case"get_usage_info":{A(e,`${n} response`);let s=_(t,`${n} response`);return C(s,["usage","session","usage_error"],`${n} response`),s.usage!==null&&_(s.usage,`${n} response usage`),_(s.session,`${n} response session`),$s(s,["usage_error"]),s}default:throw new h(`unknown daemon command result method: ${String(n)}`)}}function da(n){if(C(n,["type","status","data"],"status_event frame"),n.status!=="daemon.session_updated")throw new h("unsupported status_event status");let e=_(n.data,"status_event data");if(C(e,["local_session_id","state","error"],"status_event data"),P(e,"local_session_id"),e.state!=="failed")throw new h("status_event state must be failed");_(e.error,"status_event error")}function pa(n){C(n,["type","request_id","session_id","request"],"control_request frame"),P(n,"request_id"),gn(n);let e=_(n.request,"control request");if(!(typeof e.type=="string"&&e.type.length>0)&&!(typeof e.subtype=="string"&&e.subtype.length>0))throw new h("control request must have a non-empty string type or subtype")}function ma(n){C(n,["type","session_id","response"],"control_response frame"),gn(n);let e=_(n.response,"control response");P(e,"request_id");let t=P(e,"subtype");if(t==="success"){if(["error","code","retryable","details"].some(s=>Object.hasOwn(e,s)))throw new h("success control response must not include error fields");C(e,["subtype","request_id","response"],"success control response"),e.response!==void 0&&_(e.response,"success response result");return}if(t!=="error")throw new h(`unknown control response subtype: ${t}`);if(Object.hasOwn(e,"response"))throw new h("error control response must not include response");if(C(e,["subtype","request_id","error","code","retryable","details","pending_permission_requests"],"error control response"),P(e,"error"),e.code!==void 0&&P(e,"code"),e.retryable!==void 0&&mn(e,"retryable"),e.details!==void 0&&_(e.details,"control response details"),e.pending_permission_requests!==void 0&&!Array.isArray(e.pending_permission_requests))throw new h("pending_permission_requests must be an array")}function $s(n,e){for(let t of e)n[t]!==void 0&&P(n,t)}function Je(n,e,t){let s=_(n,`${e} response`);if(C(s,[t],`${e} response`),!Array.isArray(s[t]))throw new h(`${e} response ${t} must be an array`);return s}function zs(n,e){C(n,["local_session_id","title","cwd","state","created_at","updated_at"],e),P(n,"local_session_id"),n.cwd!==void 0&&P(n,"cwd"),P(n,"title");let t=P(n,"state");if(!["pending","ready","inactive","failed"].includes(t))throw new h(`${e} has invalid state: ${t}`);P(n,"created_at"),P(n,"updated_at")}function dn(n,e){if(n!==void 0)throw new h(`${e} success must omit response`)}function pn(n,e){let t=n;try{return P(t,"session_id")}catch{throw new h(`${e} requires a valid session_id`)}}function A(n,e){if(Object.hasOwn(n,"session_id"))throw new h(`${e} must not include session_id`)}function gn(n){let e=n;e.session_id!==void 0&&P(e,"session_id")}function fa(n){for(let e of["session_epoch","sequence"])if(Object.hasOwn(n,e))throw new h(`${e} is reserved for daemon-internal Session ordering`)}function ga(n){return typeof n=="string"&&["user","assistant","stream_event","result","system","prompt_suggestion","command_lifecycle","control_cancel_request","control_cancel","transcript_mirror"].includes(n)}function _(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw new h(`${e} must be a JSON object`);return n}function P(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new h(`${e} must be a non-empty string`);return t}function mn(n,e){let t=n[e];if(typeof t!="boolean")throw new h(`${e} must be a boolean`);return t}function ha(n,e){let t=n[e];if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new h(`${e} must be an array of strings`);return t}function C(n,e,t){let s=new Set(e),o=Object.keys(n).find(r=>!s.has(r));if(o!==void 0)throw new h(`${t} contains unknown field: ${o}`)}var Pt=class{constructor(e,t){this.connection=e;this.options=t}messages=new ue;pendingMessages=[];initializePromise;sessionId;flushingPendingMessages=!1;inputEnded=!1;resultReceived=!1;commandLifecycleSupported=!1;pendingCommandUuids=new Set;closed=!1;cleaned=!1;releasePromise;closePromise;initialize(){return this.initializePromise||(this.initializePromise=this.open(),this.initializePromise.catch(()=>{})),this.initializePromise}write(e){if(this.closed)throw new Error("Transport is not ready or has been closed");let t=ya(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=Hs(t,this.sessionId)}catch(o){this.failAndRelease(o);return}this.connection.sendSessionMessage(s).catch(o=>this.failAndRelease(o))}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,t=!1,s=this.options.claim;try{s&&(await s.ready,t=!0);let o=await this.connection.openSession({worker_args:[...this.options.workerArgs],...this.options.cwd!==void 0?{cwd:this.options.cwd}:{},...this.options.configDir!==void 0?{config_dir:this.options.configDir}:{}},this);if(s&&s.sessionId!==o&&(this.connection.releaseSessionClaim(s.sessionId),t=!1),this.sessionId=o,e=o,this.record(`session opened cwd=${this.options.cwd??"(inherit)"} workerArgs=${this.options.workerArgs.length}`),this.closed){await this.releaseSessionOnce(o);return}this.flushingPendingMessages=!0;try{for(;this.pendingMessages.length>0;){let r=this.pendingMessages.map(i=>Hs(i,o));this.pendingMessages.splice(0);for(let i of r)await this.connection.sendSessionMessage(i)}}finally{this.flushingPendingMessages=!1}}catch(o){throw e!==void 0?this.startRelease(e):t&&s&&this.connection.releaseSessionClaim(s.sessionId),this.fail(o),o}}failAndRelease(e){let t=this.sessionId;this.record("session failed, releasing",e),t!==void 0&&this.startRelease(t),this.fail(e)}record(e,t){let s=this.sessionId;this.options.diagnostics?.record(`[DaemonSession]${s!==void 0?` sessionId=${s}`:""} ${e}`,t)}startRelease(e){this.releaseSessionOnce(e).catch(()=>{})}releaseSessionOnce(e){return this.releasePromise||(this.releasePromise=this.releaseSession(e).catch(t=>{throw this.connection.fail(t),t})),this.releasePromise}releaseSession(e){return this.connection.closeSession(e)}trackOutboundCommand(e){if(!this.commandLifecycleSupported||e.type!=="user")return;let t=e.uuid;typeof t=="string"&&t.trim().length>0&&this.pendingCommandUuids.add(t)}observeCapabilities(e){e.type!=="system"||e.subtype!=="init"||this.updateCommandLifecycleCapability(e)}updateCommandLifecycleCapability(e){let t=e.capabilities;this.commandLifecycleSupported=Array.isArray(t)&&t.includes("msg_lifecycle_v1")}observeCommandLifecycle(e){if(e.type!=="command_lifecycle"||e.state!=="completed"&&e.state!=="cancelled"&&e.state!=="discarded")return;let t=e.command_uuid;typeof t=="string"&&this.pendingCommandUuids.delete(t)}maybeCloseAfterResult(){!this.inputEnded||!this.resultReceived||this.commandLifecycleSupported&&this.pendingCommandUuids.size>0||this.close().catch(()=>{})}async performClose(){this.initializePromise&&await this.initializePromise.catch(()=>{});try{this.releasePromise?await this.releasePromise:this.sessionId&&await this.releaseSessionOnce(this.sessionId)}catch(e){throw this.record("close handshake failed",e),this.markClosed(),this.messages.error(e),e}this.record("closed"),this.markClosed(),this.messages.done()}markClosed(){this.closed||(this.closed=!0,this.cleanup())}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function ya(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 Hs(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 yn="multi_session_v2",Ws="session_title_sync_v1",Js="session_delete_v1";var va=3e4,Xs=3e4,Sn="daemon_keep_alive_v1",At="daemon_async_session_teardown_v1",wa=5e3,Et=3e4,ba=125e3,ka=12e4,_a=5e3,Ra=6e4,Ca=15e4,Pa=12e4,Ea=1024,Ta=64,Ma=8*1024*1024,Aa=256,Ia=32*1024*1024,Da=new Set(["daemon.auth.fetch_job_token","daemon.auth.fetch_service_account_token"]),Tt=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}},ve=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}},Ye=class extends Error{constructor(t,s){super(`session ${t} is already open (state=${s})`);this.sessionId=t;this.state=s;this.name="DaemonSessionAlreadyOpenError"}code="SESSION_ALREADY_OPEN"},Oe=class extends Error{code="DAEMON_HEARTBEAT_TIMEOUT";elapsedMs;constructor(e){super(`DAEMON_HEARTBEAT_TIMEOUT Qoder CLI daemon stopped responding (no inbound frame for ${e}ms)`),this.name="DaemonHeartbeatTimeoutError",this.elapsedMs=e}},Mt=class{input;requestHandler;pendingRequests=new Map;timedOutRequestIds=new Set;activeInboundRequestIds=new Set;sessions=new Map;sessionSlots=new Map;closedSessionIds=new Set;sessionCwds=new Map;pendingSessionMessages=new Map;pendingSessionMessageBytes=new Map;pendingSessionMessageFrameCount=0;pendingSessionMessageByteCount=0;maxFrameBytes;readTask;writeChain=Promise.resolve();nextRequestId=1;initializing=!1;initialized=!1;capabilities=new Set;stopping=!1;failure;failureListeners=new Set;describeUnexpectedClose;diagnostics;lastInboundAt=performance.now();heartbeatWatchdog;heartbeatTimeoutMs;constructor(e){if(this.input=e.input,this.requestHandler=e.requestHandler,this.describeUnexpectedClose=e.describeUnexpectedClose,this.diagnostics=e.diagnostics,this.heartbeatTimeoutMs=e.heartbeatTimeoutMs??Xs,this.maxFrameBytes=e.maxFrameBytes??J,!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={}){if(this.initialized)throw new h("daemon connection is already initialized");if(this.initializing)throw new h("daemon initialize is already in progress");this.initializing=!0;let s,o=t.timeoutMs??va,r=this.request("initialize",{daemon_protocol_version:2,sdk_version:e,capabilities:[yn,...t.capabilities??[]],...t.auth?{auth:t.auth}:{},...t.proxy===void 0?{}:{proxy:t.proxy}}),i=new Promise((u,c)=>{s=setTimeout(()=>{let d=new Error(`Qoder CLI daemon did not initialize within ${o}ms`);this.fail(d),c(d)},o)}),a;try{a=await Promise.race([r,i])}finally{this.initializing=!1,s&&clearTimeout(s)}if(!a.capabilities.includes(yn))throw new h(`daemon is missing required capability: ${yn}`);for(let u of a.capabilities)this.capabilities.add(u);this.initialized=!0,this.capabilities.has(Sn)?this.armHeartbeatWatchdog():this.diagnostics?.record("[DaemonConnection] heartbeat not negotiated; watchdog disarmed")}createSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new Pt(this,{...e,diagnostics:this.diagnostics})}supportsCapability(e){return this.capabilities.has(e)}async setProxy(e){if(!this.capabilities.has(Se))throw new h(`daemon is missing required capability: ${Se}`);return(await this.request("setproxy",{proxy:e||null},void 0,void 0,Et,"request")).proxy}claimSessionId(e){let t=this.sessionSlots.get(e);if(!t)return this.sessionSlots.set(e,{state:"opening",waiters:[]}),{sessionId:e,ready:Promise.resolve()};if(t.state==="closing"){let s=new Promise((o,r)=>{t.waiters.push({resolve:o,reject:r})});return{sessionId:e,ready:s}}throw new Ye(e,t.state)}markSessionOpen(e){let t=this.sessionSlots.get(e);t?t.state="open":this.sessionSlots.set(e,{state:"open",waiters:[]})}markSessionClosing(e){let t=this.sessionSlots.get(e);t?t.state="closing":this.sessionSlots.set(e,{state:"closing",waiters:[]})}releaseSessionClaim(e){let t=this.sessionSlots.get(e);!t||t.state!=="opening"||this.advanceSessionSlot(e,t)}completeSessionClose(e){let t=this.sessionSlots.get(e);!t||t.state!=="closing"||this.advanceSessionSlot(e,t)}advanceSessionSlot(e,t){let s=t.waiters.shift();if(!s){this.sessionSlots.delete(e);return}t.state="opening",s.resolve();for(let o of t.waiters.splice(0))o.reject(new Ye(e,"opening"))}validatePlugins(e,t){return this.capabilities.has(xe)?this.request("validate_plugins",{paths:[...e],...t===void 0?{}:{config_dir:t}},void 0,void 0,Ca,"request").then(s=>s.reports):Promise.reject(new h(`daemon is missing required capability: ${xe}`))}setRequestHandler(e){this.requestHandler=e}onFailure(e){return this.failureListeners.add(e),this.failure&&e(this.failure),()=>this.failureListeners.delete(e)}async openSession(e,t){let s=await this.request("open_session",e,t,void 0,ka);return e.cwd!==void 0&&this.sessionCwds.set(s.session_id,e.cwd),s.session_id}async listSessions(e){return(await this.request("list_sessions",e===void 0?{}:{cwd:e},void 0,void 0,ba,"request")).sessions}renameSession(e,t,s){if(!this.capabilities.has(Ws))return Promise.reject(new h(`daemon is missing required capability: ${Ws}`));let o=s??this.sessionCwds.get(e);return this.request("rename_session",o===void 0?{title:t}:{title:t,cwd:o},void 0,e,Et)}sendSessionMessage(e){return this.writeFrame(e)}async closeSession(e){this.markSessionClosing(e);try{await this.request("close_session",{},void 0,e,Et)}finally{this.sessions.delete(e),this.closedSessionIds.add(e),this.completeSessionClose(e)}}async deleteSession(e,t){if(!this.capabilities.has(Js))throw new h(`daemon is missing required capability: ${Js}`);let s=t??this.sessionCwds.get(e);await this.request("delete_session",s===void 0?{local_session_id:e}:{local_session_id:e,cwd:s},void 0,void 0,Et)}query(e,t){return this.capabilities.has(Ve)?this.request(e,t,void 0,void 0,Ra,"request"):Promise.reject(new h(`daemon is missing required capability: ${Ve}`))}authenticate(e){return this.capabilities.has(Ve)?this.request("authenticate",e===void 0?{}:{auth:e},void 0,void 0,Pa,"request"):Promise.reject(new h(`daemon is missing required capability: ${Ve}`))}async shutdown(e=_a){if(this.stopping){await this.readTask.catch(()=>{});return}this.stopping=!0,this.disarmHeartbeatWatchdog();try{this.failure||await this.request("shutdown",{},void 0,void 0,e)}finally{let t=new Error("Daemon is stopping");for(let s of this.sessions.values())s.fail(t);this.sessions.clear();for(let s of this.sessionSlots.values())for(let o of s.waiters.splice(0))o.reject(t);this.sessionSlots.clear(),!this.input.destroyed&&!this.input.writableEnded&&this.input.end()}}async resolveUnexpectedClose(){if(!this.describeUnexpectedClose)return new Error("Daemon connection closed");try{return await this.describeUnexpectedClose()??new Error("Daemon connection closed")}catch{return new Error("Daemon connection closed")}}fail(e,t=!0){let s=e instanceof Error?e:new Error(String(e));if(!this.failure){this.failure=s,this.disarmHeartbeatWatchdog(),this.diagnostics?.record(`[DaemonConnection] connection failed pendingRequests=${this.pendingRequests.size} sessions=${this.sessions.size}`,s);for(let o of this.pendingRequests.values())o.timeout&&clearTimeout(o.timeout),o.reject(s);this.pendingRequests.clear(),this.timedOutRequestIds.clear(),this.clearPendingSessionMessages();for(let o of this.sessions.values())o.fail(s);this.sessions.clear();for(let o of this.sessionSlots.values())for(let r of o.waiters.splice(0))r.reject(s);if(this.sessionSlots.clear(),t)for(let o of this.failureListeners)try{o(s)}catch{}}}armHeartbeatWatchdog(){if(this.heartbeatTimeoutMs<=0)return;this.lastInboundAt=performance.now();let e=Math.min(wa,Math.max(25,Math.floor(this.heartbeatTimeoutMs/2)));this.heartbeatWatchdog=setInterval(()=>{if(this.failure||this.stopping||!this.initialized)return;let t=Math.round(performance.now()-this.lastInboundAt);t<=this.heartbeatTimeoutMs||(this.diagnostics?.record(`[DaemonConnection] heartbeat timeout elapsed=${t}ms pendingRequests=${this.pendingRequests.size} sessions=${this.sessions.size}`),this.fail(new Oe(t)))},e),this.heartbeatWatchdog.unref()}disarmHeartbeatWatchdog(){this.heartbeatWatchdog!==void 0&&(clearInterval(this.heartbeatWatchdog),this.heartbeatWatchdog=void 0)}request(e,t,s,o,r,i="connection"){if(this.failure)return Promise.reject(this.failure);if(e!=="initialize"&&!this.initialized)return Promise.reject(new h("daemon connection is not initialized"));let a=`sdk_daemon_${this.nextRequestId++}`,u={type:"control_request",request_id:a,...o!==void 0?{session_id:o}:{},request:{type:`daemon.${e}`,...t}};return new Promise((c,d)=>{let m={method:e,resolve:p=>c(p),reject:d,...s?{sessionTransport:s}:{},...o!==void 0?{sessionId:o}:{}};r!==void 0&&(m.timeout=setTimeout(()=>{if(this.pendingRequests.get(a)!==m)return;let p=new h(`daemon ${e} request timed out after ${r}ms`);if(this.diagnostics?.record(`[DaemonConnection] request timeout method=${e} requestId=${a}${o!==void 0?` sessionId=${o}`:""} timeoutMs=${r} scope=${i}`),i==="request"){this.pendingRequests.delete(a),this.rememberTimedOutRequestId(a),m.reject(p);return}this.fail(p)},r),m.timeout.unref?.()),this.pendingRequests.set(a,m),this.diagnostics?.record(`[DaemonConnection] request sent method=${e} requestId=${a}${o!==void 0?` sessionId=${o}`:""}${r!==void 0?` timeoutMs=${r}`:""}`),this.writeFrame(u).catch(p=>{let l=this.pendingRequests.get(a);l?.timeout&&clearTimeout(l.timeout),this.pendingRequests.delete(a),this.diagnostics?.record(`[DaemonConnection] request write failed method=${e} requestId=${a}`,p),d(p),l?.sessionTransport&&this.failIfSessionMessagesAreOrphaned()})})}async readOutput(e){let t=new re(this.maxFrameBytes,"SDK daemon output");e.pipe(t);let s=Sa({input:t,crlfDelay:1/0,terminal:!1});try{for await(let o of s){if(this.lastInboundAt=performance.now(),!o.trim())continue;let r=xa(o);r!==void 0&&this.rejectLegacyInitialize(r)||this.acceptFrame(fn(o))}(!this.stopping||this.pendingRequests.size>0)&&this.fail(await this.resolveUnexpectedClose(),!1)}catch(o){this.fail(o)}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,o=s.response.request_id;if(this.pendingRequests.has(o)){this.acceptControlResponse(s);return}if(this.timedOutRequestIds.delete(o))return;this.routeSessionMessage(t);return}if(t.type==="control_request"){let s=e,o=Oa(s);if(o==="valid"){this.acceptRequest(s);return}if(o==="contradictory")throw new h(`contradictory daemon reverse RPC routing markers: ${s.request_id}`)}if(t.type==="status_event"){this.acceptSessionUpdatedStatusEvent(e);return}this.routeSessionMessage(t)}}rememberTimedOutRequestId(e){if(this.timedOutRequestIds.size>=Ea){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 h(`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 h(`daemon output has unknown session_id: ${t}`)}acceptControlResponse(e){let t=e.response.request_id,s=this.pendingRequests.get(t);if(!s)throw new h(`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 h(`${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 K("1","2"));return}s.reject(new Tt({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 o=e,r=o.response.response?.daemon_protocol_version;if(s.method==="initialize"&&typeof r=="number"&&r!==2)throw new K(String(r),String(2));let i=Gs(s.method,o);if(s.sessionTransport){let a=i.session_id;if(typeof a!="string"||a.length===0)throw new h(`${s.method} did not return a valid session_id`);let u=this.takePendingSessionMessages(a);this.closedSessionIds.delete(a);let c=this.failIfSessionMessagesAreOrphaned(`${s.method} response session_id does not match buffered output`);if(c)throw c;if(this.sessions.has(a)){let d=new h(`daemon returned duplicate session_id: ${a}`);this.diagnostics?.record(`[DaemonConnection] rejecting duplicate open session_id=${a}`),s.reject(d);return}this.sessions.set(a,s.sessionTransport),this.markSessionOpen(a);for(let d of u)s.sessionTransport.acceptOutput(d)}s.resolve(i)}catch(o){s.reject(o instanceof Error?o:new Error(String(o))),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 o of this.pendingSessionMessages.keys())this.closedSessionIds.has(o)&&this.deletePendingSessionMessages(o);if(this.pendingSessionMessages.size===0)return;let t=[...this.pendingSessionMessages.keys()].join(", "),s=new h(`${e}: ${t}`);return this.clearPendingSessionMessages(),this.fail(s),s}bufferPendingSessionMessage(e,t){let s=this.pendingSessionMessages.get(e)??[],o=Buffer.byteLength(JSON.stringify(t),"utf8"),r=this.pendingSessionMessageBytes.get(e)??0;if(s.length+1>Ta||r+o>Ma||this.pendingSessionMessageFrameCount+1>Aa||this.pendingSessionMessageByteCount+o>Ia)throw new h("daemon pre-response Session output exceeded its bounded buffer");s.push(t),this.pendingSessionMessages.set(e,s),this.pendingSessionMessageBytes.set(e,r+o),this.pendingSessionMessageFrameCount+=1,this.pendingSessionMessageByteCount+=o}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 K("1","2")),!0)}acceptRequest(e){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 ve?t:void 0,o={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(o)}).catch(t=>this.fail(t)).finally(()=>{this.activeInboundRequestIds.delete(e.request_id)})}writeInboundError(e,t,s){let o={type:"control_response",response:{subtype:"error",request_id:e,code:t,error:s,retryable:!1}};this.writeFrame(o).catch(r=>this.fail(r))}acceptSessionUpdatedStatusEvent(e){let t=e.data.local_session_id,s=this.sessions.get(t);s&&(this.sessions.delete(t),this.closedSessionIds.add(t),s.fail(qa(e.data)))}writeFrame(e){let t;try{t=`${Qs(e)}
|
|
10
|
-
`,Te(t,this.maxFrameBytes,"SDK daemon input",e.type==="user"&&"uuid"in e&&typeof e.uuid=="string"?e.uuid:void 0)}catch(o){let r=o instanceof Error?o:new Error(String(o));return this.fail(r),Promise.reject(r)}let s=this.writeChain.then(()=>new Promise((o,r)=>{this.input.write(t,"utf8",i=>{if(i){r(i);return}o()})}));return this.writeChain=s.catch(()=>{}),s.catch(o=>this.fail(o)),s}};function xa(n){let e;try{e=JSON.parse(n)}catch{return}if(!Vs(e)||!Ys(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(!(!Vs(t)||!Ys(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 Vs(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Ys(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function Oa(n){let e=Da.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 qa(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",o=t.exit_code===null||typeof t.exit_code=="number"?t.exit_code:void 0,r=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 O(s,{exitCode:o,signal:r,stderr:i})}var Na=new Set(["default","acceptEdits","auto","bypassPermissions"]);function Xe(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&Na.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 Ze(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`goalMaxTurns must be a positive safe integer, received ${String(n)}.`)}function Zs(n,e,t,s){return new Promise((o,r)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(u){r(u);return}o({jsonrpc:"2.0"});return}let a=`${n}:${e.id}`;s.set(a,{resolve:o,reject:r}),t.onmessage?t.onmessage(e):(s.delete(a),r(new Error(`No message handler registered for MCP server "${n}"`)))})}function eo(n,e,t){if("id"in e&&e.id!==null){let s=`${n}:${e.id}`,o=t.get(s);if(o)return o.resolve(e),t.delete(s),!0}return!1}function to(n,e,t){let s=0,o=`${n}:`,r=Array.from(t.entries());for(let i of r){let[a,u]=i;a.startsWith(o)&&(u.reject(e),t.delete(a),s++)}return s}import{randomUUID as ja}from"crypto";function oo(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 Fa=500,La=1024*1024,Ua=6e4,It=class{constructor(e){this.options=e;this.holding=e.holdUntilFlush===!0}states=new Map;failures=[];holding;receivedEntryCount=0;enqueue(e){let t=Ka(e.filePath),s=Ba(e.entries);this.receivedEntryCount+=s.length;let o=so(t),r=this.states.get(o);r||(r={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(o,r)),r.entries.push(...s),r.bytes+=za(s),!this.holding&&(this.options.flushMode==="eager"||r.entries.length>=Fa||r.bytes>=La)&&this.drain(r)}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 Qa(this.options.store,e.key,t,this.options.appendTimeoutMs??Ua)}catch(s){this.failures.push(s),this.options.diagnostics?.record(`[SessionStore] append failed for ${so(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:ja(),session_id:e.key.sessionId})}})}};function Ka(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 o=s[0],r=/^([0-9a-f-]{36})\.jsonl$/i.exec(s[1]);if(s.length===2&&r)return{projectKey:o,sessionId:no(r[1])};let i=no(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 $a(c),{projectKey:o,sessionId:i,subpath:c}}function Ba(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 no(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 $a(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 so(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function za(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Qa(n,e,t,s){await Ga(n.append({...e},structuredClone(t)),s)}async function Ga(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,o)=>{t=setTimeout(()=>o(new vn(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var vn=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function xt(n){if(!we(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!wn(e)||e<0||!we(t)||Array.isArray(t))return;let s={};for(let[o,r]of Object.entries(t)){if(!we(r)||Array.isArray(r))continue;let i=r.credits;wn(i)&&i>=0&&(s[o]={credits:i})}return{total_credits:e,model_usage:s}}function Ot(n){if(!we(n)||Array.isArray(n))return null;let e={};qe(e,n,"userId"),qe(e,n,"userType"),Y(e,n,"totalUsagePercentage"),Dt(e,n,"isHighestTier"),Y(e,n,"expiresAt"),qe(e,n,"upgradeUrl"),Dt(e,n,"isQuotaExceeded"),Dt(e,n,"isPlanQuotaProrated");let t=ro(n.userQuota);t&&(e.userQuota=t);let s=Ha(n.addOnQuota);s&&(e.addOnQuota=s);let o=Wa(n.orgResourcePackage);return o&&(e.orgResourcePackage=o),e}function we(n){return typeof n=="object"&&n!==null}function wn(n){return typeof n=="number"&&Number.isFinite(n)}function bn(n){return Object.keys(n).length>0}function Y(n,e,t){let s=e[t];wn(s)&&(n[t]=s)}function qe(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function Dt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function ro(n){if(!we(n)||Array.isArray(n))return;let e={};return Y(e,n,"total"),Y(e,n,"used"),Y(e,n,"remaining"),Y(e,n,"percentage"),qe(e,n,"unit"),bn(e)?e:void 0}function Ha(n){if(!we(n)||Array.isArray(n))return;let e=ro(n)??{};return qe(e,n,"detailUrl"),bn(e)?e:void 0}function Wa(n){if(!we(n)||Array.isArray(n))return;let e={};return Y(e,n,"used"),Y(e,n,"cap"),Y(e,n,"remaining"),Y(e,n,"percentage"),Dt(e,n,"available"),qe(e,n,"unit"),bn(e)?e:void 0}function io(){return Math.random().toString(36).substring(2,15)}function ao(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 uo(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function co(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function lo(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function po(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function mo(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function et(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 fo(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function go(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function ho(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function yo(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function So(n){return typeof n=="object"&&n!==null&&n.type==="result"}var Va="<synthetic>";function Ya(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==Va?n:{...n,isApiErrorMessage:!0}}function vo(n){if(!n)return null;let e=n.trim();return e?e.startsWith("socks5h:")?`socks5:${e.slice(8)}`:e:null}var qt=class n{constructor(e,t,s,o,r,i,a,u,c,d,m,p,l,f,S,g,v,b="batched",y,I,M,Z,R,X,Qe=!1,Wt,Jt){this.hostActionDirect=Qe;if(this.transport=e,this.isSingleTurn=t,this.canUseTool=s,this.hooks=o??{},this.abortController=r,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=p??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=y??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=d,this.fetchJobToken=f,this.fetchServiceAccountToken=I,this.diagnostics=c,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=S,this.resolveModelTimeoutMs=g??500,this.memoryCallbacks=M,this.skillEvolutionCallbacks=Z,this.hostActionFallback=X,this.resolveSessionArtifacts=R,this.daemonAccountQueries=Wt,this.daemonProxyProvider=Jt,this.inputStream=new ue(()=>{this.close().catch(()=>{})}),v&&(this.transcriptMirrorBatcher=new It({store:v,flushMode:b,holdUntilFlush:this.initConfig.requireSessionStoreForkBarrier===!0,diagnostics:c,onMirrorError:ee=>this.inputStream.enqueue(ee)})),this.readLoopPromise=this.readMessages().catch(ee=>{this.inputStream.error(ee)}),this.initializationPromise=this.startInitialization(),this.initializationPromise.catch(()=>{}),this.abortController){let ee=this.abortController.signal,lt=()=>{this.failInitialization(new E),this.close().catch(()=>{})};ee.aborted?lt():ee.addEventListener("abort",lt,{once:!0})}}static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static SELECTED_SKILLS_CAPABILITY="selected_skills_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_RESUME_CAPABILITY="goal_resume_v1";static GOAL_MAX_TURNS_CAPABILITY="goal_max_turns_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";static SESSION_STORE_FORK_BARRIER_CAPABILITY="session_store_fork_barrier_v1";static HOST_ACTION_CAPABILITY="host_action";static BYOK_CONFIG_MANAGEMENT_CAPABILITY="byok_config_management_v1";static REMOTE_PROJECTION_REQUEST_ID_PREFIX="daemon_worker_sdk_";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;skillEvolutionCallbacks;hostActionFallback;resolveSessionArtifacts;daemonAccountQueries;daemonProxyProvider;resolveStreamInitialization;initResponse;latestCommands=[];initializationPromise;rejectInitialization;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;sdkStartupTimingSent=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;sessionStoreForkBarrierComplete=!1;inputEnded=!1;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 o=this.extractMessagePreview(t.content);if(o)return o;let r=this.getRecord(t.message);return r?this.extractMessagePreview(r):""}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,o=this.getRecord(t)?.content,r=Array.isArray(o)?o.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${r}${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(oo(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(o){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",o)}continue}if(lo(t)){this.handleControlResponse(t);continue}if(po(t)){this.handleControlRequest(t).catch(o=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",o)});continue}if(mo(t)){this.handleControlCancelRequest(t);continue}if(fo(t)||go(t)||ho(t)||yo(t))continue;if(So(t)){await this.transcriptMirrorBatcher?.flush();let o=t;if(this.recordInboundSessionMessage(o),this.resultMessage=o,this.pendingErrorResultExit=this.resultMessage.is_error===!0,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(o),this.rejectInitialization&&this.resultMessage.is_error===!0){let r=this.resultMessage.terminal_reason;this.failInitialization(this.abortController?.signal.aborted||this.closed||r==="aborted_streaming"||r==="aborted_tools"||r==="abort"?new E:new Pe(this.resultMessage))}this.isSingleTurn&&this.flushBeforeEndInput();continue}let s=Ya(t);if((s.type==="user"||s.type==="assistant")&&(this.pendingErrorResultExit=!1),this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{let o=s;this.validateProtocolHandshake(o),this.cliCapabilities=new Set(o.capabilities??[]);let r=o.commands;r!==void 0&&this.replaceLatestCommands(r),this.resolveStreamInitialization&&(this.initResponse=o,this.resolveStreamInitialization(this.initResponse),this.resolveStreamInitialization=void 0)}catch(o){throw this.inputStream.error(o),o}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.failInitialization(t),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,o=e.type==="assistant"&&e.error==="authentication_failed";!s&&!o||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(r=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",r)}))}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(T(this.diagnostics,"query","memory_flush",()=>this.flushMemory())),this.initConfig.evolution?.skill!==void 0&&e.push(T(this.diagnostics,"query","skill_flush",()=>this.flushSkillEvolution()));let s=(await Promise.allSettled(e)).find(o=>o.status==="rejected");if(s)throw s.reason}catch(e){this.diagnostics?.record("[QueryRunner] post-turn flush before end input failed:",e)}finally{this.endTransportInput()}}endTransportInput(){this.inputEnded||(this.inputEnded=!0,this.transport.endInput())}async request(e,t){if(t?.signal?.aborted)throw new E;let s=`${t?.requestIdPrefix??""}${io()}`,o=ao(s,e),r=t?.timeoutMs??this.controlRequestTimeoutMs,i=et(o.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let d=null,m=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:s})+`
|
|
11
|
-
`)}
|
|
12
|
-
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(f){p(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,f),c(f)}})}handleControlResponse(e){let t=e.response,s=t.request_id,o=this.pendingRequests.get(s);if(!o){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")o.resolve(t.response);else{let r=new Ee({requestId:s,message:t.error,code:t.code,retryable:t.retryable,details:t.details});o.reject(r),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)et(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=et(e.request)??"unknown",o=Date.now(),r=new AbortController;this.pendingInboundRequests.set(t,{abortController:r}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,r.signal),r.signal);if(!r.signal.aborted){let a=uo(t,i);this.transport.write(JSON.stringify(a)+`
|
|
13
|
-
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=success duration_ms=${Date.now()-o}`)}}catch(i){if(!r.signal.aborted){let{error:a,code:u}=Xa(i),c=co(t,a,u);this.transport.write(JSON.stringify(c)+`
|
|
14
|
-
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-o}`,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 E}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=ln;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 o=wo(t),r=wo(s);if(!o||!r){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(o.major!==r.major)throw new K(t,s);o.minor<r.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 E;return new Promise((s,o)=>{let r=()=>{o(new E)};t.addEventListener("abort",r,{once:!0}),e.then(i=>{t.removeEventListener("abort",r),s(i)},i=>{t.removeEventListener("abort",r),o(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,o=et(s),r=s;switch(o){case"resolve_session_artifacts":{if(!this.resolveSessionArtifacts)throw new Error("resolve_session_artifacts_unavailable: No resolveSessionArtifacts callback configured");let i=r.local_session_id,a=r.cwd;if(typeof i!="string"||i.length===0||typeof a!="string"||a.length===0)throw new TypeError("resolve_session_artifacts requires local_session_id and cwd");let u=await this.awaitAbortable(Promise.resolve().then(()=>this.resolveSessionArtifacts(i,a)),t);return Bs(u)}case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=r.reason??"initial",a=r.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");let d=c.expiresAt;if(d!==void 0&&(!Number.isFinite(d)||d<1e12))throw new Error("job_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token,...d!==void 0?{expires_at:d}:{}}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=r.tool_name,a=r.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=r.tool_use_id,c=r.permission_suggestions??r.suggestions,d=r.blocked_path,m=r.decision_reason,p=r.title,l=r.display_name,f=r.description,S=r.agent_id,g=r.permission_kind,v=r.options,b=r.details,y=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:d,decisionReason:m,title:p,displayName:l,description:f,toolUseID:u,agentID:S,permissionKind:g,permissionOptions:v,details:b}),t);if(y.behavior==="deny"&&!y.message)throw new Error("Permission deny result must include a message.");return y.behavior==="allow"?{...y,updatedInput:y.updatedInput??a,toolUseID:u}:{...y,toolUseID:u}}case"hook_callback":{let i=r.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,r.input,r.tool_use_id,t)}case"memory_should_generate":{let i=r.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(r.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=r.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(r.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=r.server_name,a=r.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(Zs(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:r.mcp_server_name??"",message:r.message??r.prompt??"",mode:r.mode,url:r.url,elicitationId:r.elicitation_id,requestedSchema:r.requested_schema,title:r.title,displayName:r.display_name,description:r.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:r.purpose,sessionId:r.sessionId,turnIndex:r.turnIndex,agentId:r.agentId,agentType:r.agentType,resolvedModel:r.resolvedModel,availableModels:r.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,d=new Promise((g,v)=>{c=setTimeout(()=>{v(new Ge(a))},a)}),m;try{m=await this.awaitAbortable(Promise.race([u,d]),t)}finally{clearTimeout(c)}let p={type:"get_model_policy",...m?.parameters!==void 0?{parameters:m.parameters}:{}},l=m?.model;if(typeof l=="string")p.model=l;else if(l!==void 0){let{model:g,...v}=l;p.model=g,p.custom_model={...v,style:v.style??"openai"}}let f=m?.taskId?.trim();f&&(p.task_id=f);let S=m?.subTask?.trim();return S&&(p.sub_task=S),p}default:throw new Error(`Unhandled control request subtype: ${o??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.startInitialization()),this.initializationPromise}startInitialization(){let e=new Promise((s,o)=>{this.rejectInitialization=o}),t=this.initConfig.resolveInitializationFromStream?this.waitForStreamInitialization():this.performInitialize();return Promise.race([t,e]).then(s=>(this.rejectInitialization=void 0,this.initResponse=s,this.cliCapabilities=new Set(s.capabilities??[]),s),s=>{throw this.rejectInitialization=void 0,s})}failInitialization(e){let t=this.rejectInitialization;if(t){this.rejectInitialization=void 0,t(e);for(let s of this.pendingRequests.values())s.reject(e);this.pendingRequests.clear()}}async performInitialize(){await this.initConfig.beforeInitialize?.();let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,supportsAvailableModelsUpdate:!0,supportsCommandsChanged:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[o,r]of Object.entries(this.hooks)){if(!r||r.length===0)continue;let i=[];for(let a of r){let u=a.hooks.map(c=>{let d=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(d,c),d});u.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:u,timeout:a.timeout})}i.length>0&&(t[o]=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.hostActions!==void 0&&(e.hostActions=this.initConfig.hostActions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.independentPlanModeControls===!0){e.independentPlanModeControls=!0;let o=Xe(this.initConfig.permissionMode);o!==void 0&&(e.permissionMode=o)}this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.initConfig.evolution!==void 0&&(e.evolution=this.initConfig.evolution),this.resolveSessionArtifacts!==void 0&&(e.resolveSessionArtifacts=!0),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let o=s;this.initResponse=o,this.replaceLatestCommands(o.commands),this.cliCapabilities=new Set(o.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 B(n.GOAL_MAX_TURNS_CAPABILITY);if(this.initConfig.hostActions!==void 0&&!this.cliCapabilities?.has(n.HOST_ACTION_CAPABILITY))throw new B(n.HOST_ACTION_CAPABILITY);if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new B(n.PLAN_MODE_CAPABILITY);let o={subtype:"set_plan_mode",active:this.initConfig.planMode};await this.request(o)}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 B(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,o){let r=this.hookCallbacks.get(e);if(!r)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(r(t,s,{signal:o}),o)??{continue:!0}}async initializationResult(){return this.initialize()}replaceLatestCommands(e){this.latestCommands=(e??[]).map(t=>({...t}))}getLatestCommands(){return this.latestCommands.map(e=>({...e}))}waitForStreamInitialization(){return new Promise(e=>{this.resolveStreamInitialization=e})}async streamInput(e){(async()=>{let t,s=!1;try{t=e[Symbol.asyncIterator]();let o=async()=>{let a=await t.next();return s=a.done===!0,{...a,submittedAtMs:Date.now()}},[,r]=await Promise.all([this.initialize(),o()]),i=0;for(;!r.done;r=await o()){let a=r.value,u=r.submittedAtMs;if(this.closed)break;i+=1;let d=Object.prototype.hasOwnProperty.call(a,"custom_context")?a.custom_context:this.initConfig.customContext,m=typeof a.uuid=="string"&&a.uuid.trim().length>0?a.uuid:Ja(),p={...a,uuid:m,extra:{...!this.sdkStartupTimingSent&&this.initConfig.sdkStartedAtMs!==void 0?{started_at_ms:this.initConfig.sdkStartedAtMs}:{},submitted_at_ms:u,...a.extra},...d===void 0?{}:{custom_context:d}};if(this.pendingErrorResultExit=!1,p.selected_skills!==void 0&&p.selected_skills.length>0&&!this.cliCapabilities?.has(n.SELECTED_SKILLS_CAPABILITY))throw new B(n.SELECTED_SKILLS_CAPABILITY);d!==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"));try{await this.transport.write(JSON.stringify(p)+`
|
|
15
|
-
`)
|
|
16
|
-
`);return}catch(s){this.diagnostics?.record("[QueryRunner] active Host action transport failed; using fallback:",s)}if(!this.hostActionFallback)throw new Error("Host action transport is no longer writable");await this.hostActionFallback(t)}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&&Ze(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 Ze(s.goal_max_turns),s.goal_max_turns}async resumeGoal(){await this.requireCliCapability(n.GOAL_RESUME_CAPABILITY);let e={subtype:"resume_goal"};return(await this.request(e))?.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 B(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?Xe(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!0}:{}})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async enableRemoteProjection(e,t={}){if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");if(t.fromSequenceNum!==void 0&&(!Number.isSafeInteger(t.fromSequenceNum)||t.fromSequenceNum<=0))throw new TypeError("fromSequenceNum must be a positive safe integer");await this.request({type:"enable_remote_projection",remote_session_id:e,...t.suppressInitialIdleStateEvents===!0?{suppress_initial_idle_state_events:!0}:{},...t.skipInitialFlush===!0?{skip_initial_flush:!0}:{},...t.fromSequenceNum===void 0?{}:{from_sequence_num:t.fromSequenceNum}},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}})}async disableRemoteProjection(e={}){let t=await this.request({type:"disable_remote_projection"},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}});if(!(typeof t?.remote_session_id!="string"||t.remote_session_id.length===0||typeof t.last_sequence_num!="number"||!Number.isSafeInteger(t.last_sequence_num)||t.last_sequence_num<=0))return{remoteSessionId:t.remote_session_id,lastSequenceNum:t.last_sequence_num}}async setProxy(e){if(this.daemonProxyProvider){if(vo(e)!==vo(this.daemonProxyProvider()))throw new Error("proxy must be set via daemon.setProxy(); a daemon-bound Query cannot change it per session");return}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(o=>({...o}))}:{}},{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){if(this.daemonAccountQueries)return await this.daemonAccountQueries.getModels(e)??[];let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{},...e?.outerProviders?{outerProviders:e.outerProviders}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){if(this.daemonAccountQueries)try{return await this.daemonAccountQueries.getByokConfig()??null}catch{return null}try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){if(this.daemonAccountQueries)try{let t=await this.daemonAccountQueries.validateByokModel(e);return typeof t=="boolean"?t:null}catch{return null}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(e){if(e&&!e.uid?.trim())throw new Error("BYOK_UID_REQUIRED");return this.daemonAccountQueries&&!e?this.daemonAccountQueries.listByokConfigs():(await this.requireCliCapability(e?"byok_config_read_v1":n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"list_byok_configs",...e?{uid:e.uid}:{}})).configs)}async createByokConfig(e){return this.daemonAccountQueries?this.daemonAccountQueries.createByokConfig(e):(await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"create_byok_config",config:e})).config)}async updateByokConfig(e){if(this.daemonAccountQueries){await this.daemonAccountQueries.updateByokConfig(e);return}await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"update_byok_config",config:e})}async deleteByokConfig(e){if(this.daemonAccountQueries){await this.daemonAccountQueries.deleteByokConfig(e);return}await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"delete_byok_config",target:e})}async checkByokConfig(e){return this.daemonAccountQueries?this.daemonAccountQueries.checkByokConfig(e):(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(){if(this.daemonAccountQueries)try{let t=await this.daemonAccountQueries.accountInfo();if(t&&Object.keys(t).length>0)return t}catch{}else 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(){if(this.daemonAccountQueries)try{return await this.daemonAccountQueries.getUsageInfo()}catch{return null}try{let e=await this.request({type:"get_usage_info"}),t=Ot(e?.usage),s=xt(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 r=await this.request(s);if(!t?.dryRun&&r?.canRewind===!1)throw new Error(typeof r.error=="string"&&r.error.length>0?r.error:"Unable to rewind files.");return r}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 o={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(o.dry_run=!0),await this.request(o)}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 B("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=as(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}:{}}),o=s?.requiresUserAction===!0,r=typeof s?.authUrl=="string"?s.authUrl:void 0;if(o&&r===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return o?{authUrl:r,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=T(this.diagnostics,"query","close",()=>this.performClose())),this.closePromise}async performClose(){if(this.closed)return;if(!(this.cliCapabilities?.has(At)===!0)&&(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 T(this.diagnostics,"query","flush",()=>this.endInputFlushPromise??this.flushBeforeEndInput())}catch(o){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",o)}this.closed=!0;for(let[,o]of this.pendingInboundRequests)o.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let t=new Error("SDK closing");for(let[o,r]of this.sdkMcpTransports){try{await T(this.diagnostics,"query","mcp_close",()=>r.close())}catch(i){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${o}":`,i)}to(o,t,this.pendingMcpResponses)}let s;try{await T(this.diagnostics,"query","transport_close",()=>this.transport.close())}catch(o){s={error:o}}try{await T(this.diagnostics,"query","read_loop",()=>this.readLoopPromise)}catch{}if(await T(this.diagnostics,"query","transcript_flush",()=>this.flushTranscriptMirrorForLifecycle()),s)throw s.error}async[Symbol.asyncDispose](){await this.close()}};function Xa(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,o=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(o){let r=s??o[1];return(!s||s===o[1])&&(e=o[2]||e),{error:e,code:r}}return s?{error:e,code:s}:{error:e}}function wo(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Nt=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 bo}from"crypto";var Za="QODER_CLOUD_AGENT_API_BASE",eu="https://api.qoder.com/api/v1/cloud",ce={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},tu=1024,ko=1*1024*1024,_o=4*1024*1024,nu=8*1024,_n=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"}},jt=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Rn=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}},su=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Eo(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(r=>n[r]!==void 0&&!su.has(r));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 jt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Ne(t)&&kn(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Ne(s)&&kn(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&Ne(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 o=!!s&&Ne(s);if(!o&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!o){if(!s||!kn(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 Ne(n){return"id"in n&&n.id!==void 0}function kn(n){return"create"in n&&n.create!==void 0}function To(n){return new Cn(n)}var Cn=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Su();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Po();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=ou(e.options.auth,e.options.env),this.apiBase=ru(),this.inputStream=new ue(()=>{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(hu(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=gu(t);this.beginPendingTurn();let o=await this.postSessionEvents([{type:ce.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(o.find(r=>r.type===ce.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:ce.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async sendHostAction(e){throw new Error("Host actions are not supported by Cloud Agent queries.")}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&&Ne(e))t=e.id;else{let s=await this.resolveAgentId(),o=e.create,r=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...au(o)}});t=Ro(r,"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(Ne(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:iu(e.create)});return Ro(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 yu(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 o=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!o.ok)throw this.handleAuthFailure(o.status),await Co(o);if(!o.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(o.body)}async readSseBody(e){let t=e.getReader(),s=new TextDecoder,o="",r={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){o+=s.decode(),o.length>0&&this.consumeSseLine(o,r);break}o+=s.decode(a,{stream:!0});let u;for(;(u=o.indexOf(`
|
|
17
|
-
`))!==-1;){let c=o.slice(0,u);o=o.slice(u+1);let d=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(d,r),this.closed)break}o.length>ko&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${ko} bytes; resetting buffer.`),o="",r.id=void 0,r.event=void 0,r.data.length=0,r.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:lu(t.data.join(`
|
|
18
|
-
`)
|
|
19
|
-
`):JSON.stringify(e)}function Mo(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function hu(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 Po(){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 yu(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function Su(){let n,e;return{promise:new Promise((s,o)=>{n=s,e=o}),resolve:n,reject:e}}import{access as Cu,chmod as qo,cp as Pu,mkdtemp as Eu,mkdir as No,realpath as jo,rm as Do,writeFile as Tu}from"fs/promises";import{homedir as Mu,tmpdir as Au}from"os";import{dirname as Iu,isAbsolute as Fo,join as be,relative as Du,resolve as Tn,sep as xu}from"path";import{homedir as vu}from"os";import{join as Io}from"path";var wu=w.configDirName,bu=w.cliHomeEnv,ku=w.configDirEnv,Ao=200;function _u(){return process.env[bu]||vu()}function En(){let n=process.env[ku];return n||Io(_u(),wu)}function je(){return Io(En(),"projects")}function Ru(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function F(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Ao)return e;let t=Math.abs(Ru(n)).toString(36);return`${e.slice(0,Ao)}-${t}`}var Ou=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,qu=6e4;async function Lo(n){if(n.resume===void 0&&!n.continue)return;let e=F(await Fu(n.cwd)),t=n.loadTimeoutMs??qu,s=n.resume!==void 0?n.resume:await Lu(n.store,e,t);if(s===void 0||!Ou.test(s))return;let o={projectKey:e,sessionId:s},r=await xo(n.store,o,t);if(!r)return;let i=n.store.listSubkeys?await Mn(n.store.listSubkeys(o),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!Ku(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let d=await xo(n.store,{...o,subpath:c},t);d&&a.push({subpath:c,entries:d})}let u;try{u=await Eu(be(Au(),"qoder-session-store-")),await qo(u,448),u=await jo(u),await ju(Nu(n.env),u);let c=be(u,"projects",e),d=be(c,s);await No(c,{recursive:!0,mode:448}),await Oo(be(c,`${s}.jsonl`),r);for(let{subpath:p,entries:l}of a){let f=Bu(d,`${p}.jsonl`),S=l.filter(v=>v.type==="agent_metadata"),g=l.filter(v=>v.type!=="agent_metadata");if(g.length>0&&await Oo(f,g),S.length>0){let v={...S.at(-1)};delete v.type,await Uo(f.slice(0,-6)+".meta.json",JSON.stringify(v))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await Do(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await Do(u,{recursive:!0,force:!0}),c}}function Nu(n){let e=n?.[w.cliHomeEnv]??process.env[w.cliHomeEnv]??Mu();return Tn(n?.[w.configDirEnv]??process.env[w.configDirEnv]??be(e,w.configDirName))}async function ju(n,e){for(let t of[".auth","oauth_creds.json"]){let s=be(n,t);try{await Cu(s),await Pu(s,be(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(o){if(o.code!=="ENOENT")throw o}}}async function Fu(n){let e=Tn(n??process.cwd());try{return await jo(e)}catch{return e}}async function Lu(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await Mn(n.listSessions(e),t,"listSessions");if(!Array.isArray(s))throw new Error("SessionStore listSessions() must return an array");return s.slice().sort((o,r)=>r.mtime-o.mtime)[0]?.sessionId}async function xo(n,e,t){let s=await Mn(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((o,r)=>Uu(o,r))}}function Uu(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 Ku(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||Fo(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Bu(n,e){let t=Tn(n,e),s=Du(n,t);if(s===""||s===".."||s.startsWith(`..${xu}`)||Fo(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Oo(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
|
|
20
|
-
`);await
|
|
21
|
-
`:"")}async function Uo(n,e){await No(Iu(n),{recursive:!0,mode:448}),await Tu(n,e,{encoding:"utf8",mode:384}),await qo(n,384)}async function Mn(n,e,t){let s;n.catch(()=>{});try{return await Promise.race([n,new Promise((o,r)=>{s=setTimeout(()=>r(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{s!==void 0&&clearTimeout(s)}}var $u=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function zu(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return $u.test(e)}function Fe(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?zu(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 Ko from"node:path";function Le(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function nt(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function Qu(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(Le(s.id,`options.memory.generation.roots[${t}].id`),Le(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){Le(s.indexFile,`options.memory.generation.roots[${t}].indexFile`);let o=s.indexFile.replaceAll("\\","/");if(Ko.posix.isAbsolute(o)||Ko.win32.isAbsolute(s.indexFile)||o.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function Gu(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(Le(s.id,`options.memory.consumption.files[${t}].id`),Le(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 Bo(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 nt(n.generation?.onResult,"options.memory.generation.onResult"),nt(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");Qu(s.roots),s.prompt!==void 0&&Le(s.prompt,"options.memory.generation.prompt"),nt(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(nt(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 o,r=n.consumption;if(r!==void 0){if(!r||typeof r!="object")throw new TypeError("options.memory.consumption must be an object");if(r.enabled!==void 0&&typeof r.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(Gu(r.files),r.maxTokens!==void 0&&(!Number.isInteger(r.maxTokens)||r.maxTokens<=0))throw new TypeError("options.memory.consumption.maxTokens must be a positive integer");if(r.overflow!==void 0&&r.overflow!=="truncate"&&r.overflow!=="fail_query")throw new TypeError('options.memory.consumption.overflow must be "truncate" or "fail_query"');if(r.failureMode!==void 0&&r.failureMode!=="best_effort"&&r.failureMode!=="fail_query")throw new TypeError('options.memory.consumption.failureMode must be "best_effort" or "fail_query"');nt(r.onResult,"options.memory.consumption.onResult"),o={enabled:r.enabled??!0,files:r.files?.map(i=>({...i,required:i.required??!1})),maxTokens:r.maxTokens,overflow:r.overflow,failureMode:r.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:o},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:s?.onResult,onConsumptionResult:r?.onResult}}}var Lt=10;function Hu(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function Ut(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function $o(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 Wu(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&&Hu(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");Ut(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=$o(n.turnComplete.reviewThreshold);if(Ut(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 o=n.turnComplete.shouldReview?"skill_evolution_should_review_0":void 0;o&&e.shouldReviewCallbacks.set(o,n.turnComplete.shouldReview),t={enabled:n.turnComplete.enabled??!0,reviewThreshold:s,shouldReviewCallbackId:o,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 zo(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 o=e?.turnComplete;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(Object.keys(o).some(i=>i!=="reviewThreshold"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.turnComplete.reviewThreshold')}let r=$o(o?.reviewThreshold);return e?.enabled===!1?(Ut(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(Ut(e?.onResult,"options.evolution.skill.generation.onResult"),{config:{requester:"sdk",mode:"native",...r===void 0?{}:{generation:{turnComplete:{reviewThreshold:r}}}},callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}})}let t=Wu(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as tc}from"node:child_process";import{join as nc}from"node:path";var Ju=3e4;function An(n,e=Ju){return ec(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return Vu(n,t,e);case"daemon.auth.fetch_service_account_token":return Yu(n,t,e);default:throw q("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}async function Vu(n,e,t){if(n.type!=="jobToken")throw q("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=Qo(e,["reason","session_id"]),o=Go(s.reason),r=Xu(s.session_id,"session_id"),i=new AbortController;try{let a=await Ho(()=>n.fetchJobToken({requestId:e.request_id,reason:o,sessionId:r},{signal:i.signal}),t,i);if(!a||typeof a.token!="string"||!a.token)throw q("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback did not provide a token");let u=a.expiresAt;if(u!==void 0&&(!Number.isFinite(u)||u<1e12))throw q("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback returned invalid expiresAt");return{token:a.token,...u!==void 0?{expires_at:u}:{}}}catch(a){throw a instanceof ve?a:q("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback failed",!0)}}async function Yu(n,e,t){if(n.type!=="serviceAccount"||typeof n.fetchServiceAccountToken!="function")throw q("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host Service Account token callback is not configured");let s=Qo(e,["reason","required_scopes"]);Go(s.reason),Zu(s.required_scopes,"required_scopes");let o=new AbortController;try{let r=await Ho(()=>n.fetchServiceAccountToken(),t,o);if(!r||typeof r.token!="string"||!r.token)throw q("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback did not provide a token");let i=r.expiresAt;if(i!==void 0&&(!Number.isFinite(i)||i<1e12))throw q("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback returned invalid expiresAt");return{token:r.token,...i!==void 0?{expires_at:i}:{}}}catch(r){throw r instanceof ve?r:q("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback failed",!0)}}function Qo(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw q("DAEMON_AUTH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function Go(n){if(n!=="initial"&&n!=="unauthorized")throw q("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function Xu(n,e){if(n!==void 0){if(typeof n!="string"||!n)throw q("DAEMON_AUTH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}}function Zu(n,e){if(!Array.isArray(n)||n.some(t=>typeof t!="string"))throw q("DAEMON_AUTH_INVALID_REQUEST",`${e} must be an array of strings`);return n}async function Ho(n,e,t){let s;try{return await Promise.race([Promise.resolve().then(n),new Promise((o,r)=>{s=setTimeout(()=>{t.abort(),r(new Error("daemon auth callback timed out"))},e),s.unref?.()})])}finally{s&&clearTimeout(s)}}function ec(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function q(n,e,t=!1){return new ve({code:n,message:e,retryable:t})}var sc="QODER_AGENT_SDK_DAEMON",oc="ELECTRON_RUN_AS_NODE",Wo="--sdk",st=2e3,Jo=8192,Vo=255,rt=new WeakMap;function On(n){return rt.get(n)}async function qn(n){cc(n.initializeTimeoutMs);let e=new U({auth:n.auth,env:n.env,proxy:n.proxy,vpcEndpoint:n.vpcEndpoint}),t=await e.prepare(),s=n.auth?vt(n.auth,n.env):void 0,o=await lc({pathToQoderCLIExecutable:n.pathToQoderCLIExecutable,executable:n.executable,executableArgs:n.executableArgs}),r={...t.env,...o.env,[sc]:"1"},i,a=new ae({debug:n.debug,debugFile:n.debugFile??Nn(n),stderr:n.stderr});try{i=await xn.spawn({command:o.command,args:o.args,env:r,stderrHandler:n.stderr}),a.record(`[Daemon] spawned pid=${i.process.pid}`);let u=new Mt({input:i.process.stdin,output:i.process.stdout,requestHandler:n.auth?An(n.auth):void 0,diagnostics:a,describeUnexpectedClose:()=>i.describeUnexpectedClose()});i.setConnection(u);let c=Date.now();await u.initialize(ft,{capabilities:["session_delete_v1",Sn,At],...s===void 0?{}:{auth:s},...n.proxy===void 0?{}:{proxy:n.proxy},...n.initializeTimeoutMs===void 0?{}:{timeoutMs:n.initializeTimeoutMs}}),a.record(`[Daemon] initialized in ${Date.now()-c}ms`);let d=u.supportsCapability(Se);n.proxy!==void 0&&!d&&a.record(`[Daemon] proxy requested but ${Se} is not supported by this CLI; the proxy was not applied to the daemon`);let m=n.proxy!==void 0&&d&&n.proxy.trim()||null;await e.cleanupAuthPayload();let p=new In(u,i,n.env,a);return rt.set(p,{hostActionLaunch:{proxy:n.proxy,cliPath:n.pathToQoderCLIExecutable,env:n.env},auth:n.auth,proxy:m,transportProvider:new Dn(u,t.env)}),p}catch(u){throw await e.cleanupAuthPayload(),await i?.stop().catch(()=>{}),u}}var In=class{constructor(e,t,s,o){this.connection=e;this.processController=t;this.env=s;this.diagnostics=o;this.connection.onFailure(r=>this.acceptDaemonFailure(r)),this.processController.onFailure(r=>this.acceptDaemonFailure(r))}currentState="ready";stopPromise;get state(){return this.currentState}onFailure(e){return this.connection.onFailure(e)}async listSessions(e){return this.requireReady(),(await this.connection.listSessions(e)).map(Yo)}async renameSession(e,t,s){if(this.requireReady(),typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");let o=rc(t),r=await this.connection.renameSession(e,o,s);return Yo(r.session)}async deleteSession(e,t){if(this.requireReady(),typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");await this.connection.deleteSession(e,t)}async setProxy(e){this.requireReady();let t=await this.connection.setProxy(e),s=rt.get(this);return s&&(s.proxy=t,s.hostActionLaunch.proxy=t??void 0),t}getProxy(){return rt.get(this)?.proxy??null}async auth(e){this.requireReady();let t;if(e!==void 0){t=vt(e,this.env),this.connection.setRequestHandler(An(e));let o=rt.get(this);o&&(o.auth=e)}return(await this.connection.authenticate(t)).authenticated}async getModels(e={}){return this.requireReady(),(await this.connection.query("get_models",{...e.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e.uid?{uid:e.uid}:{},...e.outerProviders?{outerProviders:e.outerProviders}:{}})).models}async getByokConfig(){return this.requireReady(),(await this.connection.query("get_byok_config",{})).providers}async validateByokModel(e){return this.requireReady(),(await this.connection.query("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}:{},...e.model_type!==void 0?{model_type:e.model_type}:{},...e.provider_type!==void 0?{provider_type:e.provider_type}:{}})).success}async listByokConfigs(){return this.requireReady(),(await this.connection.query("list_byok_configs",{})).configs}async createByokConfig(e){return this.requireReady(),(await this.connection.query("create_byok_config",{config:e})).config}async updateByokConfig(e){this.requireReady(),await this.connection.query("update_byok_config",{config:e})}async deleteByokConfig(e){this.requireReady(),await this.connection.query("delete_byok_config",{target:e})}async checkByokConfig(e){return this.requireReady(),this.connection.query("check_byok_config",{config:e})}async listPlugins(){return this.requireReady(),(await this.connection.query("list_plugins",{})).plugins}supportsCapability(e){return this.connection.supportsCapability(e)}async validatePlugins(e,t={}){if(this.requireReady(),!Array.isArray(e)||e.length===0||e.some(s=>typeof s!="string"||s.length===0))throw new TypeError("paths must be a non-empty array of non-empty strings");return this.connection.validatePlugins(e,t.configDir)}async getUsageInfo(){this.requireReady();let e=await this.connection.query("get_usage_info",{}),t=Ot(e.usage),s=xt(e.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}async accountInfo(){return this.requireReady(),(await this.connection.query("account_info",{})).account}stop(){return this.stopPromise||(this.processController.beginStopping(),this.currentState!=="failed"&&this.setDaemonState("stopping"),this.stopPromise=this.stopInternal()),this.stopPromise}async stopInternal(){try{await this.connection.shutdown().catch(()=>{}),await this.processController.stop(),this.currentState!=="failed"&&this.setDaemonState("stopped")}catch(e){throw this.setDaemonState("failed",e instanceof Error?e:new Error(String(e))),e}}acceptDaemonFailure(e){this.currentState==="ready"&&this.setDaemonState("failed",e),e instanceof Oe&&this.processController.stop().then(({settledAfterSigkill:t})=>{t||this.diagnostics?.record("[Daemon] heartbeat reclaim: process still present after SIGKILL grace; left to OS")}).catch(t=>{this.diagnostics?.record("[Daemon] heartbeat reclaim: forced stop failed",t)})}setDaemonState(e,t){this.currentState!==e&&(this.currentState=e)}requireReady(){if(this.currentState!=="ready")throw new Error("Daemon is not ready")}};function rc(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>Vo)throw new TypeError(`title must be at most ${Vo} characters`);return e}function Yo(n){return{localSessionId:n.local_session_id,title:n.title,...n.cwd?{cwd:n.cwd}:{},state:n.state,createdAt:n.created_at,updatedAt:n.updated_at}}var Dn=class{constructor(e,t){this.connection=e;this.daemonEnv=t}create(e){let t=new U({...e,auth:void 0,env:this.daemonEnv}),s=t.buildArgs(),o=uc(s),r=o===void 0?void 0:this.connection.claimSessionId(o);try{return this.connection.createSessionTransport({workerArgs:s,claim:r,cwd:e.cwd??process.cwd(),...e.materializedSessionConfigDir!==void 0?{configDir:e.materializedSessionConfigDir}:{},cleanup:()=>t.cleanupGeneratedSettings()})}catch(i){throw r&&this.connection.releaseSessionClaim(r.sessionId),i}}};function ic(n){let e=n.findIndex(t=>t==="--session-id"||t==="--resume");if(e>=0&&e+1<n.length)return n[e+1];for(let t of n)if(t.startsWith("--session-id="))return t.slice(13)}function ac(n){let e=n.findIndex(t=>t==="--session-id");if(e>=0&&e+1<n.length)return n[e+1];for(let t of n)if(t.startsWith("--session-id="))return t.slice(13)}function uc(n){return n.includes("--fork-session")?ac(n):ic(n)}function cc(n){if(n!==void 0&&(!Number.isSafeInteger(n)||n<=0))throw new TypeError("initializeTimeoutMs must be a positive integer")}async function lc(n){let e=Fe(n,ge),t,s={};if(e.transport==="worker"){let o=await Ie(ie(e.pathToQoderWorkerRuntime));t=o.runtimePath,s=o.env}else t=n.pathToQoderCLIExecutable??oe();return se(t)?{command:n.executable??process.execPath,args:[...n.executableArgs??[],t,Wo],env:{...s,...typeof process.versions.electron=="string"?{[oc]:"1"}:{}}}:{command:t,args:[Wo],env:s}}var xn=class n{constructor(e,t){this.process=e;this.stderrHandler=t;this.exited=new Promise(s=>{e.once("exit",()=>s()),e.once("error",()=>s())}),this.closed=new Promise(s=>{e.once("close",()=>s()),e.once("error",()=>s())}),e.stderr?.on("data",s=>{let o=s.toString("utf8");if(this.stderrTail+=o,this.stderrTail.length>Jo&&(this.stderrTail=this.stderrTail.slice(-Jo)),!!this.stderrHandler)try{this.stderrHandler(o)}catch{}}),e.once("error",s=>{this.reportFailure(new O(`Failed to spawn Qoder CLI daemon: ${s.message}`,{stderr:this.getStderr(),cause:s}))}),e.once("exit",(s,o)=>{this.exitInfo={code:s,signal:o},!this.stopping&&ot(this.closed,st).then(()=>{if(this.stopping)return;let r=this.getStderr(),i=s!==null?`Qoder CLI daemon exited with code ${s}`:`Qoder CLI daemon terminated by signal ${o}`;this.reportFailure(new O(r?`${i}
|
|
9
|
+
${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};import{randomUUID as nu}from"node:crypto";var js=["copy_text","helpful","not_helpful","create_branch_task","copy_markdown","add_reply_to_task"];var Fs=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Ls(n){if(!Fs.test(n.uuid))throw new Error("uuid must be a UUID");if(!n.sessionId.trim())throw new Error("sessionId is required");if(!Fs.test(n.parentResultUuid))throw new Error("parentResultUuid must be a UUID");if(!js.includes(n.action))throw new Error("action is not supported");return{type:"feedback",subtype:"action",uuid:n.uuid,action:n.action,session_id:n.sessionId,parent_result_uuid:n.parentResultUuid}}var ue=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};import{isAbsolute as ga}from"node:path";function pn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Ve(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-empty string`);return t}function Us(n,e){let t=n[e];if(t!==void 0){if(typeof t!="string")throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a string`);return t}}function Ks(n,e){let t=n[e];if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-negative finite number`);return t}}function Bs(n,e){let t=n[e];if(!Number.isSafeInteger(t)||t<0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-negative safe integer`);return t}function ha(n){if(!pn(n))throw new TypeError("resolveSessionArtifacts result artifacts must contain objects");let e=Ve(n,"path");if(!ga(e))throw new TypeError('resolveSessionArtifacts result field "path" must be absolute');let t=Ve(n,"displayPath"),s=Ve(n,"name"),o=Us(n,"relativePath"),r=Us(n,"mime"),i=Ks(n,"size"),a=Ks(n,"mtime"),u;if(n.group!==void 0){if(!pn(n.group))throw new TypeError('resolveSessionArtifacts result field "group" must be an object');u={key:Ve(n.group,"key"),name:Ve(n.group,"name")}}let c={path:e,displayPath:t,name:s,...u?{group:u}:{},...o!==void 0?{relativePath:o}:{},...i!==void 0?{size:i}:{},...r!==void 0?{mime:r}:{},...a!==void 0?{mtime:a}:{}};if(n.kind==="presented")return{...c,kind:"presented"};if(n.kind!=="changed")throw new TypeError('resolveSessionArtifacts result field "kind" must be "presented" or "changed"');if(typeof n.isNew!="boolean")throw new TypeError('resolveSessionArtifacts result field "isNew" must be a boolean');return{...c,kind:"changed",additions:Bs(n,"additions"),deletions:Bs(n,"deletions"),isNew:n.isNew}}function $s(n){if(!pn(n)||!Array.isArray(n.artifacts))throw new TypeError("resolveSessionArtifacts must return an object with an artifacts array");return{artifacts:n.artifacts.map(ha)}}var mn="1.5.0";import{StringDecoder as ya}from"node:string_decoder";var zs="\u2028",Qs="\u2029";function Gs(n){return!n.includes(zs)&&!n.includes(Qs)?n:n.replaceAll(zs,"\\u2028").replaceAll(Qs,"\\u2029")}async function*Hs(n){let e=new ya("utf8"),t="";for await(let s of n){t+=typeof s=="string"?s:e.write(s);let o=t.indexOf(`
|
|
10
|
+
`);for(;o!==-1;){let r=t.slice(0,o);r.endsWith("\r")&&(r=r.slice(0,-1)),t=t.slice(o+1),yield r,o=t.indexOf(`
|
|
11
|
+
`)}}t+=e.end(),t.length!==0&&(t.endsWith("\r")&&(t=t.slice(0,-1)),yield t)}var Xe=2,Ze="daemon_queries_v1",Oe="daemon_validate_plugins_v1",Se="daemon_proxy_v1",ve="daemon_proxy_bypass_v1",h=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function yn(n){if(n.trim().length===0)throw new h("daemon protocol line must not be empty");let e;try{e=JSON.parse(n)}catch{throw new h("daemon protocol line must contain valid JSON")}let t=k(e,"daemon protocol frame");if(Object.hasOwn(t,"frame_type")||Object.hasOwn(t,"protocol_version")&&!Object.hasOwn(t,"type"))throw new h("daemon v1 frame envelopes are not supported on the v2 wire");switch(t.type){case"control_request":wa(t);break;case"control_response":ba(t);break;case"status_event":Sa(t);break;case"keep_alive":P(t,["type"],"keep_alive frame");break;case"protocol_error":va(t);break;case"session_input":case"session_output":throw new h(`${String(t.type)} is not supported on the v2 wire`);default:if(C(t,"type"),!ka(t.type))throw new h(`unknown daemon message type: ${String(t.type)}`);_a(t),Sn(t)}return t}function Vs(n){let e=Gs(JSON.stringify(n));if(e.includes(`
|
|
12
|
+
`)||e.includes("\r"))throw new h("daemon protocol frame must not contain raw line breaks");return yn(e),e}function Ys(n,e){let t=e.response.response;switch(n){case"initialize":{I(e,"initialize response");let s=k(t,"initialize response");if(P(s,["daemon_protocol_version","daemon_version","capabilities"],"initialize response"),s.daemon_protocol_version!==Xe)throw new h(`unsupported daemon_protocol_version: ${String(s.daemon_protocol_version)}`);return C(s,"daemon_version"),Ra(s,"capabilities"),s}case"open_session":{let s=gn(e,"open_session response");return fn(t,"open_session"),{session_id:s}}case"list_sessions":{I(e,"list_sessions response");let s=k(t,"list_sessions response");P(s,["sessions"],"list_sessions response");let o=s.sessions;if(!Array.isArray(o))throw new h("sessions must be an array");for(let[r,i]of o.entries())Js(k(i,`sessions[${r}]`),`sessions[${r}]`);return s}case"rename_session":{gn(e,"rename_session response");let s=k(t,"rename_session response");return P(s,["session"],"rename_session response"),Js(k(s.session,"rename_session session"),"rename_session session"),s}case"close_session":return gn(e,`${n} response`),fn(t,n),null;case"delete_session":case"shutdown":case"update_byok_config":case"delete_byok_config":return I(e,`${n} response`),fn(t,n),null;case"authenticate":{I(e,`${n} response`);let s=k(t,"authenticate response");if(P(s,["authenticated"],"authenticate response"),typeof s.authenticated!="boolean")throw new h("authenticated must be a boolean");return s}case"get_models":return I(e,`${n} response`),Ye(t,n,"models");case"get_byok_config":return I(e,`${n} response`),Ye(t,n,"providers");case"list_byok_configs":return I(e,`${n} response`),Ye(t,n,"configs");case"list_plugins":return I(e,`${n} response`),Ye(t,n,"plugins");case"validate_plugins":return I(e,`${n} response`),Ye(t,n,"reports");case"setproxy":{I(e,`${n} response`);let s=k(t,`${n} response`);if(P(s,["proxy","no_proxy"],`${n} response`),s.proxy!==null&&typeof s.proxy!="string")throw new h(`${n} response proxy must be a string or null`);let o=s.no_proxy;if(o!=null&&typeof o!="string")throw new h(`${n} response no_proxy must be a string or null`);return s}case"validate_byok_model":{I(e,`${n} response`);let s=k(t,`${n} response`);return P(s,["success"],`${n} response`),hn(s,"success"),s}case"create_byok_config":{I(e,`${n} response`);let s=k(t,`${n} response`);return P(s,["config"],`${n} response`),k(s.config,`${n} response config`),s}case"account_info":{I(e,`${n} response`);let s=k(t,`${n} response`);return P(s,["account"],`${n} response`),k(s.account,`${n} response account`),s}case"check_byok_config":{I(e,`${n} response`);let s=k(t,`${n} response`);return P(s,["success","error","code","requestId","details"],`${n} response`),hn(s,"success"),Ws(s,["error","code","requestId"]),s.details!==void 0&&k(s.details,`${n} response details`),s}case"get_usage_info":{I(e,`${n} response`);let s=k(t,`${n} response`);return P(s,["usage","session","usage_error"],`${n} response`),s.usage!==null&&k(s.usage,`${n} response usage`),k(s.session,`${n} response session`),Ws(s,["usage_error"]),s}default:throw new h(`unknown daemon command result method: ${String(n)}`)}}function Sa(n){if(P(n,["type","status","data"],"status_event frame"),n.status!=="daemon.session_updated")throw new h("unsupported status_event status");let e=k(n.data,"status_event data");if(P(e,["local_session_id","state","error"],"status_event data"),C(e,"local_session_id"),e.state!=="failed")throw new h("status_event state must be failed");k(e.error,"status_event error")}function va(n){if(P(n,["type","code","message","malformed_lines","malformed_bytes","last_frame_type","last_frame_session_id"],"protocol_error frame"),C(n,"code"),n.message!==void 0&&typeof n.message!="string")throw new h("message must be a string");for(let e of["malformed_lines","malformed_bytes"]){let t=n[e];if(t!==void 0&&(!Number.isSafeInteger(t)||t<0))throw new h(`${e} must be a non-negative safe integer`)}for(let e of["last_frame_type","last_frame_session_id"])n[e]!==void 0&&C(n,e)}function wa(n){P(n,["type","request_id","session_id","request"],"control_request frame"),C(n,"request_id"),Sn(n);let e=k(n.request,"control request");if(!(typeof e.type=="string"&&e.type.length>0)&&!(typeof e.subtype=="string"&&e.subtype.length>0))throw new h("control request must have a non-empty string type or subtype")}function ba(n){P(n,["type","session_id","response"],"control_response frame"),Sn(n);let e=k(n.response,"control response");C(e,"request_id");let t=C(e,"subtype");if(t==="success"){if(["error","code","retryable","details"].some(s=>Object.hasOwn(e,s)))throw new h("success control response must not include error fields");P(e,["subtype","request_id","response"],"success control response"),e.response!==void 0&&k(e.response,"success response result");return}if(t!=="error")throw new h(`unknown control response subtype: ${t}`);if(Object.hasOwn(e,"response"))throw new h("error control response must not include response");if(P(e,["subtype","request_id","error","code","retryable","details","pending_permission_requests"],"error control response"),C(e,"error"),e.code!==void 0&&C(e,"code"),e.retryable!==void 0&&hn(e,"retryable"),e.details!==void 0&&k(e.details,"control response details"),e.pending_permission_requests!==void 0&&!Array.isArray(e.pending_permission_requests))throw new h("pending_permission_requests must be an array")}function Ws(n,e){for(let t of e)n[t]!==void 0&&C(n,t)}function Ye(n,e,t){let s=k(n,`${e} response`);if(P(s,[t],`${e} response`),!Array.isArray(s[t]))throw new h(`${e} response ${t} must be an array`);return s}function Js(n,e){P(n,["local_session_id","title","cwd","state","created_at","updated_at"],e),C(n,"local_session_id"),n.cwd!==void 0&&C(n,"cwd"),C(n,"title");let t=C(n,"state");if(!["pending","ready","inactive","failed"].includes(t))throw new h(`${e} has invalid state: ${t}`);C(n,"created_at"),C(n,"updated_at")}function fn(n,e){if(n!==void 0)throw new h(`${e} success must omit response`)}function gn(n,e){let t=n;try{return C(t,"session_id")}catch{throw new h(`${e} requires a valid session_id`)}}function I(n,e){if(Object.hasOwn(n,"session_id"))throw new h(`${e} must not include session_id`)}function Sn(n){let e=n;e.session_id!==void 0&&C(e,"session_id")}function _a(n){for(let e of["session_epoch","sequence"])if(Object.hasOwn(n,e))throw new h(`${e} is reserved for daemon-internal Session ordering`)}function ka(n){return typeof n=="string"&&["user","assistant","stream_event","tool_progress","result","system","prompt_suggestion","command_lifecycle","control_cancel_request","control_cancel","transcript_mirror"].includes(n)}function k(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw new h(`${e} must be a JSON object`);return n}function C(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new h(`${e} must be a non-empty string`);return t}function hn(n,e){let t=n[e];if(typeof t!="boolean")throw new h(`${e} must be a boolean`);return t}function Ra(n,e){let t=n[e];if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new h(`${e} must be an array of strings`);return t}function P(n,e,t){let s=new Set(e),o=Object.keys(n).find(r=>!s.has(r));if(o!==void 0)throw new h(`${t} contains unknown field: ${o}`)}var At=class{constructor(e,t){this.connection=e;this.options=t}messages=new ue;pendingMessages=[];initializePromise;sessionId;flushingPendingMessages=!1;inputEnded=!1;resultReceived=!1;commandLifecycleSupported=!1;pendingCommandUuids=new Set;closed=!1;cleaned=!1;releasePromise;closePromise;initialize(){return this.initializePromise||(this.initializePromise=this.open(),this.initializePromise.catch(()=>{})),this.initializePromise}write(e){if(this.closed)throw new Error("Transport is not ready or has been closed");let t=Pa(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=Xs(t,this.sessionId)}catch(o){this.failAndRelease(o);return}this.connection.sendSessionMessage(s).catch(o=>this.failAndRelease(o))}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,t=!1,s=this.options.claim;try{s&&(await s.ready,t=!0);let o=await this.connection.openSession({worker_args:[...this.options.workerArgs],...this.options.cwd!==void 0?{cwd:this.options.cwd}:{},...this.options.configDir!==void 0?{config_dir:this.options.configDir}:{}},this);if(s&&s.sessionId!==o&&(this.connection.releaseSessionClaim(s.sessionId),t=!1),this.sessionId=o,e=o,this.record(`session opened cwd=${this.options.cwd??"(inherit)"} workerArgs=${this.options.workerArgs.length}`),this.closed){await this.releaseSessionOnce(o);return}this.flushingPendingMessages=!0;try{for(;this.pendingMessages.length>0;){let r=this.pendingMessages.map(i=>Xs(i,o));this.pendingMessages.splice(0);for(let i of r)await this.connection.sendSessionMessage(i)}}finally{this.flushingPendingMessages=!1}}catch(o){throw e!==void 0?this.startRelease(e):t&&s&&this.connection.releaseSessionClaim(s.sessionId),this.fail(o),o}}failAndRelease(e){let t=this.sessionId;this.record("session failed, releasing",e),t!==void 0&&this.startRelease(t),this.fail(e)}record(e,t){let s=this.sessionId;this.options.diagnostics?.record(`[DaemonSession]${s!==void 0?` sessionId=${s}`:""} ${e}`,t)}startRelease(e){this.releaseSessionOnce(e).catch(()=>{})}releaseSessionOnce(e){return this.releasePromise||(this.releasePromise=this.releaseSession(e).catch(t=>{throw this.connection.fail(t),t})),this.releasePromise}releaseSession(e){return this.connection.closeSession(e)}trackOutboundCommand(e){if(!this.commandLifecycleSupported||e.type!=="user")return;let t=e.uuid;typeof t=="string"&&t.trim().length>0&&this.pendingCommandUuids.add(t)}observeCapabilities(e){e.type!=="system"||e.subtype!=="init"||this.updateCommandLifecycleCapability(e)}updateCommandLifecycleCapability(e){let t=e.capabilities;this.commandLifecycleSupported=Array.isArray(t)&&t.includes("msg_lifecycle_v1")}observeCommandLifecycle(e){if(e.type!=="command_lifecycle"||e.state!=="completed"&&e.state!=="cancelled"&&e.state!=="discarded")return;let t=e.command_uuid;typeof t=="string"&&this.pendingCommandUuids.delete(t)}maybeCloseAfterResult(){!this.inputEnded||!this.resultReceived||this.commandLifecycleSupported&&this.pendingCommandUuids.size>0||this.close().catch(()=>{})}async performClose(){this.initializePromise&&await this.initializePromise.catch(()=>{});try{this.releasePromise?await this.releasePromise:this.sessionId&&await this.releaseSessionOnce(this.sessionId)}catch(e){throw this.record("close handshake failed",e),this.markClosed(),this.messages.error(e),e}this.record("closed"),this.markClosed(),this.messages.done()}markClosed(){this.closed||(this.closed=!0,this.cleanup())}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function Pa(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 Xs(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 vn="multi_session_v2",Zs="session_title_sync_v1",eo="session_delete_v1";var Ca=3e4,so=3e4,wn="daemon_keep_alive_v1",xt="daemon_async_session_teardown_v1",Ea=5e3,Mt=3e4,Ta=125e3,Aa=12e4,Ma=5e3,Ia=6e4,Da=15e4,xa=12e4,Oa=1024,qa=64,Na=8*1024*1024,ja=256,Fa=32*1024*1024,La=new Set(["daemon.auth.fetch_job_token","daemon.auth.fetch_service_account_token"]),It=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}},we=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}},et=class extends Error{constructor(t,s){super(`session ${t} is already open (state=${s})`);this.sessionId=t;this.state=s;this.name="DaemonSessionAlreadyOpenError"}code="SESSION_ALREADY_OPEN"},qe=class extends Error{code="DAEMON_HEARTBEAT_TIMEOUT";elapsedMs;constructor(e){super(`DAEMON_HEARTBEAT_TIMEOUT Qoder CLI daemon stopped responding (no inbound frame for ${e}ms)`),this.name="DaemonHeartbeatTimeoutError",this.elapsedMs=e}},Dt=class{input;requestHandler;pendingRequests=new Map;timedOutRequestIds=new Set;activeInboundRequestIds=new Set;sessions=new Map;sessionSlots=new Map;closedSessionIds=new Set;sessionCwds=new Map;pendingSessionMessages=new Map;pendingSessionMessageBytes=new Map;pendingSessionMessageFrameCount=0;pendingSessionMessageByteCount=0;maxFrameBytes;readTask;writeChain=Promise.resolve();nextRequestId=1;initializing=!1;initialized=!1;capabilities=new Set;stopping=!1;failure;failureListeners=new Set;describeUnexpectedClose;diagnostics;lastInboundAt=performance.now();heartbeatWatchdog;heartbeatTimeoutMs;constructor(e){if(this.input=e.input,this.requestHandler=e.requestHandler,this.describeUnexpectedClose=e.describeUnexpectedClose,this.diagnostics=e.diagnostics,this.heartbeatTimeoutMs=e.heartbeatTimeoutMs??so,this.maxFrameBytes=e.maxFrameBytes??J,!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={}){if(this.initialized)throw new h("daemon connection is already initialized");if(this.initializing)throw new h("daemon initialize is already in progress");this.initializing=!0;let s,o=t.timeoutMs??Ca,r=this.request("initialize",{daemon_protocol_version:Xe,sdk_version:e,capabilities:[vn,...t.capabilities??[]],...t.auth?{auth:t.auth}:{},...t.proxy===void 0?{}:{proxy:t.proxy},...t.noProxy===void 0?{}:{no_proxy:t.noProxy}}),i=new Promise((u,c)=>{s=setTimeout(()=>{let l=new Error(`Qoder CLI daemon did not initialize within ${o}ms`);this.fail(l),c(l)},o)}),a;try{a=await Promise.race([r,i])}finally{this.initializing=!1,s&&clearTimeout(s)}if(!a.capabilities.includes(vn))throw new h(`daemon is missing required capability: ${vn}`);for(let u of a.capabilities)this.capabilities.add(u);this.initialized=!0,this.capabilities.has(wn)?this.armHeartbeatWatchdog():this.diagnostics?.record("[DaemonConnection] heartbeat not negotiated; watchdog disarmed")}createSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new At(this,{...e,diagnostics:this.diagnostics})}supportsCapability(e){return this.capabilities.has(e)}async setProxy(e,t){return(await this.setProxySettings(e,t)).proxy}async setProxySettings(e,t){if(!this.capabilities.has(Se))throw new h(`daemon is missing required capability: ${Se}`);if(t!==void 0&&!this.capabilities.has(ve))throw new h(`daemon is missing required capability: ${ve}`);let s=await this.request("setproxy",{proxy:e||null,...t===void 0?{}:{no_proxy:t}},void 0,void 0,Mt,"request");return{proxy:s.proxy,noProxy:Object.hasOwn(s,"no_proxy")?s.no_proxy??null:t===void 0?null:t}}claimSessionId(e){let t=this.sessionSlots.get(e);if(!t)return this.sessionSlots.set(e,{state:"opening",waiters:[]}),{sessionId:e,ready:Promise.resolve()};if(t.state==="closing"){let s=new Promise((o,r)=>{t.waiters.push({resolve:o,reject:r})});return{sessionId:e,ready:s}}throw new et(e,t.state)}markSessionOpen(e){let t=this.sessionSlots.get(e);t?t.state="open":this.sessionSlots.set(e,{state:"open",waiters:[]})}markSessionClosing(e){let t=this.sessionSlots.get(e);t?t.state="closing":this.sessionSlots.set(e,{state:"closing",waiters:[]})}releaseSessionClaim(e){let t=this.sessionSlots.get(e);!t||t.state!=="opening"||this.advanceSessionSlot(e,t)}completeSessionClose(e){let t=this.sessionSlots.get(e);!t||t.state!=="closing"||this.advanceSessionSlot(e,t)}advanceSessionSlot(e,t){let s=t.waiters.shift();if(!s){this.sessionSlots.delete(e);return}t.state="opening",s.resolve();for(let o of t.waiters.splice(0))o.reject(new et(e,"opening"))}validatePlugins(e,t){return this.capabilities.has(Oe)?this.request("validate_plugins",{paths:[...e],...t===void 0?{}:{config_dir:t}},void 0,void 0,Da,"request").then(s=>s.reports):Promise.reject(new h(`daemon is missing required capability: ${Oe}`))}setRequestHandler(e){this.requestHandler=e}onFailure(e){return this.failureListeners.add(e),this.failure&&e(this.failure),()=>this.failureListeners.delete(e)}async openSession(e,t){let s=await this.request("open_session",e,t,void 0,Aa);return e.cwd!==void 0&&this.sessionCwds.set(s.session_id,e.cwd),s.session_id}async listSessions(e){return(await this.request("list_sessions",e===void 0?{}:{cwd:e},void 0,void 0,Ta,"request")).sessions}renameSession(e,t,s){if(!this.capabilities.has(Zs))return Promise.reject(new h(`daemon is missing required capability: ${Zs}`));let o=s??this.sessionCwds.get(e);return this.request("rename_session",o===void 0?{title:t}:{title:t,cwd:o},void 0,e,Mt)}sendSessionMessage(e){return this.writeFrame(e)}async closeSession(e){this.markSessionClosing(e);try{await this.request("close_session",{},void 0,e,Mt)}finally{this.sessions.delete(e),this.closedSessionIds.add(e),this.completeSessionClose(e)}}async deleteSession(e,t){if(!this.capabilities.has(eo))throw new h(`daemon is missing required capability: ${eo}`);let s=t??this.sessionCwds.get(e);await this.request("delete_session",s===void 0?{local_session_id:e}:{local_session_id:e,cwd:s},void 0,void 0,Mt)}query(e,t){return this.capabilities.has(Ze)?this.request(e,t,void 0,void 0,Ia,"request"):Promise.reject(new h(`daemon is missing required capability: ${Ze}`))}authenticate(e){return this.capabilities.has(Ze)?this.request("authenticate",e===void 0?{}:{auth:e},void 0,void 0,xa,"request"):Promise.reject(new h(`daemon is missing required capability: ${Ze}`))}async shutdown(e=Ma){if(this.stopping){await this.readTask.catch(()=>{});return}this.stopping=!0,this.disarmHeartbeatWatchdog();try{this.failure||await this.request("shutdown",{},void 0,void 0,e)}finally{let t=new Error("Daemon is stopping");for(let s of this.sessions.values())s.fail(t);this.sessions.clear();for(let s of this.sessionSlots.values())for(let o of s.waiters.splice(0))o.reject(t);this.sessionSlots.clear(),!this.input.destroyed&&!this.input.writableEnded&&this.input.end()}}async resolveUnexpectedClose(){if(!this.describeUnexpectedClose)return new Error("Daemon connection closed");try{return await this.describeUnexpectedClose()??new Error("Daemon connection closed")}catch{return new Error("Daemon connection closed")}}fail(e,t=!0){let s=e instanceof Error?e:new Error(String(e));if(!this.failure){this.failure=s,this.disarmHeartbeatWatchdog(),this.diagnostics?.record(`[DaemonConnection] connection failed pendingRequests=${this.pendingRequests.size} sessions=${this.sessions.size}`,s);for(let o of this.pendingRequests.values())o.timeout&&clearTimeout(o.timeout),o.reject(s);this.pendingRequests.clear(),this.timedOutRequestIds.clear(),this.clearPendingSessionMessages();for(let o of this.sessions.values())o.fail(s);this.sessions.clear();for(let o of this.sessionSlots.values())for(let r of o.waiters.splice(0))r.reject(s);if(this.sessionSlots.clear(),t)for(let o of this.failureListeners)try{o(s)}catch{}}}armHeartbeatWatchdog(){if(this.heartbeatTimeoutMs<=0)return;this.lastInboundAt=performance.now();let e=Math.min(Ea,Math.max(25,Math.floor(this.heartbeatTimeoutMs/2)));this.heartbeatWatchdog=setInterval(()=>{if(this.failure||this.stopping||!this.initialized)return;let t=Math.round(performance.now()-this.lastInboundAt);t<=this.heartbeatTimeoutMs||(this.diagnostics?.record(`[DaemonConnection] heartbeat timeout elapsed=${t}ms pendingRequests=${this.pendingRequests.size} sessions=${this.sessions.size}`),this.fail(new qe(t)))},e),this.heartbeatWatchdog.unref()}disarmHeartbeatWatchdog(){this.heartbeatWatchdog!==void 0&&(clearInterval(this.heartbeatWatchdog),this.heartbeatWatchdog=void 0)}request(e,t,s,o,r,i="connection"){if(this.failure)return Promise.reject(this.failure);if(e!=="initialize"&&!this.initialized)return Promise.reject(new h("daemon connection is not initialized"));let a=`sdk_daemon_${this.nextRequestId++}`,u={type:"control_request",request_id:a,...o!==void 0?{session_id:o}:{},request:{type:`daemon.${e}`,...t}};return new Promise((c,l)=>{let m={method:e,resolve:p=>c(p),reject:l,...s?{sessionTransport:s}:{},...o!==void 0?{sessionId:o}:{}};r!==void 0&&(m.timeout=setTimeout(()=>{if(this.pendingRequests.get(a)!==m)return;let p=new h(`daemon ${e} request timed out after ${r}ms`);if(this.diagnostics?.record(`[DaemonConnection] request timeout method=${e} requestId=${a}${o!==void 0?` sessionId=${o}`:""} timeoutMs=${r} scope=${i}`),i==="request"){this.pendingRequests.delete(a),this.rememberTimedOutRequestId(a),m.reject(p);return}this.fail(p)},r),m.timeout.unref?.()),this.pendingRequests.set(a,m),this.diagnostics?.record(`[DaemonConnection] request sent method=${e} requestId=${a}${o!==void 0?` sessionId=${o}`:""}${r!==void 0?` timeoutMs=${r}`:""}`),this.writeFrame(u).catch(p=>{let d=this.pendingRequests.get(a);d?.timeout&&clearTimeout(d.timeout),this.pendingRequests.delete(a),this.diagnostics?.record(`[DaemonConnection] request write failed method=${e} requestId=${a}`,p),l(p),d?.sessionTransport&&this.failIfSessionMessagesAreOrphaned()})})}async readOutput(e){let t=new re(this.maxFrameBytes,"SDK daemon output");e.pipe(t);try{for await(let s of Hs(t)){if(this.lastInboundAt=performance.now(),!s.trim())continue;let o=Ua(s);o!==void 0&&this.rejectLegacyInitialize(o)||this.acceptFrame(yn(s))}(!this.stopping||this.pendingRequests.size>0)&&this.fail(await this.resolveUnexpectedClose(),!1)}catch(s){this.fail(s)}finally{e.unpipe(t),t.destroy()}}acceptFrame(e){let t=e;if(t.type!=="keep_alive"){if(t.type==="protocol_error"){let s=e,o=[`code=${s.code}`,...s.malformed_lines===void 0?[]:[`malformed_lines=${s.malformed_lines}`],...s.malformed_bytes===void 0?[]:[`malformed_bytes=${s.malformed_bytes}`],...s.last_frame_type===void 0?[]:[`last_frame_type=${s.last_frame_type}`],...s.last_frame_session_id===void 0?[]:[`last_frame_session_id=${s.last_frame_session_id}`]].join(" ");this.fail(new h(`daemon reported a fatal protocol error: ${o}`+(s.message===void 0?"":`: ${s.message}`)));return}if(t.type==="control_response"){let s=e,o=s.response.request_id;if(this.pendingRequests.has(o)){this.acceptControlResponse(s);return}if(this.timedOutRequestIds.delete(o))return;this.routeSessionMessage(t);return}if(t.type==="control_request"){let s=e,o=Ka(s);if(o==="valid"){this.acceptRequest(s);return}if(o==="contradictory")throw new h(`contradictory daemon reverse RPC routing markers: ${s.request_id}`)}if(t.type==="status_event"){this.acceptSessionUpdatedStatusEvent(e);return}this.routeSessionMessage(t)}}rememberTimedOutRequestId(e){if(this.timedOutRequestIds.size>=Oa){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 h(`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 h(`daemon output has unknown session_id: ${t}`)}acceptControlResponse(e){let t=e.response.request_id,s=this.pendingRequests.get(t);if(!s)throw new h(`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 h(`${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 B("1","2"));return}s.reject(new It({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 o=e,r=o.response.response?.daemon_protocol_version;if(s.method==="initialize"&&typeof r=="number"&&r!==Xe)throw new B(String(r),String(Xe));let i=Ys(s.method,o);if(s.sessionTransport){let a=i.session_id;if(typeof a!="string"||a.length===0)throw new h(`${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 h(`daemon returned duplicate session_id: ${a}`);this.diagnostics?.record(`[DaemonConnection] rejecting duplicate open session_id=${a}`),s.reject(l);return}this.sessions.set(a,s.sessionTransport),this.markSessionOpen(a);for(let l of u)s.sessionTransport.acceptOutput(l)}s.resolve(i)}catch(o){s.reject(o instanceof Error?o:new Error(String(o))),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 o of this.pendingSessionMessages.keys())this.closedSessionIds.has(o)&&this.deletePendingSessionMessages(o);if(this.pendingSessionMessages.size===0)return;let t=[...this.pendingSessionMessages.keys()].join(", "),s=new h(`${e}: ${t}`);return this.clearPendingSessionMessages(),this.fail(s),s}bufferPendingSessionMessage(e,t){let s=this.pendingSessionMessages.get(e)??[],o=Buffer.byteLength(JSON.stringify(t),"utf8"),r=this.pendingSessionMessageBytes.get(e)??0;if(s.length+1>qa||r+o>Na||this.pendingSessionMessageFrameCount+1>ja||this.pendingSessionMessageByteCount+o>Fa)throw new h("daemon pre-response Session output exceeded its bounded buffer");s.push(t),this.pendingSessionMessages.set(e,s),this.pendingSessionMessageBytes.set(e,r+o),this.pendingSessionMessageFrameCount+=1,this.pendingSessionMessageByteCount+=o}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 B("1","2")),!0)}acceptRequest(e){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 we?t:void 0,o={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(o)}).catch(t=>this.fail(t)).finally(()=>{this.activeInboundRequestIds.delete(e.request_id)})}writeInboundError(e,t,s){let o={type:"control_response",response:{subtype:"error",request_id:e,code:t,error:s,retryable:!1}};this.writeFrame(o).catch(r=>this.fail(r))}acceptSessionUpdatedStatusEvent(e){let t=e.data.local_session_id,s=this.sessions.get(t);s&&(this.sessions.delete(t),this.closedSessionIds.add(t),s.fail(Ba(e.data)))}writeFrame(e){let t;try{t=`${Vs(e)}
|
|
13
|
+
`,Ae(t,this.maxFrameBytes,"SDK daemon input",e.type==="user"&&"uuid"in e&&typeof e.uuid=="string"?e.uuid:void 0)}catch(o){let r=o instanceof Error?o:new Error(String(o));return this.fail(r),Promise.reject(r)}let s=this.writeChain.then(()=>new Promise((o,r)=>{this.input.write(t,"utf8",i=>{if(i){r(i);return}o()})}));return this.writeChain=s.catch(()=>{}),s.catch(o=>this.fail(o)),s}};function Ua(n){let e;try{e=JSON.parse(n)}catch{return}if(!to(e)||!no(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(!(!to(t)||!no(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 to(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function no(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function Ka(n){let e=La.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 Ba(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",o=t.exit_code===null||typeof t.exit_code=="number"?t.exit_code:void 0,r=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 O(s,{exitCode:o,signal:r,stderr:i})}var $a=new Set(["default","acceptEdits","auto","bypassPermissions"]);function tt(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&$a.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 nt(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`goalMaxTurns must be a positive safe integer, received ${String(n)}.`)}function oo(n,e,t,s){return new Promise((o,r)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(u){r(u);return}o({jsonrpc:"2.0"});return}let a=`${n}:${e.id}`;s.set(a,{resolve:o,reject:r}),t.onmessage?t.onmessage(e):(s.delete(a),r(new Error(`No message handler registered for MCP server "${n}"`)))})}function ro(n,e,t){if("id"in e&&e.id!==null){let s=`${n}:${e.id}`,o=t.get(s);if(o)return o.resolve(e),t.delete(s),!0}return!1}function io(n,e,t){let s=0,o=`${n}:`,r=Array.from(t.entries());for(let i of r){let[a,u]=i;a.startsWith(o)&&(u.reject(e),t.delete(a),s++)}return s}import{randomUUID as za}from"crypto";function co(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 Qa=500,Ga=1024*1024,Ha=6e4,Ot=class{constructor(e){this.options=e;this.holding=e.holdUntilFlush===!0}states=new Map;failures=[];holding;receivedEntryCount=0;enqueue(e){let t=Wa(e.filePath),s=Ja(e.entries);this.receivedEntryCount+=s.length;let o=uo(t),r=this.states.get(o);r||(r={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(o,r)),r.entries.push(...s),r.bytes+=Ya(s),!this.holding&&(this.options.flushMode==="eager"||r.entries.length>=Qa||r.bytes>=Ga)&&this.drain(r)}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 Xa(this.options.store,e.key,t,this.options.appendTimeoutMs??Ha)}catch(s){this.failures.push(s),this.options.diagnostics?.record(`[SessionStore] append failed for ${uo(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:za(),session_id:e.key.sessionId})}})}};function Wa(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 o=s[0],r=/^([0-9a-f-]{36})\.jsonl$/i.exec(s[1]);if(s.length===2&&r)return{projectKey:o,sessionId:ao(r[1])};let i=ao(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 Va(c),{projectKey:o,sessionId:i,subpath:c}}function Ja(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 ao(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 Va(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 uo(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function Ya(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Xa(n,e,t,s){await Za(n.append({...e},structuredClone(t)),s)}async function Za(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,o)=>{t=setTimeout(()=>o(new bn(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var bn=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Nt(n){if(!be(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!_n(e)||e<0||!be(t)||Array.isArray(t))return;let s={};for(let[o,r]of Object.entries(t)){if(!be(r)||Array.isArray(r))continue;let i=r.credits;_n(i)&&i>=0&&(s[o]={credits:i})}return{total_credits:e,model_usage:s}}function jt(n){if(!be(n)||Array.isArray(n))return null;let e={};Ne(e,n,"userId"),Ne(e,n,"userType"),Y(e,n,"totalUsagePercentage"),qt(e,n,"isHighestTier"),Y(e,n,"expiresAt"),Ne(e,n,"upgradeUrl"),qt(e,n,"isQuotaExceeded"),qt(e,n,"isPlanQuotaProrated");let t=lo(n.userQuota);t&&(e.userQuota=t);let s=eu(n.addOnQuota);s&&(e.addOnQuota=s);let o=tu(n.orgResourcePackage);return o&&(e.orgResourcePackage=o),e}function be(n){return typeof n=="object"&&n!==null}function _n(n){return typeof n=="number"&&Number.isFinite(n)}function kn(n){return Object.keys(n).length>0}function Y(n,e,t){let s=e[t];_n(s)&&(n[t]=s)}function Ne(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function qt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function lo(n){if(!be(n)||Array.isArray(n))return;let e={};return Y(e,n,"total"),Y(e,n,"used"),Y(e,n,"remaining"),Y(e,n,"percentage"),Ne(e,n,"unit"),kn(e)?e:void 0}function eu(n){if(!be(n)||Array.isArray(n))return;let e=lo(n)??{};return Ne(e,n,"detailUrl"),kn(e)?e:void 0}function tu(n){if(!be(n)||Array.isArray(n))return;let e={};return Y(e,n,"used"),Y(e,n,"cap"),Y(e,n,"remaining"),Y(e,n,"percentage"),qt(e,n,"available"),Ne(e,n,"unit"),kn(e)?e:void 0}function po(){return Math.random().toString(36).substring(2,15)}function mo(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 fo(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function go(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function ho(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function yo(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function So(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function st(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 vo(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function wo(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function bo(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function _o(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function ko(n){return typeof n=="object"&&n!==null&&n.type==="result"}var su="<synthetic>";function ou(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==su?n:{...n,isApiErrorMessage:!0}}function Ro(n){if(!n)return null;let e=n.trim();return e?e.startsWith("socks5h:")?`socks5:${e.slice(8)}`:e:null}var Ft=class n{constructor(e,t,s,o,r,i,a,u,c,l,m,p,d,f,y,g,S,b="batched",v,D,A,ee,R,X,He=!1,Yt,Xt){this.hostActionDirect=He;if(this.transport=e,this.isSingleTurn=t,this.canUseTool=s,this.hooks=o??{},this.abortController=r,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=p??new Map,this.pendingMcpResponses=d??new Map,this.sdkMcpToolOverrides=v??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=l,this.fetchJobToken=f,this.fetchServiceAccountToken=D,this.diagnostics=c,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=g??500,this.memoryCallbacks=A,this.skillEvolutionCallbacks=ee,this.hostActionFallback=X,this.resolveSessionArtifacts=R,this.daemonAccountQueries=Yt,this.daemonProxyProvider=Xt,this.inputStream=new ue(()=>{this.close().catch(()=>{})}),S&&(this.transcriptMirrorBatcher=new Ot({store:S,flushMode:b,holdUntilFlush:this.initConfig.requireSessionStoreForkBarrier===!0,diagnostics:c,onMirrorError:te=>this.inputStream.enqueue(te)})),this.readLoopPromise=this.readMessages().catch(te=>{this.inputStream.error(te)}),this.initializationPromise=this.startInitialization(),this.initializationPromise.catch(()=>{}),this.abortController){let te=this.abortController.signal,pt=()=>{this.failInitialization(new E),this.close().catch(()=>{})};te.aborted?pt():te.addEventListener("abort",pt,{once:!0})}}static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static SELECTED_SKILLS_CAPABILITY="selected_skills_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_RESUME_CAPABILITY="goal_resume_v1";static GOAL_MAX_TURNS_CAPABILITY="goal_max_turns_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";static SESSION_STORE_FORK_BARRIER_CAPABILITY="session_store_fork_barrier_v1";static HOST_ACTION_CAPABILITY="host_action";static BYOK_CONFIG_MANAGEMENT_CAPABILITY="byok_config_management_v1";static REMOTE_PROJECTION_REQUEST_ID_PREFIX="daemon_worker_sdk_";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;skillEvolutionCallbacks;hostActionFallback;resolveSessionArtifacts;daemonAccountQueries;daemonProxyProvider;resolveStreamInitialization;initResponse;latestCommands=[];initializationPromise;rejectInitialization;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;sdkStartupTimingSent=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;sessionStoreForkBarrierComplete=!1;inputEnded=!1;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 o=this.extractMessagePreview(t.content);if(o)return o;let r=this.getRecord(t.message);return r?this.extractMessagePreview(r):""}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,o=this.getRecord(t)?.content,r=Array.isArray(o)?o.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${r}${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(co(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(o){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",o)}continue}if(ho(t)){this.handleControlResponse(t);continue}if(yo(t)){this.handleControlRequest(t).catch(o=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",o)});continue}if(So(t)){this.handleControlCancelRequest(t);continue}if(vo(t)||wo(t)||bo(t)||_o(t))continue;if(ko(t)){await this.transcriptMirrorBatcher?.flush();let o=t;if(this.recordInboundSessionMessage(o),this.resultMessage=o,this.pendingErrorResultExit=this.resultMessage.is_error===!0,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(o),this.rejectInitialization&&this.resultMessage.is_error===!0){let r=this.resultMessage.terminal_reason;this.failInitialization(this.abortController?.signal.aborted||this.closed||r==="aborted_streaming"||r==="aborted_tools"||r==="abort"?new E:new Ee(this.resultMessage))}this.isSingleTurn&&this.flushBeforeEndInput();continue}let s=ou(t);if((s.type==="user"||s.type==="assistant")&&(this.pendingErrorResultExit=!1),this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{let o=s;this.validateProtocolHandshake(o),this.cliCapabilities=new Set(o.capabilities??[]);let r=o.commands;r!==void 0&&this.replaceLatestCommands(r),this.resolveStreamInitialization&&(this.initResponse=o,this.resolveStreamInitialization(this.initResponse),this.resolveStreamInitialization=void 0)}catch(o){throw this.inputStream.error(o),o}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.failInitialization(t),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,o=e.type==="assistant"&&e.error==="authentication_failed";!s&&!o||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(r=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",r)}))}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(T(this.diagnostics,"query","memory_flush",()=>this.flushMemory())),this.initConfig.evolution?.skill!==void 0&&e.push(T(this.diagnostics,"query","skill_flush",()=>this.flushSkillEvolution()));let s=(await Promise.allSettled(e)).find(o=>o.status==="rejected");if(s)throw s.reason}catch(e){this.diagnostics?.record("[QueryRunner] post-turn flush before end input failed:",e)}finally{this.endTransportInput()}}endTransportInput(){this.inputEnded||(this.inputEnded=!0,this.transport.endInput())}async request(e,t){if(t?.signal?.aborted)throw new E;let s=`${t?.requestIdPrefix??""}${po()}`,o=mo(s,e),r=t?.timeoutMs??this.controlRequestTimeoutMs,i=st(o.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})+`
|
|
14
|
+
`)}catch(f){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",f)}},p=()=>{l&&(clearTimeout(l),l=null),t?.signal?.removeEventListener("abort",d)},d=()=>{this.pendingRequests.delete(s)&&(p(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${s} subtype=${i}`),m(),c(new E))};this.pendingRequests.set(s,{resolve:f=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(f)},reject:f=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=error duration_ms=${Date.now()-a}`,f),c(f)}}),t?.signal?.addEventListener("abort",d,{once:!0}),r>0&&Number.isFinite(r)&&(l=setTimeout(()=>{if(!this.pendingRequests.has(s))return;this.pendingRequests.delete(s),p();let f=Date.now()-a;this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${s} subtype=${i} timeout_ms=${r} elapsed_ms=${f}`),m(),c(new Te({requestId:s,message:`Control request "${i}" timed out after ${r}ms`,code:on,details:{requestType:i,timeoutMs:r,elapsedMs:f}}))},r));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${s} subtype=${i} timeout_ms=${r}`),this.transport.write(JSON.stringify(o)+`
|
|
15
|
+
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(f){p(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,f),c(f)}})}handleControlResponse(e){let t=e.response,s=t.request_id,o=this.pendingRequests.get(s);if(!o){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")o.resolve(t.response);else{let r=new Te({requestId:s,message:t.error,code:t.code,retryable:t.retryable,details:t.details});o.reject(r),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)st(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=st(e.request)??"unknown",o=Date.now(),r=new AbortController;this.pendingInboundRequests.set(t,{abortController:r}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,r.signal),r.signal);if(!r.signal.aborted){let a=fo(t,i);this.transport.write(JSON.stringify(a)+`
|
|
16
|
+
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=success duration_ms=${Date.now()-o}`)}}catch(i){if(!r.signal.aborted){let{error:a,code:u}=ru(i),c=go(t,a,u);this.transport.write(JSON.stringify(c)+`
|
|
17
|
+
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-o}`,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 E}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=mn;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 o=Po(t),r=Po(s);if(!o||!r){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(o.major!==r.major)throw new B(t,s);o.minor<r.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 E;return new Promise((s,o)=>{let r=()=>{o(new E)};t.addEventListener("abort",r,{once:!0}),e.then(i=>{t.removeEventListener("abort",r),s(i)},i=>{t.removeEventListener("abort",r),o(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,o=st(s),r=s;switch(o){case"resolve_session_artifacts":{if(!this.resolveSessionArtifacts)throw new Error("resolve_session_artifacts_unavailable: No resolveSessionArtifacts callback configured");let i=r.local_session_id,a=r.cwd;if(typeof i!="string"||i.length===0||typeof a!="string"||a.length===0)throw new TypeError("resolve_session_artifacts requires local_session_id and cwd");let u=await this.awaitAbortable(Promise.resolve().then(()=>this.resolveSessionArtifacts(i,a)),t);return $s(u)}case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=r.reason??"initial",a=r.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=r.tool_name,a=r.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=r.tool_use_id,c=r.permission_suggestions??r.suggestions,l=r.blocked_path,m=r.decision_reason,p=r.title,d=r.display_name,f=r.description,y=r.agent_id,g=r.permission_kind,S=r.options,b=r.details,v=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:l,decisionReason:m,title:p,displayName:d,description:f,toolUseID:u,agentID:y,permissionKind:g,permissionOptions:S,details:b}),t);if(v.behavior==="deny"&&!v.message)throw new Error("Permission deny result must include a message.");return v.behavior==="allow"?{...v,updatedInput:v.updatedInput??a,toolUseID:u}:{...v,toolUseID:u}}case"hook_callback":{let i=r.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,r.input,r.tool_use_id,t)}case"memory_should_generate":{let i=r.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(r.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=r.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(r.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=r.server_name,a=r.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(oo(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:r.mcp_server_name??"",message:r.message??r.prompt??"",mode:r.mode,url:r.url,elicitationId:r.elicitation_id,requestedSchema:r.requested_schema,title:r.title,displayName:r.display_name,description:r.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:r.purpose,sessionId:r.sessionId,turnIndex:r.turnIndex,agentId:r.agentId,agentType:r.agentType,resolvedModel:r.resolvedModel,availableModels:r.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,l=new Promise((g,S)=>{c=setTimeout(()=>{S(new We(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:g,...S}=d;p.model=g,p.custom_model={...S,style:S.style??"openai"}}let f=m?.taskId?.trim();f&&(p.task_id=f);let y=m?.subTask?.trim();return y&&(p.sub_task=y),p}default:throw new Error(`Unhandled control request subtype: ${o??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.startInitialization()),this.initializationPromise}startInitialization(){let e=new Promise((s,o)=>{this.rejectInitialization=o}),t=this.initConfig.resolveInitializationFromStream?this.waitForStreamInitialization():this.performInitialize();return Promise.race([t,e]).then(s=>(this.rejectInitialization=void 0,this.initResponse=s,this.cliCapabilities=new Set(s.capabilities??[]),s),s=>{throw this.rejectInitialization=void 0,s})}failInitialization(e){let t=this.rejectInitialization;if(t){this.rejectInitialization=void 0,t(e);for(let s of this.pendingRequests.values())s.reject(e);this.pendingRequests.clear()}}async performInitialize(){await this.initConfig.beforeInitialize?.();let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,supportsAvailableModelsUpdate:!0,supportsCommandsChanged:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[o,r]of Object.entries(this.hooks)){if(!r||r.length===0)continue;let i=[];for(let a of r){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[o]=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.includeShellProgress===!0&&(e.includeShellProgress=!0),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.hostActions!==void 0&&(e.hostActions=this.initConfig.hostActions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.independentPlanModeControls===!0){e.independentPlanModeControls=!0;let o=tt(this.initConfig.permissionMode);o!==void 0&&(e.permissionMode=o)}this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.initConfig.evolution!==void 0&&(e.evolution=this.initConfig.evolution),this.resolveSessionArtifacts!==void 0&&(e.resolveSessionArtifacts=!0),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let o=s;this.initResponse=o,this.replaceLatestCommands(o.commands),this.cliCapabilities=new Set(o.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 $(n.GOAL_MAX_TURNS_CAPABILITY);if(this.initConfig.hostActions!==void 0&&!this.cliCapabilities?.has(n.HOST_ACTION_CAPABILITY))throw new $(n.HOST_ACTION_CAPABILITY);if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new $(n.PLAN_MODE_CAPABILITY);let o={subtype:"set_plan_mode",active:this.initConfig.planMode};await this.request(o)}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 $(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,o){let r=this.hookCallbacks.get(e);if(!r)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(r(t,s,{signal:o}),o)??{continue:!0}}async initializationResult(){return this.initialize()}replaceLatestCommands(e){this.latestCommands=(e??[]).map(t=>({...t}))}getLatestCommands(){return this.latestCommands.map(e=>({...e}))}waitForStreamInitialization(){return new Promise(e=>{this.resolveStreamInitialization=e})}async streamInput(e){(async()=>{let t,s=!1;try{t=e[Symbol.asyncIterator]();let o=async()=>{let a=await t.next();return s=a.done===!0,{...a,submittedAtMs:Date.now()}},[,r]=await Promise.all([this.initialize(),o()]),i=0;for(;!r.done;r=await o()){let a=r.value,u=r.submittedAtMs;if(this.closed)break;i+=1;let l=Object.prototype.hasOwnProperty.call(a,"custom_context")?a.custom_context:this.initConfig.customContext,m=typeof a.uuid=="string"&&a.uuid.trim().length>0?a.uuid:nu(),p={...a,uuid:m,extra:{...!this.sdkStartupTimingSent&&this.initConfig.sdkStartedAtMs!==void 0?{started_at_ms:this.initConfig.sdkStartedAtMs}:{},submitted_at_ms:u,...a.extra},...l===void 0?{}:{custom_context:l}};if(this.pendingErrorResultExit=!1,p.selected_skills!==void 0&&p.selected_skills.length>0&&!this.cliCapabilities?.has(n.SELECTED_SKILLS_CAPABILITY))throw new $(n.SELECTED_SKILLS_CAPABILITY);l!==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"));try{await this.transport.write(JSON.stringify(p)+`
|
|
18
|
+
`)}catch(d){throw d instanceof W&&d.direction==="input"?new W(d.direction,d.limit,d.actualBytes,d.source,m):d}this.sdkStartupTimingSent=!0,this.recordOutboundSessionMessage(p)}i>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(o){this.diagnostics?.record("[QueryRunner] streamInput error:",o),(!(o instanceof Ee)||o.result!==this.resultMessage)&&this.inputStream.error(o instanceof Error?o:new Error(String(o))),this.endTransportInput()}finally{t&&!s&&Promise.resolve().then(()=>t?.return?.()).catch(o=>{this.diagnostics?.record("[QueryRunner] input cleanup error:",o)})}})().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 sendHostAction(e){if(this.initConfig.hostActions===void 0)throw new Error("Host actions are disabled; configure options.hostActions first");await this.initialize(),await this.requireCliCapability(n.HOST_ACTION_CAPABILITY);let t=Ls(e);if(!this.hostActionDirect&&!this.closed&&!this.inputEnded&&this.transport.isReady())try{await this.transport.write(`${JSON.stringify(t)}
|
|
19
|
+
`);return}catch(s){this.diagnostics?.record("[QueryRunner] active Host action transport failed; using fallback:",s)}if(!this.hostActionFallback)throw new Error("Host action transport is no longer writable");await this.hostActionFallback(t)}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"};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);let s=e.customContext??this.initConfig.customContext;return s!==void 0&&(t.custom_context=s),(await this.request(t))?.goal??null}async setGoalMaxTurns(e){e!==null&&nt(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 nt(s.goal_max_turns),s.goal_max_turns}async resumeGoal(){await this.requireCliCapability(n.GOAL_RESUME_CAPABILITY);let e={subtype:"resume_goal"};return(await this.request(e))?.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 $(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?tt(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!0}:{}})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async enableRemoteProjection(e,t={}){if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");if(t.fromSequenceNum!==void 0&&(!Number.isSafeInteger(t.fromSequenceNum)||t.fromSequenceNum<=0))throw new TypeError("fromSequenceNum must be a positive safe integer");await this.request({type:"enable_remote_projection",remote_session_id:e,...t.suppressInitialIdleStateEvents===!0?{suppress_initial_idle_state_events:!0}:{},...t.skipInitialFlush===!0?{skip_initial_flush:!0}:{},...t.fromSequenceNum===void 0?{}:{from_sequence_num:t.fromSequenceNum}},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}})}async disableRemoteProjection(e={}){let t=await this.request({type:"disable_remote_projection"},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}});if(!(typeof t?.remote_session_id!="string"||t.remote_session_id.length===0||typeof t.last_sequence_num!="number"||!Number.isSafeInteger(t.last_sequence_num)||t.last_sequence_num<=0))return{remoteSessionId:t.remote_session_id,lastSequenceNum:t.last_sequence_num}}async setProxy(e){if(this.daemonProxyProvider){if(Ro(e)!==Ro(this.daemonProxyProvider()))throw new Error("proxy must be set via daemon.setProxy(); a daemon-bound Query cannot change it per session");return}await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){let s=t?.customContext??this.initConfig.customContext;return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{},...s!==void 0?{custom_context:s}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let s=t?.customContext??this.initConfig.customContext,o=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(r=>({...r}))}:{},...s!==void 0?{custom_context:s}:{}},{timeoutMs:0,signal:t?.signal});return o?.response==null?null:{response:o.response,synthetic:o.synthetic??!1,...o.refusal_fallback?{refusalFallback:{originalModel:o.refusal_fallback.original_model,fallbackModel:o.refusal_fallback.fallback_model,content:o.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){if(this.daemonAccountQueries)return await this.daemonAccountQueries.getModels(e)??[];let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{},...e?.outerProviders?{outerProviders:e.outerProviders}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){if(this.daemonAccountQueries)try{return await this.daemonAccountQueries.getByokConfig()??null}catch{return null}try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){if(this.daemonAccountQueries)try{let t=await this.daemonAccountQueries.validateByokModel(e);return typeof t=="boolean"?t:null}catch{return null}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(e){if(e&&!e.uid?.trim())throw new Error("BYOK_UID_REQUIRED");return this.daemonAccountQueries&&!e?this.daemonAccountQueries.listByokConfigs():(await this.requireCliCapability(e?"byok_config_read_v1":n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"list_byok_configs",...e?{uid:e.uid}:{}})).configs)}async createByokConfig(e){return this.daemonAccountQueries?this.daemonAccountQueries.createByokConfig(e):(await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"create_byok_config",config:e})).config)}async updateByokConfig(e){if(this.daemonAccountQueries){await this.daemonAccountQueries.updateByokConfig(e);return}await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"update_byok_config",config:e})}async deleteByokConfig(e){if(this.daemonAccountQueries){await this.daemonAccountQueries.deleteByokConfig(e);return}await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"delete_byok_config",target:e})}async checkByokConfig(e){return this.daemonAccountQueries?this.daemonAccountQueries.checkByokConfig(e):(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(){if(this.daemonAccountQueries)try{let t=await this.daemonAccountQueries.accountInfo();if(t&&Object.keys(t).length>0)return t}catch{}else 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(){if(this.daemonAccountQueries)try{return await this.daemonAccountQueries.getUsageInfo()}catch{return null}try{let e=await this.request({type:"get_usage_info"}),t=jt(e?.usage),s=Nt(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 r=await this.request(s);if(!t?.dryRun&&r?.canRewind===!1)throw new Error(typeof r.error=="string"&&r.error.length>0?r.error:"Unable to rewind files.");return r}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 o={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(o.dry_run=!0),await this.request(o)}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 $("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=us(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}:{}}),o=s?.requiresUserAction===!0,r=typeof s?.authUrl=="string"?s.authUrl:void 0;if(o&&r===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return o?{authUrl:r,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=T(this.diagnostics,"query","close",()=>this.performClose())),this.closePromise}async performClose(){if(this.closed)return;if(!(this.cliCapabilities?.has(xt)===!0)&&(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 T(this.diagnostics,"query","flush",()=>this.endInputFlushPromise??this.flushBeforeEndInput())}catch(o){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",o)}this.closed=!0;for(let[,o]of this.pendingInboundRequests)o.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let t=new Error("SDK closing");for(let[o,r]of this.sdkMcpTransports){try{await T(this.diagnostics,"query","mcp_close",()=>r.close())}catch(i){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${o}":`,i)}io(o,t,this.pendingMcpResponses)}let s;try{await T(this.diagnostics,"query","transport_close",()=>this.transport.close())}catch(o){s={error:o}}try{await T(this.diagnostics,"query","read_loop",()=>this.readLoopPromise)}catch{}if(await T(this.diagnostics,"query","transcript_flush",()=>this.flushTranscriptMirrorForLifecycle()),s)throw s.error}async[Symbol.asyncDispose](){await this.close()}};function ru(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,o=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(o){let r=s??o[1];return(!s||s===o[1])&&(e=o[2]||e),{error:e,code:r}}return s?{error:e,code:s}:{error:e}}function Po(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Lt=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 Co}from"crypto";var iu="QODER_CLOUD_AGENT_API_BASE",au="https://api.qoder.com/api/v1/cloud",ce={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},uu=1024,Eo=1*1024*1024,To=4*1024*1024,cu=8*1024,Pn=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"}},Ut=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Cn=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}},lu=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Do(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(r=>n[r]!==void 0&&!lu.has(r));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 Ut;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&je(t)&&Rn(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&je(s)&&Rn(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&je(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 o=!!s&&je(s);if(!o&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!o){if(!s||!Rn(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 je(n){return"id"in n&&n.id!==void 0}function Rn(n){return"create"in n&&n.create!==void 0}function xo(n){return new En(n)}var En=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Pu();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Io();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=du(e.options.auth,e.options.env),this.apiBase=pu(),this.inputStream=new ue(()=>{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(ku(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=_u(t);this.beginPendingTurn();let o=await this.postSessionEvents([{type:ce.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(o.find(r=>r.type===ce.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:ce.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async sendHostAction(e){throw new Error("Host actions are not supported by Cloud Agent queries.")}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&&je(e))t=e.id;else{let s=await this.resolveAgentId(),o=e.create,r=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...fu(o)}});t=Ao(r,"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(je(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:mu(e.create)});return Ao(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 Ru(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 o=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!o.ok)throw this.handleAuthFailure(o.status),await Mo(o);if(!o.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(o.body)}async readSseBody(e){let t=e.getReader(),s=new TextDecoder,o="",r={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){o+=s.decode(),o.length>0&&this.consumeSseLine(o,r);break}o+=s.decode(a,{stream:!0});let u;for(;(u=o.indexOf(`
|
|
20
|
+
`))!==-1;){let c=o.slice(0,u);o=o.slice(u+1);let l=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(l,r),this.closed)break}o.length>Eo&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Eo} bytes; resetting buffer.`),o="",r.id=void 0,r.event=void 0,r.data.length=0,r.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:yu(t.data.join(`
|
|
21
|
+
`))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let s=e.indexOf(":"),o=s===-1?e:e.slice(0,s),r=s===-1?"":e.slice(s+1);switch(r.startsWith(" ")&&(r=r.slice(1)),o){case"id":t.id=r;break;case"event":t.event=r;break;case"data":if(t.dataBytes+r.length>To){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${To} bytes; dropping event.`),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}t.data.push(r),t.dataBytes+=r.length;break}}handleSseEvent(e){if(this.closed)return;let t=z(e.data,"type")??e.event,s=z(e.data,"turn_id"),o={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Co(),session_id:this.sessionId??z(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(o),!this.isCurrentTurnEvent(s)){this.bufferPendingTurnEvent(e,t,s);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case ce.agentMessage:{let s=vu(ot(e.data,"content"));s&&this.assistantTextParts.push(s);return}case ce.modelRequestEnd:this.captureUsage(e.data);return;case ce.idle:this.idleSeen=!0,this.finishIfIdle();return;case ce.error:this.emitErrorResult(e),this.finish();return;case ce.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Io(),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>=uu&&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(z(e.data,"error")??z(Kt(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:Co(),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 gu(s)}captureUsage(e){let t=Kt(e,"usage");if(!t)return;this.latestUsage=wu(this.latestUsage,t);let s=L(e,"total_cost_usd")??L(e,"cost_usd")??L(t,"total_cost_usd")??L(t,"cost_usd");s!==void 0&&(this.totalCostUsd+=s);let o=z(e,"model")??z(t,"model");if(o){let r=this.latestModelUsage[o]?.costUSD??0;this.latestModelUsage[o]=bu(this.latestUsage,r+(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 Mo(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 du(n,e){if(n?.type!=="accessToken")throw new Ut;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 Pn(t);return s}function pu(){return process.env[iu]?.replace(/\/+$/,"")??au}function mu(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 fu(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 Ao(n,e){let t=z(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function gu(n){let e=Su(n,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:z(t,"id"),turnId:z(t,"turn_id"),type:z(t,"type")}]):[]}async function Mo(n){let e=await hu(n,cu);return new Cn(n.status,e||n.statusText||"unknown error")}async function hu(n,e){if(!n.body)try{return(await n.text()).slice(0,e)}catch{return""}let t=n.body.getReader(),s=new TextDecoder,o=[],r=0;try{for(;r<e;){let{done:i,value:a}=await t.read();if(i)break;r+=a.byteLength,o.push(s.decode(a,{stream:!0}))}o.push(s.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return o.join("").slice(0,e)}function yu(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function Kt(n,e){let t=ot(n,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function Su(n,e){let t=ot(n,e);return Array.isArray(t)?t:void 0}function z(n,e){let t=ot(n,e);return typeof t=="string"?t:void 0}function L(n,e){let t=ot(n,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ot(n,e){if(!(n===null||typeof n!="object"||Array.isArray(n)))return n[e]}function vu(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Oo(t)?t.text:"").filter(Boolean).join("")||void 0}function wu(n,e){let t=Kt(e,"cache_creation"),s=Kt(e,"server_tool_use");return{...n,cache_creation:{ephemeral_1h_input_tokens:L(t,"ephemeral_1h_input_tokens")??n.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:L(t,"ephemeral_5m_input_tokens")??n.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:L(e,"cache_creation_input_tokens")??n.cache_creation_input_tokens,cache_read_input_tokens:L(e,"cache_read_input_tokens")??n.cache_read_input_tokens,input_tokens:L(e,"input_tokens")??n.input_tokens,output_tokens:L(e,"output_tokens")??n.output_tokens,server_tool_use:{web_fetch_requests:L(s,"web_fetch_requests")??n.server_tool_use.web_fetch_requests,web_search_requests:L(s,"web_search_requests")??n.server_tool_use.web_search_requests}}}function bu(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 _u(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Oo(t)?t.text:JSON.stringify(t)).join(`
|
|
22
|
+
`):JSON.stringify(e)}function Oo(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function ku(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 Io(){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 Ru(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function Pu(){let n,e;return{promise:new Promise((s,o)=>{n=s,e=o}),resolve:n,reject:e}}import{access as Du,chmod as Uo,cp as xu,mkdtemp as Ou,mkdir as Ko,realpath as Bo,rm as jo,writeFile as qu}from"fs/promises";import{homedir as Nu,tmpdir as ju}from"os";import{dirname as Fu,isAbsolute as $o,join as _e,relative as Lu,resolve as Mn,sep as Uu}from"path";import{homedir as Cu}from"os";import{join as No}from"path";var Eu=w.configDirName,Tu=w.cliHomeEnv,Au=w.configDirEnv,qo=200;function Mu(){return process.env[Tu]||Cu()}function An(){let n=process.env[Au];return n||No(Mu(),Eu)}function Fe(){return No(An(),"projects")}function Iu(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function U(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=qo)return e;let t=Math.abs(Iu(n)).toString(36);return`${e.slice(0,qo)}-${t}`}var Ku=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Bu=6e4;async function zo(n){if(n.resume===void 0&&!n.continue)return;let e=U(await Qu(n.cwd)),t=n.loadTimeoutMs??Bu,s=n.resume!==void 0?n.resume:await Gu(n.store,e,t);if(s===void 0||!Ku.test(s))return;let o={projectKey:e,sessionId:s},r=await Fo(n.store,o,t);if(!r)return;let i=n.store.listSubkeys?await In(n.store.listSubkeys(o),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!Wu(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let l=await Fo(n.store,{...o,subpath:c},t);l&&a.push({subpath:c,entries:l})}let u;try{u=await Ou(_e(ju(),"qoder-session-store-")),await Uo(u,448),u=await Bo(u),await zu($u(n.env),u);let c=_e(u,"projects",e),l=_e(c,s);await Ko(c,{recursive:!0,mode:448}),await Lo(_e(c,`${s}.jsonl`),r);for(let{subpath:p,entries:d}of a){let f=Ju(l,`${p}.jsonl`),y=d.filter(S=>S.type==="agent_metadata"),g=d.filter(S=>S.type!=="agent_metadata");if(g.length>0&&await Lo(f,g),y.length>0){let S={...y.at(-1)};delete S.type,await Qo(f.slice(0,-6)+".meta.json",JSON.stringify(S))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await jo(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await jo(u,{recursive:!0,force:!0}),c}}function $u(n){let e=n?.[w.cliHomeEnv]??process.env[w.cliHomeEnv]??Nu();return Mn(n?.[w.configDirEnv]??process.env[w.configDirEnv]??_e(e,w.configDirName))}async function zu(n,e){for(let t of[".auth","oauth_creds.json"]){let s=_e(n,t);try{await Du(s),await xu(s,_e(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(o){if(o.code!=="ENOENT")throw o}}}async function Qu(n){let e=Mn(n??process.cwd());try{return await Bo(e)}catch{return e}}async function Gu(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await In(n.listSessions(e),t,"listSessions");if(!Array.isArray(s))throw new Error("SessionStore listSessions() must return an array");return s.slice().sort((o,r)=>r.mtime-o.mtime)[0]?.sessionId}async function Fo(n,e,t){let s=await In(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((o,r)=>Hu(o,r))}}function Hu(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 Wu(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||$o(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Ju(n,e){let t=Mn(n,e),s=Lu(n,t);if(s===""||s===".."||s.startsWith(`..${Uu}`)||$o(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Lo(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
|
|
23
|
+
`);await Qo(n,t?`${t}
|
|
24
|
+
`:"")}async function Qo(n,e){await Ko(Fu(n),{recursive:!0,mode:448}),await qu(n,e,{encoding:"utf8",mode:384}),await Uo(n,384)}async function In(n,e,t){let s;n.catch(()=>{});try{return await Promise.race([n,new Promise((o,r)=>{s=setTimeout(()=>r(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{s!==void 0&&clearTimeout(s)}}var Vu=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function Yu(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return Vu.test(e)}function Le(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?Yu(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 Go from"node:path";function Ue(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function rt(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function Xu(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(Ue(s.id,`options.memory.generation.roots[${t}].id`),Ue(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){Ue(s.indexFile,`options.memory.generation.roots[${t}].indexFile`);let o=s.indexFile.replaceAll("\\","/");if(Go.posix.isAbsolute(o)||Go.win32.isAbsolute(s.indexFile)||o.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function Zu(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(Ue(s.id,`options.memory.consumption.files[${t}].id`),Ue(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 Ho(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 rt(n.generation?.onResult,"options.memory.generation.onResult"),rt(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");Xu(s.roots),s.prompt!==void 0&&Ue(s.prompt,"options.memory.generation.prompt"),rt(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(rt(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 o,r=n.consumption;if(r!==void 0){if(!r||typeof r!="object")throw new TypeError("options.memory.consumption must be an object");if(r.enabled!==void 0&&typeof r.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(Zu(r.files),r.maxTokens!==void 0&&(!Number.isInteger(r.maxTokens)||r.maxTokens<=0))throw new TypeError("options.memory.consumption.maxTokens must be a positive integer");if(r.overflow!==void 0&&r.overflow!=="truncate"&&r.overflow!=="fail_query")throw new TypeError('options.memory.consumption.overflow must be "truncate" or "fail_query"');if(r.failureMode!==void 0&&r.failureMode!=="best_effort"&&r.failureMode!=="fail_query")throw new TypeError('options.memory.consumption.failureMode must be "best_effort" or "fail_query"');rt(r.onResult,"options.memory.consumption.onResult"),o={enabled:r.enabled??!0,files:r.files?.map(i=>({...i,required:i.required??!1})),maxTokens:r.maxTokens,overflow:r.overflow,failureMode:r.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:o},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:s?.onResult,onConsumptionResult:r?.onResult}}}var Bt=10;function ec(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 Wo(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 tc(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&&ec(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=Wo(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 o=n.turnComplete.shouldReview?"skill_evolution_should_review_0":void 0;o&&e.shouldReviewCallbacks.set(o,n.turnComplete.shouldReview),t={enabled:n.turnComplete.enabled??!0,reviewThreshold:s,shouldReviewCallbackId:o,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 Jo(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 o=e?.turnComplete;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(Object.keys(o).some(i=>i!=="reviewThreshold"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.turnComplete.reviewThreshold')}let r=Wo(o?.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",...r===void 0?{}:{generation:{turnComplete:{reviewThreshold:r}}}},callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}})}let t=tc(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as uc}from"node:child_process";import{join as cc}from"node:path";var nc=3e4;function Dn(n,e=nc){return ac(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return sc(n,t,e);case"daemon.auth.fetch_service_account_token":return oc(n,t,e);default:throw q("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}async function sc(n,e,t){if(n.type!=="jobToken")throw q("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=Vo(e,["reason","session_id"]),o=Yo(s.reason),r=rc(s.session_id,"session_id"),i=new AbortController;try{let a=await Xo(()=>n.fetchJobToken({requestId:e.request_id,reason:o,sessionId:r},{signal:i.signal}),t,i);if(!a||typeof a.token!="string"||!a.token)throw q("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback did not provide a token");let u=a.expiresAt;if(u!==void 0&&(!Number.isFinite(u)||u<1e12))throw q("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback returned invalid expiresAt");return{token:a.token,...u!==void 0?{expires_at:u}:{}}}catch(a){throw a instanceof we?a:q("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback failed",!0)}}async function oc(n,e,t){if(n.type!=="serviceAccount"||typeof n.fetchServiceAccountToken!="function")throw q("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host Service Account token callback is not configured");let s=Vo(e,["reason","required_scopes"]);Yo(s.reason),ic(s.required_scopes,"required_scopes");let o=new AbortController;try{let r=await Xo(()=>n.fetchServiceAccountToken(),t,o);if(!r||typeof r.token!="string"||!r.token)throw q("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback did not provide a token");let i=r.expiresAt;if(i!==void 0&&(!Number.isFinite(i)||i<1e12))throw q("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback returned invalid expiresAt");return{token:r.token,...i!==void 0?{expires_at:i}:{}}}catch(r){throw r instanceof we?r:q("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback failed",!0)}}function Vo(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw q("DAEMON_AUTH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function Yo(n){if(n!=="initial"&&n!=="unauthorized")throw q("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function rc(n,e){if(n!==void 0){if(typeof n!="string"||!n)throw q("DAEMON_AUTH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}}function ic(n,e){if(!Array.isArray(n)||n.some(t=>typeof t!="string"))throw q("DAEMON_AUTH_INVALID_REQUEST",`${e} must be an array of strings`);return n}async function Xo(n,e,t){let s;try{return await Promise.race([Promise.resolve().then(n),new Promise((o,r)=>{s=setTimeout(()=>{t.abort(),r(new Error("daemon auth callback timed out"))},e),s.unref?.()})])}finally{s&&clearTimeout(s)}}function ac(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function q(n,e,t=!1){return new we({code:n,message:e,retryable:t})}var lc="QODER_AGENT_SDK_DAEMON",dc="ELECTRON_RUN_AS_NODE",Zo="--sdk",it=2e3,er=8192,tr=255,Ke=new WeakMap;function Nn(n){return Ke.get(n)}async function jn(n){hc(n.initializeTimeoutMs);let e=n.noProxy===void 0?void 0:n.noProxy.trim(),t=new K({auth:n.auth,env:n.env,proxy:n.proxy,vpcEndpoint:n.vpcEndpoint}),s=await t.prepare(),o=n.auth?_t(n.auth,n.env):void 0,r=await yc({pathToQoderCLIExecutable:n.pathToQoderCLIExecutable,executable:n.executable,executableArgs:n.executableArgs}),i=e===void 0?s.env:{...s.env,NO_PROXY:e,no_proxy:e},a={...i,...r.env,[lc]:"1"},u,c=new ae({debug:n.debug,debugFile:n.debugFile??Fn(n),stderr:n.stderr});try{u=await qn.spawn({command:r.command,args:r.args,env:a,stderrHandler:n.stderr}),c.record(`[Daemon] spawned pid=${u.process.pid}`);let l=new Dt({input:u.process.stdin,output:u.process.stdout,requestHandler:n.auth?Dn(n.auth):void 0,diagnostics:c,describeUnexpectedClose:()=>u.describeUnexpectedClose()});u.setConnection(l);let m=Date.now();await l.initialize(yt,{capabilities:["session_delete_v1",wn,xt],...o===void 0?{}:{auth:o},...n.proxy===void 0?{}:{proxy:n.proxy},...e===void 0?{}:{noProxy:e},...n.initializeTimeoutMs===void 0?{}:{timeoutMs:n.initializeTimeoutMs}}),c.record(`[Daemon] initialized in ${Date.now()-m}ms`);let p=l.supportsCapability(Se);n.proxy!==void 0&&!p&&c.record(`[Daemon] proxy requested but ${Se} is not supported by this CLI; the proxy was not applied to the daemon`);let d=n.proxy!==void 0&&p&&n.proxy.trim()||null,f=l.supportsCapability(ve);if(e!==void 0&&!f)throw new h(`daemon is missing required capability: ${ve}`);let y=e===void 0||!f?null:e||null,g=e;await t.cleanupAuthPayload();let S=new xn(l,u,n.env,c);return Ke.set(S,{hostActionLaunch:{proxy:n.proxy,noProxy:g,cliPath:n.pathToQoderCLIExecutable,env:n.env},auth:n.auth,proxy:d,noProxy:y,transportProvider:new On(l,i)}),S}catch(l){throw await t.cleanupAuthPayload(),await u?.stop().catch(()=>{}),l}}var xn=class{constructor(e,t,s,o){this.connection=e;this.processController=t;this.env=s;this.diagnostics=o;this.connection.onFailure(r=>this.acceptDaemonFailure(r)),this.processController.onFailure(r=>this.acceptDaemonFailure(r))}currentState="ready";stopPromise;get state(){return this.currentState}onFailure(e){return this.connection.onFailure(e)}async listSessions(e){return this.requireReady(),(await this.connection.listSessions(e)).map(nr)}async renameSession(e,t,s){if(this.requireReady(),typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");let o=pc(t),r=await this.connection.renameSession(e,o,s);return nr(r.session)}async deleteSession(e,t){if(this.requireReady(),typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");await this.connection.deleteSession(e,t)}async setProxy(e,t){this.requireReady();let s=t?.noProxy,o=await this.connection.setProxySettings(e,s),r=Ke.get(this);return r&&(r.proxy=o.proxy,r.hostActionLaunch.proxy=o.proxy??void 0,s!==void 0&&(r.noProxy=o.noProxy,r.hostActionLaunch.noProxy=o.noProxy===null?null:o.noProxy)),o.proxy}getProxy(){return Ke.get(this)?.proxy??null}getNoProxy(){return Ke.get(this)?.noProxy??null}async auth(e){this.requireReady();let t;if(e!==void 0){t=_t(e,this.env),this.connection.setRequestHandler(Dn(e));let o=Ke.get(this);o&&(o.auth=e)}return(await this.connection.authenticate(t)).authenticated}async getModels(e={}){return this.requireReady(),(await this.connection.query("get_models",{...e.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e.uid?{uid:e.uid}:{},...e.outerProviders?{outerProviders:e.outerProviders}:{}})).models}async getByokConfig(){return this.requireReady(),(await this.connection.query("get_byok_config",{})).providers}async validateByokModel(e){return this.requireReady(),(await this.connection.query("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}:{},...e.model_type!==void 0?{model_type:e.model_type}:{},...e.provider_type!==void 0?{provider_type:e.provider_type}:{}})).success}async listByokConfigs(){return this.requireReady(),(await this.connection.query("list_byok_configs",{})).configs}async createByokConfig(e){return this.requireReady(),(await this.connection.query("create_byok_config",{config:e})).config}async updateByokConfig(e){this.requireReady(),await this.connection.query("update_byok_config",{config:e})}async deleteByokConfig(e){this.requireReady(),await this.connection.query("delete_byok_config",{target:e})}async checkByokConfig(e){return this.requireReady(),this.connection.query("check_byok_config",{config:e})}async listPlugins(){return this.requireReady(),(await this.connection.query("list_plugins",{})).plugins}supportsCapability(e){return this.connection.supportsCapability(e)}async validatePlugins(e,t={}){if(this.requireReady(),!Array.isArray(e)||e.length===0||e.some(s=>typeof s!="string"||s.length===0))throw new TypeError("paths must be a non-empty array of non-empty strings");return this.connection.validatePlugins(e,t.configDir)}async getUsageInfo(){this.requireReady();let e=await this.connection.query("get_usage_info",{}),t=jt(e.usage),s=Nt(e.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}async accountInfo(){return this.requireReady(),(await this.connection.query("account_info",{})).account}stop(){return this.stopPromise||(this.processController.beginStopping(),this.currentState!=="failed"&&this.setDaemonState("stopping"),this.stopPromise=this.stopInternal()),this.stopPromise}async stopInternal(){try{await this.connection.shutdown().catch(()=>{}),await this.processController.stop(),this.currentState!=="failed"&&this.setDaemonState("stopped")}catch(e){throw this.setDaemonState("failed",e instanceof Error?e:new Error(String(e))),e}}acceptDaemonFailure(e){this.currentState==="ready"&&this.setDaemonState("failed",e),e instanceof qe&&this.processController.stop().then(({settledAfterSigkill:t})=>{t||this.diagnostics?.record("[Daemon] heartbeat reclaim: process still present after SIGKILL grace; left to OS")}).catch(t=>{this.diagnostics?.record("[Daemon] heartbeat reclaim: forced stop failed",t)})}setDaemonState(e,t){this.currentState!==e&&(this.currentState=e)}requireReady(){if(this.currentState!=="ready")throw new Error("Daemon is not ready")}};function pc(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>tr)throw new TypeError(`title must be at most ${tr} characters`);return e}function nr(n){return{localSessionId:n.local_session_id,title:n.title,...n.cwd?{cwd:n.cwd}:{},state:n.state,createdAt:n.created_at,updatedAt:n.updated_at}}var On=class{constructor(e,t){this.connection=e;this.daemonEnv=t}create(e){let t=new K({...e,auth:void 0,env:this.daemonEnv}),s=t.buildArgs(),o=gc(s),r=o===void 0?void 0:this.connection.claimSessionId(o);try{return this.connection.createSessionTransport({workerArgs:s,claim:r,cwd:e.cwd??process.cwd(),...e.materializedSessionConfigDir!==void 0?{configDir:e.materializedSessionConfigDir}:{},cleanup:()=>t.cleanupGeneratedSettings()})}catch(i){throw r&&this.connection.releaseSessionClaim(r.sessionId),i}}};function mc(n){let e=n.findIndex(t=>t==="--session-id"||t==="--resume");if(e>=0&&e+1<n.length)return n[e+1];for(let t of n)if(t.startsWith("--session-id="))return t.slice(13)}function fc(n){let e=n.findIndex(t=>t==="--session-id");if(e>=0&&e+1<n.length)return n[e+1];for(let t of n)if(t.startsWith("--session-id="))return t.slice(13)}function gc(n){return n.includes("--fork-session")?fc(n):mc(n)}function hc(n){if(n!==void 0&&(!Number.isSafeInteger(n)||n<=0))throw new TypeError("initializeTimeoutMs must be a positive integer")}async function yc(n){let e=Le(n,ge),t,s={};if(e.transport==="worker"){let o=await De(ie(e.pathToQoderWorkerRuntime));t=o.runtimePath,s=o.env}else t=n.pathToQoderCLIExecutable??oe();return se(t)?{command:n.executable??process.execPath,args:[...n.executableArgs??[],t,Zo],env:{...s,...typeof process.versions.electron=="string"?{[dc]:"1"}:{}}}:{command:t,args:[Zo],env:s}}var qn=class n{constructor(e,t){this.process=e;this.stderrHandler=t;this.exited=new Promise(s=>{e.once("exit",()=>s()),e.once("error",()=>s())}),this.closed=new Promise(s=>{e.once("close",()=>s()),e.once("error",()=>s())}),e.stderr?.on("data",s=>{let o=s.toString("utf8");if(this.stderrTail+=o,this.stderrTail.length>er&&(this.stderrTail=this.stderrTail.slice(-er)),!!this.stderrHandler)try{this.stderrHandler(o)}catch{}}),e.once("error",s=>{this.reportFailure(new O(`Failed to spawn Qoder CLI daemon: ${s.message}`,{stderr:this.getStderr(),cause:s}))}),e.once("exit",(s,o)=>{this.exitInfo={code:s,signal:o},!this.stopping&&at(this.closed,it).then(()=>{if(this.stopping)return;let r=this.getStderr(),i=s!==null?`Qoder CLI daemon exited with code ${s}`:`Qoder CLI daemon terminated by signal ${o}`;this.reportFailure(new O(r?`${i}
|
|
22
25
|
daemon stderr:
|
|
23
|
-
${r}`:i,{exitCode:s,signal:o,stderr:r}))})})}connection;failure;failureListeners=new Set;stderrTail="";exited;closed;exitInfo;stopping=!1;async describeUnexpectedClose(){if(!await
|
|
26
|
+
${r}`:i,{exitCode:s,signal:o,stderr:r}))})})}connection;failure;failureListeners=new Set;stderrTail="";exited;closed;exitInfo;stopping=!1;async describeUnexpectedClose(){if(!await at(this.closed,it))return;let e=this.exitInfo;if(!e)return;let t=this.getStderr(),s=e.code!==null?`Qoder CLI daemon exited with code ${e.code}`:`Qoder CLI daemon terminated by signal ${e.signal}`;return new O(t?`${s}
|
|
24
27
|
daemon stderr:
|
|
25
|
-
${t}`:s,{exitCode:e.code,signal:e.signal,stderr:t})}static async spawn(e){let t;try{t=
|
|
26
|
-
`)})}async function yc(n,e,t){if(e?.type==="serviceAccount")throw new Error("Host actions are not supported for Service Account authentication");if(e?.type!=="jobToken")return;let s=new AbortController,o;try{let r=await Promise.race([Promise.resolve().then(()=>e.fetchJobToken({requestId:gc(),reason:"initial",sessionId:n.session_id},{signal:s.signal})),new Promise((i,a)=>{o=setTimeout(()=>{s.abort(),a(new Error("Host action authentication timed out"))},Math.min(t,3e4))})]);if(!r?.token?.trim()||r.expiresAt!==void 0&&(!Number.isFinite(r.expiresAt)||r.expiresAt<=Date.now()))throw new Error("Host action credentials are unavailable or expired");return{type:e.type,token:r.token,expiresAt:r.expiresAt}}catch{throw new Error("Host action authentication failed")}finally{o&&clearTimeout(o)}}async function Sc(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??Zo(),s=e?.timeout??6e4,o=["feedback","-c",n.content,"--json"];if(e?.storageDir&&o.push("--storage-dir",e.storageDir),n.sessionId&&o.push("-s",n.sessionId),n.workdir&&o.push("--workdir",n.workdir),n.email&&o.push("--email",n.email),n.include)for(let r of n.include)o.push("--include",r);if(n.imagePaths)for(let r of n.imagePaths)o.push("--images",r);if(n.callerVersion&&o.push("--caller-version",n.callerVersion),e?.integrationMode){let r=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;r&&o.push("--ide-type",r)}return new Promise(r=>{mc(t,o,{env:e?.env??process.env,timeout:s,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);r({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}r(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var jn=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 vc(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=On(e);if(!s)throw new Error("options.daemon must be returned by startDaemon().");return s.transportProvider}if(n.transport!==void 0){if(Rs(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=Fe(n,ge);return t.transport==="worker"?new De({pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Me.default}function Fn(n){let e=Date.now(),{prompt:t,options:s={}}=n,o=s.daemon,r;o&&(r=wc(s));let i=o?On(o):void 0,a=s.sessionStore,u=s.sessionStoreFlush??"batched",c=vc(s,o),d=new ae({onCloseDiagnostic:s.onCloseDiagnostic,debug:s.debug,debugFile:s.debugFile,stderr:s.stderr});if(o!==void 0&&d.record("[DaemonRoute] explicit_daemon transport_overridden"),s.canUseTool&&s.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");if(s.planMode!==void 0&&typeof s.planMode!="boolean")throw new TypeError("options.planMode must be a boolean");s.goalMaxTurns!==void 0&&Ze(s.goalMaxTurns);let m=i?.auth??s.auth;if(m==null)throw new jn;if(s.hostActions!==void 0&&m.type==="serviceAccount")throw new Error("Host actions are not supported for Service Account authentication: Tracking requires a user signing context");let p=a!==void 0&&s.forkSession===!0;if(a&&s.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${w.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(a&&i===void 0&&!(c instanceof Me)&&!(c instanceof De))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(a&&s.sessionStoreFlush!==void 0&&s.sessionStoreFlush!=="batched"&&s.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(a&&s.loadTimeoutMs!==void 0&&(!Number.isFinite(s.loadTimeoutMs)||s.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(a&&s.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(s.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(s.experimentalCloudAgent!==void 0)return Eo(s),To({prompt:t,options:s,diagnostics:d});let l=Bo(s.memory),f=zo(s.evolution?.skill),S=s.onAuthExpired,g=!1,v=S?()=>{g||(g=!0,Promise.resolve(S()).catch(k=>{d.record("[query] onAuthExpired callback threw:",k)}))}:void 0,b=new Map,y=new Map,I=new Map,M={},Z={},R={};if(s.mcpServers)for(let[k,D]of Object.entries(s.mcpServers)){let G=D.tools;if(Array.isArray(G)&&G.length>0&&(Z[k]=G),D.type==="sdk"&&"instance"in D&&D.instance){let te=D.instance;if(b.set(k,te),G){let mt=Xt(k,G);mt&&(R[k]=mt)}let ns=new Nt(mt=>{eo(k,mt,I)});y.set(k,ns),te.connect(ns).catch(()=>{})}else M[k]=D}let X=Object.keys(M).length>0,Qe=Object.keys(Z).length>0,Wt=s.pathToQoderCLIExecutable,Jt=s.env,ee=m?.type==="jobToken"?m.fetchJobToken:void 0,lt=m?.type==="serviceAccount"?m.fetchServiceAccountToken:void 0,dt={pathToQoderCLIExecutable:Wt,executable:s.executable,executableArgs:s.executableArgs,env:Jt,proxy:s.proxy,vpcEndpoint:s.vpcEndpoint,cwd:s.cwd,closeGraceMs:s.closeGraceMs,auth:m,model:s.model,agent:s.agent,debug:s.debug,diagnostics:d,maxTurns:s.maxTurns,includePartialMessages:s.includePartialMessages,includeHookEvents:s.includeHookEvents,sessionMirror:a!==void 0,permissionMode:s.permissionMode,allowDangerouslySkipPermissions:s.allowDangerouslySkipPermissions,permissionPromptToolName:s.permissionPromptToolName,canUseTool:s.canUseTool!==void 0,continue:s.continue,resume:s.resume,resumeSessionAt:s.resumeSessionAt,resumeDropsTurn:s.resumeDropsTurn,forkSession:s.forkSession,sessionId:s.sessionId,persistSession:s.persistSession,allowedTools:(()=>{let k=s.allowedTools??[];if(s.skills===void 0)return k.length>0?k:void 0;let D=s.skills==="all"?["Skill"]:s.skills.map(te=>`Skill(${te})`),G=new Set(k);return[...k,...D.filter(te=>!G.has(te))]})(),disallowedTools:s.disallowedTools,tools:s.tools,toolConfig:s.toolConfig,extensions:s.extensions,extraArgs:s.extraArgs,mcpServers:X?M:void 0,mcpToolPolicies:Qe?Z:void 0,allowedMcpServerNames:s.allowedMcpServerNames,strictMcpConfig:s.strictMcpConfig,settings:s.settings,securityScan:s.securityScan,settingSources:s.settingSources,additionalDirectories:s.additionalDirectories,plugins:s.plugins,enableFileCheckpointing:s.enableFileCheckpointing,stderr:"pipe",stderrHandler:s.stderr,spawnQoderCLIProcess:s.spawnQoderCLIProcess,onAuthExpired:v},pt,Zn=a!==void 0&&(s.resume!==void 0||s.continue===!0)?new Ct(async()=>{let k=await Lo({store:a,cwd:s.cwd,resume:s.resume,continue:s.continue,loadTimeoutMs:s.loadTimeoutMs,env:s.env});if(!k)return{transport:kt(c,{...dt,continue:!1})};pt=er(s.env);try{return{transport:kt(c,{...dt,env:{...dt.env??process.env,[w.configDirEnv]:k.configDir,...s.hostActions!==void 0?{QODERCLI_HOST_ACTION_STORAGE_DIR:pt}:{}},materializedSessionConfigDir:k.configDir,continue:!1,resume:k.sessionId}),cleanup:k.cleanup}}catch(D){throw await k.cleanup(),D}}):kt(c,dt);Zn.initialize().catch(()=>{});let Kr=typeof t=="string",Re=s.systemPrompt,es,ts;if(typeof Re=="string")es=Re;else if(typeof Re=="object"&&Re!==null&&Re.type==="preset"){let k=Re;if(k.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(k.preset)}`);ts=k.append}let Br={sdkStartedAtMs:e,systemPrompt:es,appendSystemPrompt:ts,modelRequestPatches:s.modelRequestPatches,agents:s.agents,skills:Array.isArray(s.skills)?s.skills:void 0,planMode:o!==void 0?s.planMode??!1:s.planMode,promptSuggestions:s.promptSuggestions,hostActions:s.hostActions,goalMaxTurns:s.goalMaxTurns,enableFileCheckpointing:s.enableFileCheckpointing,memory:l.config,evolution:f.config?{skill:f.config}:void 0,customContext:s.customContext,beforeInitialize:void 0,requireSessionStoreForkBarrier:p,...o!==void 0?{independentPlanModeControls:!0,permissionMode:r}:{}},Vt=new qt(Zn,Kr,s.canUseTool,s.hooks,s.abortController,b,Br,s.onElicitation,d,v,s.controlRequestTimeoutMs,y,I,ee,s.resolveModel,s.resolveModelTimeoutMs,a,u,R,lt,l.callbacks,f.callbacks,s.resolveSessionArtifacts,async k=>{let D=i?.hostActionLaunch,G=new U({auth:m,vpcEndpoint:s.vpcEndpoint,env:{...D?.env??s.env??process.env,...pt!==void 0?{QODERCLI_HOST_ACTION_STORAGE_DIR:pt}:{}}});try{let te=await G.prepare();await tr(k,{cliPath:D?.cliPath??s.pathToQoderCLIExecutable,env:te.env,cwd:s.cwd,auth:m,proxy:D?.proxy??s.proxy})}finally{await G.cleanupAuthPayload()}},i!==void 0,i!==void 0?o:void 0,o?()=>o.getProxy():void 0);if(typeof t=="string"){let k={type:"user",extra:{submitted_at_ms:e},message:{role:"user",content:[{type:"text",text:t}]},parent_tool_use_id:null};Vt.streamInput(async function*(){yield k}())}else Vt.streamInput(t);return Vt}function wc(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=Xe(n.permissionMode),s=[["auth",n.auth],["transport",n.transport],["env",n.env],["pathToQoderCLIExecutable",n.pathToQoderCLIExecutable],["executable",n.executable],["executableArgs",n.executableArgs],["proxy",n.proxy],["vpcEndpoint",n.vpcEndpoint],["spawnQoderCLIProcess",n.spawnQoderCLIProcess],["closeGraceMs",n.closeGraceMs],["sessionStore",n.sessionStore]].find(([,o])=>o!==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 bc=1e3,Ln=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}}},Un=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 kc(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 Ln,s=Fn({prompt:t,options:n.options}),o,r;try{return await Promise.race([s.initializationResult(),new Promise((i,a)=>{o=setTimeout(()=>{a(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 Un(s,t)}catch(i){t.discard();let a=n.options?.closeGraceMs??ne,u=(Number.isFinite(a)?Math.max(0,a):ne)+bc;throw await Promise.race([s.close().catch(()=>{}),new Promise(c=>{r=setTimeout(c,u)})]),i}finally{o!==void 0&&clearTimeout(o),r!==void 0&&clearTimeout(r)}}import{readFile as _c}from"node:fs/promises";import Rc from"node:os";import z from"node:path";var Cc=["user","project","local"],$n=new Set(["__proto__","constructor","prototype"]),Pc=/^[\p{L}\p{N}\p{M}._ -]+$/u,Ec=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Tc=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),Mc=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),Ac=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 ke(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function Ic(n){let e=n.charCodeAt(0)===65279?n.slice(1):n,t="",s=!1,o=!1,r=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(r){u===`
|
|
28
|
+
${t}`:s,{exitCode:e.code,signal:e.signal,stderr:t})}static async spawn(e){let t;try{t=uc(e.command,e.args,{env:e.env,stdio:["pipe","pipe","pipe"]}),await vc(t)}catch(s){throw new O(`Failed to spawn Qoder CLI daemon: ${Sc(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,e.stderrHandler)}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(){return this.beginStopping(),await at(this.exited,it)?{settledAfterSigkill:!0}:(this.process.kill("SIGTERM"),await at(this.exited,it)?{settledAfterSigkill:!0}:(this.process.kill("SIGKILL"),{settledAfterSigkill:await at(this.exited,it)}))}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 Sc(n){return n instanceof Error?n.message:String(n)}async function vc(n){n.pid===void 0&&await new Promise((e,t)=>{let s=()=>{n.off("error",o),e()},o=r=>{n.off("spawn",s),t(r)};n.once("spawn",s),n.once("error",o)})}function Fn(n){if(n.debug!==!0)return cc(An(),"logs",`sdk-daemon-${process.pid}-${Date.now()}.log`)}async function at(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)}}import{execFile as wc,spawn as bc}from"child_process";import{randomUUID as _c}from"node:crypto";import{homedir as kc}from"node:os";import{resolve as sr}from"node:path";function or(){return oe()}function rr(n=process.env){return sr(n.QODERCLI_HOST_ACTION_STORAGE_DIR??n[w.configDirEnv]??sr(n[w.cliHomeEnv]??kc(),n[`${w.configDirEnv}_NAME`]??w.configDirName))}async function ir(n,e={}){let t=e.cliPath??or(),s=e.timeout??125e3,o=se(t)?process.execPath:t,r=["feedback","action","send","--json"];e.proxy!==void 0&&r.push("--proxy",e.proxy);let i=await Rc(n,e.auth,s),a=se(t)?[t,...r]:r;await new Promise((u,c)=>{let l=bc(o,a,{cwd:e.cwd,env:{...e.env??process.env,...se(t)&&process.versions.electron?{ELECTRON_RUN_AS_NODE:"1"}:{}},stdio:["pipe","ignore","ignore"]}),m=setTimeout(()=>{l.kill("SIGTERM"),c(new Error("Host action fallback timed out"))},s);m.unref?.(),l.once("error",p=>{clearTimeout(m),c(p)}),l.once("exit",(p,d)=>{clearTimeout(m),p===0?u():c(new Error(`Host action fallback exited with ${p??d??"unknown status"}`))}),l.stdin.on("error",p=>{clearTimeout(m),l.kill("SIGTERM"),c(p)}),l.stdin.end(`${JSON.stringify(i?{event:n,credential:i}:n)}
|
|
29
|
+
`)})}async function Rc(n,e,t){if(e?.type==="serviceAccount")throw new Error("Host actions are not supported for Service Account authentication");if(e?.type!=="jobToken")return;let s=new AbortController,o;try{let r=await Promise.race([Promise.resolve().then(()=>e.fetchJobToken({requestId:_c(),reason:"initial",sessionId:n.session_id},{signal:s.signal})),new Promise((i,a)=>{o=setTimeout(()=>{s.abort(),a(new Error("Host action authentication timed out"))},Math.min(t,3e4))})]);if(!r?.token?.trim()||r.expiresAt!==void 0&&(!Number.isFinite(r.expiresAt)||r.expiresAt<=Date.now()))throw new Error("Host action credentials are unavailable or expired");return{type:e.type,token:r.token,expiresAt:r.expiresAt}}catch{throw new Error("Host action authentication failed")}finally{o&&clearTimeout(o)}}async function Pc(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??or(),s=e?.timeout??6e4,o=["feedback","-c",n.content,"--json"];if(e?.storageDir&&o.push("--storage-dir",e.storageDir),n.sessionId&&o.push("-s",n.sessionId),n.workdir&&o.push("--workdir",n.workdir),n.email&&o.push("--email",n.email),n.include)for(let r of n.include)o.push("--include",r);if(n.imagePaths)for(let r of n.imagePaths)o.push("--images",r);if(n.callerVersion&&o.push("--caller-version",n.callerVersion),e?.integrationMode){let r=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;r&&o.push("--ide-type",r)}return new Promise(r=>{wc(t,o,{env:e?.env??process.env,timeout:s,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);r({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}r(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var Ln=class extends Error{code="auth_not_configured";constructor(){super("The auth option is required when calling query(); configure options.auth so the SDK can create an auth payload file before spawning qodercli."),this.name="AuthNotConfiguredError"}};function Cc(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=Nn(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=Le(n,ge);return t.transport==="worker"?new xe({pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Me.default}function Un(n){let e=Date.now(),{prompt:t,options:s={}}=n,o=s.daemon,r;o&&(r=Ec(s));let i=o?Nn(o):void 0,a=s.sessionStore,u=s.sessionStoreFlush??"batched",c=Cc(s,o),l=new ae({onCloseDiagnostic:s.onCloseDiagnostic,debug:s.debug,debugFile:s.debugFile,stderr:s.stderr});if(o!==void 0&&l.record("[DaemonRoute] explicit_daemon transport_overridden"),s.canUseTool&&s.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");if(s.planMode!==void 0&&typeof s.planMode!="boolean")throw new TypeError("options.planMode must be a boolean");s.goalMaxTurns!==void 0&&nt(s.goalMaxTurns);let m=i?.auth??s.auth;if(m==null)throw new Ln;if(s.hostActions!==void 0&&m.type==="serviceAccount")throw new Error("Host actions are not supported for Service Account authentication: Tracking requires a user signing context");let p=a!==void 0&&s.forkSession===!0;if(a&&s.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${w.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(a&&i===void 0&&!(c instanceof Me)&&!(c instanceof xe))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(a&&s.sessionStoreFlush!==void 0&&s.sessionStoreFlush!=="batched"&&s.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(a&&s.loadTimeoutMs!==void 0&&(!Number.isFinite(s.loadTimeoutMs)||s.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(a&&s.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(s.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(s.experimentalCloudAgent!==void 0)return Do(s),xo({prompt:t,options:s,diagnostics:l});let d=Ho(s.memory),f=Jo(s.evolution?.skill),y=s.onAuthExpired,g=!1,S=y?()=>{g||(g=!0,Promise.resolve(y()).catch(_=>{l.record("[query] onAuthExpired callback threw:",_)}))}:void 0,b=new Map,v=new Map,D=new Map,A={},ee={},R={};if(s.mcpServers)for(let[_,M]of Object.entries(s.mcpServers)){let F=M.tools;if(Array.isArray(F)&&F.length>0&&(ee[_]=F),M.type==="sdk"&&"instance"in M&&M.instance){let Z=M.instance;if(b.set(_,Z),F){let ht=tn(_,F);ht&&(R[_]=ht)}let gt=new Lt(ht=>{ro(_,ht,D)});v.set(_,gt),Z.connect(gt).catch(()=>{})}else A[_]=M}let X=Object.keys(A).length>0,He=Object.keys(ee).length>0,Yt=s.pathToQoderCLIExecutable,Xt=s.env,te=m?.type==="jobToken"?m.fetchJobToken:void 0,pt=m?.type==="serviceAccount"?m.fetchServiceAccountToken:void 0,mt={pathToQoderCLIExecutable:Yt,executable:s.executable,executableArgs:s.executableArgs,env:Xt,proxy:s.proxy,vpcEndpoint:s.vpcEndpoint,cwd:s.cwd,closeGraceMs:s.closeGraceMs,auth:m,model:s.model,agent:s.agent,debug:s.debug,diagnostics:l,maxTurns:s.maxTurns,includePartialMessages:s.includePartialMessages,includeHookEvents:s.includeHookEvents,sessionMirror:a!==void 0,permissionMode:s.permissionMode,allowDangerouslySkipPermissions:s.allowDangerouslySkipPermissions,permissionPromptToolName:s.permissionPromptToolName,canUseTool:s.canUseTool!==void 0,continue:s.continue,resume:s.resume,resumeSessionAt:s.resumeSessionAt,resumeDropsTurn:s.resumeDropsTurn,forkSession:s.forkSession,sessionId:s.sessionId,persistSession:s.persistSession,allowedTools:(()=>{let _=s.allowedTools??[];if(s.skills===void 0)return _.length>0?_:void 0;let M=s.skills==="all"?["Skill"]:s.skills.map(Z=>`Skill(${Z})`),F=new Set(_);return[..._,...M.filter(Z=>!F.has(Z))]})(),disallowedTools:s.disallowedTools,tools:s.tools,toolConfig:s.toolConfig,extensions:s.extensions,extraArgs:s.extraArgs,mcpServers:X?A:void 0,mcpToolPolicies:He?ee:void 0,allowedMcpServerNames:s.allowedMcpServerNames,strictMcpConfig:s.strictMcpConfig,settings:s.settings,securityScan:s.securityScan,settingSources:s.settingSources,additionalDirectories:s.additionalDirectories,plugins:s.plugins,enableFileCheckpointing:s.enableFileCheckpointing,stderr:"pipe",stderrHandler:s.stderr,spawnQoderCLIProcess:s.spawnQoderCLIProcess,onAuthExpired:S},ft,ts=a!==void 0&&(s.resume!==void 0||s.continue===!0)?new Tt(async()=>{let _=await zo({store:a,cwd:s.cwd,resume:s.resume,continue:s.continue,loadTimeoutMs:s.loadTimeoutMs,env:s.env});if(!_)return{transport:Pt(c,{...mt,continue:!1})};ft=rr(s.env);try{return{transport:Pt(c,{...mt,env:{...mt.env??process.env,[w.configDirEnv]:_.configDir,...s.hostActions!==void 0?{QODERCLI_HOST_ACTION_STORAGE_DIR:ft}:{}},materializedSessionConfigDir:_.configDir,continue:!1,resume:_.sessionId}),cleanup:_.cleanup}}catch(M){throw await _.cleanup(),M}}):Pt(c,mt);ts.initialize().catch(()=>{});let Hr=typeof t=="string",Pe=s.systemPrompt,ns,ss;if(typeof Pe=="string")ns=Pe;else if(typeof Pe=="object"&&Pe!==null&&Pe.type==="preset"){let _=Pe;if(_.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(_.preset)}`);ss=_.append}let Wr={sdkStartedAtMs:e,systemPrompt:ns,appendSystemPrompt:ss,modelRequestPatches:s.modelRequestPatches,agents:s.agents,skills:Array.isArray(s.skills)?s.skills:void 0,planMode:o!==void 0?s.planMode??!1:s.planMode,promptSuggestions:s.promptSuggestions,includeShellProgress:s.includeShellProgress,hostActions:s.hostActions,goalMaxTurns:s.goalMaxTurns,enableFileCheckpointing:s.enableFileCheckpointing,memory:d.config,evolution:f.config?{skill:f.config}:void 0,customContext:s.customContext,beforeInitialize:void 0,requireSessionStoreForkBarrier:p,...o!==void 0?{independentPlanModeControls:!0,permissionMode:r}:{}},Zt=new Ft(ts,Hr,s.canUseTool,s.hooks,s.abortController,b,Wr,s.onElicitation,l,S,s.controlRequestTimeoutMs,v,D,te,s.resolveModel,s.resolveModelTimeoutMs,a,u,R,pt,d.callbacks,f.callbacks,s.resolveSessionArtifacts,async _=>{let M=i?.hostActionLaunch,F=M?.noProxy,Z=new K({auth:m,vpcEndpoint:s.vpcEndpoint,env:{...M?.env??s.env??process.env,...F!=null?{NO_PROXY:F,no_proxy:F}:{},...ft!==void 0?{QODERCLI_HOST_ACTION_STORAGE_DIR:ft}:{}}});try{let gt=await Z.prepare();await ir(_,{cliPath:M?.cliPath??s.pathToQoderCLIExecutable,env:gt.env,cwd:s.cwd,auth:m,proxy:M?.proxy??s.proxy})}finally{await Z.cleanupAuthPayload()}},i!==void 0,i!==void 0?o:void 0,o?()=>o.getProxy():void 0);if(typeof t=="string"){let _={type:"user",extra:{submitted_at_ms:e},message:{role:"user",content:[{type:"text",text:t}]},parent_tool_use_id:null};Zt.streamInput(async function*(){yield _}())}else Zt.streamInput(t);return Zt}function Ec(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=tt(n.permissionMode),s=[["auth",n.auth],["transport",n.transport],["env",n.env],["pathToQoderCLIExecutable",n.pathToQoderCLIExecutable],["executable",n.executable],["executableArgs",n.executableArgs],["proxy",n.proxy],["vpcEndpoint",n.vpcEndpoint],["spawnQoderCLIProcess",n.spawnQoderCLIProcess],["closeGraceMs",n.closeGraceMs],["sessionStore",n.sessionStore]].find(([,o])=>o!==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 Tc=1e3,Kn=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}}},Bn=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 Ac(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 Kn,s=Un({prompt:t,options:n.options}),o,r;try{return await Promise.race([s.initializationResult(),new Promise((i,a)=>{o=setTimeout(()=>{a(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 Bn(s,t)}catch(i){t.discard();let a=n.options?.closeGraceMs??ne,u=(Number.isFinite(a)?Math.max(0,a):ne)+Tc;throw await Promise.race([s.close().catch(()=>{}),new Promise(c=>{r=setTimeout(c,u)})]),i}finally{o!==void 0&&clearTimeout(o),r!==void 0&&clearTimeout(r)}}import{readFile as Mc}from"node:fs/promises";import Ic from"node:os";import Q from"node:path";var Dc=["user","project","local"],Qn=new Set(["__proto__","constructor","prototype"]),xc=/^[\p{L}\p{N}\p{M}._ -]+$/u,Oc=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,qc=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),Nc=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),jc=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 ke(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function Fc(n){let e=n.charCodeAt(0)===65279?n.slice(1):n,t="",s=!1,o=!1,r=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(r){u===`
|
|
27
30
|
`||u==="\r"?(r=!1,t+=u):t+=" ";continue}if(i){u==="*"&&c==="/"?(i=!1,t+=" ",a+=1):t+=u===`
|
|
28
|
-
`||u==="\r"?u:" ";continue}if(s){t+=u,o?o=!1:u==="\\"?o=!0:u==='"'&&(s=!1);continue}u==='"'?(s=!0,t+=u):u==="/"&&c==="/"?(r=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Dc(n,e){let t;try{t=JSON.parse(Ic(n))}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`Unable to parse settings from ${e}: ${o}`)}if(!ke(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return Kt(t)}function Ue(n){return Array.isArray(n)?n.map(Ue):ke(n)?Kt(n):n}function Kt(n){let e={};for(let[t,s]of Object.entries(n))$n.has(t)||s===void 0||(e[t]=Ue(s));return e}function xc(n){let e=n.join(".");if(Mc.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(Ac.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function Bn(n,e,t=[]){for(let[s,o]of Object.entries(e)){if($n.has(s)||o===void 0)continue;let r=[...t,s],i=n[s],a=xc(r);if(a==="shallow"&&i&&o){let u={};ke(i)&&Object.assign(u,Kt(i)),ke(o)&&Object.assign(u,Kt(o)),n[s]=u;continue}if(Array.isArray(i)){let u=Array.isArray(o)?o:[o];if(a==="concat"){n[s]=[...i.map(Ue),...u.map(Ue)];continue}if(a==="union"){n[s]=[...new Set([...i,...u])].map(Ue);continue}}if(ke(i)&&ke(o))Bn(i,o,r);else if(ke(o)){let u={};Bn(u,o,r),n[s]=u}else n[s]=Ue(o)}}function Oc(n){let e=n?.[w.configDirNameEnv];if(e===void 0||e==="")return{user:w.configDirName,project:w.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!Pc.test(t)||Ec.test(t))throw new Error(`${w.configDirNameEnv} must be a valid directory name`);if(Tc.has(t.toLowerCase()))throw new Error(`${w.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function Kn(n,e){let t;try{t=await _c(e,"utf8")}catch(s){if(s.code==="ENOENT")return;throw s}return{source:n,path:z.resolve(e),settings:Dc(t,z.resolve(e))}}async function qc(n={}){let e=z.resolve(n.cwd??process.cwd()),t=process.env,s=Oc(t),o=t[w.cliHomeEnv]??t.GEMINI_CLI_HOME,r=o?z.resolve(e,o):Rc.homedir(),i=t[w.configDirEnv]?z.resolve(e,t[w.configDirEnv]):z.join(r,s.user),a=z.join(e,s.project),u=new Set(n.settingSources??Cc),c=z.resolve(r)===e,d=[];if(u.has("user")){let l=await Kn("user",z.join(i,"settings.json"));l&&d.push(l)}if(u.has("project")&&!c){let l=await Kn("project",z.join(a,"settings.json"));l&&d.push(l)}if(u.has("local")&&!c){let l=await Kn("local",z.join(a,"settings.local.json"));l&&d.push(l)}let m={},p={};for(let l of d){Bn(m,l.settings);for(let f of Object.keys(l.settings))$n.has(f)||(p[f]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:m,provenance:p,sources:d}}var Bt=class extends Error{constructor(){super("Global daemon is already initialized with different options"),this.name="DaemonConfigurationConflictError"}},pe,L,me,Ke,de;function sr(n){if(de)return de.then(()=>sr(n));if(pe){if(pe.state==="ready")return nr(n)?(le(n).record("[GlobalDaemon] init reused the ready daemon"),Promise.resolve({mode:"daemon",daemon:pe})):(le(n).record("[GlobalDaemon] init rejected: configuration conflict with the ready daemon"),Promise.reject(new Bt));pe=void 0,L=void 0,Ke=void 0}return me?nr(n)?(le(n).record("[GlobalDaemon] init joined an in-flight initialization"),me):(le(n).record("[GlobalDaemon] init rejected: configuration conflict with an in-flight initialization"),Promise.reject(new Bt)):Ke?(le(n).record(`[GlobalDaemon] init short-circuited to direct mode (reason=${Ke.reason})`),Promise.resolve(Ke)):(L=n,or(n,le(n)))}function or(n,e){let t;return t=qn(n).then(s=>(pe=s,s.onFailure(o=>Nc(o,n)),e.record("[GlobalDaemon] daemon ready"),{mode:"daemon",daemon:s})).catch(s=>{let o=Lc(s);return Ke=o,L=void 0,e.record(`[GlobalDaemon] startDaemon failed, falling back to direct mode (reason=${o.reason})`,s),o}).finally(()=>{me===t&&(me=void 0)}),me=t,t}function Nc(n,e){let t=le(e);t.record(`[GlobalDaemon] active daemon failed: ${n.message}; clearing the slot`,n),pe=void 0,!(de||me)&&(t.record("[GlobalDaemon] eagerly rebuilding the global daemon"),or(e,t))}function le(n){return new ae({debug:n.debug,debugFile:n.debugFile??Nn(n),stderr:n.stderr})}function jc(){if(de)return de;let n=me,e=pe,t=le(L??{}),s;return s=(async()=>{let o=e?{mode:"daemon",daemon:e}:n?await n:void 0;o?.mode==="daemon"?(t.record("[GlobalDaemon] shutting down the global daemon"),await o.daemon.stop(),t.record("[GlobalDaemon] global daemon stopped")):t.record("[GlobalDaemon] shutdown with no daemon to stop")})().finally(()=>{de===s&&(pe=void 0,L=void 0,me=void 0,Ke=void 0,de=void 0)}),de=s,s}function nr(n){return L?.auth===n.auth&&L.pathToQoderCLIExecutable===n.pathToQoderCLIExecutable&&L.executable===n.executable&&Fc(L.executableArgs,n.executableArgs)&&L.proxy===n.proxy&&L.vpcEndpoint===n.vpcEndpoint&&L.env===n.env}function Fc(n,e){return n===e?!0:n===void 0||e===void 0?!1:n.length===e.length&&n.every((t,s)=>t===e[s])}function Lc(n){return n instanceof K?{mode:"direct",reason:"protocol_version_mismatch"}:{mode:"direct",reason:"daemon_unavailable"}}import{McpServer as Uc}from"@modelcontextprotocol/sdk/server/mcp.js";function Kc(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 Uc({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.`);Yt(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(o){throw o instanceof Error&&o.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.`):o}}return{type:"sdk",name:n.name,instance:e,...t.length>0?{tools:t}:{}}}function Bc(n,e,t,s,o){return{name:n,description:e,inputSchema:t,handler:s,annotations:o?.annotations,...o?.exposedName!==void 0?{exposedName:o.exposedName}:{},...o?.alwaysLoad!==void 0?{alwaysLoad:o.alwaysLoad}:{},...o?.permissionPolicy!==void 0?{permissionPolicy:o.permissionPolicy}:{}}}import{readdir as zn,readFile as zt,stat as Be,appendFile as pr,realpath as $c,rm as ir}from"fs/promises";import{basename as zc,join as x,resolve as ar}from"path";import{execFile as Qc}from"child_process";import{randomUUID as mr}from"crypto";import{promisify as Gc}from"util";async function rr(n,e){let t=0,s=524288;for(;t<n.length;){t>=s&&(await new Promise(u=>setImmediate(u)),s=t+524288);let o=n.indexOf(10,t),r=o===-1?n.length:o,i=n.toString("utf8",t,r).trim();if(t=r+1,!i)continue;let a;try{a=JSON.parse(i)}catch{continue}e(a)}}var Hc=Gc(Qc),Wc=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,fr=new Set(["user","assistant","system","progress","attachment"]);function N(n){return n!==null&&typeof n=="object"}function _e(n){return Wc.test(n)}function gr(n,e){if(!N(n)||n.type!=="active-leaf"||(n.sessionId??n.session_id)!==e)return;let s=Object.hasOwn(n,"leafUuid")?n.leafUuid:n.leaf_uuid;if(!(s!==null&&typeof s!="string"))return{leafUuid:s,sessionId:e}}async function Jc(n,e){let t=[],s;return await rr(n,o=>{s=gr(o,e)??s,N(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&fr.has(o.type)&&t.push(o)}),{entries:t,activeLeaf:s}}function $t(n){if(!N(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var Vc=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function Yc(n){return typeof n=="string"&&Vc.has(n)?n:void 0}function Qn(n){if(n.type!=="user")return;let e=$t(n).filter(r=>N(r)&&r.type==="tool_result"&&typeof r.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]:[],o=e.flatMap((r,i)=>{let a=Yc(t[i]);if(!a)return[];let u=s[i];return[{id:r.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return o.length>0?o:void 0}function it(n){if(n.type!=="assistant"||!N(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function hr(n){return n.type!=="user"||!n.parentUuid?!1:$t(n).some(e=>N(e)&&e.type==="tool_result")}function Xc(n){if(!N(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function Zc(n,e){let t=new Map;for(let[s,o]of n){let r=Xc(o);if(r){let i=t.get(r);i?i.push(s):t.set(r,[s])}}for(let[s,o]of n){let r=el(o,o.parentUuid,n,t,e);r!==o.parentUuid&&n.set(s,{...o,parentUuid:r})}}function el(n,e,t,s,o){if(!e||t.has(e))return e;let r=s.get(e);return!r||r.length===0?e:r.length===1?r[0]:tl(n,r,t)??nl(n,r,t,o)??e}function tl(n,e,t){if(!hr(n))return;let s=$t(n).filter(r=>N(r)&&r.type==="tool_result").map(r=>r.tool_use_id).filter(r=>typeof r=="string");if(s.length===0)return;let o=e.filter(r=>{let i=t.get(r);return i?$t(i).some(a=>N(a)&&a.type==="tool_use"&&s.includes(typeof a.id=="string"?a.id:"")):!1});return o.length===1?o[0]:void 0}function nl(n,e,t,s){return e.map(r=>t.get(r)).filter(r=>r!==void 0).filter(r=>(s.get(r.uuid)??-1)<(s.get(n.uuid)??-1)).at(-1)?.uuid}function sl(n){for(let e of n.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,s=t?.headUuid,o=t?.anchorUuid,r=t?.tailUuid;if(!s||!o||!r)continue;let i=n.get(s);i&&n.set(s,{...i,parentUuid:o});for(let[a,u]of n)a!==s&&u.parentUuid===o&&n.set(a,{...u,parentUuid:r})}}function ur(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 ol(n,e,t){let s=e.filter(p=>p.type==="assistant");if(s.length===0)return e;let o=new Map,r=0;for(let p of n.keys())o.set(p,r++);let i=new Map;for(let p of s){let l=it(p);l&&i.set(l,p)}let a=new Map,u=new Map;for(let p of n.values()){let l=it(p);if(l){let f=a.get(l)??[];f.push(p),a.set(l,f);continue}if(hr(p)&&p.parentUuid){let f=u.get(p.parentUuid)??[];f.push(p),u.set(p.parentUuid,f)}}let c=new Set,d=new Map;for(let p of s){let l=it(p);if(!l||c.has(l))continue;c.add(l);let f=a.get(l)??[p],S=f.filter(R=>!t.has(R.uuid)),g=[];for(let R of f){let X=u.get(R.uuid)??[];for(let Qe of X)t.has(Qe.uuid)||g.push(Qe)}if(S.length===0&&g.length===0)continue;let v=i.get(l);if(!v)continue;let b=[...f].sort((R,X)=>ur(R,X,o));g.sort((R,X)=>ur(R,X,o));let y=b.findIndex(R=>R.uuid===v.uuid),I=b.slice(0,Math.max(y,0)).filter(R=>!t.has(R.uuid)),M=b.slice(y+1).filter(R=>!t.has(R.uuid)),Z=[...I,...M,...g];for(let R of Z)t.add(R.uuid);d.set(v.uuid,Z)}if(d.size===0)return e;let m=[];for(let p of e){let l=d.get(p.uuid);if(l){let f=o.get(p.uuid)??Number.MAX_SAFE_INTEGER,S=[],g=[];for(let v of l)(p.type==="assistant"&&v.type==="assistant"&&it(v)===it(p)&&(o.get(v.uuid)??Number.MAX_SAFE_INTEGER)<f?S:g).push(v);m.push(...S,p,...g)}else m.push(p)}return m}function yr(n,e,t="runtime"){if(n.length===0)return[];let s=new Map,o=new Map;for(let[d,m]of n.entries())s.set(m.uuid,m),o.set(m.uuid,d);t==="runtime"&&sl(s),Zc(s,o);let r;if(e?.leafUuid===null)return[];if(e){let d=s.get(e.leafUuid),m=d?.sessionId??d?.session_id;d&&(m===void 0||m===e.sessionId)&&(r=d)}if(!r){let d=new Set;for(let S of s.values())S.parentUuid&&d.add(S.parentUuid);let m=Array.from(s.values()).filter(S=>!d.has(S.uuid)),p=[];for(let S of m){let g=S,v=new Set;for(;g&&!v.has(g.uuid);){if(v.add(g.uuid),g.type==="user"||g.type==="assistant"){p.push(g);break}g=g.parentUuid?s.get(g.parentUuid):void 0}}if(p.length===0)return[];let l=p.filter(S=>!S.isSidechain&&!S.teamName&&!S.isMeta);r=(l.length>0?l:p).reduce((S,g)=>(o.get(g.uuid)??-1)>(o.get(S.uuid)??-1)?g:S)}let i=[],a=new Set,u=r;for(;u&&!a.has(u.uuid);){a.add(u.uuid),i.push(u);let d=t==="historical"&&u.type==="system"&&u.subtype==="compact_boundary"?u.logicalParentUuid??u.parentUuid:u.parentUuid;u=d?s.get(d):void 0}i.reverse();let c=t==="runtime"?rl(i):i;return ol(s,c,new Set(c.map(d=>d.uuid)))}function rl(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 il(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function Gn(n,e,t){let s=n.flatMap(r=>N(r)&&typeof r.uuid=="string"&&typeof r.type=="string"&&fr.has(r.type)?[r]:[]),o;for(let r of n)o=gr(r,e)??o;return yr(s,o,t)}function cr(n,e,t){if(t==="historical"&&il(n))return!1;let s=n.type==="user"||n.type==="assistant",o=e&&n.type==="system";return!(!s&&!o||n.isMeta||n.isSidechain||n.teamName)}function al(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 Hn(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function Wn(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function lr(n){let e=n.type==="system"?al(n.compactMetadata):void 0,t=Qn(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,...Hn(n),...Wn(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 dr(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 Qt(n){try{return await $c(ar(n))}catch{return ar(n)}}async function ul(n){return F(await Qt(n))}async function fe(n){let e=je();if(n?.dir){let t=await Qt(n.dir),s=[x(e,F(t))];if(n.includeWorktrees!==!1)try{let{stdout:o}=await Hc("git",["worktree","list","--porcelain"],{cwd:n.dir}),r=o.split(`
|
|
29
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of r)s.push(x(e,await
|
|
30
|
-
`).filter(Boolean).flatMap(r=>{try{let i=JSON.parse(r);return
|
|
31
|
-
`).filter(Boolean))try{let m=JSON.parse(
|
|
32
|
-
`," ").trim();if(!i)continue;let a=
|
|
33
|
-
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function
|
|
34
|
-
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function
|
|
35
|
-
`))if(s.trim())try{t.push(JSON.parse(s))}catch{}return
|
|
36
|
-
`).trim();if(r)return r}}function
|
|
37
|
-
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),r=
|
|
31
|
+
`||u==="\r"?u:" ";continue}if(s){t+=u,o?o=!1:u==="\\"?o=!0:u==='"'&&(s=!1);continue}u==='"'?(s=!0,t+=u):u==="/"&&c==="/"?(r=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Lc(n,e){let t;try{t=JSON.parse(Fc(n))}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`Unable to parse settings from ${e}: ${o}`)}if(!ke(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return zt(t)}function Be(n){return Array.isArray(n)?n.map(Be):ke(n)?zt(n):n}function zt(n){let e={};for(let[t,s]of Object.entries(n))Qn.has(t)||s===void 0||(e[t]=Be(s));return e}function Uc(n){let e=n.join(".");if(Nc.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(jc.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function zn(n,e,t=[]){for(let[s,o]of Object.entries(e)){if(Qn.has(s)||o===void 0)continue;let r=[...t,s],i=n[s],a=Uc(r);if(a==="shallow"&&i&&o){let u={};ke(i)&&Object.assign(u,zt(i)),ke(o)&&Object.assign(u,zt(o)),n[s]=u;continue}if(Array.isArray(i)){let u=Array.isArray(o)?o:[o];if(a==="concat"){n[s]=[...i.map(Be),...u.map(Be)];continue}if(a==="union"){n[s]=[...new Set([...i,...u])].map(Be);continue}}if(ke(i)&&ke(o))zn(i,o,r);else if(ke(o)){let u={};zn(u,o,r),n[s]=u}else n[s]=Be(o)}}function Kc(n){let e=n?.[w.configDirNameEnv];if(e===void 0||e==="")return{user:w.configDirName,project:w.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!xc.test(t)||Oc.test(t))throw new Error(`${w.configDirNameEnv} must be a valid directory name`);if(qc.has(t.toLowerCase()))throw new Error(`${w.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function $n(n,e){let t;try{t=await Mc(e,"utf8")}catch(s){if(s.code==="ENOENT")return;throw s}return{source:n,path:Q.resolve(e),settings:Lc(t,Q.resolve(e))}}async function Bc(n={}){let e=Q.resolve(n.cwd??process.cwd()),t=process.env,s=Kc(t),o=t[w.cliHomeEnv]??t.GEMINI_CLI_HOME,r=o?Q.resolve(e,o):Ic.homedir(),i=t[w.configDirEnv]?Q.resolve(e,t[w.configDirEnv]):Q.join(r,s.user),a=Q.join(e,s.project),u=new Set(n.settingSources??Dc),c=Q.resolve(r)===e,l=[];if(u.has("user")){let d=await $n("user",Q.join(i,"settings.json"));d&&l.push(d)}if(u.has("project")&&!c){let d=await $n("project",Q.join(a,"settings.json"));d&&l.push(d)}if(u.has("local")&&!c){let d=await $n("local",Q.join(a,"settings.local.json"));d&&l.push(d)}let m={},p={};for(let d of l){zn(m,d.settings);for(let f of Object.keys(d.settings))Qn.has(f)||(p[f]={source:d.source,...d.path?{path:d.path}:{}})}return{effective:m,provenance:p,sources:l}}var Qt=class extends Error{constructor(){super("Global daemon is already initialized with different options"),this.name="DaemonConfigurationConflictError"}},pe,N,me,$e,de;function ur(n){if(de)return de.then(()=>ur(n));if(pe){if(pe.state==="ready")return ar(n)?(le(n).record("[GlobalDaemon] init reused the ready daemon"),Promise.resolve({mode:"daemon",daemon:pe})):(le(n).record("[GlobalDaemon] init rejected: configuration conflict with the ready daemon"),Promise.reject(new Qt));pe=void 0,N=void 0,$e=void 0}return me?ar(n)?(le(n).record("[GlobalDaemon] init joined an in-flight initialization"),me):(le(n).record("[GlobalDaemon] init rejected: configuration conflict with an in-flight initialization"),Promise.reject(new Qt)):$e?(le(n).record(`[GlobalDaemon] init short-circuited to direct mode (reason=${$e.reason})`),Promise.resolve($e)):(N=n,cr(n,le(n)))}function cr(n,e){let t;return t=jn(n).then(s=>(pe=s,s.onFailure(o=>$c(o,n)),e.record("[GlobalDaemon] daemon ready"),{mode:"daemon",daemon:s})).catch(s=>{let o=Gc(s);return $e=o,N=void 0,e.record(`[GlobalDaemon] startDaemon failed, falling back to direct mode (reason=${o.reason})`,s),o}).finally(()=>{me===t&&(me=void 0)}),me=t,t}function $c(n,e){let t=le(e);t.record(`[GlobalDaemon] active daemon failed: ${n.message}; clearing the slot`,n),pe=void 0,!(de||me)&&(t.record("[GlobalDaemon] eagerly rebuilding the global daemon"),cr(e,t))}function le(n){return new ae({debug:n.debug,debugFile:n.debugFile??Fn(n),stderr:n.stderr})}function zc(){if(de)return de;let n=me,e=pe,t=le(N??{}),s;return s=(async()=>{let o=e?{mode:"daemon",daemon:e}:n?await n:void 0;o?.mode==="daemon"?(t.record("[GlobalDaemon] shutting down the global daemon"),await o.daemon.stop(),t.record("[GlobalDaemon] global daemon stopped")):t.record("[GlobalDaemon] shutdown with no daemon to stop")})().finally(()=>{de===s&&(pe=void 0,N=void 0,me=void 0,$e=void 0,de=void 0)}),de=s,s}function ar(n){return N?.auth===n.auth&&N.pathToQoderCLIExecutable===n.pathToQoderCLIExecutable&&N.executable===n.executable&&Qc(N.executableArgs,n.executableArgs)&&N.proxy===n.proxy&&N.noProxy===n.noProxy&&N.vpcEndpoint===n.vpcEndpoint&&N.env===n.env}function Qc(n,e){return n===e?!0:n===void 0||e===void 0?!1:n.length===e.length&&n.every((t,s)=>t===e[s])}function Gc(n){return n instanceof B?{mode:"direct",reason:"protocol_version_mismatch"}:{mode:"direct",reason:"daemon_unavailable"}}import{McpServer as Hc}from"@modelcontextprotocol/sdk/server/mcp.js";function Wc(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 Hc({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.`);en(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(o){throw o instanceof Error&&o.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.`):o}}return{type:"sdk",name:n.name,instance:e,...t.length>0?{tools:t}:{}}}function Jc(n,e,t,s,o){return{name:n,description:e,inputSchema:t,handler:s,annotations:o?.annotations,...o?.exposedName!==void 0?{exposedName:o.exposedName}:{},...o?.alwaysLoad!==void 0?{alwaysLoad:o.alwaysLoad}:{},...o?.permissionPolicy!==void 0?{permissionPolicy:o.permissionPolicy}:{}}}import{readdir as Gn,readFile as Ht,stat as ze,appendFile as yr,realpath as Vc,rm as dr}from"fs/promises";import{basename as Yc,join as x,resolve as pr}from"path";import{execFile as Xc}from"child_process";import{randomUUID as Sr}from"crypto";import{promisify as Zc}from"util";async function lr(n,e){let t=0,s=524288;for(;t<n.length;){t>=s&&(await new Promise(u=>setImmediate(u)),s=t+524288);let o=n.indexOf(10,t),r=o===-1?n.length:o,i=n.toString("utf8",t,r).trim();if(t=r+1,!i)continue;let a;try{a=JSON.parse(i)}catch{continue}e(a)}}var el=Zc(Xc),tl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,vr=new Set(["user","assistant","system","progress","attachment"]);function j(n){return n!==null&&typeof n=="object"}function Re(n){return tl.test(n)}function wr(n,e){if(!j(n)||n.type!=="active-leaf"||(n.sessionId??n.session_id)!==e)return;let s=Object.hasOwn(n,"leafUuid")?n.leafUuid:n.leaf_uuid;if(!(s!==null&&typeof s!="string"))return{leafUuid:s,sessionId:e}}async function nl(n,e){let t=[],s;return await lr(n,o=>{s=wr(o,e)??s,j(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&vr.has(o.type)&&t.push(o)}),{entries:t,activeLeaf:s}}function Gt(n){if(!j(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var sl=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function ol(n){return typeof n=="string"&&sl.has(n)?n:void 0}function Hn(n){if(n.type!=="user")return;let e=Gt(n).filter(r=>j(r)&&r.type==="tool_result"&&typeof r.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]:[],o=e.flatMap((r,i)=>{let a=ol(t[i]);if(!a)return[];let u=s[i];return[{id:r.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return o.length>0?o:void 0}function ut(n){if(n.type!=="assistant"||!j(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function br(n){return n.type!=="user"||!n.parentUuid?!1:Gt(n).some(e=>j(e)&&e.type==="tool_result")}function rl(n){if(!j(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function il(n,e){let t=new Map;for(let[s,o]of n){let r=rl(o);if(r){let i=t.get(r);i?i.push(s):t.set(r,[s])}}for(let[s,o]of n){let r=al(o,o.parentUuid,n,t,e);r!==o.parentUuid&&n.set(s,{...o,parentUuid:r})}}function al(n,e,t,s,o){if(!e||t.has(e))return e;let r=s.get(e);return!r||r.length===0?e:r.length===1?r[0]:ul(n,r,t)??cl(n,r,t,o)??e}function ul(n,e,t){if(!br(n))return;let s=Gt(n).filter(r=>j(r)&&r.type==="tool_result").map(r=>r.tool_use_id).filter(r=>typeof r=="string");if(s.length===0)return;let o=e.filter(r=>{let i=t.get(r);return i?Gt(i).some(a=>j(a)&&a.type==="tool_use"&&s.includes(typeof a.id=="string"?a.id:"")):!1});return o.length===1?o[0]:void 0}function cl(n,e,t,s){return e.map(r=>t.get(r)).filter(r=>r!==void 0).filter(r=>(s.get(r.uuid)??-1)<(s.get(n.uuid)??-1)).at(-1)?.uuid}function ll(n){for(let e of n.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,s=t?.headUuid,o=t?.anchorUuid,r=t?.tailUuid;if(!s||!o||!r)continue;let i=n.get(s);i&&n.set(s,{...i,parentUuid:o});for(let[a,u]of n)a!==s&&u.parentUuid===o&&n.set(a,{...u,parentUuid:r})}}function mr(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 _r(n,e,t){let s=e.filter(p=>p.type==="assistant");if(s.length===0)return e;let o=new Map,r=0;for(let p of n.keys())o.set(p,r++);let i=new Map;for(let p of s){let d=ut(p);d&&i.set(d,p)}let a=new Map,u=new Map;for(let p of n.values()){let d=ut(p);if(d){let f=a.get(d)??[];f.push(p),a.set(d,f);continue}if(br(p)&&p.parentUuid){let f=u.get(p.parentUuid)??[];f.push(p),u.set(p.parentUuid,f)}}let c=new Set,l=new Map;for(let p of s){let d=ut(p);if(!d||c.has(d))continue;c.add(d);let f=a.get(d)??[p],y=f.filter(R=>!t.has(R.uuid)),g=[];for(let R of f){let X=u.get(R.uuid)??[];for(let He of X)t.has(He.uuid)||g.push(He)}if(y.length===0&&g.length===0)continue;let S=i.get(d);if(!S)continue;let b=[...f].sort((R,X)=>mr(R,X,o));g.sort((R,X)=>mr(R,X,o));let v=b.findIndex(R=>R.uuid===S.uuid),D=b.slice(0,Math.max(v,0)).filter(R=>!t.has(R.uuid)),A=b.slice(v+1).filter(R=>!t.has(R.uuid)),ee=[...D,...A,...g];for(let R of ee)t.add(R.uuid);l.set(S.uuid,ee)}if(l.size===0)return e;let m=[];for(let p of e){let d=l.get(p.uuid);if(d){let f=o.get(p.uuid)??Number.MAX_SAFE_INTEGER,y=[],g=[];for(let S of d)(p.type==="assistant"&&S.type==="assistant"&&ut(S)===ut(p)&&(o.get(S.uuid)??Number.MAX_SAFE_INTEGER)<f?y:g).push(S);m.push(...y,p,...g)}else m.push(p)}return m}function kr(n,e,t="runtime"){if(n.length===0)return[];let s=new Map,o=new Map;for(let[l,m]of n.entries())s.set(m.uuid,m),o.set(m.uuid,l);t==="runtime"&&ll(s),il(s,o);let r;if(e?.leafUuid===null)return[];if(e){let l=s.get(e.leafUuid),m=l?.sessionId??l?.session_id;l&&(m===void 0||m===e.sessionId)&&(r=l)}if(!r){let l=new Set;for(let y of s.values())y.parentUuid&&l.add(y.parentUuid);let m=Array.from(s.values()).filter(y=>!l.has(y.uuid)),p=[];for(let y of m){let g=y,S=new Set;for(;g&&!S.has(g.uuid);){if(S.add(g.uuid),g.type==="user"||g.type==="assistant"){p.push(g);break}g=g.parentUuid?s.get(g.parentUuid):void 0}}if(p.length===0)return[];let d=p.filter(y=>!y.isSidechain&&!y.teamName&&!y.isMeta);r=(d.length>0?d:p).reduce((y,g)=>(o.get(g.uuid)??-1)>(o.get(y.uuid)??-1)?g:y)}let i=[],a=new Set,u=r;for(;u&&!a.has(u.uuid);){a.add(u.uuid),i.push(u);let l=t==="historical"&&u.type==="system"&&u.subtype==="compact_boundary"?u.logicalParentUuid??u.parentUuid:u.parentUuid;u=l?s.get(l):void 0}i.reverse();let c=t==="runtime"?dl(i):i;return _r(s,c,new Set(c.map(l=>l.uuid)))}function dl(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 pl(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function Wn(n,e,t){let s=n.flatMap(r=>j(r)&&typeof r.uuid=="string"&&typeof r.type=="string"&&vr.has(r.type)?[r]:[]),o;for(let r of n)o=wr(r,e)??o;return kr(s,o,t)}function fr(n,e,t){if(t==="historical"&&pl(n))return!1;let s=n.type==="user"||n.type==="assistant",o=e&&n.type==="system";return!(!s&&!o||n.isMeta||n.isSidechain||n.teamName)}function ml(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 Jn(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function Vn(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function gr(n){let e=n.type==="system"?ml(n.compactMetadata):void 0,t=Hn(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,...Jn(n),...Vn(n),...t?{tool_result_meta:t}:{},...typeof n.timestamp=="string"&&n.timestamp.length>0?{timestamp:n.timestamp}:{},...n.type==="system"&&n.subtype?{subtype:n.subtype}:{},...e?{compact_metadata:e}:{}}}function hr(n,e){let t=Math.max(0,e?.offset??0),s=e?.limit;return s!==void 0&&s>0?n.slice(t,t+s):t>0?n.slice(t):n}async function Wt(n){try{return await Vc(pr(n))}catch{return pr(n)}}async function fl(n){return U(await Wt(n))}async function fe(n){let e=Fe();if(n?.dir){let t=await Wt(n.dir),s=[x(e,U(t))];if(n.includeWorktrees!==!1)try{let{stdout:o}=await el("git",["worktree","list","--porcelain"],{cwd:n.dir}),r=o.split(`
|
|
32
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of r)s.push(x(e,await fl(i)))}catch{}return s}try{return(await Gn(e,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>x(e,s.name))}catch{return[]}}async function Rr(n){try{let[e,t]=await Promise.all([Ht(n,"utf-8"),ze(n)]),s=e.trim().split(`
|
|
33
|
+
`).filter(Boolean).flatMap(r=>{try{let i=JSON.parse(r);return j(i)?[i]:[]}catch{return[]}});if(s.length===0)return null;let o=Yc(n,".jsonl");return Yn(o,s,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function Pr(n,e){return x(n,e,"subagents")}function Cr(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 Er(n){let e=[];async function t(s){let o;try{o=await Gn(s,{withFileTypes:!0})}catch{return}for(let r of o){let i=x(s,r.name);if(r.isDirectory()){await t(i);continue}if(r.isFile()&&r.name.startsWith("agent-")&&r.name.endsWith(".jsonl")){let a=r.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(n),e}async function gl(n){try{let e=await Ht(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 Tr(n){if(n.length===0)return[];let e=new Map(n.map(i=>[i.uuid,i])),t=n[n.length-1],s=[],o=new Set,r=t;for(;r&&!o.has(r.uuid);)o.add(r.uuid),s.push(r),r=r.parentUuid!==void 0&&r.parentUuid!==null?e.get(r.parentUuid):void 0;return s.reverse(),_r(e,s,o)}async function hl(n,e,t){let[s,o]=await Promise.all([Ht(n,"utf-8"),gl(n)]),r=[];for(let l of s.trim().split(`
|
|
34
|
+
`).filter(Boolean))try{let m=JSON.parse(l);Cr(m)&&r.push(m)}catch{}let a=Tr(r).map(l=>{let m=Hn(l);return{type:l.type,uuid:l.uuid,session_id:l.sessionId??e,message:l.message,parent_tool_use_id:o.parentToolUseId,parent_agent_id:o.parentAgentId,...Jn(l),...Vn(l),...m?{tool_result_meta:m}:{}}}),u=t?.offset??0,c=t?.limit;return c!==void 0?a.slice(u,u+c):a.slice(u)}async function Qe(n){return U(await Wt(n??process.cwd()))}function ct(n,e){return{projectKey:n,sessionId:e}}function yl(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 Sl(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 vl=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function wl(n){let e=n;for(let t=0;t<10;t+=1){let s=e.normalize("NFKC").replace(vl,"");if(s===e)return s;e=s}return e}var bl=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,_l=/<command-name>(.*?)<\/command-name>/,kl=/<bash-input>([\s\S]*?)<\/bash-input>/;function Rl(n){if(n.length<=200)return n;let e=n.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function Pl(n,e){if(n.type!=="user"||n.isMeta===!0||n.isCompactSummary===!0)return;let t=n.message;if(!j(t))return;let s=t.content,o=[];if(typeof s=="string")o.push(s);else if(Array.isArray(s)){for(let r of s)if(j(r)){if(r.type==="tool_result")return;r.type==="text"&&typeof r.text=="string"&&o.push(r.text)}}for(let r of o){let i=r.replaceAll(`
|
|
35
|
+
`," ").trim();if(!i)continue;let a=_l.exec(i);if(a){e.commandFallback??=a[1];continue}let u=kl.exec(i);if(u)return`! ${u[1].trim()}`;if(!bl.test(i))return Rl(i)}}function Yn(n,e,t,s={}){if(e.length===0)return;let o,r,i,a,u,c,l,m,p,d,f;for(let b of e){let v=b;if(f??=v.isSidechain===!0,d===void 0&&typeof v.timestamp=="string"){let D=Date.parse(v.timestamp);Number.isFinite(D)&&(d=D)}if(!o){let D={commandFallback:r};o=Pl(v,D),r=D.commandFallback}v.type==="custom-title"&&typeof v.customTitle=="string"&&(i=v.customTitle),v.type==="ai-title"&&typeof v.aiTitle=="string"&&(a=v.aiTitle),typeof v.lastPrompt=="string"&&(u=v.lastPrompt),typeof v.summary=="string"&&(c=v.summary),v.type==="tag"&&(p=typeof v.tag=="string"&&v.tag?v.tag:void 0),typeof v.gitBranch=="string"&&(l=v.gitBranch),m===void 0&&typeof v.cwd=="string"&&(m=v.cwd),v.type==="relocated"&&typeof v.relocatedCwd=="string"&&(m=v.relocatedCwd)}if(f)return;let y=o??r,g=i||a,S=g||u||c||y;if(S)return{sessionId:n,summary:S,lastModified:t??yl(e),fileSize:s.fileSize,customTitle:g,firstPrompt:y,gitBranch:l,cwd:m||s.defaultCwd,tag:p,createdAt:d}}async function Ar(n,e,t){let s=ct(await Qe(t),e),o=await n.load(s);return o?{key:s,entries:o}:void 0}async function Cl(n){if(n?.sessionStore){let c=n.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let l=await Wt(n.dir??process.cwd()),m=U(l),p=(await c.listSessions(m)).slice().sort((g,S)=>S.mtime-g.mtime),d=Math.max(0,n.offset??0),f=n.limit!==void 0&&n.limit>0?p.slice(d,d+n.limit):d>0?p.slice(d):p;return(await Promise.allSettled(f.map(async({sessionId:g,mtime:S})=>{let b=await c.load(ct(m,g));return b?Yn(g,b,S,{defaultCwd:l}):void 0}))).flatMap((g,S)=>{if(g.status==="fulfilled")return g.value?[g.value]:[];let b=f[S];return[{sessionId:b.sessionId,summary:"",lastModified:b.mtime}]})}let e=await fe(n),s=(await Promise.all(e.map(async c=>{try{return(await Gn(c)).filter(m=>m.endsWith(".jsonl")).map(m=>x(c,m))}catch{return[]}}))).flat(),o=await Promise.all(s.map(Rr)),r=new Map;for(let c of o){if(!c)continue;let l=r.get(c.sessionId);(!l||c.lastModified>l.lastModified)&&r.set(c.sessionId,c)}let i=Array.from(r.values()).sort((c,l)=>l.lastModified-c.lastModified),a=n?.offset??0,u=n?.limit;return u!==void 0?i.slice(a,a+u):i.slice(a)}async function El(n,e){if(e?.sessionStore){if(!Re(n))return;let s=await Ar(e.sessionStore,n,e.dir);return s?Yn(n,s.entries,Sl(s.entries)):void 0}let t=await fe(e);for(let s of t){let o=x(s,`${n}.jsonl`),r=await Rr(o);if(r)return r}}async function Tl(n,e){if(!Re(n))return[];let t=e?.includeSystemMessages===!0,s=e?.view??"runtime";if(e?.sessionStore){let r=await Ar(e.sessionStore,n,e.dir);if(!r)return[];let i=Wn(r.entries,n,s);return hr(i.filter(a=>fr(a,t,s)).map(gr),e)}let o=await fe(e);for(let r of o){let i=x(r,`${n}.jsonl`);try{let a=await Ht(i),{entries:u,activeLeaf:c}=await nl(a,n),m=kr(u,c,s).filter(p=>fr(p,t,s)).map(gr);return hr(m,e)}catch{continue}}return[]}async function Al(n,e,t){if(!Re(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(ct(await Qe(t.dir),n),[{type:"custom-title",sessionId:n,customTitle:s,uuid:Sr(),timestamp:new Date().toISOString()}]);return}let o=await fe(t);for(let r of o){let i=x(r,`${n}.jsonl`);try{await ze(i);let a=JSON.stringify({type:"custom-title",sessionId:n,customTitle:s,timestamp:new Date().toISOString()});await yr(i,a+`
|
|
36
|
+
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function Ml(n,e,t){if(!Re(n))throw new Error(`Invalid sessionId: ${n}`);let s=e===null?null:wl(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(ct(await Qe(t.dir),n),[{type:"tag",sessionId:n,tag:s??"",uuid:Sr(),timestamp:new Date().toISOString()}]);return}let o=await fe(t);for(let r of o){let i=x(r,`${n}.jsonl`);try{await ze(i);let a=JSON.stringify({type:"tag",sessionId:n,tag:s??"",timestamp:new Date().toISOString()});await yr(i,a+`
|
|
37
|
+
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function Il(n,e){if(e?.sessionStore){if(!Re(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(o=>{if(!o.startsWith("subagents/"))return;let r=o.split("/").at(-1);return r?.startsWith("agent-")?r.slice(6):void 0}).filter(o=>o!==void 0)))}let t=await fe(e);for(let s of t){let o=x(s,`${n}.jsonl`);try{await ze(o);let r=await Er(Pr(s,n));return Array.from(new Set(r.map(i=>i.agentId)))}catch{continue}}return[]}async function Dl(n,e,t){if(t?.sessionStore){if(!Re(n)||!e)return[];let o=await Qe(t.dir),r=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let d=await t.sessionStore.listSubkeys({projectKey:o,sessionId:n}),f=`agent-${e}`,y=d.find(g=>g.startsWith("subagents/")&&g.split("/").at(-1)===f);if(!y)return[];r=y}let i=await t.sessionStore.load({projectKey:o,sessionId:n,subpath:r});if(!i)return[];let a=i.filter(Cr),u=i.filter(d=>d.type==="agent_metadata").at(-1),c=typeof u?.toolUseId=="string"?u.toolUseId:null,l=typeof u?.parentAgentId=="string"?u.parentAgentId:null,m=Tr(a).map(d=>{let f=Hn(d);return{type:d.type,uuid:d.uuid,session_id:d.sessionId??n,message:d.message,parent_tool_use_id:c,parent_agent_id:l,...Jn(d),...Vn(d),...f?{tool_result_meta:f}:{}}}),p=Math.max(0,t.offset??0);return t.limit!==void 0?m.slice(p,p+t.limit):m.slice(p)}let s=await fe(t);for(let o of s){let r=x(o,`${n}.jsonl`);try{await ze(r);let a=(await Er(Pr(o,n))).find(u=>u.agentId===e);return a?await hl(a.filePath,n,t):[]}catch{continue}}return[]}async function xl(n,e){if(!Re(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(ct(await Qe(e.dir),n));return}let t=await fe(e);for(let s of t){let o=x(s,`${n}.jsonl`);try{await ze(o),await Promise.all([dr(o,{force:!0}),dr(x(s,n),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${n} not found`)}import{randomUUID as Jt}from"crypto";import{readdir as Ol,readFile as ql,realpath as Nl,stat as Mr,writeFile as jl}from"fs/promises";import{dirname as Fl,join as Xn,resolve as Ll}from"path";var Ir=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ul=new Set(["user","assistant","attachment","system","progress"]);async function xr(n){let e=Ll(n);try{return await Nl(e)}catch{return e}}async function Kl(n,e){let t=Fe();if(e){let o=U(await xr(e)),r=Xn(t,o,`${n}.jsonl`);try{if((await Mr(r)).size>0)return r}catch{}return}let s;try{s=await Ol(t,{withFileTypes:!0})}catch{return}for(let o of s){if(!o.isDirectory()&&!o.isSymbolicLink())continue;let r=Xn(t,o.name,`${n}.jsonl`);try{if((await Mr(r)).size>0)return r}catch{}}}function Or(n,e){let t=[],s;for(let r of n){if(r===null||typeof r!="object")continue;let i=r;if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){t.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(s=i.relocatedCwd)}return{transcript:Wn(n,e,"historical").filter(r=>Ul.has(r.type)),contentReplacements:t,relocatedCwd:s}}function Bl(n,e){let t=[];for(let s of n.split(`
|
|
38
|
+
`))if(s.trim())try{t.push(JSON.parse(s))}catch{}return Or(t,e)}function $l(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 o=s.content;if(typeof o=="string"&&o.trim())return o.trim();if(!Array.isArray(o)||o.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let r=o.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
|
|
39
|
+
`).trim();if(r)return r}}function zl(n){let e,t;for(let s of n){if(s===null||typeof s!="object")continue;let o=s;typeof o.customTitle=="string"&&o.customTitle&&(e=o.customTitle),typeof o.aiTitle=="string"&&o.aiTitle&&(t=o.aiTitle)}return e??t??$l(n)}function Dr(n,e,t,s){let o=n.transcript.filter(d=>d.isSidechain!==!0);if(o.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let d=o.findIndex(f=>f.uuid===t.upToMessageId);if(d<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);o=o.slice(0,d+1)}let r=new Set(o.map(d=>d.uuid)),i=new Map(o.map(d=>[d.uuid,Jt()])),a=o.filter(d=>d.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(o.map(d=>[d.uuid,d])),c=Jt(),l=new Date().toISOString(),m=a.map((d,f)=>{let y=null,g=typeof d.parentUuid=="string"?d.parentUuid:void 0;for(;g;){let v=u.get(g);if(!v)break;if(v.type!=="progress"){y=i.get(g)??null;break}g=typeof v.parentUuid=="string"?v.parentUuid:void 0}let S=typeof d.logicalParentUuid=="string"?i.get(d.logicalParentUuid)??null:d.logicalParentUuid??null,b={...d,...d.type==="system"&&d.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(d.uuid),parentUuid:y,logicalParentUuid:S,sessionId:c,timestamp:f===a.length-1?l:typeof d.timestamp=="string"?d.timestamp:l,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:d.uuid}};return delete b.teamName,delete b.agentName,delete b.sessionKind,delete b.slug,delete b.sourceToolAssistantUUID,b});if(n.contentReplacements.length>0){let d=n.contentReplacements.flatMap(f=>{if(f===null||typeof f!="object")return[];let y=f.messageUuid;if(typeof y!="string"||!r.has(y))return[];let g=i.get(y);return g?[{...f,messageUuid:g}]:[]});d.length>0&&m.push({type:"content-replacement",sessionId:c,replacements:d,uuid:Jt(),timestamp:l})}n.relocatedCwd&&m.push({type:"relocated",sessionId:c,relocatedCwd:n.relocatedCwd});let p=t.title?.trim();return m.push({type:"custom-title",sessionId:c,customTitle:p||`${zl(s)??"Forked session"} (fork)`,uuid:Jt(),timestamp:l}),{sessionId:c,entries:m}}async function Ql(n,e={}){if(!Ir.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!Ir.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await xr(e.dir??process.cwd()),a=U(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=Dr(Or(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Kl(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await ql(t,"utf8"),o=s.split(`
|
|
40
|
+
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),r=Dr(Bl(s,n),n,e,o);return await jl(Xn(Fl(t),`${r.sessionId}.jsonl`),`${r.entries.map(i=>JSON.stringify(i)).join(`
|
|
38
41
|
`)}
|
|
39
|
-
`,{flag:"wx",mode:384}),{sessionId:r.sessionId}}function
|
|
40
|
-
${s.stdout}`);throw
|
|
42
|
+
`,{flag:"wx",mode:384}),{sessionId:r.sessionId}}function Vt(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Zn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Vt(e),o=this.entries.get(s)??[];o.push(...t),this.entries.set(s,o),this.keys.set(s,{...e});let r=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=r,this.modifiedAt.set(s,r)}async load(e){let t=this.entries.get(Vt(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,o]of this.keys)o.projectKey!==e||o.subpath!==void 0||t.push({sessionId:o.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,o)=>o.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Vt(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(Vt(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 Gl}from"fs";import{readdir as Fr,readFile as Hl,realpath as Wl,stat as qr}from"fs/promises";import{basename as Nr,dirname as Jl,join as lt,relative as Vl,resolve as Yl,sep as Xl}from"path";import{createInterface as Zl}from"readline";var ed=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,td=500,nd=1024*1024;async function sd(n){let e=Yl(n);try{return await Wl(e)}catch{return e}}async function od(n,e){let t=Fe();if(e){let o=U(await sd(e)),r=lt(t,o,`${n}.jsonl`);try{if((await qr(r)).size>0)return{filePath:r,projectKey:o}}catch{}return}let s;try{s=await Fr(t,{withFileTypes:!0})}catch{return}for(let o of s){if(!o.isDirectory()&&!o.isSymbolicLink())continue;let r=lt(t,o.name,`${n}.jsonl`);try{if((await qr(r)).size>0)return{filePath:r,projectKey:o.name}}catch{}}}async function rd(n){let e=[];async function t(s){let o;try{o=await Fr(s,{withFileTypes:!0})}catch{return}o.sort((r,i)=>r.name.localeCompare(i.name));for(let r of o){let i=lt(s,r.name);r.isDirectory()?await t(i):r.isFile()&&r.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function jr(n,e,t,s){let o=Zl({input:Gl(n,{encoding:"utf8"}),crlfDelay:1/0}),r=[],i=0;for await(let a of o){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${n}`);continue}r.push(u),i+=Buffer.byteLength(a),(r.length>=s||i>=nd)&&(await t.append(e,r),r=[],i=0)}r.length>0&&await t.append(e,r)}async function id(n,e,t={}){if(!ed.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await od(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let o=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:td;if(await jr(s.filePath,{projectKey:s.projectKey,sessionId:n},e,o),t.includeSubagents===!1)return;let r=s.filePath.replace(/\.jsonl$/,""),i=lt(r,"subagents");for(let a of await rd(i)){let c=Vl(r,a).split(Xl);c[c.length-1]=Nr(c[c.length-1],".jsonl");let l={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await jr(a,l,e,o);let m=lt(Jl(a),`${Nr(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Hl(m,"utf8"));await e.append(l,[{type:"agent_metadata",...p}])}catch(p){if(typeof p=="object"&&p!==null&&"code"in p&&p.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${m}: ${String(p)}`)}}}import{spawn as ad}from"node:child_process";import{existsSync as ud}from"node:fs";import{Worker as cd}from"node:worker_threads";var es=3e4;async function Lr(n,e={}){let t=Le({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},ge);return t.transport==="worker"?dd(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):ld(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??oe()})}function ld(n,e){return new Promise((t,s)=>{let o=ad(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:Ur(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),r="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,o.kill("SIGTERM"),s(Kr(e.timeoutMs)))},e.timeoutMs??es);o.stdout.on("data",c=>{r+=c.toString()}),o.stderr.on("data",c=>{i+=c.toString()}),o.on("error",c=>{a||(a=!0,clearTimeout(u),s(c))}),o.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:r,stderr:i,exitCode:c??1}))})})}async function dd(n,e){md(e.signal);let t=ie(e.pathToQoderWorkerRuntime),s=await De(t);pd(s);let o=e.cwd??process.cwd(),r=Ur(e.env);delete r.NODE_OPTIONS;let i=Et(s,{cwd:o,env:r});return new Promise((a,u)=>{let c=new cd(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),l="",m="",p=!1,d,f=c.stdout===null,y=c.stderr===null,g=()=>{clearTimeout(D),e.signal?.removeEventListener("abort",v)},S=A=>{p||(p=!0,g(),u(A))},b=()=>{p||d===void 0||!f||!y||(p=!0,g(),a({stdout:l,stderr:m,exitCode:d}))},v=()=>{c.terminate(),S(Br(e.signal))},D=setTimeout(()=>{c.terminate(),S(Kr(e.timeoutMs))},e.timeoutMs??es);c.stdin?.end(),c.stdout?.on("data",A=>{l+=A.toString()}),c.stdout?.on("end",()=>{f=!0,b()}),c.stderr?.on("data",A=>{m+=A.toString()}),c.stderr?.on("end",()=>{y=!0,b()}),c.once("error",S),c.once("exit",A=>{d=A,b()}),e.signal?.addEventListener("abort",v,{once:!0}),e.signal?.aborted&&v()})}function Ur(n){let e={...process.env,...n},t={};for(let[s,o]of Object.entries(e))o!==void 0&&(t[s]=o);return t}function pd(n){if(!ud(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function Kr(n){return new Error(`qodercli subprocess timed out after ${n??es}ms`)}function md(n){if(n?.aborted)throw Br(n)}function Br(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function fd(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ge(e,n);return JSON.parse(t.stdout).map(o=>({id:o.id,name:o.name,source:o.source,path:o.installPath??o.path,version:o.version??"unknown",scope:o.scope,enabled:o.enabled,canDisable:o.canDisable,displayName:o.displayName,description:o.description,installedAt:o.installedAt,lastUpdated:o.lastUpdated,...typeof o.projectPath=="string"?{projectPath:o.projectPath}:{},resources:o.resources}))}async function gd(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ge(t,e);s.exitCode!==0&&dt(s)}async function hd(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ge(t,e);s.exitCode!==0&&dt(s)}async function yd(n,e){let t=e?.scope??"user",s=await Ge(["plugins","install",n,"--scope",t,"--json"],e);s.exitCode!==0&&dt(s);let o=JSON.parse(s.stdout);return{pluginId:o.pluginId,version:o.version??"local",path:o.path}}async function Sd(n,e){let t=e?.scope??"user",s=["plugins","uninstall",n,"--scope",t,"--json"];e?.keepData&&s.push("--keep-data");let o=await Ge(s,e);o.exitCode!==0&&dt(o);let r=JSON.parse(o.stdout);return{pluginId:r.pluginId,fullyRemoved:r.fullyRemoved,reverseDependents:r.reverseDependents??[]}}async function vd(n,e){let t=e?.daemon;if(t&&t.state==="ready"&&t.supportsCapability(Oe))return wd(n,t,e);let s;try{s=await Ge(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new E("Plugin validation was aborted");let i=r instanceof Error?r.message:String(r);throw G("plugin_validation_failed",`Failed to run qodercli plugin validation: ${i}`)}let o;try{o=JSON.parse(s.stdout)}catch{let r=bd(`${s.stderr}
|
|
43
|
+
${s.stdout}`);throw G(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(o&&typeof o=="object"&&"ok"in o&&o.schemaVersion!==1)throw G("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(o&&typeof o=="object"&&o.ok===!0&&o.report){let r=o.report;if($r(r))return r;throw G("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(o&&typeof o=="object"&&o.ok===!1){let r=o.error;if(!r||typeof r!="object"||typeof r.code!="string"||typeof r.message!="string")throw G("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let i=r;throw G(i.code,i.message)}throw s.exitCode!==0&&dt(s),G("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}async function wd(n,e,t){if(t.signal?.aborted)throw new E("Plugin validation was aborted");let s=t.env?.QODER_CONFIG_DIR??t.env?.QODERCN_CONFIG_DIR,o;try{o=await e.validatePlugins([n],s?{configDir:s}:void 0)}catch(i){if(t.signal?.aborted||i instanceof Error&&i.name==="AbortError")throw new E("Plugin validation was aborted");if(i instanceof Error&&i.name==="DaemonRpcError"&&typeof i.code=="string")throw G(i.code,i.message);let a=i instanceof Error?i.message:String(i);throw G("plugin_validation_failed",`Failed to run qodercli plugin validation: ${a}`)}if(t.signal?.aborted)throw new E("Plugin validation was aborted");let r=o[0];if(o.length!==1||!$r(r))throw G("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.");return r}function bd(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var _d=3e4;function Ge(n,e){return Lr(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:_d})}function dt(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 G(e,t)}function G(n,e){let t=new Error(e);return t.code=n,t}function $r(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"))}var Gr={};Vr(Gr,{filterEscalatingDefaultMode:()=>zr,isBashToolBackgroundLaunchResult:()=>Qr});var kd=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function zr(n){let e=n.effective.permissions?.defaultMode;if(!e||!kd.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:o,...r}=n.effective.permissions??{};return{...n.effective,permissions:r}}return n.effective}}return n.effective}function Qr(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=r=>r===void 0||typeof r=="string",s=r=>r===void 0||typeof r=="number"&&Number.isInteger(r)&&r>=0,o=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)&&(o===void 0||o==="user"||o==="model"||o==="timeout"||o==="auto")}export{E as AbortError,vt as AuthAccessTokenEnvVarError,wt as AuthServiceAccountEnvVarError,on as CONTROL_REQUEST_TIMEOUT_CODE,Te as ControlRequestError,so as DAEMON_HEARTBEAT_TIMEOUT_MS,ve as DAEMON_PROXY_BYPASS_CAPABILITY,Se as DAEMON_PROXY_CAPABILITY,Oe as DAEMON_VALIDATE_PLUGINS_CAPABILITY,ls as DEFAULT_ACCESS_TOKEN_ENV_VAR,ge as DEFAULT_RUNTIME_TRANSPORT,St as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,qe as DaemonHeartbeatTimeoutError,It as DaemonRpcError,et as DaemonSessionAlreadyOpenError,Xr as EXIT_REASONS,W as FrameTooLargeError,Yr as HOOK_EVENTS,Zn as InMemorySessionStore,Bt as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,We as ModelPolicyTimeoutError,Me as ProcessTransport,B as ProtocolVersionMismatchError,Ee as QoderCliInitializationError,O as QoderCliProcessError,ye as QoderWorkerRuntimeError,$ as UnsupportedCliCapabilityError,mn as WIRE_PROTOCOL_VERSION,xe as WorkerTransport,oi as accessToken,ri as accessTokenFromEnv,Gr as coreTypes,Wc as createSdkMcpServer,xl as deleteSession,hd as disablePlugin,gd as enablePlugin,zr as filterEscalatingDefaultMode,Ql as forkSession,El as getSessionInfo,Tl as getSessionMessages,Dl as getSubagentMessages,qs as hasResolvableQoderWorkerRuntime,id as importSessionToStore,ur as initDaemon,yd as installPlugin,Qr as isBashToolBackgroundLaunchResult,ci as jobToken,fd as listPlugins,Cl as listSessions,Il as listSubagents,ii as qodercliAuth,Un as query,Al as renameSession,ie as resolveQoderWorkerRuntimePath,Bc as resolveSettings,ai as serviceAccount,ui as serviceAccountFromEnv,zc as shutdownDaemon,jn as startDaemon,Ac as startup,Pc as submitFeedback,Ml as tagSession,Jc as tool,Sd as uninstallPlugin,vd as validatePlugin};
|