@qoder-ai/qoder-agent-sdk 1.0.38 → 1.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/global/plugins.d.ts +2 -6
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/protocol/common.d.ts +2 -0
- package/dist/protocol/control.d.ts +1 -1
- package/dist/protocol/messages.d.ts +3 -3
- package/dist/query/query-runner.d.ts +1 -0
- package/dist/runtime-manifest.json +5 -5
- package/dist/types/messages.d.ts +2 -2
- package/dist/types/model-policy-provider.d.ts +13 -2
- package/dist/types/options.d.ts +7 -2
- package/dist/types/plugins.d.ts +10 -0
- package/package.json +2 -2
package/dist/global/plugins.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import type { PluginDetails, InstallPluginOptions, InstallPluginResult, PluginToggleOptions, PluginValidationReport, ValidatePluginOptions, UninstallPluginOptions, UninstallPluginResult } from '../types/plugins.js';
|
|
2
|
-
export declare function listPlugins(opts?:
|
|
3
|
-
orgId?: string;
|
|
4
|
-
cliPath?: string;
|
|
5
|
-
env?: Record<string, string>;
|
|
6
|
-
}): Promise<PluginDetails[]>;
|
|
1
|
+
import type { PluginDetails, ListPluginsOptions, InstallPluginOptions, InstallPluginResult, PluginToggleOptions, PluginValidationReport, ValidatePluginOptions, UninstallPluginOptions, UninstallPluginResult } from '../types/plugins.js';
|
|
2
|
+
export declare function listPlugins(opts?: ListPluginsOptions): Promise<PluginDetails[]>;
|
|
7
3
|
export declare function enablePlugin(id: string, opts?: PluginToggleOptions): Promise<void>;
|
|
8
4
|
export declare function disablePlugin(id: string, opts?: PluginToggleOptions): Promise<void>;
|
|
9
5
|
export declare function installPlugin(path: string, opts?: InstallPluginOptions): Promise<InstallPluginResult>;
|
package/dist/index.d.ts
CHANGED
|
@@ -74,7 +74,7 @@ export { importSessionToStore } from './session/session-import.js';
|
|
|
74
74
|
export type { ImportSessionToStoreOptions } from './session/session-import.js';
|
|
75
75
|
export type { SessionKey, SessionStore, SessionStoreEntry, SessionStoreFlush, } from './session/session-store.js';
|
|
76
76
|
export { listPlugins, enablePlugin, disablePlugin, installPlugin, uninstallPlugin, validatePlugin, } from './global/plugins.js';
|
|
77
|
-
export type { PluginScope, PluginToggleOptions, InstallPluginOptions, UninstallPluginOptions, PluginDetails, PluginResources, InstallPluginResult, UninstallPluginResult, PluginValidationSeverity, PluginValidationPhase, PluginValidationPosition, PluginValidationLocation, PluginValidationDiagnostic, PluginValidationReport, ValidatePluginOptions, } from './types/plugins.js';
|
|
77
|
+
export type { PluginScope, ListPluginsOptions, PluginToggleOptions, InstallPluginOptions, UninstallPluginOptions, PluginDetails, PluginResources, InstallPluginResult, UninstallPluginResult, PluginValidationSeverity, PluginValidationPhase, PluginValidationPosition, PluginValidationLocation, PluginValidationDiagnostic, PluginValidationReport, ValidatePluginOptions, } from './types/plugins.js';
|
|
78
78
|
export { submitFeedback } from './feedback.js';
|
|
79
79
|
export type { SubmitFeedbackParams, SubmitFeedbackOptions, IntegrationMode, } from './feedback.js';
|
|
80
80
|
export { AbortError, ControlRequestError, ModelPolicyTimeoutError, ProtocolVersionMismatchError, UnsupportedCliCapabilityError, } from './core/errors.js';
|
|
@@ -113,7 +113,7 @@ export type { Settings, ResolveSettingsOptions, ResolvedSettingSource, ResolvedS
|
|
|
113
113
|
export { filterEscalatingDefaultMode } from './types/settings.js';
|
|
114
114
|
export type { QoderModelPurpose } from './types/control.js';
|
|
115
115
|
export type { SDKControlRequest, SDKControlResponse, SDKControlInterruptResponse, SDKControlInitializeResponse, SDKControlGetContextUsageResponse, SDKControlGetUsageInfoRequest, SDKControlGetUsageInfoResponse, SideQuestionHistoryEntry, AskSideQuestionOptions, SideQuestionRefusalFallback, SideQuestionResult, SDKControlAddDirectoriesResponse, SDKControlReloadPluginsResponse, SDKControlReloadSkillsRequest, SDKControlReloadSkillsResponse, SDKControlStopTaskRequest, SDKControlBackgroundTasksRequest, SDKControlBackgroundTasksResponse, SDKPlanModeSnapshot, } from './types/control.js';
|
|
116
|
-
export type { SDKControlGetModelPolicyRequest, SDKControlGetModelPolicyResponse, SDKCapabilities, ModelPolicyContext, ModelPolicyResult, ModelPolicyProvider, } from './types/model-policy-provider.js';
|
|
116
|
+
export type { SDKControlGetModelPolicyRequest, SDKControlGetModelPolicyResponse, SDKCapabilities, ModelPolicyContext, ModelPolicyParameters, ModelPolicyResult, ModelPolicyProvider, } from './types/model-policy-provider.js';
|
|
117
117
|
export type { SDKControlGetByokConfigRequest, SDKControlGetByokConfigResponse, SDKControlValidateByokModelRequest, SDKControlValidateByokModelResponse, SDKControlListByokConfigsRequest, SDKControlListByokConfigsResponse, SDKControlCreateByokConfigRequest, SDKControlCreateByokConfigResponse, SDKControlUpdateByokConfigRequest, SDKControlDeleteByokConfigRequest, SDKControlCheckByokConfigRequest, SDKControlCheckByokConfigResponse, BYOKModelValidationInput, BYOKLocalizedName, BYOKProviderInfo, BYOKModelTypeInfo, BYOKModelInfo, ByokProtocol, ByokModelConfigInfo, CustomByokProviderConfigInfo, ByokConfigInfo, ByokModelConfigInput, CustomByokProviderThinkingMode, CustomByokProviderReasoningEffortLevel, CustomByokProviderThinkingCapabilitiesInput, CustomByokProviderModelCapabilitiesInput, CustomByokProviderModelInput, CustomByokProviderConfigInput, CreateByokConfigInput, UpdateByokModelConfigInput, UpdateCustomByokProviderConfigInput, UpdateByokConfigInput, DeleteByokConfigInput, CheckByokConfigInput, ByokConfigReference, ByokConfigCheckResult, CustomModel, } from './types/byok.js';
|
|
118
118
|
export { isBashToolBackgroundLaunchResult } from './types/tools.js';
|
|
119
119
|
export type { AgentInput, AgentOutput, AgentToolCompletionResult, AgentToolBackgroundLaunchResult, AgentToolTeammateSpawnedResult, BashInput, BashToolBackgroundLaunchResult, FileReadInput, FileReadOutput, FileEditInput, FileWriteInput, GlobInput, GrepInput, WebFetchInput, WebSearchInput, AskUserQuestionInput, NotebookEditInput, TaskCreateInput, TaskCreateOutput, TaskGetInput, TaskGetOutput, TaskUpdateInput, TaskUpdateOutput, TaskListInput, TaskListOutput, ExitPlanModeInput, TodoWriteInput, ToolInputSchemas, ToolOutputSchemas, } from './types/tools.js';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var io=Object.defineProperty;var ao=(n,e)=>{for(var t in e)io(n,t,{get:e[t],enumerable:!0})};import{spawn as Lo}from"child_process";import{createInterface as Bo}from"readline";var uo=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],co=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Je=2e3,On=5e3;var Ve="1.0.38";var he=41,In=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],An=["TaskCreate","TaskGet","TaskUpdate","TaskList"],lo="QODER_FEATURE_TASKS";function Dn(n){let e=n[lo];if(e!=="0"&&e!=="false")return[...In];let t=new Set(An);return In.flatMap(s=>s===An[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Kn,mkdtemp as ko,rm as Un,writeFile as _o}from"fs/promises";import{existsSync as et,mkdtempSync as Ro,readFileSync as Eo,rmSync as Co,writeFileSync as Po}from"fs";import{homedir as To,tmpdir as Ln}from"os";import{dirname as Hn,join as L}from"path";import{fileURLToPath as Mo}from"url";var po=/^[A-Za-z0-9_-]{1,64}$/,mo=new Set(["mcp_list","mcp_get","mcp_call"]);function Tt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!po.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(mo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Mt(n,e){let t={};for(let s of e)Tt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function It(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Mt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function xn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=It(t,s,r)}return e}var fo="global",Nn=fo==="cn",go=Nn?"QODERCN_":"QODER_",At=`${go}VPC_ENDPOINT`,v=Nn?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var qn=v.accessTokenEnv,Ye=v.serviceAccountEnv;function ho(n){return{type:"accessToken",accessToken:n}}function yo(n=qn){return{type:"accessToken",accessToken:{envVar:n}}}function So(){return{type:"qodercli"}}function wo(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function vo(n=Ye){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function bo(n){return{type:"jobToken",fetchJobToken:n}}var jn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Fn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(jn),t=Object.keys(n).filter(s=>!e.has(s));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let s of jn){let r=n[s];if(r!==void 0&&typeof r!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var Bn="QODER_AGENT_SDK_ENTRYPOINT",$n="QODER_AGENT_SDK_VERSION",zn="QODER_SDK_AUTH_PAYLOAD_FILE",Io="sdk-ts",Ao=Mo(import.meta.url),Qn=Hn(Ao),Xe=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},Ze=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function tt(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function H(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Oo();if(n)return n;let e=Do();if(et(e))return e;let t=xo();return t||v.cliCommands[0]}function Oo(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,"dist","_bundled",t);if(et(s))return s}return null}function Do(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[L(n,"node_modules",".bin",t),L(n,"..","..",".bin",t)];for(let r of s)if(et(r))return r}return v.cliCommands[0]}function xo(){let n=process.env[v.cliHomeEnv]??To();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,v.configDirName,"local",t);if(et(s))return s}return null}function Jn(){let n=[L(Qn,".."),L(Qn,"..","..")];return[...new Set(n)]}function No(){return{allow:[],ask:[],deny:[]}}function Gn(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function qo(n,e){if(e.startsWith("mcp__"))return e;let t=Gn(n),s=e==="*"?"*":Gn(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function Wn(n,e){if(e.length===0)return;let t=new Set(n);for(let s of e)t.has(s)||(n.push(s),t.add(s))}function jo(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var G=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Co(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupLaunchArtifacts(){this.cleanupGeneratedSettings(),await this.cleanupAuthPayload()}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Hn(this.authPayloadPath);try{await Un(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);delete t[Bn],delete t[$n],delete t[zn];for(let s of this.serviceAccountCredentialEnvVars())Fo(t,s);if(t[Bn]=Io,t[$n]=Ve,this.authPayloadPath&&(t[zn]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[At]=s:delete t[At]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Ye];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Dn(t.env??process.env);if(Array.isArray(s)?e.push("--tools",s.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let r=this.buildSettingsArg();if(r!==void 0&&e.push("--settings",r),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let s={...e??{}};this.applySettingsCompatibility(s),this.applyAdditionalDirectories(s),this.applyMcpPolicyRules(s,t),this.applySecurityScanSetting(s);let r=this.applyFileCheckpointingSetting(s);return Object.keys(r).length>0?JSON.stringify(r):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?jo(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Fn(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},r=this.toQoderDefaultPermissionMode(t.defaultMode);r!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=r),e.general=s}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},r=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];Wn(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=It(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=No(),t=new Map;for(let[s,r]of Object.entries(this.options.mcpToolPolicies??{}))r.length>0&&t.set(s,r);for(let[s,r]of Object.entries(this.options.mcpServers??{})){let o=r.tools;Array.isArray(o)&&o.length>0&&t.set(s,[...t.get(s)??[],...o])}for(let[s,r]of t)for(let o of r){let i=qo(s,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=s;for(let r of["allow","ask","deny"]){let o=Array.isArray(s[r])?[...s[r]]:[];Wn(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Eo(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Ro(L(Ln(),"qoder-agent-sdk-settings-"));let t=L(this.generatedSettingsDir,"settings.json");return Po(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await ko(L(Ln(),"qoder-sdk-auth-"));try{await Kn(s,448);let r=L(s,"payload.json");return await _o(r,JSON.stringify(t),{mode:384}),await Kn(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await Un(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Ze(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Xe(t);return s}};function Fo(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function nt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var Ko=new Set(["--mcp-config","--proxy","--settings"]);function st(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),Ko.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as Uo}from"node:stream";var B=16*1024*1024,Oe=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},J=class extends Uo{constructor(t=B,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ye(n,e=B,t="JSONL output"){let s=n.endsWith(`
|
|
1
|
+
var io=Object.defineProperty;var ao=(n,e)=>{for(var t in e)io(n,t,{get:e[t],enumerable:!0})};import{spawn as Lo}from"child_process";import{createInterface as Bo}from"readline";var uo=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],co=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Je=2e3,On=5e3;var Ve="1.0.40";var he=41,In=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],An=["TaskCreate","TaskGet","TaskUpdate","TaskList"],lo="QODER_FEATURE_TASKS";function Dn(n){let e=n[lo];if(e!=="0"&&e!=="false")return[...In];let t=new Set(An);return In.flatMap(s=>s===An[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Kn,mkdtemp as ko,rm as Un,writeFile as _o}from"fs/promises";import{existsSync as et,mkdtempSync as Ro,readFileSync as Eo,rmSync as Co,writeFileSync as Po}from"fs";import{homedir as To,tmpdir as Ln}from"os";import{dirname as Hn,join as L}from"path";import{fileURLToPath as Mo}from"url";var po=/^[A-Za-z0-9_-]{1,64}$/,mo=new Set(["mcp_list","mcp_get","mcp_call"]);function Tt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!po.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(mo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Mt(n,e){let t={};for(let s of e)Tt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function It(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Mt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function xn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=It(t,s,r)}return e}var fo="global",Nn=fo==="cn",go=Nn?"QODERCN_":"QODER_",At=`${go}VPC_ENDPOINT`,v=Nn?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var qn=v.accessTokenEnv,Ye=v.serviceAccountEnv;function ho(n){return{type:"accessToken",accessToken:n}}function yo(n=qn){return{type:"accessToken",accessToken:{envVar:n}}}function So(){return{type:"qodercli"}}function wo(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function vo(n=Ye){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function bo(n){return{type:"jobToken",fetchJobToken:n}}var jn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Fn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(jn),t=Object.keys(n).filter(s=>!e.has(s));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let s of jn){let r=n[s];if(r!==void 0&&typeof r!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var Bn="QODER_AGENT_SDK_ENTRYPOINT",$n="QODER_AGENT_SDK_VERSION",zn="QODER_SDK_AUTH_PAYLOAD_FILE",Io="sdk-ts",Ao=Mo(import.meta.url),Qn=Hn(Ao),Xe=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},Ze=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function tt(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function H(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Oo();if(n)return n;let e=Do();if(et(e))return e;let t=xo();return t||v.cliCommands[0]}function Oo(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,"dist","_bundled",t);if(et(s))return s}return null}function Do(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[L(n,"node_modules",".bin",t),L(n,"..","..",".bin",t)];for(let r of s)if(et(r))return r}return v.cliCommands[0]}function xo(){let n=process.env[v.cliHomeEnv]??To();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,v.configDirName,"local",t);if(et(s))return s}return null}function Jn(){let n=[L(Qn,".."),L(Qn,"..","..")];return[...new Set(n)]}function No(){return{allow:[],ask:[],deny:[]}}function Gn(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function qo(n,e){if(e.startsWith("mcp__"))return e;let t=Gn(n),s=e==="*"?"*":Gn(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function Wn(n,e){if(e.length===0)return;let t=new Set(n);for(let s of e)t.has(s)||(n.push(s),t.add(s))}function jo(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var G=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Co(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupLaunchArtifacts(){this.cleanupGeneratedSettings(),await this.cleanupAuthPayload()}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Hn(this.authPayloadPath);try{await Un(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);delete t[Bn],delete t[$n],delete t[zn];for(let s of this.serviceAccountCredentialEnvVars())Fo(t,s);if(t[Bn]=Io,t[$n]=Ve,this.authPayloadPath&&(t[zn]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[At]=s:delete t[At]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Ye];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Dn(t.env??process.env);if(Array.isArray(s)?e.push("--tools",s.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let r=this.buildSettingsArg();if(r!==void 0&&e.push("--settings",r),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let s={...e??{}};this.applySettingsCompatibility(s),this.applyAdditionalDirectories(s),this.applyMcpPolicyRules(s,t),this.applySecurityScanSetting(s);let r=this.applyFileCheckpointingSetting(s);return Object.keys(r).length>0?JSON.stringify(r):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?jo(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Fn(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},r=this.toQoderDefaultPermissionMode(t.defaultMode);r!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=r),e.general=s}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},r=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];Wn(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=It(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=No(),t=new Map;for(let[s,r]of Object.entries(this.options.mcpToolPolicies??{}))r.length>0&&t.set(s,r);for(let[s,r]of Object.entries(this.options.mcpServers??{})){let o=r.tools;Array.isArray(o)&&o.length>0&&t.set(s,[...t.get(s)??[],...o])}for(let[s,r]of t)for(let o of r){let i=qo(s,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=s;for(let r of["allow","ask","deny"]){let o=Array.isArray(s[r])?[...s[r]]:[];Wn(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Eo(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Ro(L(Ln(),"qoder-agent-sdk-settings-"));let t=L(this.generatedSettingsDir,"settings.json");return Po(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await ko(L(Ln(),"qoder-sdk-auth-"));try{await Kn(s,448);let r=L(s,"payload.json");return await _o(r,JSON.stringify(t),{mode:384}),await Kn(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await Un(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Ze(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Xe(t);return s}};function Fo(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function nt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var Ko=new Set(["--mcp-config","--proxy","--settings"]);function st(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),Ko.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as Uo}from"node:stream";var B=16*1024*1024,Oe=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},J=class extends Uo{constructor(t=B,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ye(n,e=B,t="JSONL output"){let s=n.endsWith(`
|
|
2
2
|
`)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new Oe(t,e)}var Vn=8192,I=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},Se=class n{static default=new n;process=null;customHandle=null;options;ready=!1;closed=!1;shutdownStarted=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;processStopped=!1;closeTimer;killTimer;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new G(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(nt(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupLaunchArtifacts();return}let s=e.env,{command:r,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${r} ${st(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:r,args:o,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,this.observeProcess(i)}else this.process=Lo(r,o,{cwd:this.options.cwd,env:s,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.observeProcess(this.process),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!this.closed&&!this.shutdownStarted&&!this.processStopped,this.flushPendingInput()}catch(e){throw this.process||this.customHandle?this.shutdownProcess():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
3
3
|
`)?e:e+`
|
|
4
4
|
`;if(ye(t,B,"SDK process input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=new J(B,"SDK process output");e.pipe(t);let s=Bo({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){this.closed||(this.closed=!0,this.shutdownProcess())}shutdownProcess(){if(this.shutdownStarted)return;this.shutdownStarted=!0,this.ready=!1,this.pendingInput=[];let e=this.process??this.customHandle;if(!e)return;if(this.hasProcessStopped()){this.finishProcess();return}if(this.endInput(),this.hasProcessStopped()){this.finishProcess();return}let t=r=>{try{e.kill(r)}catch(o){this.diagnostics?.record(`[ProcessTransport] Failed to send ${r}:`,o)}},s=this.options.closeGraceMs??Je;this.closeTimer=setTimeout(()=>{this.closeTimer=void 0,!this.hasProcessStopped()&&(t("SIGTERM"),!this.hasProcessStopped()&&(this.killTimer=setTimeout(()=>{this.killTimer=void 0,this.hasProcessStopped()||t("SIGKILL")},On),this.killTimer.unref()))},s),this.closeTimer.unref()}hasProcessStopped(){let e=this.process??this.customHandle;return this.processStopped||e!==null&&e.exitCode!==null||this.process!==null&&this.process.signalCode!==null}finishProcess(){this.processStopped||(this.processStopped=!0,this.ready=!1,clearTimeout(this.closeTimer),clearTimeout(this.killTimer),this.closeTimer=void 0,this.killTimer=void 0,this.cleanupLaunchArtifacts().catch(()=>{}))}observeProcess(e){e.on("error",t=>{this.ready=!1,this.closed||(this.processExitError??=this.createSpawnError(t)),this.diagnostics?.record("[ProcessTransport] Process error:",t),this.hasProcessStopped()?this.finishProcess():this.shutdownProcess()}),e.once("exit",(t,s)=>{if(this.finishProcess(),this.diagnostics?.record(`[ProcessTransport] Process exited: code=${t}, signal=${s}`),!this.closed&&!this.processExitError){t===he&&this.fireAuthExpired();let r=this.createProcessExitError(t,s);r&&(this.processExitError=r)}})}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>Vn&&(this.stderrTail=this.stderrTail.slice(-Vn))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",r=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new I(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==he){if(e!==0&&e!==null)return new I(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new I(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(this.hasProcessStopped()){let t=this.createProcessExitError(e.exitCode,this.process?.signalCode??null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let r=(i,a)=>{if(e.off("error",o),this.closed){t();return}let u=this.processExitError??this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.processExitError??this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??H();if(tt(t)){let s=this.options.executable??"node",r=this.options.executableArgs??[];return{command:s,commandArgs:[...r,t,...e]}}return{command:t,commandArgs:e}}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function $o(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var se=$o();function Yn(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function rt(n,e){return n.create(e)}import{existsSync as fi}from"fs";import{createInterface as gi}from"readline";import{Worker as hi}from"worker_threads";import{createHash as zo}from"node:crypto";import{existsSync as Qo}from"node:fs";import{chmod as Go,lstat as Wo,mkdir as De,readFile as Xn,readdir as Ho,readlink as Jo,rename as Vo,rm as ot,stat as Yo,symlink as Xo,writeFile as Zn}from"node:fs/promises";import{tmpdir as Zo,userInfo as ei}from"node:os";import{basename as es,dirname as we,join as $,relative as ti}from"node:path";var ni="QODER_WORKER_RUNTIME_ASSET_ROOT",ts=/(^|[\\/])app\.asar([\\/]|$)/,Dt=".qoder-worker-runtime-ready";function ns(n){return ts.test(n)}function xt(n){return ns(n)?n.replace(ts,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ve(n,e={}){let t=xt(n);if(!e.forceMaterialize&&t){let u=we(t);if(Qo(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Ot(t,u,!1,we(n))}if(!(e.forceMaterialize||ns(n))){let u=we(n);return Ot(n,u,!1)}let r=we(n),o=await si(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=ti(r,n)||es(n),a=$(o,i);return Ot(a,o,!0,r)}function Ot(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[ni]:e}}}async function si(n,e,t){let s=await ri(n,e),r=t.cacheDir??ai(),o=$(r,s),i=$(o,Dt);if(await rs(i)===s)return o;let a=$(r,`.setup-${s}-${process.pid}-${Date.now()}`);await De(r,{recursive:!0,mode:448}),await ot(a,{recursive:!0,force:!0}),await ot(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await De(a,{recursive:!0,mode:448}),await ss(n,a),await Zn($(a,Dt),s,{mode:384}),await ii(a,o,s),o}catch(u){throw await ot(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function ri(n,e){let t=zo("sha256");t.update("qoder-worker-runtime-v1\0");let s=await os($(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await Yo(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function ss(n,e){let t=await Ho(n,{withFileTypes:!0});await De(e,{recursive:!0,mode:448});for(let s of t){let r=$(n,s.name),o=$(e,s.name);if(s.isDirectory()){await ss(r,o);continue}if(s.isSymbolicLink()){await De(we(o),{recursive:!0,mode:448}),await Xo(await Jo(r),o);continue}if(!s.isFile())continue;let i=await oi(r);await De(we(o),{recursive:!0,mode:448}),await Zn(o,await Xn(r),{mode:i}),process.platform!=="win32"&&await Go(o,i)}}async function oi(n){let e=((await Wo(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=es(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function ii(n,e,t){try{await Vo(n,e)}catch(s){if(await rs($(e,Dt))===t){await ot(n,{recursive:!0,force:!0});return}throw s}}async function rs(n){let e=await os(n);return e?e.toString("utf8"):null}async function os(n){try{return await Xn(n)}catch{return null}}function ai(){let n=ui(ei().username||process.env.USER||process.env.USERNAME||"user");return $(Zo(),`qoder-sdk-worker-runtime-${n}`)}function ui(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var ci="QODER_WORKER_CWD";function it(n,e){return{env:{...e.env,[ci]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as Nt}from"node:fs";import{dirname as li,join as re}from"node:path";import{fileURLToPath as di}from"node:url";var pi=di(import.meta.url),qt=li(pi);function V(n){if(n)return n;let e=[];for(let t of mi())e.push(re(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),re(t,"dist","_worker","qoder-worker-runtime.mjs"),re(t,"_worker","qoder-worker-runtime.obf.mjs"),re(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(Nt(t))return t;return e[0]??re(qt,"..","_worker","qoder-worker-runtime.obf.mjs")}function is(n){let e=V(n);if(Nt(e))return!0;let t=xt(e);return t!==null&&Nt(t)}function mi(){let n=[re(qt,".."),re(qt,"..","..")];return[...new Set(n)]}var as=8192,oe=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},be=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new jt(nt(this.options,e))}},jt=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new G(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupLaunchArtifacts();return}let t=V(this.options.pathToQoderWorkerRuntime),s;try{s=await ve(t,{diagnostics:this.diagnostics})}catch(a){throw new oe(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!fi(r))throw new oe(`Qoder worker runtime not found: ${r}`);if(this.closed){await this.cleanupLaunchArtifacts();return}let o=this.options.cwd??process.cwd(),i=it(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${st(e.args)}`),this.worker=new hi(r,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker)}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupLaunchArtifacts().catch(()=>{});return}a===he&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupLaunchArtifacts().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw this.worker?this.close():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
@@ -10,7 +10,7 @@ ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(
|
|
|
10
10
|
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(f){p(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,f),c(f)}})}handleControlResponse(e){let t=e.response,s=t.request_id,r=this.pendingRequests.get(s);if(!r){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")r.resolve(t.response);else{let o=new qe({requestId:s,message:t.error,code:t.code,retryable:t.retryable,details:t.details});r.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)ke(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",s)})}async handleControlRequest(e){let t=e.request_id,s=ke(e.request)??"unknown",r=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=vs(t,i);this.transport.write(JSON.stringify(a)+`
|
|
11
11
|
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=success duration_ms=${Date.now()-r}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:u}=zi(i),c=bs(t,a,u);this.transport.write(JSON.stringify(c)+`
|
|
12
12
|
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-r}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new N}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=Kt;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${s}. Consider upgrading qodercli for the version handshake.`);return}let r=Is(t),o=Is(s);if(!r||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(r.major!==o.major)throw new q(t,s);r.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${s}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new N;return new Promise((s,r)=>{let o=()=>{r(new N)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),s(i)},i=>{t.removeEventListener("abort",o),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,r=ke(s),o=s;switch(r){case"resolve_session_artifacts":{if(!this.resolveSessionArtifacts)throw new Error("resolve_session_artifacts_unavailable: No resolveSessionArtifacts callback configured");let i=o.local_session_id,a=o.cwd;if(typeof i!="string"||i.length===0||typeof a!="string"||a.length===0)throw new TypeError("resolve_session_artifacts requires local_session_id and cwd");let u=await this.awaitAbortable(Promise.resolve().then(()=>this.resolveSessionArtifacts(i,a)),t);return ds(u)}case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");let d=c.expiresAt;if(d!==void 0&&(!Number.isFinite(d)||d<1e12))throw new Error("job_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token,...d!==void 0?{expires_at:d}:{}}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=o.tool_use_id,c=o.permission_suggestions??o.suggestions,d=o.blocked_path,m=o.decision_reason,p=o.title,l=o.display_name,f=o.description,y=o.agent_id,g=o.permission_kind,S=o.options,b=o.details,h=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:d,decisionReason:m,title:p,displayName:l,description:f,toolUseID:u,agentID:y,permissionKind:g,permissionOptions:S,details:b}),t);if(h.behavior==="deny"&&!h.message)throw new Error("Permission deny result must include a message.");return h.behavior==="allow"?{...h,updatedInput:h.updatedInput??a,toolUseID:u}:{...h,toolUseID:u}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"memory_should_generate":{let i=o.callbackId;if(!i)throw new Error("Memory shouldGenerate request missing callbackId");let a=this.memoryCallbacks?.shouldGenerateCallbacks.get(i);if(!a)throw new Error(`Unknown memory shouldGenerate callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Memory shouldGenerate callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"skill_evolution_should_review":{let i=o.callbackId;if(!i)throw new Error("Skill evolution shouldReview request missing callbackId");let a=this.skillEvolutionCallbacks?.shouldReviewCallbacks.get(i);if(!a)throw new Error(`Unknown skill evolution shouldReview callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Skill evolution shouldReview callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"mcp_message":{let i=o.server_name,a=o.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(ps(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,agentId:o.agentId,agentType:o.agentType,resolvedModel:o.resolvedModel,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,d=new Promise((g,S)=>{c=setTimeout(()=>{S(new Ne(a))},a)}),m;try{m=await this.awaitAbortable(Promise.race([u,d]),t)}finally{clearTimeout(c)}let p={type:"get_model_policy",...m?.parameters!==void 0?{parameters:m.parameters}:{}},l=m?.model;if(typeof l=="string")p.model=l;else if(l!==void 0){let{model:g,...S}=l;p.model=g,p.custom_model={...S,style:S.style??"openai"}}let f=m?.taskId?.trim();f&&(p.task_id=f);let y=m?.subTask?.trim();return y&&(p.sub_task=y),p}default:throw new Error(`Unhandled control request subtype: ${r??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){await this.initConfig.beforeInitialize?.();let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,supportsAvailableModelsUpdate:!0,supportsCommandsChanged:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let d=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(d,c),d});u.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:u,timeout:a.timeout})}i.length>0&&(t[r]=i)}if(Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.independentPlanModeControls===!0){e.independentPlanModeControls=!0;let r=je(this.initConfig.permissionMode);r!==void 0&&(e.permissionMode=r)}this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.initConfig.evolution!==void 0&&(e.evolution=this.initConfig.evolution),this.resolveSessionArtifacts!==void 0&&(e.resolveSessionArtifacts=!0),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let r=s;this.initResponse=r,this.replaceLatestCommands(r.commands),this.cliCapabilities=new Set(r.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");if(this.initConfig.goalMaxTurns!==void 0&&!this.cliCapabilities?.has(n.GOAL_MAX_TURNS_CAPABILITY))throw new W(n.GOAL_MAX_TURNS_CAPABILITY);if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new W(n.PLAN_MODE_CAPABILITY);let r={subtype:"set_plan_mode",active:this.initConfig.planMode};await this.request(r)}return await this.completeSessionStoreForkBarrier(),this.initResponse}async completeSessionStoreForkBarrier(){if(this.initConfig.requireSessionStoreForkBarrier!==!0)return;if(!this.cliCapabilities?.has(n.SESSION_STORE_FORK_BARRIER_CAPABILITY))throw new W(n.SESSION_STORE_FORK_BARRIER_CAPABILITY);let e=this.transcriptMirrorBatcher;if(!e)throw new Error("SessionStore Fork persistence barrier requires a transcript mirror.");await e.completeBarrier(),this.sessionStoreForkBarrierComplete=!0}async flushTranscriptMirrorForLifecycle(){if(this.initConfig.requireSessionStoreForkBarrier===!0&&!this.sessionStoreForkBarrierComplete){this.transcriptMirrorBatcher?.discardPending();return}await this.transcriptMirrorBatcher?.flush()}async invokeRegisteredHookCallback(e,t,s,r){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,s,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}replaceLatestCommands(e){this.latestCommands=(e??[]).map(t=>({...t}))}getLatestCommands(){return this.latestCommands.map(e=>({...e}))}waitForStreamInitialization(){return new Promise(e=>{this.resolveStreamInitialization=e})}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let s of e){if(this.closed)break;t+=1;let o=Object.prototype.hasOwnProperty.call(s,"custom_context")?s.custom_context:this.initConfig.customContext,i=typeof s.uuid=="string"&&s.uuid.trim().length>0?s.uuid:ji(),a={...s,uuid:i,...o===void 0?{}:{custom_context:o}};this.pendingErrorResultExit=!1,o!==void 0&&!this.cliCapabilities?.has(n.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(a)+`
|
|
13
|
-
`),this.recordOutboundSessionMessage(a)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(s=>typeof s=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async setGoalMaxTurns(e){e!==null&&Fe(e),await this.requireCliCapability(n.GOAL_MAX_TURNS_CAPABILITY);let t={subtype:"set_goal_max_turns",max_turns:e},s=await this.request(t);return Fe(s.goal_max_turns),s.goal_max_turns}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new W(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?je(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!0}:{}})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async enableRemoteProjection(e,t={}){if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");if(t.fromSequenceNum!==void 0&&(!Number.isSafeInteger(t.fromSequenceNum)||t.fromSequenceNum<=0))throw new TypeError("fromSequenceNum must be a positive safe integer");await this.request({type:"enable_remote_projection",remote_session_id:e,...t.suppressInitialIdleStateEvents===!0?{suppress_initial_idle_state_events:!0}:{},...t.skipInitialFlush===!0?{skip_initial_flush:!0}:{},...t.fromSequenceNum===void 0?{}:{from_sequence_num:t.fromSequenceNum}},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}})}async disableRemoteProjection(e={}){let t=await this.request({type:"disable_remote_projection"},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}});if(!(typeof t?.remote_session_id!="string"||t.remote_session_id.length===0||typeof t.last_sequence_num!="number"||!Number.isSafeInteger(t.last_sequence_num)||t.last_sequence_num<=0))return{remoteSessionId:t.remote_session_id,lastSequenceNum:t.last_sequence_num}}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let s=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(r=>({...r}))}:{}},{timeoutMs:0,signal:t?.signal});return s?.response==null?null:{response:s.response,synthetic:s.synthetic??!1,...s.refusal_fallback?{refusalFallback:{originalModel:s.refusal_fallback.original_model,fallbackModel:s.refusal_fallback.fallback_model,content:s.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return await this.initializationResult(),this.getLatestCommands()}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async listByokConfigs(){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"list_byok_configs"})).configs}async createByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"create_byok_config",config:e})).config}async updateByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"update_byok_config",config:e})}async deleteByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"delete_byok_config",target:e})}async checkByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"check_byok_config",config:e})}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=$i(e?.usage),s=Bi(e?.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}catch{return null}}async reloadPlugins(){let e=await this.request({type:"reload_plugins"});return this.replaceLatestCommands(e.commands),e}async reloadSkills(){return await this.requireCliCapability("reload_skills_v1"),await this.request({type:"reload_skills"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let r={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(r.dry_run=!0),await this.request(r)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new W("skill_evolution_v1");if(e.evolution?.skill?.enabled!==!0||e.evolution.skill.requester!=="sdk")throw new Error("The connected CLI did not enable SDK skill evolution for this query")}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=xn(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(s){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",s)}this.closed=!0;for(let[,s]of this.pendingInboundRequests)s.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[s,r]of this.sdkMcpTransports){try{await r.close()}catch(o){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${s}":`,o)}fs(s,e,this.pendingMcpResponses)}let t;try{await this.transport.close()}catch(s){t={error:s}}try{await this.readLoopPromise}catch{}if(await this.flushTranscriptMirrorForLifecycle(),t)throw t.error}async[Symbol.asyncDispose](){await this.close()}};function ie(n){return typeof n=="object"&&n!==null}function Lt(n){return typeof n=="number"&&Number.isFinite(n)}function Bt(n){return Object.keys(n).length>0}function z(n,e,t){let s=e[t];Lt(s)&&(n[t]=s)}function _e(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function lt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function As(n){if(!ie(n)||Array.isArray(n))return;let e={};return z(e,n,"total"),z(e,n,"used"),z(e,n,"remaining"),z(e,n,"percentage"),_e(e,n,"unit"),Bt(e)?e:void 0}function Ui(n){if(!ie(n)||Array.isArray(n))return;let e=As(n)??{};return _e(e,n,"detailUrl"),Bt(e)?e:void 0}function Li(n){if(!ie(n)||Array.isArray(n))return;let e={};return z(e,n,"used"),z(e,n,"cap"),z(e,n,"remaining"),z(e,n,"percentage"),lt(e,n,"available"),_e(e,n,"unit"),Bt(e)?e:void 0}function Bi(n){if(!ie(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Lt(e)||e<0||!ie(t)||Array.isArray(t))return;let s={};for(let[r,o]of Object.entries(t)){if(!ie(o)||Array.isArray(o))continue;let i=o.credits;Lt(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function $i(n){if(!ie(n)||Array.isArray(n))return null;let e={};_e(e,n,"userId"),_e(e,n,"userType"),z(e,n,"totalUsagePercentage"),lt(e,n,"isHighestTier"),z(e,n,"expiresAt"),_e(e,n,"upgradeUrl"),lt(e,n,"isQuotaExceeded"),lt(e,n,"isPlanQuotaProrated");let t=As(n.userQuota);t&&(e.userQuota=t);let s=Ui(n.addOnQuota);s&&(e.addOnQuota=s);let r=Li(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function zi(n){let e=n instanceof Error?n.message:String(n),t=typeof n=="object"&&n!==null?n.code:void 0,s=typeof t=="string"&&t.length>0?t:void 0,r=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(r){let o=s??r[1];return(!s||s===r[1])&&(e=r[2]||e),{error:e,code:o}}return s?{error:e,code:s}:{error:e}}function Is(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var pt=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as Os}from"crypto";var Qi="QODER_CLOUD_AGENT_API_BASE",Gi="https://api.qoder.com/api/v1/cloud",X={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Wi=1024,Ds=1*1024*1024,xs=4*1024*1024,Hi=8*1024,zt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},mt=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Qt=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},Ji=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Fs(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!Ji.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(n.auth?.type!=="accessToken")throw new mt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Re(t)&&$t(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Re(s)&&$t(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&Re(s)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let r=!!s&&Re(s);if(!r&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!r){if(!s||!$t(s))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof s.create.environment_id!="string"||s.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function Re(n){return"id"in n&&n.id!==void 0}function $t(n){return"create"in n&&n.create!==void 0}function Ks(n){return new Gt(n)}var Gt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=la();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=js();latestModelUsage={};totalCostUsd=0;postedMessages=0;activeInputStreams=0;idleSeen=!1;resultEmitted=!1;constructor(e){if(!e.options.experimentalCloudAgent)throw new Error("options.experimentalCloudAgent is required for CloudAgentQuery.");this.experimentalCloudAgent=e.options.experimentalCloudAgent,this.diagnostics=e.diagnostics,this.onAuthExpired=e.options.onAuthExpired,this.accessToken=Vi(e.options.auth,e.options.env),this.apiBase=Yi(),this.inputStream=new Y(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(s=>{this.sseConnected.reject(s),this.closed||this.inputStream.error(s)}),this.streamInput(ua(e.prompt)).catch(s=>{this.closed||this.inputStream.error(s)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let s=aa(t);this.beginPendingTurn();let r=await this.postSessionEvents([{type:X.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(r.find(o=>o.type===X.userMessage)?.turnId)}}finally{this.activeInputStreams=Math.max(0,this.activeInputStreams-1),this.finishIfIdle()}})().catch(t=>{this.closed||this.inputStream.error(t)})}async interrupt(){await this.sessionReadyPromise,await this.postSessionEvents([{type:X.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async listByokConfigs(){this.unsupported("listByokConfigs")}async createByokConfig(e){this.unsupported("createByokConfig")}async updateByokConfig(e){this.unsupported("updateByokConfig")}async deleteByokConfig(e){this.unsupported("deleteByokConfig")}async checkByokConfig(e){this.unsupported("checkByokConfig")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async reloadSkills(){this.unsupported("reloadSkills")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&Re(e))t=e.id;else{let s=await this.resolveAgentId(),r=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...Zi(r)}});t=Ns(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(Re(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Xi(e.create)});return Ns(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let s=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==s&&(t=0),t+=1,await ca(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),s=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;s&&t.searchParams.set("after_id",s),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let r=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await qs(r);if(!r.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(r.body)}async readSseBody(e){let t=e.getReader(),s=new TextDecoder,r="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){r+=s.decode(),r.length>0&&this.consumeSseLine(r,o);break}r+=s.decode(a,{stream:!0});let u;for(;(u=r.indexOf(`
|
|
13
|
+
`),this.recordOutboundSessionMessage(a)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(s=>typeof s=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async setGoalMaxTurns(e){e!==null&&Fe(e),await this.requireCliCapability(n.GOAL_MAX_TURNS_CAPABILITY);let t={subtype:"set_goal_max_turns",max_turns:e},s=await this.request(t);return Fe(s.goal_max_turns),s.goal_max_turns}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new W(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?je(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!0}:{}})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async enableRemoteProjection(e,t={}){if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");if(t.fromSequenceNum!==void 0&&(!Number.isSafeInteger(t.fromSequenceNum)||t.fromSequenceNum<=0))throw new TypeError("fromSequenceNum must be a positive safe integer");await this.request({type:"enable_remote_projection",remote_session_id:e,...t.suppressInitialIdleStateEvents===!0?{suppress_initial_idle_state_events:!0}:{},...t.skipInitialFlush===!0?{skip_initial_flush:!0}:{},...t.fromSequenceNum===void 0?{}:{from_sequence_num:t.fromSequenceNum}},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}})}async disableRemoteProjection(e={}){let t=await this.request({type:"disable_remote_projection"},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}});if(!(typeof t?.remote_session_id!="string"||t.remote_session_id.length===0||typeof t.last_sequence_num!="number"||!Number.isSafeInteger(t.last_sequence_num)||t.last_sequence_num<=0))return{remoteSessionId:t.remote_session_id,lastSequenceNum:t.last_sequence_num}}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let s=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(r=>({...r}))}:{}},{timeoutMs:0,signal:t?.signal});return s?.response==null?null:{response:s.response,synthetic:s.synthetic??!1,...s.refusal_fallback?{refusalFallback:{originalModel:s.refusal_fallback.original_model,fallbackModel:s.refusal_fallback.fallback_model,content:s.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return await this.initializationResult(),this.getLatestCommands()}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{},...e?.outerProviders?{outerProviders:e.outerProviders}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async listByokConfigs(){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"list_byok_configs"})).configs}async createByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"create_byok_config",config:e})).config}async updateByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"update_byok_config",config:e})}async deleteByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"delete_byok_config",target:e})}async checkByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"check_byok_config",config:e})}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=$i(e?.usage),s=Bi(e?.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}catch{return null}}async reloadPlugins(){let e=await this.request({type:"reload_plugins"});return this.replaceLatestCommands(e.commands),e}async reloadSkills(){return await this.requireCliCapability("reload_skills_v1"),await this.request({type:"reload_skills"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let r={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(r.dry_run=!0),await this.request(r)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new W("skill_evolution_v1");if(e.evolution?.skill?.enabled!==!0||e.evolution.skill.requester!=="sdk")throw new Error("The connected CLI did not enable SDK skill evolution for this query")}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=xn(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(s){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",s)}this.closed=!0;for(let[,s]of this.pendingInboundRequests)s.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[s,r]of this.sdkMcpTransports){try{await r.close()}catch(o){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${s}":`,o)}fs(s,e,this.pendingMcpResponses)}let t;try{await this.transport.close()}catch(s){t={error:s}}try{await this.readLoopPromise}catch{}if(await this.flushTranscriptMirrorForLifecycle(),t)throw t.error}async[Symbol.asyncDispose](){await this.close()}};function ie(n){return typeof n=="object"&&n!==null}function Lt(n){return typeof n=="number"&&Number.isFinite(n)}function Bt(n){return Object.keys(n).length>0}function z(n,e,t){let s=e[t];Lt(s)&&(n[t]=s)}function _e(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function lt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function As(n){if(!ie(n)||Array.isArray(n))return;let e={};return z(e,n,"total"),z(e,n,"used"),z(e,n,"remaining"),z(e,n,"percentage"),_e(e,n,"unit"),Bt(e)?e:void 0}function Ui(n){if(!ie(n)||Array.isArray(n))return;let e=As(n)??{};return _e(e,n,"detailUrl"),Bt(e)?e:void 0}function Li(n){if(!ie(n)||Array.isArray(n))return;let e={};return z(e,n,"used"),z(e,n,"cap"),z(e,n,"remaining"),z(e,n,"percentage"),lt(e,n,"available"),_e(e,n,"unit"),Bt(e)?e:void 0}function Bi(n){if(!ie(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Lt(e)||e<0||!ie(t)||Array.isArray(t))return;let s={};for(let[r,o]of Object.entries(t)){if(!ie(o)||Array.isArray(o))continue;let i=o.credits;Lt(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function $i(n){if(!ie(n)||Array.isArray(n))return null;let e={};_e(e,n,"userId"),_e(e,n,"userType"),z(e,n,"totalUsagePercentage"),lt(e,n,"isHighestTier"),z(e,n,"expiresAt"),_e(e,n,"upgradeUrl"),lt(e,n,"isQuotaExceeded"),lt(e,n,"isPlanQuotaProrated");let t=As(n.userQuota);t&&(e.userQuota=t);let s=Ui(n.addOnQuota);s&&(e.addOnQuota=s);let r=Li(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function zi(n){let e=n instanceof Error?n.message:String(n),t=typeof n=="object"&&n!==null?n.code:void 0,s=typeof t=="string"&&t.length>0?t:void 0,r=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(r){let o=s??r[1];return(!s||s===r[1])&&(e=r[2]||e),{error:e,code:o}}return s?{error:e,code:s}:{error:e}}function Is(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var pt=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as Os}from"crypto";var Qi="QODER_CLOUD_AGENT_API_BASE",Gi="https://api.qoder.com/api/v1/cloud",X={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Wi=1024,Ds=1*1024*1024,xs=4*1024*1024,Hi=8*1024,zt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},mt=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Qt=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},Ji=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Fs(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!Ji.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(n.auth?.type!=="accessToken")throw new mt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Re(t)&&$t(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Re(s)&&$t(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&Re(s)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let r=!!s&&Re(s);if(!r&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!r){if(!s||!$t(s))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof s.create.environment_id!="string"||s.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function Re(n){return"id"in n&&n.id!==void 0}function $t(n){return"create"in n&&n.create!==void 0}function Ks(n){return new Gt(n)}var Gt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=la();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=js();latestModelUsage={};totalCostUsd=0;postedMessages=0;activeInputStreams=0;idleSeen=!1;resultEmitted=!1;constructor(e){if(!e.options.experimentalCloudAgent)throw new Error("options.experimentalCloudAgent is required for CloudAgentQuery.");this.experimentalCloudAgent=e.options.experimentalCloudAgent,this.diagnostics=e.diagnostics,this.onAuthExpired=e.options.onAuthExpired,this.accessToken=Vi(e.options.auth,e.options.env),this.apiBase=Yi(),this.inputStream=new Y(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(s=>{this.sseConnected.reject(s),this.closed||this.inputStream.error(s)}),this.streamInput(ua(e.prompt)).catch(s=>{this.closed||this.inputStream.error(s)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let s=aa(t);this.beginPendingTurn();let r=await this.postSessionEvents([{type:X.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(r.find(o=>o.type===X.userMessage)?.turnId)}}finally{this.activeInputStreams=Math.max(0,this.activeInputStreams-1),this.finishIfIdle()}})().catch(t=>{this.closed||this.inputStream.error(t)})}async interrupt(){await this.sessionReadyPromise,await this.postSessionEvents([{type:X.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async listByokConfigs(){this.unsupported("listByokConfigs")}async createByokConfig(e){this.unsupported("createByokConfig")}async updateByokConfig(e){this.unsupported("updateByokConfig")}async deleteByokConfig(e){this.unsupported("deleteByokConfig")}async checkByokConfig(e){this.unsupported("checkByokConfig")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async reloadSkills(){this.unsupported("reloadSkills")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&Re(e))t=e.id;else{let s=await this.resolveAgentId(),r=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...Zi(r)}});t=Ns(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(Re(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Xi(e.create)});return Ns(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let s=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==s&&(t=0),t+=1,await ca(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),s=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;s&&t.searchParams.set("after_id",s),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let r=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await qs(r);if(!r.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(r.body)}async readSseBody(e){let t=e.getReader(),s=new TextDecoder,r="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){r+=s.decode(),r.length>0&&this.consumeSseLine(r,o);break}r+=s.decode(a,{stream:!0});let u;for(;(u=r.indexOf(`
|
|
14
14
|
`))!==-1;){let c=r.slice(0,u);r=r.slice(u+1);let d=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(d,o),this.closed)break}r.length>Ds&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Ds} bytes; resetting buffer.`),r="",o.id=void 0,o.event=void 0,o.data.length=0,o.dataBytes=0)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}consumeSseLine(e,t){if(e===""){(t.event||t.data.length>0)&&this.handleSseEvent({id:t.id,event:t.event??"message",data:na(t.data.join(`
|
|
15
15
|
`))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let s=e.indexOf(":"),r=s===-1?e:e.slice(0,s),o=s===-1?"":e.slice(s+1);switch(o.startsWith(" ")&&(o=o.slice(1)),r){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>xs){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${xs} bytes; dropping event.`),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}t.data.push(o),t.dataBytes+=o.length;break}}handleSseEvent(e){if(this.closed)return;let t=j(e.data,"type")??e.event,s=j(e.data,"turn_id"),r={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Os(),session_id:this.sessionId??j(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(r),!this.isCurrentTurnEvent(s)){this.bufferPendingTurnEvent(e,t,s);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case X.agentMessage:{let s=ra(Ke(e.data,"content"));s&&this.assistantTextParts.push(s);return}case X.modelRequestEnd:this.captureUsage(e.data);return;case X.idle:this.idleSeen=!0,this.finishIfIdle();return;case X.error:this.emitErrorResult(e),this.finish();return;case X.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=js(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let s of t)if(this.isCurrentTurnEvent(s.turnId)&&this.handleCurrentTurnEvent(s.event,s.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,s){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=Wi&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:s}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(j(e.data,"error")??j(ft(e.data,"error"),"message")??"Cloud Agent session failed.")}emitErrorResultMessage(e){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"error_during_execution",is_error:!0,errors:[e]}))}buildResultBase(){let e=Date.now()-this.startedAt;return{type:"result",duration_ms:e,duration_api_ms:e,num_turns:Math.max(1,this.postedMessages),stop_reason:null,total_cost_usd:this.totalCostUsd,usage:this.latestUsage,modelUsage:this.latestModelUsage,permission_denials:[],uuid:Os(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,s=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return ea(s)}captureUsage(e){let t=ft(e,"usage");if(!t)return;this.latestUsage=oa(this.latestUsage,t);let s=A(e,"total_cost_usd")??A(e,"cost_usd")??A(t,"total_cost_usd")??A(t,"cost_usd");s!==void 0&&(this.totalCostUsd+=s);let r=j(e,"model")??j(t,"model");if(r){let o=this.latestModelUsage[r]?.costUSD??0;this.latestModelUsage[r]=ia(this.latestUsage,o+(s??0))}}async requestJson(e,t){let s=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!s.ok)throw this.handleAuthFailure(s.status),await qs(s);if(s.status===204)return{};try{return await s.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function Vi(n,e){if(n?.type!=="accessToken")throw new mt;if(typeof n.accessToken=="string")return n.accessToken;let t=n.accessToken.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new zt(t);return s}function Yi(){return process.env[Qi]?.replace(/\/+$/,"")??Gi}function Xi(n){return Wt({name:n.name,model:n.model,system:n.system,description:n.description,tools:n.tools,mcp_servers:n.mcp_servers,skills:n.skills,metadata:n.metadata})}function Zi(n){return Wt({title:n.title,environment_id:n.environment_id,resources:n.resources?.map(e=>Wt({...e})),vault_ids:n.vault_ids,memory_store_ids:n.memory_store_ids})}function Wt(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}function Ns(n,e){let t=j(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function ea(n){let e=sa(n,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:j(t,"id"),turnId:j(t,"turn_id"),type:j(t,"type")}]):[]}async function qs(n){let e=await ta(n,Hi);return new Qt(n.status,e||n.statusText||"unknown error")}async function ta(n,e){if(!n.body)try{return(await n.text()).slice(0,e)}catch{return""}let t=n.body.getReader(),s=new TextDecoder,r=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,r.push(s.decode(a,{stream:!0}))}r.push(s.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return r.join("").slice(0,e)}function na(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function ft(n,e){let t=Ke(n,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function sa(n,e){let t=Ke(n,e);return Array.isArray(t)?t:void 0}function j(n,e){let t=Ke(n,e);return typeof t=="string"?t:void 0}function A(n,e){let t=Ke(n,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Ke(n,e){if(!(n===null||typeof n!="object"||Array.isArray(n)))return n[e]}function ra(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Us(t)?t.text:"").filter(Boolean).join("")||void 0}function oa(n,e){let t=ft(e,"cache_creation"),s=ft(e,"server_tool_use");return{...n,cache_creation:{ephemeral_1h_input_tokens:A(t,"ephemeral_1h_input_tokens")??n.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:A(t,"ephemeral_5m_input_tokens")??n.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:A(e,"cache_creation_input_tokens")??n.cache_creation_input_tokens,cache_read_input_tokens:A(e,"cache_read_input_tokens")??n.cache_read_input_tokens,input_tokens:A(e,"input_tokens")??n.input_tokens,output_tokens:A(e,"output_tokens")??n.output_tokens,server_tool_use:{web_fetch_requests:A(s,"web_fetch_requests")??n.server_tool_use.web_fetch_requests,web_search_requests:A(s,"web_search_requests")??n.server_tool_use.web_search_requests}}}function ia(n,e){return{inputTokens:n.input_tokens,outputTokens:n.output_tokens,cacheReadInputTokens:n.cache_read_input_tokens,cacheCreationInputTokens:n.cache_creation_input_tokens,webSearchRequests:n.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function aa(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Us(t)?t.text:JSON.stringify(t)).join(`
|
|
16
16
|
`):JSON.stringify(e)}function Us(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function ua(n){return typeof n!="string"?n:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:n}]},parent_tool_use_id:null}}()}function js(){return{cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},cache_creation_input_tokens:0,cache_read_input_tokens:0,inference_geo:"",input_tokens:0,iterations:[],output_tokens:0,server_tool_use:{web_fetch_requests:0,web_search_requests:0},service_tier:"standard",speed:"standard"}}async function ca(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function la(){let n,e;return{promise:new Promise((s,r)=>{n=s,e=r}),resolve:n,reject:e}}import{access as Sa,chmod as Gs,cp as wa,mkdtemp as va,mkdir as Ws,realpath as Hs,rm as $s,writeFile as ba}from"fs/promises";import{homedir as ka,tmpdir as _a}from"os";import{dirname as Ra,isAbsolute as Js,join as ae,relative as Ea,resolve as Ht,sep as Ca}from"path";import{homedir as da}from"os";import{join as Bs}from"path";var pa=v.configDirName,ma=v.cliHomeEnv,fa=v.configDirEnv,Ls=200;function ga(){return process.env[ma]||da()}function ha(){let n=process.env[fa];return n||Bs(ga(),pa)}function Ee(){return Bs(ha(),"projects")}function ya(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function O(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Ls)return e;let t=Math.abs(ya(n)).toString(36);return`${e.slice(0,Ls)}-${t}`}var Pa=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ta=6e4;async function Vs(n){if(n.resume===void 0&&!n.continue)return;let e=O(await Aa(n.cwd)),t=n.loadTimeoutMs??Ta,s=n.resume!==void 0?n.resume:await Oa(n.store,e,t);if(s===void 0||!Pa.test(s))return;let r={projectKey:e,sessionId:s},o=await zs(n.store,r,t);if(!o)return;let i=n.store.listSubkeys?await Jt(n.store.listSubkeys(r),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!xa(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let d=await zs(n.store,{...r,subpath:c},t);d&&a.push({subpath:c,entries:d})}let u;try{u=await va(ae(_a(),"qoder-session-store-")),await Gs(u,448),u=await Hs(u),await Ia(Ma(n.env),u);let c=ae(u,"projects",e),d=ae(c,s);await Ws(c,{recursive:!0,mode:448}),await Qs(ae(c,`${s}.jsonl`),o);for(let{subpath:p,entries:l}of a){let f=Na(d,`${p}.jsonl`),y=l.filter(S=>S.type==="agent_metadata"),g=l.filter(S=>S.type!=="agent_metadata");if(g.length>0&&await Qs(f,g),y.length>0){let S={...y.at(-1)};delete S.type,await Ys(f.slice(0,-6)+".meta.json",JSON.stringify(S))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await $s(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await $s(u,{recursive:!0,force:!0}),c}}function Ma(n){let e=n?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??ka();return Ht(n?.[v.configDirEnv]??process.env[v.configDirEnv]??ae(e,v.configDirName))}async function Ia(n,e){for(let t of[".auth","oauth_creds.json"]){let s=ae(n,t);try{await Sa(s),await wa(s,ae(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(r){if(r.code!=="ENOENT")throw r}}}async function Aa(n){let e=Ht(n??process.cwd());try{return await Hs(e)}catch{return e}}async function Oa(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await Jt(n.listSessions(e),t,"listSessions");if(!Array.isArray(s))throw new Error("SessionStore listSessions() must return an array");return s.slice().sort((r,o)=>o.mtime-r.mtime)[0]?.sessionId}async function zs(n,e,t){let s=await Jt(n.load({...e}),t,"load");if(!(s===null||s.length===0)){if(!Array.isArray(s))throw new Error("SessionStore load() must return an array or null");return s.map((r,o)=>Da(r,o))}}function Da(n,e){if(n===null||typeof n!="object"||typeof n.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(n);if(t===void 0)throw new Error("JSON serialization returned undefined");return JSON.parse(t)}catch(t){throw new Error(`SessionStore entry ${e} is not JSON-safe`,{cause:t})}}function xa(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||Js(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Na(n,e){let t=Ht(n,e),s=Ea(n,t);if(s===""||s===".."||s.startsWith(`..${Ca}`)||Js(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Qs(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
|
|
@@ -31,5 +31,5 @@ ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(
|
|
|
31
31
|
`).trim();if(o)return o}}function Qc(n){let e,t;for(let s of n){if(s===null||typeof s!="object")continue;let r=s;typeof r.customTitle=="string"&&r.customTitle&&(e=r.customTitle),typeof r.aiTitle=="string"&&r.aiTitle&&(t=r.aiTitle)}return e??t??zc(n)}function Lr(n,e,t,s){let r=n.transcript.filter(l=>l.isSidechain!==!0);if(r.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let l=r.findIndex(f=>f.uuid===t.upToMessageId);if(l<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);r=r.slice(0,l+1)}let o=new Set(r.map(l=>l.uuid)),i=new Map(r.map(l=>[l.uuid,Et()])),a=r.filter(l=>l.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(r.map(l=>[l.uuid,l])),c=Et(),d=new Date().toISOString(),m=a.map((l,f)=>{let y=null,g=typeof l.parentUuid=="string"?l.parentUuid:void 0;for(;g;){let h=u.get(g);if(!h)break;if(h.type!=="progress"){y=i.get(g)??null;break}g=typeof h.parentUuid=="string"?h.parentUuid:void 0}let S=typeof l.logicalParentUuid=="string"?i.get(l.logicalParentUuid)??null:l.logicalParentUuid??null,b={...l,...l.type==="system"&&l.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(l.uuid),parentUuid:y,logicalParentUuid:S,sessionId:c,timestamp:f===a.length-1?d:typeof l.timestamp=="string"?l.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:l.uuid}};return delete b.teamName,delete b.agentName,delete b.sessionKind,delete b.slug,delete b.sourceToolAssistantUUID,b});if(n.contentReplacements.length>0){let l=n.contentReplacements.flatMap(f=>{if(f===null||typeof f!="object")return[];let y=f.messageUuid;if(typeof y!="string"||!o.has(y))return[];let g=i.get(y);return g?[{...f,messageUuid:g}]:[]});l.length>0&&m.push({type:"content-replacement",sessionId:c,replacements:l,uuid:Et(),timestamp:d})}n.relocatedCwd&&m.push({type:"relocated",sessionId:c,relocatedCwd:n.relocatedCwd});let p=t.title?.trim();return m.push({type:"custom-title",sessionId:c,customTitle:p||`${Qc(s)??"Forked session"} (fork)`,uuid:Et(),timestamp:d}),{sessionId:c,entries:m}}async function Gc(n,e={}){if(!Ur.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!Ur.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await Br(e.dir??process.cwd()),a=O(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=Lr($r(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Bc(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await qc(t,"utf8"),r=s.split(`
|
|
32
32
|
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Lr($c(s,n),n,e,r);return await Fc(_n(Kc(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
|
|
33
33
|
`)}
|
|
34
|
-
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Ct(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Rn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Ct(e),r=this.entries.get(s)??[];r.push(...t),this.entries.set(s,r),this.keys.set(s,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(s,o)}async load(e){let t=this.entries.get(Ct(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,r]of this.keys)r.projectKey!==e||r.subpath!==void 0||t.push({sessionId:r.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,r)=>r.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Ct(e));return}for(let[t,s]of this.keys)s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let s of this.keys.values())s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&s.subpath!==void 0&&t.push(s.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Ct(e))??[]]}get size(){let e=0;for(let t of this.keys.values())t.subpath===void 0&&(e+=1);return e}clear(){this.entries.clear(),this.keys.clear(),this.modifiedAt.clear(),this.lastModifiedAt=0}deleteSerialized(e){this.entries.delete(e),this.keys.delete(e),this.modifiedAt.delete(e)}};import{createReadStream as Wc}from"fs";import{readdir as Wr,readFile as Hc,realpath as Jc,stat as zr}from"fs/promises";import{basename as Qr,dirname as Vc,join as ze,relative as Yc,resolve as Xc,sep as Zc}from"path";import{createInterface as el}from"readline";var tl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,nl=500,sl=1024*1024;async function rl(n){let e=Xc(n);try{return await Jc(e)}catch{return e}}async function ol(n,e){let t=Ee();if(e){let r=O(await rl(e)),o=ze(t,r,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await Wr(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=ze(t,r.name,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function il(n){let e=[];async function t(s){let r;try{r=await Wr(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=ze(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function Gr(n,e,t,s){let r=el({input:Wc(n,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of r){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${n}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=s||i>=sl)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function al(n,e,t={}){if(!tl.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await ol(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:nl;if(await Gr(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=ze(o,"subagents");for(let a of await il(i)){let c=Yc(o,a).split(Zc);c[c.length-1]=Qr(c[c.length-1],".jsonl");let d={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await Gr(a,d,e,r);let m=ze(Vc(a),`${Qr(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Hc(m,"utf8"));await e.append(d,[{type:"agent_metadata",...p}])}catch(p){if(typeof p=="object"&&p!==null&&"code"in p&&p.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${m}: ${String(p)}`)}}}import{spawn as ul}from"node:child_process";import{existsSync as cl}from"node:fs";import{Worker as ll}from"node:worker_threads";var En=3e4;async function Hr(n,e={}){let t=Ce({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},se);return t.transport==="worker"?pl(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):dl(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??H()})}function dl(n,e){return new Promise((t,s)=>{let r=ul(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:Jr(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(Vr(e.timeoutMs)))},e.timeoutMs??En);r.stdout.on("data",c=>{o+=c.toString()}),r.stderr.on("data",c=>{i+=c.toString()}),r.on("error",c=>{a||(a=!0,clearTimeout(u),s(c))}),r.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function pl(n,e){fl(e.signal);let t=V(e.pathToQoderWorkerRuntime),s=await ve(t);ml(s);let r=e.cwd??process.cwd(),o=Jr(e.env);delete o.NODE_OPTIONS;let i=it(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new ll(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),d="",m="",p=!1,l,f=c.stdout===null,y=c.stderr===null,g=()=>{clearTimeout(E),e.signal?.removeEventListener("abort",h)},S=C=>{p||(p=!0,g(),u(C))},b=()=>{p||l===void 0||!f||!y||(p=!0,g(),a({stdout:d,stderr:m,exitCode:l}))},h=()=>{c.terminate(),S(Yr(e.signal))},E=setTimeout(()=>{c.terminate(),S(Vr(e.timeoutMs))},e.timeoutMs??En);c.stdin?.end(),c.stdout?.on("data",C=>{d+=C.toString()}),c.stdout?.on("end",()=>{f=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{y=!0,b()}),c.once("error",S),c.once("exit",C=>{l=C,b()}),e.signal?.addEventListener("abort",h,{once:!0}),e.signal?.aborted&&h()})}function Jr(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function ml(n){if(!cl(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function Vr(n){return new Error(`qodercli subprocess timed out after ${n??En}ms`)}function fl(n){if(n?.aborted)throw Yr(n)}function Yr(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function gl(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ae(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,resources:r.resources}))}async function hl(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function yl(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function Sl(n,e){let t=e?.scope??"user",s=await Ae(["plugins","install",n,"--scope",t,"--json"],e);s.exitCode!==0&&Qe(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,version:r.version??"local",path:r.path}}async function wl(n,e){let t=e?.scope??"user",s=["plugins","uninstall",n,"--scope",t,"--json"];e?.keepData&&s.push("--keep-data");let r=await Ae(s,e);r.exitCode!==0&&Qe(r);let o=JSON.parse(r.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}async function vl(n,e){let t;try{t=await Ae(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new N("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw ee("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=bl(`${t.stderr}
|
|
34
|
+
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Ct(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Rn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Ct(e),r=this.entries.get(s)??[];r.push(...t),this.entries.set(s,r),this.keys.set(s,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(s,o)}async load(e){let t=this.entries.get(Ct(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,r]of this.keys)r.projectKey!==e||r.subpath!==void 0||t.push({sessionId:r.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,r)=>r.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Ct(e));return}for(let[t,s]of this.keys)s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let s of this.keys.values())s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&s.subpath!==void 0&&t.push(s.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Ct(e))??[]]}get size(){let e=0;for(let t of this.keys.values())t.subpath===void 0&&(e+=1);return e}clear(){this.entries.clear(),this.keys.clear(),this.modifiedAt.clear(),this.lastModifiedAt=0}deleteSerialized(e){this.entries.delete(e),this.keys.delete(e),this.modifiedAt.delete(e)}};import{createReadStream as Wc}from"fs";import{readdir as Wr,readFile as Hc,realpath as Jc,stat as zr}from"fs/promises";import{basename as Qr,dirname as Vc,join as ze,relative as Yc,resolve as Xc,sep as Zc}from"path";import{createInterface as el}from"readline";var tl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,nl=500,sl=1024*1024;async function rl(n){let e=Xc(n);try{return await Jc(e)}catch{return e}}async function ol(n,e){let t=Ee();if(e){let r=O(await rl(e)),o=ze(t,r,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await Wr(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=ze(t,r.name,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function il(n){let e=[];async function t(s){let r;try{r=await Wr(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=ze(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function Gr(n,e,t,s){let r=el({input:Wc(n,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of r){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${n}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=s||i>=sl)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function al(n,e,t={}){if(!tl.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await ol(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:nl;if(await Gr(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=ze(o,"subagents");for(let a of await il(i)){let c=Yc(o,a).split(Zc);c[c.length-1]=Qr(c[c.length-1],".jsonl");let d={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await Gr(a,d,e,r);let m=ze(Vc(a),`${Qr(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Hc(m,"utf8"));await e.append(d,[{type:"agent_metadata",...p}])}catch(p){if(typeof p=="object"&&p!==null&&"code"in p&&p.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${m}: ${String(p)}`)}}}import{spawn as ul}from"node:child_process";import{existsSync as cl}from"node:fs";import{Worker as ll}from"node:worker_threads";var En=3e4;async function Hr(n,e={}){let t=Ce({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},se);return t.transport==="worker"?pl(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):dl(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??H()})}function dl(n,e){return new Promise((t,s)=>{let r=ul(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:Jr(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(Vr(e.timeoutMs)))},e.timeoutMs??En);r.stdout.on("data",c=>{o+=c.toString()}),r.stderr.on("data",c=>{i+=c.toString()}),r.on("error",c=>{a||(a=!0,clearTimeout(u),s(c))}),r.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function pl(n,e){fl(e.signal);let t=V(e.pathToQoderWorkerRuntime),s=await ve(t);ml(s);let r=e.cwd??process.cwd(),o=Jr(e.env);delete o.NODE_OPTIONS;let i=it(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new ll(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),d="",m="",p=!1,l,f=c.stdout===null,y=c.stderr===null,g=()=>{clearTimeout(E),e.signal?.removeEventListener("abort",h)},S=C=>{p||(p=!0,g(),u(C))},b=()=>{p||l===void 0||!f||!y||(p=!0,g(),a({stdout:d,stderr:m,exitCode:l}))},h=()=>{c.terminate(),S(Yr(e.signal))},E=setTimeout(()=>{c.terminate(),S(Vr(e.timeoutMs))},e.timeoutMs??En);c.stdin?.end(),c.stdout?.on("data",C=>{d+=C.toString()}),c.stdout?.on("end",()=>{f=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{y=!0,b()}),c.once("error",S),c.once("exit",C=>{l=C,b()}),e.signal?.addEventListener("abort",h,{once:!0}),e.signal?.aborted&&h()})}function Jr(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function ml(n){if(!cl(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function Vr(n){return new Error(`qodercli subprocess timed out after ${n??En}ms`)}function fl(n){if(n?.aborted)throw Yr(n)}function Yr(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function gl(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ae(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,...typeof r.projectPath=="string"?{projectPath:r.projectPath}:{},resources:r.resources}))}async function hl(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function yl(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function Sl(n,e){let t=e?.scope??"user",s=await Ae(["plugins","install",n,"--scope",t,"--json"],e);s.exitCode!==0&&Qe(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,version:r.version??"local",path:r.path}}async function wl(n,e){let t=e?.scope??"user",s=["plugins","uninstall",n,"--scope",t,"--json"];e?.keepData&&s.push("--keep-data");let r=await Ae(s,e);r.exitCode!==0&&Qe(r);let o=JSON.parse(r.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}async function vl(n,e){let t;try{t=await Ae(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new N("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw ee("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=bl(`${t.stderr}
|
|
35
35
|
${t.stdout}`);throw ee(r?"plugin_validation_unsupported":"plugin_validation_protocol_error",r?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(s&&typeof s=="object"&&"ok"in s&&s.schemaVersion!==1)throw ee("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(s&&typeof s=="object"&&s.ok===!0&&s.report){let r=s.report;if(_l(r))return r;throw ee("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(s&&typeof s=="object"&&s.ok===!1){let r=s.error;if(!r||typeof r!="object"||typeof r.code!="string"||typeof r.message!="string")throw ee("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=r;throw ee(o.code,o.message)}throw t.exitCode!==0&&Qe(t),ee("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function bl(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var kl=3e4;function Ae(n,e){return Hr(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:kl})}function Qe(n){let e="plugin_operation_failed",t=n.stderr||n.stdout;try{let s=JSON.parse(n.stdout);s.error&&s.code?(e=s.code,t=s.message??t):s.ok===!1&&s.error&&(e=s.error.code??e,t=s.error.message??t)}catch{}throw ee(e,t)}function ee(n,e){let t=new Error(e);return t.code=n,t}function _l(n){if(!n||typeof n!="object")return!1;let e=n;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(s=>s!==null&&typeof s=="object"&&(s.severity==="error"||s.severity==="warning")&&typeof s.code=="string"&&typeof s.message=="string"&&typeof s.phase=="string"&&t.has(s.phase)&&(s.location===void 0||s.location!==null&&typeof s.location=="object"&&typeof s.location.path=="string"))}import{execFile as Rl}from"child_process";function El(){return H()}async function Cl(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??El(),s=e?.timeout??6e4,r=["feedback","-c",n.content,"--json"];if(e?.storageDir&&r.push("--storage-dir",e.storageDir),n.sessionId&&r.push("-s",n.sessionId),n.workdir&&r.push("--workdir",n.workdir),n.email&&r.push("--email",n.email),n.include)for(let o of n.include)r.push("--include",o);if(n.imagePaths)for(let o of n.imagePaths)r.push("--images",o);if(n.callerVersion&&r.push("--caller-version",n.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&r.push("--ide-type",o)}return new Promise(o=>{Rl(t,r,{env:e?.env??process.env,timeout:s,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);o({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var eo={};ao(eo,{filterEscalatingDefaultMode:()=>Xr,isBashToolBackgroundLaunchResult:()=>Zr});var Pl=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function Xr(n){let e=n.effective.permissions?.defaultMode;if(!e||!Pl.has(e))return n.effective;for(let t=n.sources.length-1;t>=0;t-=1){let s=n.sources[t];if(s.settings.permissions?.defaultMode!==void 0){if(s.source==="project"){let{defaultMode:r,...o}=n.effective.permissions??{};return{...n.effective,permissions:o}}return n.effective}}return n.effective}function Zr(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=o=>o===void 0||typeof o=="string",s=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,r=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&s(e.totalLines)&&s(e.totalBytes)&&(r===void 0||r==="user"||r==="model"||r==="timeout"||r==="auto")}export{N as AbortError,Xe as AuthAccessTokenEnvVarError,Ze as AuthServiceAccountEnvVarError,qe as ControlRequestError,qn as DEFAULT_ACCESS_TOKEN_ENV_VAR,se as DEFAULT_RUNTIME_TRANSPORT,Ye as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,St as DaemonRpcError,co as EXIT_REASONS,uo as HOOK_EVENTS,Rn as InMemorySessionStore,gt as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Ne as ModelPolicyTimeoutError,Se as ProcessTransport,q as ProtocolVersionMismatchError,I as QoderCliProcessError,oe as QoderWorkerRuntimeError,W as UnsupportedCliCapabilityError,Kt as WIRE_PROTOCOL_VERSION,be as WorkerTransport,ho as accessToken,yo as accessTokenFromEnv,eo as coreTypes,Wu as createSdkMcpServer,xc as deleteSession,yl as disablePlugin,hl as enablePlugin,Xr as filterEscalatingDefaultMode,Gc as forkSession,Tc as getSessionInfo,Mc as getSessionMessages,Dc as getSubagentMessages,is as hasResolvableQoderWorkerRuntime,al as importSessionToStore,br as initDaemon,Sl as installPlugin,Zr as isBashToolBackgroundLaunchResult,bo as jobToken,gl as listPlugins,Pc as listSessions,Oc as listSubagents,So as qodercliAuth,dn as query,Ic as renameSession,V as resolveQoderWorkerRuntimePath,Lu as resolveSettings,wo as serviceAccount,vo as serviceAccountFromEnv,$u as shutdownDaemon,cn as startDaemon,Tu as startup,Cl as submitFeedback,Ac as tagSession,Hu as tool,wl as uninstallPlugin,vl as validatePlugin};
|
|
@@ -359,6 +359,8 @@ export type ModelInfo = {
|
|
|
359
359
|
model?: string;
|
|
360
360
|
/** BYOK: provider key, e.g. `'openai'`, `'deepseek'`. */
|
|
361
361
|
provider?: string;
|
|
362
|
+
/** External-model provider, e.g. `'cmcc'`. */
|
|
363
|
+
outerProvider?: string;
|
|
362
364
|
/** Rich context-window config from the server (tier labels → token_count). */
|
|
363
365
|
context_config?: ModelContextConfig;
|
|
364
366
|
/** Rich thinking config from the server (effort levels with descriptions). */
|
|
@@ -313,7 +313,7 @@ export type SDKControlGetModelPolicyResponse = {
|
|
|
313
313
|
type: 'get_model_policy';
|
|
314
314
|
/** Optional model override. Omitted means keep the CLI-resolved model. */
|
|
315
315
|
model?: string;
|
|
316
|
-
/** Optional per-request model policy parameters
|
|
316
|
+
/** Optional per-request model policy parameters, including outerProvider. */
|
|
317
317
|
parameters?: Record<string, unknown>;
|
|
318
318
|
/**
|
|
319
319
|
* Optional per-call BYOK credential payload. When present, the CLI
|
|
@@ -68,7 +68,7 @@ export type SDKUserMessage = {
|
|
|
68
68
|
message: MessageParam;
|
|
69
69
|
parent_tool_use_id: string | null;
|
|
70
70
|
custom_context?: Record<string, string>;
|
|
71
|
-
/** The client has
|
|
71
|
+
/** The client has resolved slash commands, so a leading slash is literal input. */
|
|
72
72
|
client_composed?: boolean;
|
|
73
73
|
file_attachments?: SDKFileAttachment[];
|
|
74
74
|
isSynthetic?: boolean;
|
|
@@ -130,7 +130,7 @@ export type SDKResultSuccess = {
|
|
|
130
130
|
usage: NonNullableUsage;
|
|
131
131
|
modelUsage: Record<string, ModelUsage>;
|
|
132
132
|
permission_denials: SDKPermissionDenial[];
|
|
133
|
-
error_code?: number;
|
|
133
|
+
error_code?: number | string;
|
|
134
134
|
deferred_tool_use?: unknown;
|
|
135
135
|
terminal_reason?: string | null;
|
|
136
136
|
fast_mode_state?: FastModeState;
|
|
@@ -153,7 +153,7 @@ export type SDKResultError = {
|
|
|
153
153
|
modelUsage: Record<string, ModelUsage>;
|
|
154
154
|
permission_denials: SDKPermissionDenial[];
|
|
155
155
|
errors: string[];
|
|
156
|
-
error_code?: number;
|
|
156
|
+
error_code?: number | string;
|
|
157
157
|
terminal_reason?: string | null;
|
|
158
158
|
fast_mode_state?: FastModeState;
|
|
159
159
|
origin?: SDKMessageOrigin;
|
|
@@ -332,6 +332,7 @@ export declare class QueryRunner implements InternalQuery {
|
|
|
332
332
|
getAvailableModels(options?: {
|
|
333
333
|
fetchStrategy?: 'live' | 'cache';
|
|
334
334
|
uid?: string;
|
|
335
|
+
outerProviders?: string[];
|
|
335
336
|
}): Promise<ModelInfo[]>;
|
|
336
337
|
/**
|
|
337
338
|
* List the available BYOK (Bring Your Own Key) providers and their supported models.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 1,
|
|
3
3
|
"brand": "global",
|
|
4
|
-
"sdkVersion": "1.0.
|
|
5
|
-
"qoderCliVersion": "1.1.
|
|
4
|
+
"sdkVersion": "1.0.40",
|
|
5
|
+
"qoderCliVersion": "1.1.52",
|
|
6
6
|
"defaultTransport": "worker",
|
|
7
7
|
"workerRuntime": {
|
|
8
8
|
"packaged": false,
|
|
9
9
|
"delivery": "install",
|
|
10
10
|
"source": "qodercli-worker-runtime",
|
|
11
|
-
"urlTemplate": "https://download.qoder.com/qodercli/releases/1.1.
|
|
11
|
+
"urlTemplate": "https://download.qoder.com/qodercli/releases/1.1.52/qodercli-worker-runtime-{target}.tgz",
|
|
12
12
|
"artifactNameTemplate": "qodercli-worker-runtime-{target}.tgz",
|
|
13
|
-
"sdkVersion": "1.0.
|
|
14
|
-
"qoderCliVersion": "1.1.
|
|
13
|
+
"sdkVersion": "1.0.40",
|
|
14
|
+
"qoderCliVersion": "1.1.52"
|
|
15
15
|
}
|
|
16
16
|
}
|
package/dist/types/messages.d.ts
CHANGED
|
@@ -16,8 +16,8 @@ export type SDKUserMessage = {
|
|
|
16
16
|
parent_tool_use_id: string | null;
|
|
17
17
|
custom_context?: Record<string, string>;
|
|
18
18
|
/**
|
|
19
|
-
* When true, the client has
|
|
20
|
-
* leading slash
|
|
19
|
+
* When true, the client has already resolved slash-command intent. The CLI
|
|
20
|
+
* treats a leading slash as literal model input while preserving attachments.
|
|
21
21
|
*/
|
|
22
22
|
client_composed?: boolean;
|
|
23
23
|
isSynthetic?: boolean;
|
|
@@ -40,6 +40,17 @@ export interface ModelPolicyContext {
|
|
|
40
40
|
/**
|
|
41
41
|
* Result returned by the resolveModel callback.
|
|
42
42
|
*/
|
|
43
|
+
export interface ModelPolicyParameters extends Record<string, unknown> {
|
|
44
|
+
/** Context window token count advertised by the selected model. */
|
|
45
|
+
contextWindow?: number;
|
|
46
|
+
/** Reasoning effort advertised by the selected model. */
|
|
47
|
+
reasoningEffort?: string;
|
|
48
|
+
/**
|
|
49
|
+
* External-provider routing for this request. It must match the provider
|
|
50
|
+
* declared by the selected model catalog entry.
|
|
51
|
+
*/
|
|
52
|
+
outerProvider?: string;
|
|
53
|
+
}
|
|
43
54
|
export interface ModelPolicyResult {
|
|
44
55
|
/**
|
|
45
56
|
* Selected model identifier, or a BYOK custom model object.
|
|
@@ -52,8 +63,8 @@ export interface ModelPolicyResult {
|
|
|
52
63
|
model?: string | (CustomModel & {
|
|
53
64
|
model: string;
|
|
54
65
|
});
|
|
55
|
-
/** Optional per-request model policy parameters
|
|
56
|
-
parameters?:
|
|
66
|
+
/** Optional per-request model policy parameters. */
|
|
67
|
+
parameters?: ModelPolicyParameters;
|
|
57
68
|
/**
|
|
58
69
|
* Optional routing scene label sent as the inference request body `task_id`.
|
|
59
70
|
* The server selects models by it; internal CLI tasks keep their own values.
|
package/dist/types/options.d.ts
CHANGED
|
@@ -323,8 +323,11 @@ export type Options = {
|
|
|
323
323
|
* Pull-mode model selection callback.
|
|
324
324
|
*
|
|
325
325
|
* When provided, the SDK enters pull mode: the CLI asks the SDK before
|
|
326
|
-
* every LLM call
|
|
327
|
-
* `options.model
|
|
326
|
+
* every LLM call. The CLI first resolves the local base model from
|
|
327
|
+
* `options.model`, settings, and its model router, then exposes that result
|
|
328
|
+
* to the callback as `resolvedModel` when available. The callback may keep
|
|
329
|
+
* or override the model; overrides without an inline `customModel` are
|
|
330
|
+
* validated by the CLI's normal model-routing chain before inference.
|
|
328
331
|
*
|
|
329
332
|
* When omitted, the SDK uses push mode: the CLI uses its local resolution
|
|
330
333
|
* chain (`options.model` / settings / model router).
|
|
@@ -517,6 +520,8 @@ export interface Query extends AsyncGenerator<SDKMessage, void> {
|
|
|
517
520
|
getAvailableModels(options?: {
|
|
518
521
|
fetchStrategy?: 'live' | 'cache';
|
|
519
522
|
uid?: string;
|
|
523
|
+
/** External-model providers to append to the normal model list. */
|
|
524
|
+
outerProviders?: string[];
|
|
520
525
|
}): Promise<ModelInfo[]>;
|
|
521
526
|
/**
|
|
522
527
|
* List the available BYOK (Bring Your Own Key) providers and their supported models.
|
package/dist/types/plugins.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { PluginInfo } from '../protocol/common.js';
|
|
2
2
|
/** Plugin installation scopes that can be changed through the CLI. */
|
|
3
3
|
export type PluginScope = 'user' | 'project' | 'local';
|
|
4
|
+
export type ListPluginsOptions = {
|
|
5
|
+
/** Directory used to resolve project/local plugin state and enablement. */
|
|
6
|
+
cwd?: string;
|
|
7
|
+
orgId?: string;
|
|
8
|
+
/** Optional qodercli executable or qoder Worker runtime entry override. */
|
|
9
|
+
cliPath?: string;
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
};
|
|
4
12
|
export type PluginToggleOptions = {
|
|
5
13
|
/** Directory used to resolve project and local plugin state. */
|
|
6
14
|
cwd?: string;
|
|
@@ -61,6 +69,8 @@ export type PluginDetails = PluginInfo & {
|
|
|
61
69
|
description?: string;
|
|
62
70
|
installedAt?: string;
|
|
63
71
|
lastUpdated?: string;
|
|
72
|
+
/** Project root for project/local rows when supplied by qodercli. */
|
|
73
|
+
projectPath?: string;
|
|
64
74
|
resources: PluginResources;
|
|
65
75
|
};
|
|
66
76
|
export type InstallPluginResult = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qoder-ai/qoder-agent-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.40",
|
|
4
4
|
"description": "TypeScript SDK for building Qoder-powered coding agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"zod": "^3.25.0 || ^4.0.0"
|
|
52
52
|
},
|
|
53
|
-
"qoderCliVersion": "1.1.
|
|
53
|
+
"qoderCliVersion": "1.1.52",
|
|
54
54
|
"qoderSdkBrand": "global",
|
|
55
55
|
"license": "SEE LICENSE IN LICENSE"
|
|
56
56
|
}
|