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