@qoder-ai/qoder-agent-sdk 1.0.20 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -47,9 +47,10 @@ const q = query({
47
47
  ```
48
48
 
49
49
  The worker transport uses the runtime installed at
50
- `dist/_worker/qoder-worker-runtime.obf.mjs`. You can instead set
51
- `QODER_WORKER_RUNTIME_PATH` or pass
52
- `new WorkerTransport({ pathToQoderWorkerRuntime })`.
50
+ `dist/_worker/qoder-worker-runtime.obf.mjs`. To use another Worker runtime,
51
+ pass its path explicitly with
52
+ `new WorkerTransport({ pathToQoderWorkerRuntime })`. Environment variables do
53
+ not override the Worker runtime entry.
53
54
 
54
55
  The package includes a `dist/runtime-manifest.json` that records the default
55
56
  runtime and pins the qodercli Worker runtime archive URL. The SDK package itself
@@ -70,14 +71,15 @@ QODER_SKIP_DOWNLOAD=1 npm install @qoder-ai/qoder-agent-sdk zod
70
71
 
71
72
  `QODER_SKIP_DOWNLOAD` only affects install-time downloads. It does not change the
72
73
  package's default runtime. Then point the process transport at an existing
73
- `qodercli`, or point the worker transport at an existing runtime:
74
+ `qodercli`:
74
75
 
75
76
  ```bash
76
77
  export QODERCLI_PATH=/absolute/path/to/qodercli
77
- # or
78
- export QODER_WORKER_RUNTIME_PATH=/absolute/path/to/qoder-worker-runtime.obf.mjs
79
78
  ```
80
79
 
80
+ To use an existing Worker runtime, pass its absolute path through
81
+ `new WorkerTransport({ pathToQoderWorkerRuntime })`.
82
+
81
83
  `query()` is the only query entry point and defaults to Worker. Pass
82
84
  `transport: ProcessTransport.default`,
83
85
  `transport: WorkerTransport.default`, or a custom transport provider when a
@@ -6,7 +6,9 @@ export declare const SDK_BRAND_CONFIG: {
6
6
  packageName: string;
7
7
  cliCommands: readonly ["qoderclicn", "qodercn"];
8
8
  configDirName: string;
9
+ projectConfigDirName: string;
9
10
  configDirEnv: string;
11
+ configDirNameEnv: string;
10
12
  cliHomeEnv: string;
11
13
  accessTokenEnv: string;
12
14
  serviceAccountEnv: string;
@@ -15,7 +17,9 @@ export declare const SDK_BRAND_CONFIG: {
15
17
  packageName: string;
16
18
  cliCommands: readonly ["qodercli", "qoder"];
17
19
  configDirName: string;
20
+ projectConfigDirName: string;
18
21
  configDirEnv: string;
22
+ configDirNameEnv: string;
19
23
  cliHomeEnv: string;
20
24
  accessTokenEnv: string;
21
25
  serviceAccountEnv: string;
@@ -1,4 +1,4 @@
1
- import type { PluginDetails, InstallPluginResult, UninstallPluginResult } from '../types/plugins.js';
1
+ import type { PluginDetails, InstallPluginResult, PluginValidationReport, ValidatePluginOptions, UninstallPluginResult } from '../types/plugins.js';
2
2
  export declare function listPlugins(opts?: {
3
3
  orgId?: string;
4
4
  cliPath?: string;
@@ -20,4 +20,10 @@ export declare function uninstallPlugin(id: string, opts?: {
20
20
  keepData?: boolean;
21
21
  cliPath?: string;
22
22
  env?: Record<string, string>;
23
- }): Promise<UninstallPluginResult>;
23
+ }): Promise<UninstallPluginResult>;
24
+ /**
25
+ * Statically validate a local plugin without creating a session or executing
26
+ * plugin hooks, MCP servers, or binaries. Invalid plugin content is returned
27
+ * as a report; transport and CLI capability failures reject the promise.
28
+ */
29
+ export declare function validatePlugin(path: string, opts?: ValidatePluginOptions): Promise<PluginValidationReport>;
package/dist/index.d.ts CHANGED
@@ -52,6 +52,9 @@
52
52
  * ```
53
53
  */
54
54
  export { query } from './query/query.js';
55
+ export { startup } from './query/startup.js';
56
+ export type { StartupParams, WarmQuery } from './query/startup.js';
57
+ export { resolveSettings } from './settings/resolve-settings.js';
55
58
  export { DEFAULT_RUNTIME_TRANSPORT, } from './core/default-runtime.js';
56
59
  export { ProcessTransport, QoderCliProcessError, } from './core/process-transport.js';
57
60
  export { hasResolvableQoderWorkerRuntime, QoderWorkerRuntimeError, WorkerTransport, resolveQoderWorkerRuntimePath, } from './core/worker-transport.js';
@@ -66,8 +69,8 @@ export { InMemorySessionStore } from './session/session-store.js';
66
69
  export { importSessionToStore } from './session/session-import.js';
67
70
  export type { ImportSessionToStoreOptions } from './session/session-import.js';
68
71
  export type { SessionKey, SessionStore, SessionStoreEntry, SessionStoreFlush, } from './session/session-store.js';
69
- export { listPlugins, enablePlugin, disablePlugin, installPlugin, uninstallPlugin } from './global/plugins.js';
70
- export type { PluginDetails, PluginResources, InstallPluginResult, UninstallPluginResult } from './types/plugins.js';
72
+ export { listPlugins, enablePlugin, disablePlugin, installPlugin, uninstallPlugin, validatePlugin, } from './global/plugins.js';
73
+ export type { PluginDetails, PluginResources, InstallPluginResult, UninstallPluginResult, PluginValidationSeverity, PluginValidationPhase, PluginValidationPosition, PluginValidationLocation, PluginValidationDiagnostic, PluginValidationReport, ValidatePluginOptions, } from './types/plugins.js';
71
74
  export { submitFeedback } from './feedback.js';
72
75
  export type { SubmitFeedbackParams, SubmitFeedbackOptions, IntegrationMode, } from './feedback.js';
73
76
  export { AbortError, ModelPolicyTimeoutError, ProtocolVersionMismatchError, UnsupportedCliCapabilityError, } from './core/errors.js';
@@ -97,7 +100,7 @@ export type { HookEvent, HookPermissionDecision, HookCallback, HookCallbackMatch
97
100
  export type { McpStdioServerConfig, McpSSEServerConfig, McpHttpServerConfig, McpSdkServerConfig, McpSdkServerConfigWithInstance, McpServerConfig, McpServerToolPolicy, McpServerConfigForProcessTransport, McpServerStatus, McpServerStatusConfig, } from './types/mcp.js';
98
101
  export type { AgentDefinition, AgentInfo, AgentMemoryScope, AgentMcpServerSpec, } from './types/agents.js';
99
102
  export type { SDKSessionInfo, SessionMessage, ListSessionsOptions, GetSessionInfoOptions, GetSessionMessagesOptions, GetSubagentMessagesOptions, ListSubagentsOptions, SessionMutationOptions, ForkSessionOptions, ForkSessionResult, RewindFilesResult, RewindScope, RewindStatus, RewindFileFailure, RewindResult, } from './types/session.js';
100
- export type { Settings, ResolvedSettings, ResolvedSettingsSource, } from './types/settings.js';
103
+ export type { Settings, ResolveSettingsOptions, ResolvedSettingSource, ResolvedSettings, ResolvedSettingsSource, SettingsProvenanceEntry, } from './types/settings.js';
101
104
  export { filterEscalatingDefaultMode } from './types/settings.js';
102
105
  export type { QoderModelPurpose } from './types/control.js';
103
106
  export type { SDKControlRequest, SDKControlResponse, SDKControlInterruptResponse, SDKControlInitializeResponse, SDKControlGetContextUsageResponse, SDKControlGetUsageInfoRequest, SDKControlGetUsageInfoResponse, SDKControlAddDirectoriesResponse, SDKControlReloadPluginsResponse, SDKControlStopTaskRequest, SDKControlBackgroundTasksRequest, SDKControlBackgroundTasksResponse, } from './types/control.js';
package/dist/index.js CHANGED
@@ -1,31 +1,34 @@
1
- var pr=Object.defineProperty;var fr=(s,e)=>{for(var t in e)pr(s,t,{get:e[t],enumerable:!0})};import{spawn as Hr}from"child_process";import{createInterface as Br}from"readline";var gr=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],mr=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],we=2e3,wt=5e3;var vt="1.0.20";var q=41,yt=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","WebFetch","WebSearch","Write"],St=["TaskCreate","TaskGet","TaskUpdate","TaskList"],hr="QODER_FEATURE_TASKS";function kt(s){let e=s[hr];if(e!=="0"&&e!=="false")return[...yt];let t=new Set(St);return yt.flatMap(r=>r===St[0]?["TodoWrite"]:t.has(r)?[]:[r])}import{chmod as Rt,mkdtemp as _r,rm as Tt,writeFile as Mr}from"fs/promises";import{existsSync as be,mkdtempSync as Cr,readFileSync as Ar,rmSync as xr,writeFileSync as Ir}from"fs";import{homedir as Dr,tmpdir as Et}from"os";import{dirname as Dt,join as x}from"path";import{fileURLToPath as Or}from"url";var yr=/^[A-Za-z0-9_-]{1,64}$/,Sr=new Set(["mcp_list","mcp_get","mcp_call"]);function Le(s,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${s}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!yr.test(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Sr.has(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Qe(s,e){let t={};for(let r of e)Le(s,r),(r.exposedName!==void 0||r.alwaysLoad===!0)&&(t[r.name]={...r.exposedName!==void 0?{exposedName:r.exposedName}:{},...r.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function ze(s,e,t=e.tools??[]){let{tools:r,...n}=e,o=Qe(s,t);return{...n,...o?{toolOverrides:o}:{}}}function Pt(s){let e={};for(let[t,r]of Object.entries(s)){if(r.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let n=r.tools??[],o=n.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=ze(t,r,n)}return e}var wr="global",vr=wr==="cn",v=vr?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",configDirEnv:"QODERCN_CONFIG_DIR",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",configDirEnv:"QODER_CONFIG_DIR",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var bt=v.accessTokenEnv,ve=v.serviceAccountEnv;function kr(s){return{type:"accessToken",accessToken:s}}function Pr(s=bt){return{type:"accessToken",accessToken:{envVar:s}}}function br(){return{type:"qodercli"}}function Rr(s){let e=s.serviceAccountKey!==void 0,t=typeof s.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...s}}function Tr(s=ve){return{type:"serviceAccount",serviceAccountKey:{envVar:s}}}function Er(s){return{type:"jobToken",fetchJobToken:s}}var _t="QODER_AGENT_SDK_ENTRYPOINT",Mt="QODER_AGENT_SDK_VERSION",Ct="QODER_SDK_AUTH_PAYLOAD_FILE",jr="sdk-ts",Nr=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],Kr=Or(import.meta.url),At=Dt(Kr),ke=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"}},Pe=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 Ot(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function G(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=Ur();if(s)return s;let e=qr();if(be(e))return e;let t=Fr();return t||v.cliCommands[0]}function Ur(){for(let s of jt())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=x(s,"dist","_bundled",t);if(be(r))return r}return null}function qr(){for(let s of jt())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=[x(s,"node_modules",".bin",t),x(s,"..","..",".bin",t)];for(let n of r)if(be(n))return n}return v.cliCommands[0]}function Fr(){let s=process.env[v.cliHomeEnv]??Dr();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=x(s,v.configDirName,"local",t);if(be(r))return r}return null}function jt(){let s=[x(At,".."),x(At,"..","..")];return[...new Set(s)]}function $r(){return{allow:[],ask:[],deny:[]}}function xt(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function Lr(s,e){if(e.startsWith("mcp__"))return e;let t=xt(s),r=e==="*"?"*":xt(e);if(!t||!r)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${r}`}function It(s,e){if(e.length===0)return;let t=new Set(s);for(let r of e)t.has(r)||(s.push(r),t.add(r))}function Qr(s){let e=s??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},r=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...r,enabled:!0}}}}var J=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,r="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=r}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{xr(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Dt(this.authPayloadPath);try{await Tt(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);delete t[_t],delete t[Mt],delete t[Ct];for(let r of this.serviceAccountCredentialEnvVars())zr(t,r);if(t[_t]=jr,t[Mt]=vt,this.authPayloadPath&&(t[Ct]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let r of Nr)t[r]=this.options.proxy;return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[ve];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let r=t.tools??kt(t.env??process.env);if(Array.isArray(r)?e.push("--tools",r.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let n=this.buildSettingsArg();if(n!==void 0&&e.push("--settings",n),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let r={...e??{}};this.applySettingsCompatibility(r),this.applyAdditionalDirectories(r),this.applyMcpPolicyRules(r,t);let n=this.applyFileCheckpointingSetting(r);return Object.keys(n).length>0?JSON.stringify(n):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?Qr(e):e}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let r=e.general!==null&&typeof e.general=="object"?e.general:{},n=this.toQoderDefaultPermissionMode(t.defaultMode);n!==void 0&&r.defaultPermissionMode===void 0&&(r.defaultPermissionMode=n),e.general=r}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let r=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},n=Array.isArray(r.additionalDirectories)?[...r.additionalDirectories]:[];It(n,t),r.additionalDirectories=n,e.permissions=r}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[r,n]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[r]??n.tools??[];t[r]=ze(r,n,o)}return t}collectMcpPolicyPermissionRules(){let e=$r(),t=new Map;for(let[r,n]of Object.entries(this.options.mcpToolPolicies??{}))n.length>0&&t.set(r,n);for(let[r,n]of Object.entries(this.options.mcpServers??{})){let o=n.tools;Array.isArray(o)&&o.length>0&&t.set(r,[...t.get(r)??[],...o])}for(let[r,n]of t)for(let o of n){let i=Lr(r,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let r=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=r;for(let n of["allow","ask","deny"]){let o=Array.isArray(r[n])?[...r[n]]:[];It(o,t[n]),r[n]=o}}readSettingsFile(e){let t=Ar(e,"utf8").trim();if(!t)return{};let r=JSON.parse(t);if(r===null||typeof r!="object"||Array.isArray(r))throw new Error("Settings file must contain a JSON object.");return r}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Cr(x(Et(),"qoder-agent-sdk-settings-"));let t=x(this.generatedSettingsDir,"settings.json");return Ir(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),r=await _r(x(Et(),"qoder-sdk-auth-"));try{await Rt(r,448);let n=x(r,"payload.json");return await Mr(n,JSON.stringify(t),{mode:384}),await Rt(n,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${n}`),n}catch(n){throw await Tt(r,{recursive:!0,force:!0}).catch(()=>{}),n}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,r=typeof e.fetchServiceAccountToken=="function";if(t===r)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return r?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,r=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!r)throw new Pe(t);return r}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,r=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!r)throw new ke(t);return r}};function zr(s,e){if(process.platform!=="win32"){delete s[e];return}let t=e.toLowerCase();for(let r of Object.keys(s))r.toLowerCase()===t&&delete s[r]}function Re(s,e){let t={...s};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}var Nt=8192,V=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}},Y=class s{static default=new s;process=null;customHandle=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new J(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(Re(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let r=e.env,{command:n,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${n} ${o.join(" ")}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:n,args:o,cwd:this.options.cwd,env:r,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,c)=>{this.ready=!1,a===q&&this.fireAuthExpired();let u=this.createProcessExitError(a,c);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})})}else this.process=Hr(n,o,{cwd:this.options.cwd,env:r,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===q&&this.fireAuthExpired();let c=this.createProcessExitError(i,a);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let c=a.trim();c&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${c}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
1
+ var Pr=Object.defineProperty;var Rr=(s,e)=>{for(var t in e)Pr(s,t,{get:e[t],enumerable:!0})};import{spawn as sn}from"child_process";import{createInterface as rn}from"readline";var Tr=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],Er=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Re=2e3,xt=5e3;var It="1.0.21";var L=41,Mt=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","WebFetch","WebSearch","Write"],At=["TaskCreate","TaskGet","TaskUpdate","TaskList"],_r="QODER_FEATURE_TASKS";function Ot(s){let e=s[_r];if(e!=="0"&&e!=="false")return[...Mt];let t=new Set(At);return Mt.flatMap(r=>r===At[0]?["TodoWrite"]:t.has(r)?[]:[r])}import{chmod as Nt,mkdtemp as Ur,rm as Kt,writeFile as qr}from"fs/promises";import{existsSync as Ce,mkdtempSync as Fr,readFileSync as $r,rmSync as Lr,writeFileSync as Qr}from"fs";import{homedir as zr,tmpdir as Ut}from"os";import{dirname as Ht,join as I}from"path";import{fileURLToPath as Hr}from"url";var Cr=/^[A-Za-z0-9_-]{1,64}$/,Mr=new Set(["mcp_list","mcp_get","mcp_call"]);function Je(s,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${s}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!Cr.test(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Mr.has(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Ve(s,e){let t={};for(let r of e)Je(s,r),(r.exposedName!==void 0||r.alwaysLoad===!0)&&(t[r.name]={...r.exposedName!==void 0?{exposedName:r.exposedName}:{},...r.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function Ge(s,e,t=e.tools??[]){let{tools:r,...n}=e,o=Ve(s,t);return{...n,...o?{toolOverrides:o}:{}}}function Dt(s){let e={};for(let[t,r]of Object.entries(s)){if(r.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let n=r.tools??[],o=n.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=Ge(t,r,n)}return e}var Ar="global",xr=Ar==="cn",y=xr?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var jt=y.accessTokenEnv,Te=y.serviceAccountEnv;function Ir(s){return{type:"accessToken",accessToken:s}}function Or(s=jt){return{type:"accessToken",accessToken:{envVar:s}}}function Dr(){return{type:"qodercli"}}function jr(s){let e=s.serviceAccountKey!==void 0,t=typeof s.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...s}}function Nr(s=Te){return{type:"serviceAccount",serviceAccountKey:{envVar:s}}}function Kr(s){return{type:"jobToken",fetchJobToken:s}}var qt="QODER_AGENT_SDK_ENTRYPOINT",Ft="QODER_AGENT_SDK_VERSION",$t="QODER_SDK_AUTH_PAYLOAD_FILE",Br="sdk-ts",Wr=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],Jr=Hr(import.meta.url),Lt=Ht(Jr),Ee=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},_e=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function Bt(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function X(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=Vr();if(s)return s;let e=Gr();if(Ce(e))return e;let t=Yr();return t||y.cliCommands[0]}function Vr(){for(let s of Wt())for(let e of y.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=I(s,"dist","_bundled",t);if(Ce(r))return r}return null}function Gr(){for(let s of Wt())for(let e of y.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=[I(s,"node_modules",".bin",t),I(s,"..","..",".bin",t)];for(let n of r)if(Ce(n))return n}return y.cliCommands[0]}function Yr(){let s=process.env[y.cliHomeEnv]??zr();for(let e of y.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=I(s,y.configDirName,"local",t);if(Ce(r))return r}return null}function Wt(){let s=[I(Lt,".."),I(Lt,"..","..")];return[...new Set(s)]}function Xr(){return{allow:[],ask:[],deny:[]}}function Qt(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function Zr(s,e){if(e.startsWith("mcp__"))return e;let t=Qt(s),r=e==="*"?"*":Qt(e);if(!t||!r)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${r}`}function zt(s,e){if(e.length===0)return;let t=new Set(s);for(let r of e)t.has(r)||(s.push(r),t.add(r))}function en(s){let e=s??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},r=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...r,enabled:!0}}}}var Y=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,r="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=r}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Lr(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Ht(this.authPayloadPath);try{await Kt(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);delete t[qt],delete t[Ft],delete t[$t];for(let r of this.serviceAccountCredentialEnvVars())tn(t,r);if(t[qt]=Br,t[Ft]=It,this.authPayloadPath&&(t[$t]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let r of Wr)t[r]=this.options.proxy;return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Te];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let r=t.tools??Ot(t.env??process.env);if(Array.isArray(r)?e.push("--tools",r.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let n=this.buildSettingsArg();if(n!==void 0&&e.push("--settings",n),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let r={...e??{}};this.applySettingsCompatibility(r),this.applyAdditionalDirectories(r),this.applyMcpPolicyRules(r,t);let n=this.applyFileCheckpointingSetting(r);return Object.keys(n).length>0?JSON.stringify(n):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?en(e):e}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let r=e.general!==null&&typeof e.general=="object"?e.general:{},n=this.toQoderDefaultPermissionMode(t.defaultMode);n!==void 0&&r.defaultPermissionMode===void 0&&(r.defaultPermissionMode=n),e.general=r}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let r=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},n=Array.isArray(r.additionalDirectories)?[...r.additionalDirectories]:[];zt(n,t),r.additionalDirectories=n,e.permissions=r}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[r,n]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[r]??n.tools??[];t[r]=Ge(r,n,o)}return t}collectMcpPolicyPermissionRules(){let e=Xr(),t=new Map;for(let[r,n]of Object.entries(this.options.mcpToolPolicies??{}))n.length>0&&t.set(r,n);for(let[r,n]of Object.entries(this.options.mcpServers??{})){let o=n.tools;Array.isArray(o)&&o.length>0&&t.set(r,[...t.get(r)??[],...o])}for(let[r,n]of t)for(let o of n){let i=Zr(r,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let r=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=r;for(let n of["allow","ask","deny"]){let o=Array.isArray(r[n])?[...r[n]]:[];zt(o,t[n]),r[n]=o}}readSettingsFile(e){let t=$r(e,"utf8").trim();if(!t)return{};let r=JSON.parse(t);if(r===null||typeof r!="object"||Array.isArray(r))throw new Error("Settings file must contain a JSON object.");return r}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Fr(I(Ut(),"qoder-agent-sdk-settings-"));let t=I(this.generatedSettingsDir,"settings.json");return Qr(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),r=await Ur(I(Ut(),"qoder-sdk-auth-"));try{await Nt(r,448);let n=I(r,"payload.json");return await qr(n,JSON.stringify(t),{mode:384}),await Nt(n,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${n}`),n}catch(n){throw await Kt(r,{recursive:!0,force:!0}).catch(()=>{}),n}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,r=typeof e.fetchServiceAccountToken=="function";if(t===r)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return r?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,r=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!r)throw new _e(t);return r}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,r=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!r)throw new Ee(t);return r}};function tn(s,e){if(process.platform!=="win32"){delete s[e];return}let t=e.toLowerCase();for(let r of Object.keys(s))r.toLowerCase()===t&&delete s[r]}function Me(s,e){let t={...s};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}var Jt=8192,Z=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},ee=class s{static default=new s;process=null;customHandle=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new Y(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(Me(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let r=e.env,{command:n,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${n} ${o.join(" ")}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:n,args:o,cwd:this.options.cwd,env:r,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,c)=>{this.ready=!1,a===L&&this.fireAuthExpired();let u=this.createProcessExitError(a,c);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})})}else this.process=sn(n,o,{cwd:this.options.cwd,env:r,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===L&&this.fireAuthExpired();let c=this.createProcessExitError(i,a);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let c=a.trim();c&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${c}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
2
2
  `)?e:e+`
3
- `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=Br({input:e,crlfDelay:1/0});try{for await(let r of t){if(this.closed)break;let n=r.trim();if(n)try{yield JSON.parse(n)}catch{}}this.closed||await this.waitForProcessExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let r=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!r)return;let n=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??we,i=setTimeout(()=>{if(n()){r("SIGTERM");let a=setTimeout(()=>{n()&&r("SIGKILL")},wt);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>Nt&&(this.stderrTail=this.stderrTail.slice(-Nt))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",n=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new V(n,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==q){if(e!==0&&e!==null)return new V(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new V(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(e.exitCode!==null||e.killed){let t=this.createProcessExitError(e.exitCode,null);if(t)throw this.processExitError=t,t;return}await new Promise((t,r)=>{let n=(i,a)=>{e.off("error",o);let c=this.createProcessExitError(i,a);c?(this.processExitError=c,r(c)):t()},o=i=>{e.off("exit",n);let a=this.createSpawnError(i);this.processExitError=a,r(a)};e.once("exit",n),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??G();if(Ot(t)){let r=this.options.executable??"node",n=this.options.executableArgs??[];return{command:r,commandArgs:[...n,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function Wr(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var He=Wr();function Kt(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function Te(s,e){return s.create(e)}import{existsSync as Ve}from"fs";import{createInterface as mn}from"readline";import{dirname as hn,join as F}from"path";import{fileURLToPath as yn}from"url";import{Worker as Sn}from"worker_threads";import{createHash as Jr}from"node:crypto";import{existsSync as Gr}from"node:fs";import{chmod as Vr,lstat as Yr,mkdir as ae,readFile as Ut,readdir as Xr,readlink as Zr,rename as en,rm as Ee,stat as tn,symlink as sn,writeFile as qt}from"node:fs/promises";import{tmpdir as rn,userInfo as nn}from"node:os";import{basename as Ft,dirname as X,join as I,relative as on}from"node:path";var an="QODER_WORKER_RUNTIME_ASSET_ROOT",$t=/(^|[\\/])app\.asar([\\/]|$)/,We=".qoder-worker-runtime-ready";function Lt(s){return $t.test(s)}function cn(s){return Lt(s)?s.replace($t,(e,t,r)=>`${t}app.asar.unpacked${r}`):null}async function Qt(s,e={}){let t=cn(s);if(!e.forceMaterialize&&t){let c=X(t);if(Gr(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Be(t,c,!1,X(s))}if(!(e.forceMaterialize||Lt(s))){let c=X(s);return Be(s,c,!1)}let n=X(s),o=await un(n,s,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=on(n,s)||Ft(s),a=I(o,i);return Be(a,o,!0,n)}function Be(s,e,t,r){return{runtimePath:s,runtimeRoot:e,materialized:t,sourceRuntimeRoot:r,env:{[an]:e}}}async function un(s,e,t){let r=await dn(s,e),n=t.cacheDir??fn(),o=I(n,r),i=I(o,We);if(await Ht(i)===r)return o;let a=I(n,`.setup-${r}-${process.pid}-${Date.now()}`);await ae(n,{recursive:!0,mode:448}),await Ee(a,{recursive:!0,force:!0}),await Ee(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${s} -> ${o}`);try{return await ae(a,{recursive:!0,mode:448}),await zt(s,a),await qt(I(a,We),r,{mode:384}),await pn(a,o,r),o}catch(c){throw await Ee(a,{recursive:!0,force:!0}).catch(()=>{}),c}}async function dn(s,e){let t=Jr("sha256");t.update("qoder-worker-runtime-v1\0");let r=await Bt(I(s,"runtime-info.json"));if(r)t.update(r);else{t.update(e);let n=await tn(e).catch(()=>null);n&&t.update(`${n.size}\0${n.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function zt(s,e){let t=await Xr(s,{withFileTypes:!0});await ae(e,{recursive:!0,mode:448});for(let r of t){let n=I(s,r.name),o=I(e,r.name);if(r.isDirectory()){await zt(n,o);continue}if(r.isSymbolicLink()){await ae(X(o),{recursive:!0,mode:448}),await sn(await Zr(n),o);continue}if(!r.isFile())continue;let i=await ln(n);await ae(X(o),{recursive:!0,mode:448}),await qt(o,await Ut(n),{mode:i}),process.platform!=="win32"&&await Vr(o,i)}}async function ln(s){let e=((await Yr(s)).mode||420)&511;if(process.platform==="win32")return e||420;let t=Ft(s);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function pn(s,e,t){try{await en(s,e)}catch(r){if(await Ht(I(e,We))===t){await Ee(s,{recursive:!0,force:!0});return}throw r}}async function Ht(s){let e=await Bt(s);return e?e.toString("utf8"):null}async function Bt(s){try{return await Ut(s)}catch{return null}}function fn(){let s=gn(nn().username||process.env.USER||process.env.USERNAME||"user");return I(rn(),`qoder-sdk-worker-runtime-${s}`)}function gn(s){return s.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Wt=8192,Jt="QODER_WORKER_RUNTIME_PATH",wn="QODER_WORKER_CWD",vn=new Set(["--mcp-config","--settings"]),kn=yn(import.meta.url),Je=hn(kn),$=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}},Z=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new Ge(Re(this.options,e))}},Ge=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 J(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=Ye(this.options.pathToQoderWorkerRuntime),r;try{r=await Qt(t,{diagnostics:this.diagnostics})}catch(a){throw new $(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let n=r.runtimePath;if(!Ve(n))throw new $(`Qoder worker runtime not found: ${n}`);let o=this.options.cwd??process.cwd(),i={...e.env,[wn]:o,...r.env};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${n}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${Pn(e.args)}`),this.worker=new Sn(n,{argv:e.args,env:i,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:{...this.options.workerData??{},qoderWorkerRuntime:{cwd:o,runtimeRoot:r.runtimeRoot,materialized:r.materialized}}}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===q&&this.fireAuthExpired();let c=this.createWorkerExitError(a);c&&(this.workerExitError=c),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let c=a.toString();this.appendStderr(c),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(c),this.options.stderr==="inherit"&&process.stderr.write(c);let u=c.trim();u&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${u}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
3
+ `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=rn({input:e,crlfDelay:1/0});try{for await(let r of t){if(this.closed)break;let n=r.trim();if(n)try{yield JSON.parse(n)}catch{}}this.closed||await this.waitForProcessExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let r=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!r)return;let n=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??Re,i=setTimeout(()=>{if(n()){r("SIGTERM");let a=setTimeout(()=>{n()&&r("SIGKILL")},xt);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>Jt&&(this.stderrTail=this.stderrTail.slice(-Jt))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",n=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new Z(n,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==L){if(e!==0&&e!==null)return new Z(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new Z(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(e.exitCode!==null||e.killed){let t=this.createProcessExitError(e.exitCode,null);if(t)throw this.processExitError=t,t;return}await new Promise((t,r)=>{let n=(i,a)=>{e.off("error",o);let c=this.createProcessExitError(i,a);c?(this.processExitError=c,r(c)):t()},o=i=>{e.off("exit",n);let a=this.createSpawnError(i);this.processExitError=a,r(a)};e.once("exit",n),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??X();if(Bt(t)){let r=this.options.executable??"node",n=this.options.executableArgs??[];return{command:r,commandArgs:[...n,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function nn(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var Ye=nn();function Vt(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function Ae(s,e){return s.create(e)}import{existsSync as Ie}from"fs";import{createInterface as Tn}from"readline";import{dirname as En,join as Q}from"path";import{fileURLToPath as _n}from"url";import{Worker as Cn}from"worker_threads";import{createHash as on}from"node:crypto";import{existsSync as an}from"node:fs";import{chmod as cn,lstat as un,mkdir as fe,readFile as Gt,readdir as dn,readlink as ln,rename as pn,rm as xe,stat as fn,symlink as gn,writeFile as Yt}from"node:fs/promises";import{tmpdir as mn,userInfo as hn}from"node:os";import{basename as Xt,dirname as te,join as O,relative as yn}from"node:path";var Sn="QODER_WORKER_RUNTIME_ASSET_ROOT",Zt=/(^|[\\/])app\.asar([\\/]|$)/,Ze=".qoder-worker-runtime-ready";function es(s){return Zt.test(s)}function et(s){return es(s)?s.replace(Zt,(e,t,r)=>`${t}app.asar.unpacked${r}`):null}async function ts(s,e={}){let t=et(s);if(!e.forceMaterialize&&t){let c=te(t);if(an(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Xe(t,c,!1,te(s))}if(!(e.forceMaterialize||es(s))){let c=te(s);return Xe(s,c,!1)}let n=te(s),o=await vn(n,s,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=yn(n,s)||Xt(s),a=O(o,i);return Xe(a,o,!0,n)}function Xe(s,e,t,r){return{runtimePath:s,runtimeRoot:e,materialized:t,sourceRuntimeRoot:r,env:{[Sn]:e}}}async function vn(s,e,t){let r=await wn(s,e),n=t.cacheDir??Pn(),o=O(n,r),i=O(o,Ze);if(await rs(i)===r)return o;let a=O(n,`.setup-${r}-${process.pid}-${Date.now()}`);await fe(n,{recursive:!0,mode:448}),await xe(a,{recursive:!0,force:!0}),await xe(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${s} -> ${o}`);try{return await fe(a,{recursive:!0,mode:448}),await ss(s,a),await Yt(O(a,Ze),r,{mode:384}),await bn(a,o,r),o}catch(c){throw await xe(a,{recursive:!0,force:!0}).catch(()=>{}),c}}async function wn(s,e){let t=on("sha256");t.update("qoder-worker-runtime-v1\0");let r=await ns(O(s,"runtime-info.json"));if(r)t.update(r);else{t.update(e);let n=await fn(e).catch(()=>null);n&&t.update(`${n.size}\0${n.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function ss(s,e){let t=await dn(s,{withFileTypes:!0});await fe(e,{recursive:!0,mode:448});for(let r of t){let n=O(s,r.name),o=O(e,r.name);if(r.isDirectory()){await ss(n,o);continue}if(r.isSymbolicLink()){await fe(te(o),{recursive:!0,mode:448}),await gn(await ln(n),o);continue}if(!r.isFile())continue;let i=await kn(n);await fe(te(o),{recursive:!0,mode:448}),await Yt(o,await Gt(n),{mode:i}),process.platform!=="win32"&&await cn(o,i)}}async function kn(s){let e=((await un(s)).mode||420)&511;if(process.platform==="win32")return e||420;let t=Xt(s);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function bn(s,e,t){try{await pn(s,e)}catch(r){if(await rs(O(e,Ze))===t){await xe(s,{recursive:!0,force:!0});return}throw r}}async function rs(s){let e=await ns(s);return e?e.toString("utf8"):null}async function ns(s){try{return await Gt(s)}catch{return null}}function Pn(){let s=Rn(hn().username||process.env.USER||process.env.USERNAME||"user");return O(mn(),`qoder-sdk-worker-runtime-${s}`)}function Rn(s){return s.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var os=8192,Mn="QODER_WORKER_CWD",An=new Set(["--mcp-config","--settings"]),xn=_n(import.meta.url),tt=En(xn),z=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},se=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new st(Me(this.options,e))}},st=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new Y(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=rt(this.options.pathToQoderWorkerRuntime),r;try{r=await ts(t,{diagnostics:this.diagnostics})}catch(a){throw new z(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let n=r.runtimePath;if(!Ie(n))throw new z(`Qoder worker runtime not found: ${n}`);let o=this.options.cwd??process.cwd(),i={...e.env,[Mn]:o,...r.env};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${n}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${In(e.args)}`),this.worker=new Cn(n,{argv:e.args,env:i,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:{...this.options.workerData??{},qoderWorkerRuntime:{cwd:o,runtimeRoot:r.runtimeRoot,materialized:r.materialized}}}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===L&&this.fireAuthExpired();let c=this.createWorkerExitError(a);c&&(this.workerExitError=c),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let c=a.toString();this.appendStderr(c),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(c),this.options.stderr==="inherit"&&process.stderr.write(c);let u=c.trim();u&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${u}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
4
4
  `)?e:e+`
5
- `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=mn({input:e,crlfDelay:1/0});try{for await(let r of t){if(this.closed)break;let n=r.trim();if(n)try{yield JSON.parse(n)}catch{}}this.closed||await this.waitForWorkerExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.launchOptionsBuilder.cleanupGeneratedSettings(),this.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??we;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}destroyWorkerStreams(e){e?.stdin?.destroy(),e?.stdout?.destroy(),e?.stderr?.destroy()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>Wt&&(this.stderrTail=this.stderrTail.slice(-Wt))}createWorkerError(e){return new $(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===q))return new $(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,r)=>{let n=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,r(a)):t()},o=i=>{if(e.off("exit",n),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,r(a)};e.once("exit",n),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function Ye(s){if(s)return s;if(process.env[Jt])return process.env[Jt];let e=[];for(let t of Rn())e.push(F(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),F(t,"dist","_worker","qoder-worker-runtime.mjs"),F(t,"_worker","qoder-worker-runtime.obf.mjs"),F(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(Ve(t))return t;return e[0]??F(Je,"..","_worker","qoder-worker-runtime.obf.mjs")}function Pn(s){let e=[];for(let t=0;t<s.length;t+=1){let r=s[t];e.push(r),vn.has(r)&&t+1<s.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}function bn(s){return Ve(Ye(s))}function Rn(){let s=[F(Je,".."),F(Je,"..","..")];return[...new Set(s)]}var _e=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;cleanup;cleanupPromise;async initialize(){try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){e.close(),await this.runCleanup();return}for(let t of this.pending.splice(0))t.type==="write"?await e.write(t.data):e.endInput()}catch(e){throw await this.runCleanup(),e}}write(e){if(this.closed)throw new Error("Transport has been closed");if(this.transport?.isReady()){this.transport.write(e);return}this.pending.push({type:"write",data:e})}close(){this.closed||(this.closed=!0,this.pending.length=0,this.transport?this.transport.close():this.bootstrapPromise&&this.bootstrapPromise.catch(()=>this.runCleanup()))}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{await this.initialize(),yield*(await this.getTransport()).readMessages()}finally{await this.runCleanup()}}endInput(){if(!this.closed){if(this.transport?.isReady()){this.transport.endInput();return}this.pending.push({type:"endInput"})}}async getTransport(){return this.bootstrapPromise||(this.bootstrapPromise=this.bootstrap().then(e=>(this.transport=e.transport,this.cleanup=e.cleanup,this.closed&&(e.transport.close(),this.runCleanup()),e.transport))),this.bootstrapPromise}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as Tn,mkdirSync as En}from"fs";import{dirname as _n}from"path";var Mn="QODER_AGENT_SDK_DEBUG";function Cn(s){return s.debugFile?!0:s.debug===!0||xn(process.env[Mn])}function An(s){if(s.debugFile)return s.debugFile}function xn(s){if(s===void 0)return!1;let e=s.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var Me=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=Cn(e),this.debugFile=An(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let r=this.formatLine(e,t),n=this.debugFile;if(n){this.writeToFile(n,r);return}this.writeToStderr(r)}get filePath(){return this.debugFile}writeToFile(e,t){try{En(_n(e),{recursive:!0}),Tn(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let r=new Date().toISOString(),n=this.formatError(t);return`${r} ${e}${n}
5
+ `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=Tn({input:e,crlfDelay:1/0});try{for await(let r of t){if(this.closed)break;let n=r.trim();if(n)try{yield JSON.parse(n)}catch{}}this.closed||await this.waitForWorkerExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.launchOptionsBuilder.cleanupGeneratedSettings(),this.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??Re;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}destroyWorkerStreams(e){e?.stdin?.destroy(),e?.stdout?.destroy(),e?.stderr?.destroy()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>os&&(this.stderrTail=this.stderrTail.slice(-os))}createWorkerError(e){return new z(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===L))return new z(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,r)=>{let n=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,r(a)):t()},o=i=>{if(e.off("exit",n),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,r(a)};e.once("exit",n),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function rt(s){if(s)return s;let e=[];for(let t of Dn())e.push(Q(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),Q(t,"dist","_worker","qoder-worker-runtime.mjs"),Q(t,"_worker","qoder-worker-runtime.obf.mjs"),Q(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(Ie(t))return t;return e[0]??Q(tt,"..","_worker","qoder-worker-runtime.obf.mjs")}function In(s){let e=[];for(let t=0;t<s.length;t+=1){let r=s[t];e.push(r),An.has(r)&&t+1<s.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}function On(s){let e=rt(s);if(Ie(e))return!0;let t=et(e);return t!==null&&Ie(t)}function Dn(){let s=[Q(tt,".."),Q(tt,"..","..")];return[...new Set(s)]}var Oe=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;cleanup;cleanupPromise;async initialize(){try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){e.close(),await this.runCleanup();return}for(let t of this.pending.splice(0))t.type==="write"?await e.write(t.data):e.endInput()}catch(e){throw await this.runCleanup(),e}}write(e){if(this.closed)throw new Error("Transport has been closed");if(this.transport?.isReady()){this.transport.write(e);return}this.pending.push({type:"write",data:e})}close(){this.closed||(this.closed=!0,this.pending.length=0,this.transport?this.transport.close():this.bootstrapPromise&&this.bootstrapPromise.catch(()=>this.runCleanup()))}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{await this.initialize(),yield*(await this.getTransport()).readMessages()}finally{await this.runCleanup()}}endInput(){if(!this.closed){if(this.transport?.isReady()){this.transport.endInput();return}this.pending.push({type:"endInput"})}}async getTransport(){return this.bootstrapPromise||(this.bootstrapPromise=this.bootstrap().then(e=>(this.transport=e.transport,this.cleanup=e.cleanup,this.closed&&(e.transport.close(),this.runCleanup()),e.transport))),this.bootstrapPromise}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as jn,mkdirSync as Nn}from"fs";import{dirname as Kn}from"path";var Un="QODER_AGENT_SDK_DEBUG";function qn(s){return s.debugFile?!0:s.debug===!0||$n(process.env[Un])}function Fn(s){if(s.debugFile)return s.debugFile}function $n(s){if(s===void 0)return!1;let e=s.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var De=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=qn(e),this.debugFile=Fn(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let r=this.formatLine(e,t),n=this.debugFile;if(n){this.writeToFile(n,r);return}this.writeToStderr(r)}get filePath(){return this.debugFile}writeToFile(e,t){try{Nn(Kn(e),{recursive:!0}),jn(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let r=new Date().toISOString(),n=this.formatError(t);return`${r} ${e}${n}
6
6
  `}formatError(e){if(e===void 0)return"";if(e instanceof Error)return`
7
- ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};var ee=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var L=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ce=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},ue=class extends Error{cliProtocolVersion;sdkProtocolVersion;constructor(e,t){super(`Wire protocol major mismatch: CLI announced "${e}" but this SDK was built for "${t}". Upgrade either qodercli or @qoder-ai/qoder-agent-sdk so the major versions align.`),this.name="ProtocolVersionMismatchError",this.cliProtocolVersion=e,this.sdkProtocolVersion=t}},de=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var Xe="1.2.0";function Gt(s,e,t,r){return new Promise((n,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(c){o(c);return}n({jsonrpc:"2.0"});return}let a=`${s}:${e.id}`;r.set(a,{resolve:n,reject:o}),t.onmessage?t.onmessage(e):(r.delete(a),o(new Error(`No message handler registered for MCP server "${s}"`)))})}function Vt(s,e,t){if("id"in e&&e.id!==null){let r=`${s}:${e.id}`,n=t.get(r);if(n)return n.resolve(e),t.delete(r),!0}return!1}function Yt(s,e,t){let r=0,n=`${s}:`,o=Array.from(t.entries());for(let i of o){let[a,c]=i;a.startsWith(n)&&(c.reject(e),t.delete(a),r++)}return r}import{randomUUID as In}from"crypto";function es(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var Dn=500,On=1024*1024,jn=6e4,Nn=[200,800],Ce=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=Kn(e.filePath),r=Un(e.entries),n=Zt(t),o=this.states.get(n);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(n,o)),o.entries.push(...r),o.bytes+=Fn(r),(this.options.flushMode==="eager"||o.entries.length>=Dn||o.bytes>=On)&&this.drain(o)}async flush(){for(let e of this.states.values())this.drain(e);await Promise.all([...this.states.values()].map(e=>e.tail))}drain(e){if(e.entries.length===0)return;let t=e.entries;e.entries=[],e.bytes=0,e.tail=e.tail.then(async()=>{try{await $n(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??jn,retryDelaysMs:this.options.retryDelaysMs??Nn})}catch(r){this.options.diagnostics?.record(`[SessionStore] append failed for ${Zt(e.key)}`,r),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:r instanceof Error?r.message:String(r),key:{...e.key},uuid:In(),session_id:e.key.sessionId})}})}};function Kn(s){let e=s.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),r=e.slice(t+1);if(t<0||r.length<2)throw new Error(`Invalid transcript mirror path: ${s}`);let n=r[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(r[1]);if(r.length===2&&o)return{projectKey:n,sessionId:Xt(o[1])};let i=Xt(r[1]),a=r.slice(2),c=a.at(-1);a[a.length-1]=c.endsWith(".jsonl")?c.slice(0,-6):c;let u=a.join("/");return qn(u),{projectKey:n,sessionId:i,subpath:u}}function Un(s){return s.map((e,t)=>{if(typeof e!="object"||e===null||typeof e.type!="string")throw new Error(`Transcript mirror entry ${t} is not a typed object`);return e})}function Xt(s){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s))throw new Error(`Invalid transcript session id: ${s}`);return s}function qn(s){let e=s.split("/");if(!s||s.includes("\0")||/^[a-z]:/i.test(s)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${s}`)}function Zt(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}function Fn(s){return s.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function $n(s,e,t,r){for(let n=0;;n++)try{await Ln(s.append({...e},structuredClone(t)),r.appendTimeoutMs);return}catch(o){if(o instanceof Ae)throw o;let i=r.retryDelaysMs[n];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function Ln(s,e){let t;s.catch(()=>{});try{await Promise.race([s,new Promise((r,n)=>{t=setTimeout(()=>n(new Ae(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Ae=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function ts(){return Math.random().toString(36).substring(2,15)}function ss(s,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:s,request:t}}function rs(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function ns(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function os(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function is(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function as(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function te(s){if(typeof s!="object"||s===null)return;let e=s,t=e.subtype;if(typeof t=="string")return t;let r=e.type;return typeof r=="string"?r:void 0}function cs(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function us(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function ds(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function ls(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function ps(s){return typeof s=="object"&&s!==null&&s.type==="result"}var Ie=class s{static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,r,n,o,i,a,c,u,l,f,d,p,g,S,m,h,k="batched",y,E){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=r,this.hooks=n??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=d??new Map,this.pendingMcpResponses=p??new Map,this.sdkMcpToolOverrides=y??{},this.initConfig=a??{},this.onElicitation=c,this.onAuthExpired=l,this.fetchJobToken=g,this.fetchServiceAccountToken=E,this.diagnostics=u,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=S,this.resolveModelTimeoutMs=m??500,this.inputStream=new ee(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new Ce({store:h,flushMode:k,diagnostics:u,onMirrorError:C=>this.inputStream.enqueue(C)})),this.readLoopPromise=this.readMessages().catch(C=>{this.inputStream.error(C)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let C=this.abortController.signal;C.aborted?this.close().catch(()=>{}):C.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let r=e.replace(/\s+/g," ").trim();return r.length>200?`${r.slice(0,200)}...`:r}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let r=t.text;if(typeof r=="string")return this.normalizeLogPreview(r);let n=this.extractMessagePreview(t.content);if(n)return n;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let r=this.getRecord(e)?.type;return typeof r=="string"&&r?r:"unknown"}getMessageSubtype(e){let r=this.getRecord(e)?.subtype;return typeof r=="string"&&r?r:"none"}getMessageUuid(e){let r=this.getRecord(e)?.uuid;return typeof r=="string"&&r?r:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,n=this.getRecord(t)?.content,o=Array.isArray(n)?n.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(es(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(n){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",n)}continue}if(os(t)){this.handleControlResponse(t);continue}if(is(t)){this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",n)});continue}if(as(t)){this.handleControlCancelRequest(t);continue}if(cs(t)||us(t)||ds(t)||ls(t))continue;if(ps(t)){await this.transcriptMirrorBatcher?.flush();let n=t;this.recordInboundSessionMessage(n),this.resultMessage=n,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(n),this.isSingleTurn&&this.transport.endInput();continue}let r=t;if(this.recordInboundSessionMessage(r),r.type==="system"&&r.subtype==="init")try{let n=r;this.validateProtocolHandshake(n),this.cliCapabilities=new Set(n.capabilities??[])}catch(n){throw this.inputStream.error(n),n}this.notifyAuthExpiredIfNeeded(r),this.inputStream.enqueue(r)}}catch(t){e=t}finally{await this.transcriptMirrorBatcher?.flush();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,r]of this.pendingRequests)r.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let r=e.type==="auth_status"&&!!e.error,n=e.type==="assistant"&&e.error==="authentication_failed";!r&&!n||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}async request(e,t){let r=ts(),n=ss(r,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=te(n.request)??"unknown",a=Date.now();return new Promise((c,u)=>{let l=null,f=()=>{l&&(clearTimeout(l),l=null)};this.pendingRequests.set(r,{resolve:d=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(d)},reject:d=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=error duration_ms=${Date.now()-a}`,d),u(d)}}),o>0&&Number.isFinite(o)&&(l=setTimeout(()=>{if(this.pendingRequests.has(r)){this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${r} subtype=${i} timeout_ms=${o}`);try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:r})+`
8
- `)}catch(d){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",d)}u(new Error(`Control request "${te(n.request)??"unknown"}" timed out after ${o}ms`))}},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${r} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(n)+`
9
- `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${r} subtype=${i}`)}catch(d){f(),this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${r} subtype=${i}`,d),u(d)}})}handleControlResponse(e){let t=e.response,r=t.request_id,n=this.pendingRequests.get(r);if(!n){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${r} status=${t.subtype}`);return}if(this.pendingRequests.delete(r),t.subtype==="success")n.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),n.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)te(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",r)})}async handleControlRequest(e){let t=e.request_id,r=te(e.request)??"unknown",n=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${r}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=rs(t,i);this.transport.write(JSON.stringify(a)+`
10
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${r} status=success duration_ms=${Date.now()-n}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:c}=Wn(i),u=ns(t,a,c);this.transport.write(JSON.stringify(u)+`
11
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${r} status=error duration_ms=${Date.now()-n}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new L}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,r=Xe;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${r}. Consider upgrading qodercli for the version handshake.`);return}let n=fs(t),o=fs(r);if(!n||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${r}"; skipping handshake.`);return}if(n.major!==o.major)throw new ue(t,r);n.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${r}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new L;return new Promise((r,n)=>{let o=()=>{n(new L)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),r(i)},i=>{t.removeEventListener("abort",o),n(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let r=e.request,n=te(r),o=r;switch(n){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,c=e.request_id,u=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!u?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:u.token}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let c=o.tool_use_id,u=o.permission_suggestions??o.suggestions,l=o.blocked_path,f=o.decision_reason,d=o.title,p=o.display_name,g=o.description,S=o.agent_id,m=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:u,blockedPath:l,decisionReason:f,title:d,displayName:p,description:g,toolUseID:c,agentID:S}),t);if(m.behavior==="deny"&&!m.message)throw new Error("Permission deny result must include a message.");return m.behavior==="allow"?{...m,updatedInput:m.updatedInput??a,toolUseID:c}:{...m,toolUseID:c}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"mcp_message":{let i=o.server_name,a=o.message,c=this.sdkMcpTransports.get(i);if(!c)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(Gt(i,a,c,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,c=Promise.resolve(this.resolveModel(i)),u,l=new Promise((p,g)=>{u=setTimeout(()=>{g(new ce(a))},a)}),f;try{f=await this.awaitAbortable(Promise.race([c,l]),t)}finally{clearTimeout(u)}let d={type:"get_model_policy",model:typeof f.model=="string"?f.model:f.model.model,parameters:f.parameters};if(typeof f.model!="string"){let{model:p,...g}=f.model;d.custom_model={...g,style:g.style??"openai"}}return d}default:throw new Error(`Unhandled control request subtype: ${n??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,initializeTimeoutMs:s.INITIALIZE_TIMEOUT_MS},t={};for(let[n,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let c=a.hooks.map(u=>{let l=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(l,u),l});c.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:c,timeout:a.timeout})}i.length>0&&(t[n]=i)}Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let r=await this.request(e,{timeoutMs:s.INITIALIZE_TIMEOUT_MS});if(r&&typeof r=="object"){let n=r;this.initResponse=n}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,r,n){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,r,{signal:n}),n)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let r of e){if(this.closed)break;t+=1,this.transport.write(JSON.stringify(r)+`
12
- `),this.recordOutboundSessionMessage(r)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&this.transport.endInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(r=>typeof r=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(s.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(s.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new de(e)}async setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account)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=Bn(e?.usage),r=Hn(e?.session);return!t&&!r?null:{...t??{},...r?{session:r}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let r={type:"rewind_files",user_message_id:e};t?.dryRun&&(r.dry_run=!0);let o=await this.request(r);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let n={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(n.dry_run=!0),await this.request(n)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=Pt(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let r=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),n=r?.requiresUserAction===!0,o=typeof r?.authUrl=="string"?r.authUrl:void 0;if(n&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return n?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){if(this.closed)return;this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,r]of this.sdkMcpTransports){try{await r.close()}catch(n){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,n)}Yt(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function Q(s){return typeof s=="object"&&s!==null}function Ze(s){return typeof s=="number"&&Number.isFinite(s)}function et(s){return Object.keys(s).length>0}function D(s,e,t){let r=e[t];Ze(r)&&(s[t]=r)}function se(s,e,t){let r=e[t];typeof r=="string"&&(s[t]=r)}function xe(s,e,t){let r=e[t];typeof r=="boolean"&&(s[t]=r)}function gs(s){if(!Q(s)||Array.isArray(s))return;let e={};return D(e,s,"total"),D(e,s,"used"),D(e,s,"remaining"),D(e,s,"percentage"),se(e,s,"unit"),et(e)?e:void 0}function Qn(s){if(!Q(s)||Array.isArray(s))return;let e=gs(s)??{};return se(e,s,"detailUrl"),et(e)?e:void 0}function zn(s){if(!Q(s)||Array.isArray(s))return;let e={};return D(e,s,"used"),D(e,s,"cap"),D(e,s,"remaining"),D(e,s,"percentage"),xe(e,s,"available"),se(e,s,"unit"),et(e)?e:void 0}function Hn(s){if(!Q(s)||Array.isArray(s))return;let e=s.total_credits,t=s.model_usage;if(!Ze(e)||e<0||!Q(t)||Array.isArray(t))return;let r={};for(let[n,o]of Object.entries(t)){if(!Q(o)||Array.isArray(o))continue;let i=o.credits;Ze(i)&&i>=0&&(r[n]={credits:i})}return{total_credits:e,model_usage:r}}function Bn(s){if(!Q(s)||Array.isArray(s))return null;let e={};se(e,s,"userId"),se(e,s,"userType"),D(e,s,"totalUsagePercentage"),xe(e,s,"isHighestTier"),D(e,s,"expiresAt"),se(e,s,"upgradeUrl"),xe(e,s,"isQuotaExceeded"),xe(e,s,"isPlanQuotaProrated");let t=gs(s.userQuota);t&&(e.userQuota=t);let r=Qn(s.addOnQuota);r&&(e.addOnQuota=r);let n=zn(s.orgResourcePackage);return n&&(e.orgResourcePackage=n),e}function Wn(s){let e=s instanceof Error?s.message:String(s),t=typeof s=="object"&&s!==null?s.code:void 0,r=typeof t=="string"&&t.length>0?t:void 0,n=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(n){let o=r??n[1];return(!r||r===n[1])&&(e=n[2]||e),{error:e,code:o}}return r?{error:e,code:r}:{error:e}}function fs(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var De=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as ms}from"crypto";var Jn="QODER_CLOUD_AGENT_API_BASE",Gn="https://api.qoder.com/api/v1/cloud",j={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Vn=1024,hs=1*1024*1024,ys=4*1024*1024,Yn=8*1024,st=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},Oe=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},rt=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}},Xn=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function ks(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(o=>s[o]!==void 0&&!Xn.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(s.auth?.type!=="accessToken")throw new Oe;let{agent:t,session:r}=s.experimentalCloudAgent;if(t&&re(t)&&tt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(r&&re(r)&&tt(r))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(r&&re(r)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let n=!!r&&re(r);if(!n&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!n){if(!r||!tt(r))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof r.create.environment_id!="string"||r.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function re(s){return"id"in s&&s.id!==void 0}function tt(s){return"create"in s&&s.create!==void 0}function Ps(s){return new nt(s)}var nt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=go();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=vs();latestModelUsage={};totalCostUsd=0;postedMessages=0;activeInputStreams=0;idleSeen=!1;resultEmitted=!1;constructor(e){if(!e.options.experimentalCloudAgent)throw new Error("options.experimentalCloudAgent is required for CloudAgentQuery.");this.experimentalCloudAgent=e.options.experimentalCloudAgent,this.diagnostics=e.diagnostics,this.onAuthExpired=e.options.onAuthExpired,this.accessToken=Zn(e.options.auth,e.options.env),this.apiBase=eo(),this.inputStream=new ee(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(r=>{this.sseConnected.reject(r),this.closed||this.inputStream.error(r)}),this.streamInput(po(e.prompt)).catch(r=>{this.closed||this.inputStream.error(r)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let r=lo(t);this.beginPendingTurn();let n=await this.postSessionEvents([{type:j.userMessage,content:r}]);this.postedMessages+=1,this.activateTurn(n.find(o=>o.type===j.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:j.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&re(e))t=e.id;else{let r=await this.resolveAgentId(),n=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:r,...so(n)}});t=Ss(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:to(e.create)});return Ss(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let r=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==r&&(t=0),t+=1,await fo(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),r=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;r&&t.searchParams.set("after_id",r),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let n=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!n.ok)throw this.handleAuthFailure(n.status),await ws(n);if(!n.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(n.body)}async readSseBody(e){let t=e.getReader(),r=new TextDecoder,n="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){n+=r.decode(),n.length>0&&this.consumeSseLine(n,o);break}n+=r.decode(a,{stream:!0});let c;for(;(c=n.indexOf(`
13
- `))!==-1;){let u=n.slice(0,c);n=n.slice(c+1);let l=u.endsWith("\r")?u.slice(0,-1):u;if(this.consumeSseLine(l,o),this.closed)break}n.length>hs&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${hs} bytes; resetting buffer.`),n="",o.id=void 0,o.event=void 0,o.data.length=0,o.dataBytes=0)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}consumeSseLine(e,t){if(e===""){(t.event||t.data.length>0)&&this.handleSseEvent({id:t.id,event:t.event??"message",data:oo(t.data.join(`
14
- `))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let r=e.indexOf(":"),n=r===-1?e:e.slice(0,r),o=r===-1?"":e.slice(r+1);switch(o.startsWith(" ")&&(o=o.slice(1)),n){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>ys){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${ys} 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=_(e.data,"type")??e.event,r=_(e.data,"turn_id"),n={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??ms(),session_id:this.sessionId??_(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(n),!this.isCurrentTurnEvent(r)){this.bufferPendingTurnEvent(e,t,r);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case j.agentMessage:{let r=ao(le(e.data,"content"));r&&this.assistantTextParts.push(r);return}case j.modelRequestEnd:this.captureUsage(e.data);return;case j.idle:this.idleSeen=!0,this.finishIfIdle();return;case j.error:this.emitErrorResult(e),this.finish();return;case j.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=vs(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let r of t)if(this.isCurrentTurnEvent(r.turnId)&&this.handleCurrentTurnEvent(r.event,r.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,r){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=Vn&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:r}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(_(e.data,"error")??_(je(e.data,"error"),"message")??"Cloud Agent session failed.")}emitErrorResultMessage(e){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"error_during_execution",is_error:!0,errors:[e]}))}buildResultBase(){let e=Date.now()-this.startedAt;return{type:"result",duration_ms:e,duration_api_ms:e,num_turns:Math.max(1,this.postedMessages),stop_reason:null,total_cost_usd:this.totalCostUsd,usage:this.latestUsage,modelUsage:this.latestModelUsage,permission_denials:[],uuid:ms(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,r=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return ro(r)}captureUsage(e){let t=je(e,"usage");if(!t)return;this.latestUsage=co(this.latestUsage,t);let r=R(e,"total_cost_usd")??R(e,"cost_usd")??R(t,"total_cost_usd")??R(t,"cost_usd");r!==void 0&&(this.totalCostUsd+=r);let n=_(e,"model")??_(t,"model");if(n){let o=this.latestModelUsage[n]?.costUSD??0;this.latestModelUsage[n]=uo(this.latestUsage,o+(r??0))}}async requestJson(e,t){let r=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await ws(r);if(r.status===204)return{};try{return await r.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function Zn(s,e){if(s?.type!=="accessToken")throw new Oe;if(typeof s.accessToken=="string")return s.accessToken;let t=s.accessToken.envVar,r=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!r)throw new st(t);return r}function eo(){return process.env[Jn]?.replace(/\/+$/,"")??Gn}function to(s){return ot({name:s.name,model:s.model,system:s.system,description:s.description,tools:s.tools,mcp_servers:s.mcp_servers,skills:s.skills,metadata:s.metadata})}function so(s){return ot({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>ot({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function ot(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function Ss(s,e){let t=_(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function ro(s){let e=io(s,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:_(t,"id"),turnId:_(t,"turn_id"),type:_(t,"type")}]):[]}async function ws(s){let e=await no(s,Yn);return new rt(s.status,e||s.statusText||"unknown error")}async function no(s,e){if(!s.body)try{return(await s.text()).slice(0,e)}catch{return""}let t=s.body.getReader(),r=new TextDecoder,n=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,n.push(r.decode(a,{stream:!0}))}n.push(r.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return n.join("").slice(0,e)}function oo(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function je(s,e){let t=le(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function io(s,e){let t=le(s,e);return Array.isArray(t)?t:void 0}function _(s,e){let t=le(s,e);return typeof t=="string"?t:void 0}function R(s,e){let t=le(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function le(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function ao(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>bs(t)?t.text:"").filter(Boolean).join("")||void 0}function co(s,e){let t=je(e,"cache_creation"),r=je(e,"server_tool_use");return{...s,cache_creation:{ephemeral_1h_input_tokens:R(t,"ephemeral_1h_input_tokens")??s.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:R(t,"ephemeral_5m_input_tokens")??s.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:R(e,"cache_creation_input_tokens")??s.cache_creation_input_tokens,cache_read_input_tokens:R(e,"cache_read_input_tokens")??s.cache_read_input_tokens,input_tokens:R(e,"input_tokens")??s.input_tokens,output_tokens:R(e,"output_tokens")??s.output_tokens,server_tool_use:{web_fetch_requests:R(r,"web_fetch_requests")??s.server_tool_use.web_fetch_requests,web_search_requests:R(r,"web_search_requests")??s.server_tool_use.web_search_requests}}}function uo(s,e){return{inputTokens:s.input_tokens,outputTokens:s.output_tokens,cacheReadInputTokens:s.cache_read_input_tokens,cacheCreationInputTokens:s.cache_creation_input_tokens,webSearchRequests:s.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function lo(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>bs(t)?t.text:JSON.stringify(t)).join(`
15
- `):JSON.stringify(e)}function bs(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function po(s){return typeof s!="string"?s:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:s}]},parent_tool_use_id:null}}()}function vs(){return{cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},cache_creation_input_tokens:0,cache_read_input_tokens:0,inference_geo:"",input_tokens:0,iterations:[],output_tokens:0,server_tool_use:{web_fetch_requests:0,web_search_requests:0},service_tier:"standard",speed:"standard"}}async function fo(s,e){e.aborted||await new Promise(t=>{let r=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(r),t()},{once:!0})})}function go(){let s,e;return{promise:new Promise((r,n)=>{s=r,e=n}),resolve:s,reject:e}}import{access as Po,chmod as Cs,cp as bo,mkdtemp as Ro,mkdir as As,realpath as To,rm as Es,writeFile as Eo}from"fs/promises";import{homedir as _o,tmpdir as Mo}from"os";import{dirname as Co,isAbsolute as xs,join as z,relative as Ao,resolve as it,sep as xo}from"path";import{homedir as mo}from"os";import{join as Ts}from"path";var ho=v.configDirName,yo=v.cliHomeEnv,So=v.configDirEnv,Rs=200;function wo(){return process.env[yo]||mo()}function vo(){let s=process.env[So];return s||Ts(wo(),ho)}function ne(){return Ts(vo(),"projects")}function ko(s){let e=5381;for(let t=0;t<s.length;t++)e=e*33^s.charCodeAt(t);return e}function T(s){let e=s.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Rs)return e;let t=Math.abs(ko(s)).toString(36);return`${e.slice(0,Rs)}-${t}`}var Io=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Do=6e4;async function Is(s){if(s.resume===void 0&&!s.continue)return;let e=T(await No(s.cwd)),t=s.loadTimeoutMs??Do,r=s.resume!==void 0?s.resume:await Ko(s.store,e,t);if(r===void 0||!Io.test(r))return;let n={projectKey:e,sessionId:r},o=await _s(s.store,n,t);if(!o)return;let i=s.store.listSubkeys?await at(s.store.listSubkeys(n),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let u of i){if(!qo(u)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(u)}`);continue}let l=await _s(s.store,{...n,subpath:u},t);l&&a.push({subpath:u,entries:l})}let c;try{c=await Ro(z(Mo(),"qoder-session-store-")),await Cs(c,448),await jo(Oo(s.env),c);let u=z(c,"projects",e),l=z(u,r);await As(u,{recursive:!0,mode:448}),await Ms(z(u,`${r}.jsonl`),o);for(let{subpath:d,entries:p}of a){let g=Fo(l,`${d}.jsonl`),S=p.filter(h=>h.type==="agent_metadata"),m=p.filter(h=>h.type!=="agent_metadata");if(m.length>0&&await Ms(g,m),S.length>0){let h={...S.at(-1)};delete h.type,await Ds(g.slice(0,-6)+".meta.json",JSON.stringify(h))}}let f=c;return{configDir:f,projectKey:e,sessionId:r,cleanup:async()=>{await Es(f,{recursive:!0,force:!0})}}}catch(u){throw c!==void 0&&await Es(c,{recursive:!0,force:!0}),u}}function Oo(s){let e=s?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??_o();return it(s?.[v.configDirEnv]??process.env[v.configDirEnv]??z(e,v.configDirName))}async function jo(s,e){for(let t of[".auth","oauth_creds.json"]){let r=z(s,t);try{await Po(r),await bo(r,z(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(n){if(n.code!=="ENOENT")throw n}}}async function No(s){let e=it(s??process.cwd());try{return await To(e)}catch{return e}}async function Ko(s,e,t){if(!s.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let r=await at(s.listSessions(e),t,"listSessions");if(!Array.isArray(r))throw new Error("SessionStore listSessions() must return an array");return r.slice().sort((n,o)=>o.mtime-n.mtime)[0]?.sessionId}async function _s(s,e,t){let r=await at(s.load({...e}),t,"load");if(!(r===null||r.length===0)){if(!Array.isArray(r))throw new Error("SessionStore load() must return an array or null");return r.map((n,o)=>Uo(n,o))}}function Uo(s,e){if(s===null||typeof s!="object"||typeof s.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(s);if(t===void 0)throw new Error("JSON serialization returned undefined");return JSON.parse(t)}catch(t){throw new Error(`SessionStore entry ${e} is not JSON-safe`,{cause:t})}}function qo(s){return!(typeof s!="string"||!s||s.includes("\0")||s.includes("\\")||xs(s)||/^[a-z]:/i.test(s)||s.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Fo(s,e){let t=it(s,e),r=Ao(s,t);if(r===""||r===".."||r.startsWith(`..${xo}`)||xs(r))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Ms(s,e){let t=e.map(r=>JSON.stringify(r)).join(`
16
- `);await Ds(s,t?`${t}
17
- `:"")}async function Ds(s,e){await As(Co(s),{recursive:!0,mode:448}),await Eo(s,e,{encoding:"utf8",mode:384}),await Cs(s,384)}async function at(s,e,t){let r;s.catch(()=>{});try{return await Promise.race([s,new Promise((n,o)=>{r=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{r!==void 0&&clearTimeout(r)}}var $o=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function Lo(s){let e=s.replace(/\\/g,"/").split("/").at(-1)??"";return $o.test(e)}function Os(s,e,t=process.env){let r=s.pathToQoderCLIExecutable;return r?Lo(r)?{transport:"worker",pathToQoderWorkerRuntime:r}:{transport:"process"}:s.executable!==void 0||s.executableArgs!==void 0||s.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:t.QODER_WORKER_RUNTIME_PATH?{transport:"worker",pathToQoderWorkerRuntime:t.QODER_WORKER_RUNTIME_PATH}:{transport:e}}var ct=class extends Error{code="auth_not_configured";constructor(){super("The auth option is required when calling query(); configure options.auth so the SDK can create an auth payload file before spawning qodercli."),this.name="AuthNotConfiguredError"}};function Qo(s){if(s.transport!==void 0){if(Kt(s.transport))return s.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let e=Os(s,He);return e.transport==="worker"?new Z({pathToQoderWorkerRuntime:e.pathToQoderWorkerRuntime}):Y.default}function zo(s){let{prompt:e,options:t={}}=s,r=Qo(t),n=new Me({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");let o=t.auth;if(o==null)throw new ct;if(t.sessionStore&&t.enableFileCheckpointing)throw new Error("sessionStore cannot be combined with enableFileCheckpointing because checkpoint blobs are not part of the SessionStore contract.");if(t.sessionStore&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${v.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(t.sessionStore&&!(r instanceof Y)&&!(r instanceof Z))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(t.sessionStore&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(t.sessionStore&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(t.sessionStore&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return ks(t),Ps({prompt:e,options:t,diagnostics:n});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,u=a?()=>{c||(c=!0,Promise.resolve(a()).catch(w=>{n.record("[query] onAuthExpired callback threw:",w)}))}:void 0,l=new Map,f=new Map,d=new Map,p={},g={},S={};if(t.mcpServers)for(let[w,A]of Object.entries(t.mcpServers)){let U=A.tools;if(Array.isArray(U)&&U.length>0&&(g[w]=U),A.type==="sdk"&&"instance"in A&&A.instance){let W=A.instance;if(l.set(w,W),U){let Se=Qe(w,U);Se&&(S[w]=Se)}let ht=new De(Se=>{Vt(w,Se,d)});f.set(w,ht),W.connect(ht).catch(()=>{})}else p[w]=A}let m=Object.keys(p).length>0,h=Object.keys(g).length>0,k=t.pathToQoderCLIExecutable,y=t.env,E=o?.type==="jobToken"?o.fetchJobToken:void 0,C=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,K={pathToQoderCLIExecutable:k,executable:t.executable,executableArgs:t.executableArgs,env:y,proxy:t.proxy,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:o,model:i?void 0:t.model,agent:t.agent,debug:t.debug,diagnostics:n,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:t.sessionStore!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,continue:t.continue,resume:t.resume,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let w=t.allowedTools??[];if(t.skills===void 0)return w.length>0?w:void 0;let A=t.skills==="all"?["Skill"]:t.skills.map(W=>`Skill(${W})`),U=new Set(w);return[...w,...A.filter(W=>!U.has(W))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:m?p:void 0,mcpToolPolicies:h?g:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:u},O=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new _e(async()=>{let w=await Is({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!w)return{transport:Te(r,{...K,continue:!1})};try{return{transport:Te(r,{...K,env:{...K.env??process.env,[v.configDirEnv]:w.configDir},continue:!1,resume:w.sessionId}),cleanup:w.cleanup}}catch(A){throw await w.cleanup(),A}}):Te(r,K);O.initialize().catch(()=>{});let ye=typeof e=="string",B=t.systemPrompt,gt,mt;if(typeof B=="string")gt=B;else if(typeof B=="object"&&B!==null&&B.type==="preset"){let w=B;if(w.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(w.preset)}`);mt=w.append}let lr={systemPrompt:gt,appendSystemPrompt:mt,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},$e=new Ie(O,ye,t.canUseTool,t.hooks,t.abortController,l,lr,t.onElicitation,n,u,t.controlRequestTimeoutMs,f,d,E,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",S,C);if(typeof e=="string"){let w={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};$e.streamInput(async function*(){yield w}())}else $e.streamInput(e);return $e}import{McpServer as Ho}from"@modelcontextprotocol/sdk/server/mcp.js";function Bo(s){if(!s.name||typeof s.name!="string"||s.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new Ho({name:s.name,version:s.version??"1.0.0"},{capabilities:{tools:s.tools&&s.tools.length>0?{}:void 0}}),t=[];if(s.tools&&s.tools.length>0)for(let r of s.tools){if(!r.name||typeof r.name!="string"||r.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${s.name}".`);if(!r.description||typeof r.description!="string")throw new Error(`[createSdkMcpServer] Tool "${r.name}" must have a non-empty description string.`);Le(s.name,{name:r.name,exposedName:r.exposedName,alwaysLoad:r.alwaysLoad}),(r.exposedName!==void 0||r.alwaysLoad!==void 0||r.permissionPolicy!==void 0)&&t.push({name:r.name,...r.exposedName!==void 0?{exposedName:r.exposedName}:{},...r.alwaysLoad!==void 0?{alwaysLoad:r.alwaysLoad}:{},...r.permissionPolicy!==void 0?{permission_policy:r.permissionPolicy}:{}});try{e.registerTool(r.name,{description:r.description,inputSchema:r.inputSchema,...r.annotations?{annotations:r.annotations}:{}},r.handler)}catch(n){throw n instanceof Error&&n.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${r.name}" in server "${s.name}". Each tool name must be unique within a server.`):n}}return{type:"sdk",name:s.name,instance:e,...t.length>0?{tools:t}:{}}}function Wo(s,e,t,r,n){return{name:s,description:e,inputSchema:t,handler:r,annotations:n?.annotations,...n?.exposedName!==void 0?{exposedName:n.exposedName}:{},...n?.alwaysLoad!==void 0?{alwaysLoad:n.alwaysLoad}:{},...n?.permissionPolicy!==void 0?{permissionPolicy:n.permissionPolicy}:{}}}import{readdir as dt,readFile as Ne,stat as oe,appendFile as zs,realpath as Jo,rm as js}from"fs/promises";import{basename as Go,join as b,resolve as Ns}from"path";import{execFile as Vo}from"child_process";import{randomUUID as Hs}from"crypto";import{promisify as Yo}from"util";var Xo=Yo(Vo),Zo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,ei=new Set(["user","assistant","system","progress","attachment"]);function M(s){return s!==null&&typeof s=="object"}function H(s){return Zo.test(s)}function Ks(s){let e=[];for(let t of s.split(`
18
- `)){let r=t.trim();if(r)try{let n=JSON.parse(r);M(n)&&typeof n.uuid=="string"&&typeof n.type=="string"&&ei.has(n.type)&&e.push(n)}catch{}}return e}function Us(s,e){let t;for(let r of s.split(`
19
- `)){let n=r.trim();if(n)try{let o=JSON.parse(n);if(!M(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;if(a!==null&&typeof a!="string")continue;t={leafUuid:a,sessionId:e}}catch{}}return t}function ut(s){if(!M(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}function pe(s){if(s.type!=="assistant"||!M(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function Bs(s){return s.type!=="user"||!s.parentUuid?!1:ut(s).some(e=>M(e)&&e.type==="tool_result")}function ti(s){if(!M(s.message))return null;let e=s.message.id;return typeof e=="string"&&e.length>0?e:null}function si(s,e){let t=new Map;for(let[r,n]of s){let o=ti(n);if(o){let i=t.get(o);i?i.push(r):t.set(o,[r])}}for(let[r,n]of s){let o=ri(n,n.parentUuid,s,t,e);o!==n.parentUuid&&s.set(r,{...n,parentUuid:o})}}function ri(s,e,t,r,n){if(!e||t.has(e))return e;let o=r.get(e);return!o||o.length===0?e:o.length===1?o[0]:ni(s,o,t)??oi(s,o,t,n)??e}function ni(s,e,t){if(!Bs(s))return;let r=ut(s).filter(o=>M(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(r.length===0)return;let n=e.filter(o=>{let i=t.get(o);return i?ut(i).some(a=>M(a)&&a.type==="tool_use"&&r.includes(typeof a.id=="string"?a.id:"")):!1});return n.length===1?n[0]:void 0}function oi(s,e,t,r){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(r.get(o.uuid)??-1)<(r.get(s.uuid)??-1)).at(-1)?.uuid}function ii(s){for(let e of s.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,r=t?.headUuid,n=t?.anchorUuid,o=t?.tailUuid;if(!r||!n||!o)continue;let i=s.get(r);i&&s.set(r,{...i,parentUuid:n});for(let[a,c]of s)a!==r&&c.parentUuid===n&&s.set(a,{...c,parentUuid:o})}}function qs(s,e,t){let r=(s.timestamp??"").localeCompare(e.timestamp??"");return r!==0?r:(t.get(s.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function ai(s,e,t){let r=e.filter(d=>d.type==="assistant");if(r.length===0)return e;let n=new Map,o=0;for(let d of s.keys())n.set(d,o++);let i=new Map;for(let d of r){let p=pe(d);p&&i.set(p,d)}let a=new Map,c=new Map;for(let d of s.values()){let p=pe(d);if(p){let g=a.get(p)??[];g.push(d),a.set(p,g);continue}if(Bs(d)&&d.parentUuid){let g=c.get(d.parentUuid)??[];g.push(d),c.set(d.parentUuid,g)}}let u=new Set,l=new Map;for(let d of r){let p=pe(d);if(!p||u.has(p))continue;u.add(p);let g=a.get(p)??[d],S=g.filter(P=>!t.has(P.uuid)),m=[];for(let P of g){let O=c.get(P.uuid)??[];for(let ye of O)t.has(ye.uuid)||m.push(ye)}if(S.length===0&&m.length===0)continue;let h=i.get(p);if(!h)continue;let k=[...g].sort((P,O)=>qs(P,O,n));m.sort((P,O)=>qs(P,O,n));let y=k.findIndex(P=>P.uuid===h.uuid),E=k.slice(0,Math.max(y,0)).filter(P=>!t.has(P.uuid)),C=k.slice(y+1).filter(P=>!t.has(P.uuid)),K=[...E,...C,...m];for(let P of K)t.add(P.uuid);l.set(h.uuid,K)}if(l.size===0)return e;let f=[];for(let d of e){let p=l.get(d.uuid);if(p){let g=n.get(d.uuid)??Number.MAX_SAFE_INTEGER,S=[],m=[];for(let h of p)(d.type==="assistant"&&h.type==="assistant"&&pe(h)===pe(d)&&(n.get(h.uuid)??Number.MAX_SAFE_INTEGER)<g?S:m).push(h);f.push(...S,d,...m)}else f.push(d)}return f}function Fs(s,e){if(s.length===0)return[];let t=new Map,r=new Map;for(let[c,u]of s.entries())t.set(u.uuid,u),r.set(u.uuid,c);ii(t),si(t,r);let n;if(e?.leafUuid===null)return[];if(e){let c=t.get(e.leafUuid),u=c?.sessionId??c?.session_id;c&&(u===void 0||u===e.sessionId)&&(n=c)}if(!n){let c=new Set;for(let p of t.values())p.parentUuid&&c.add(p.parentUuid);let u=Array.from(t.values()).filter(p=>!c.has(p.uuid)),l=[];for(let p of u){let g=p,S=new Set;for(;g&&!S.has(g.uuid);){if(S.add(g.uuid),g.type==="user"||g.type==="assistant"){l.push(g);break}g=g.parentUuid?t.get(g.parentUuid):void 0}}if(l.length===0)return[];let f=l.filter(p=>!p.isSidechain&&!p.teamName&&!p.isMeta);n=(f.length>0?f:l).reduce((p,g)=>(r.get(g.uuid)??-1)>(r.get(p.uuid)??-1)?g:p)}let o=[],i=new Set,a=n;for(;a&&!i.has(a.uuid);)i.add(a.uuid),o.push(a),a=a.parentUuid?t.get(a.parentUuid):void 0;return o.reverse(),ai(t,o,i)}function $s(s,e){let t=s.type==="user"||s.type==="assistant",r=e&&s.type==="system";return!(!t&&!r||s.isMeta||s.isSidechain||s.teamName)}function ci(s){if(!s)return;let e=s.preservedSegment,t={trigger:s.trigger,pre_tokens:s.preTokens??s.pre_tokens,post_tokens:s.postTokens??s.post_tokens,messages_summarized:s.messagesSummarized??s.messages_summarized,duration_ms:s.durationMs??s.duration_ms};return!e?.headUuid||!e.anchorUuid||!e.tailUuid?t:{...t,preserved_segment:{head_uuid:e.headUuid,anchor_uuid:e.anchorUuid,tail_uuid:e.tailUuid}}}function Ls(s){let e=s.type==="system"?ci(s.compactMetadata):void 0;return{type:s.type,uuid:s.uuid,session_id:s.sessionId??s.session_id??"",message:s.message,parent_tool_use_id:null,parent_agent_id:null,...typeof s.timestamp=="string"&&s.timestamp.length>0?{timestamp:s.timestamp}:{},...s.type==="system"&&s.subtype?{subtype:s.subtype}:{},...e?{compact_metadata:e}:{}}}function Qs(s,e){let t=Math.max(0,e?.offset??0),r=e?.limit;return r!==void 0&&r>0?s.slice(t,t+r):t>0?s.slice(t):s}async function Ke(s){try{return await Jo(Ns(s))}catch{return Ns(s)}}async function ui(s){return T(await Ke(s))}async function N(s){let e=ne();if(s?.dir){let t=await Ke(s.dir),r=[b(e,T(t))];if(s.includeWorktrees!==!1)try{let{stdout:n}=await Xo("git",["worktree","list","--porcelain"],{cwd:s.dir}),o=n.split(`
20
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)r.push(b(e,await ui(i)))}catch{}return r}try{return(await dt(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>b(e,r.name))}catch{return[]}}async function Ws(s){try{let[e,t]=await Promise.all([Ne(s,"utf-8"),oe(s)]),r=e.trim().split(`
21
- `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return M(i)?[i]:[]}catch{return[]}});if(r.length===0)return null;let n=Go(s,".jsonl");return lt(n,r,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function Js(s,e){return b(s,e,"subagents")}function Gs(s){if(typeof s!="object"||s===null)return!1;let e=s;return(e.type==="user"||e.type==="assistant")&&typeof e.uuid=="string"}async function Vs(s){let e=[];async function t(r){let n;try{n=await dt(r,{withFileTypes:!0})}catch{return}for(let o of n){let i=b(r,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(s),e}async function di(s){try{let e=await Ne(s.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function Ys(s){if(s.length===0)return[];let e=new Map(s.map(i=>[i.uuid,i])),t=s[s.length-1],r=[],n=new Set,o=t;for(;o&&!n.has(o.uuid);)n.add(o.uuid),r.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return r.reverse()}async function li(s,e,t){let[r,n]=await Promise.all([Ne(s,"utf-8"),di(s)]),o=[];for(let l of r.trim().split(`
22
- `).filter(Boolean))try{let f=JSON.parse(l);Gs(f)&&o.push(f)}catch{}let a=Ys(o).map(l=>({type:l.type,uuid:l.uuid,session_id:l.sessionId??e,message:l.message,parent_tool_use_id:n.parentToolUseId,parent_agent_id:n.parentAgentId})),c=t?.offset??0,u=t?.limit;return u!==void 0?a.slice(c,c+u):a.slice(c)}async function ie(s){return T(await Ke(s??process.cwd()))}function fe(s,e){return{projectKey:s,sessionId:e}}function pi(s){return s.map(e=>JSON.stringify(e)).join(`
23
- `)}function fi(s){let e=0;for(let t of s){if(typeof t.timestamp!="string")continue;let r=Date.parse(t.timestamp);Number.isFinite(r)&&(e=Math.max(e,r))}return e}function gi(s){let e=s.at(-1)?.timestamp;if(typeof e=="string"){let t=Date.parse(e);if(Number.isFinite(t))return t}return Date.now()}var mi=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function hi(s){let e=s;for(let t=0;t<10;t+=1){let r=e.normalize("NFKC").replace(mi,"");if(r===e)return r;e=r}return e}var yi=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,Si=/<command-name>(.*?)<\/command-name>/,wi=/<bash-input>([\s\S]*?)<\/bash-input>/;function vi(s){if(s.length<=200)return s;let e=s.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function ki(s,e){if(s.type!=="user"||s.isMeta===!0||s.isCompactSummary===!0)return;let t=s.message;if(!M(t))return;let r=t.content,n=[];if(typeof r=="string")n.push(r);else if(Array.isArray(r)){for(let o of r)if(M(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&n.push(o.text)}}for(let o of n){let i=o.replaceAll(`
24
- `," ").trim();if(!i)continue;let a=Si.exec(i);if(a){e.commandFallback??=a[1];continue}let c=wi.exec(i);if(c)return`! ${c[1].trim()}`;if(!yi.test(i))return vi(i)}}function lt(s,e,t,r={}){if(e.length===0)return;let n,o,i,a,c,u,l,f,d,p,g;for(let k of e){let y=k;if(g??=y.isSidechain===!0,p===void 0&&typeof y.timestamp=="string"){let E=Date.parse(y.timestamp);Number.isFinite(E)&&(p=E)}if(!n){let E={commandFallback:o};n=ki(y,E),o=E.commandFallback}y.type==="custom-title"&&typeof y.customTitle=="string"&&(i=y.customTitle),y.type==="ai-title"&&typeof y.aiTitle=="string"&&(a=y.aiTitle),typeof y.lastPrompt=="string"&&(c=y.lastPrompt),typeof y.summary=="string"&&(u=y.summary),y.type==="tag"&&(d=typeof y.tag=="string"&&y.tag?y.tag:void 0),typeof y.gitBranch=="string"&&(l=y.gitBranch),f===void 0&&typeof y.cwd=="string"&&(f=y.cwd),y.type==="relocated"&&typeof y.relocatedCwd=="string"&&(f=y.relocatedCwd)}if(g)return;let S=n??o,m=i||a,h=m||c||u||S;if(h)return{sessionId:s,summary:h,lastModified:t??fi(e),fileSize:r.fileSize,customTitle:m,firstPrompt:S,gitBranch:l,cwd:f||r.defaultCwd,tag:d,createdAt:p}}async function Xs(s,e,t){let r=fe(await ie(t),e),n=await s.load(r);return n?{key:r,entries:n}:void 0}async function Pi(s){if(s?.sessionStore){let u=s.sessionStore;if(!u.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let l=await Ke(s.dir??process.cwd()),f=T(l),d=(await u.listSessions(f)).slice().sort((m,h)=>h.mtime-m.mtime),p=Math.max(0,s.offset??0),g=s.limit!==void 0&&s.limit>0?d.slice(p,p+s.limit):p>0?d.slice(p):d;return(await Promise.allSettled(g.map(async({sessionId:m,mtime:h})=>{let k=await u.load(fe(f,m));return k?lt(m,k,h,{defaultCwd:l}):void 0}))).flatMap((m,h)=>{if(m.status==="fulfilled")return m.value?[m.value]:[];let k=g[h];return[{sessionId:k.sessionId,summary:"",lastModified:k.mtime}]})}let e=await N(s),r=(await Promise.all(e.map(async u=>{try{return(await dt(u)).filter(f=>f.endsWith(".jsonl")).map(f=>b(u,f))}catch{return[]}}))).flat(),n=await Promise.all(r.map(Ws)),o=new Map;for(let u of n){if(!u)continue;let l=o.get(u.sessionId);(!l||u.lastModified>l.lastModified)&&o.set(u.sessionId,u)}let i=Array.from(o.values()).sort((u,l)=>l.lastModified-u.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function bi(s,e){if(e?.sessionStore){if(!H(s))return;let r=await Xs(e.sessionStore,s,e.dir);return r?lt(s,r.entries,gi(r.entries)):void 0}let t=await N(e);for(let r of t){let n=b(r,`${s}.jsonl`),o=await Ws(n);if(o)return o}}async function Ri(s,e){if(!H(s))return[];let t=e?.includeSystemMessages===!0;if(e?.sessionStore){let n=await Xs(e.sessionStore,s,e.dir);if(!n)return[];let o=pi(n.entries),i=Fs(Ks(o),Us(o,s));return Qs(i.filter(a=>$s(a,t)).map(Ls),e)}let r=await N(e);for(let n of r){let o=b(n,`${s}.jsonl`);try{let i=await Ne(o,"utf-8"),c=Fs(Ks(i),Us(i,s)).filter(u=>$s(u,t)).map(Ls);return Qs(c,e)}catch{continue}}return[]}async function Ti(s,e,t){if(!H(s))throw new Error(`Invalid sessionId: ${s}`);let r=e.trim();if(!r)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(fe(await ie(t.dir),s),[{type:"custom-title",sessionId:s,customTitle:r,uuid:Hs(),timestamp:new Date().toISOString()}]);return}let n=await N(t);for(let o of n){let i=b(o,`${s}.jsonl`);try{await oe(i);let a=JSON.stringify({type:"custom-title",sessionId:s,customTitle:r,timestamp:new Date().toISOString()});await zs(i,a+`
25
- `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function Ei(s,e,t){if(!H(s))throw new Error(`Invalid sessionId: ${s}`);let r=e===null?null:hi(e).trim();if(r!==null&&!r)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(fe(await ie(t.dir),s),[{type:"tag",sessionId:s,tag:r??"",uuid:Hs(),timestamp:new Date().toISOString()}]);return}let n=await N(t);for(let o of n){let i=b(o,`${s}.jsonl`);try{await oe(i);let a=JSON.stringify({type:"tag",sessionId:s,tag:r??"",timestamp:new Date().toISOString()});await zs(i,a+`
26
- `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function _i(s,e){if(e?.sessionStore){if(!H(s))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let r=await e.sessionStore.listSubkeys({projectKey:await ie(e.dir),sessionId:s});return Array.from(new Set(r.map(n=>{if(!n.startsWith("subagents/"))return;let o=n.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(n=>n!==void 0)))}let t=await N(e);for(let r of t){let n=b(r,`${s}.jsonl`);try{await oe(n);let o=await Vs(Js(r,s));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function Mi(s,e,t){if(t?.sessionStore){if(!H(s)||!e)return[];let n=await ie(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let p=await t.sessionStore.listSubkeys({projectKey:n,sessionId:s}),g=`agent-${e}`,S=p.find(m=>m.startsWith("subagents/")&&m.split("/").at(-1)===g);if(!S)return[];o=S}let i=await t.sessionStore.load({projectKey:n,sessionId:s,subpath:o});if(!i)return[];let a=i.filter(Gs),c=i.filter(p=>p.type==="agent_metadata").at(-1),u=typeof c?.toolUseId=="string"?c.toolUseId:null,l=typeof c?.parentAgentId=="string"?c.parentAgentId:null,f=Ys(a).map(p=>({type:p.type,uuid:p.uuid,session_id:p.sessionId??s,message:p.message,parent_tool_use_id:u,parent_agent_id:l})),d=Math.max(0,t.offset??0);return t.limit!==void 0?f.slice(d,d+t.limit):f.slice(d)}let r=await N(t);for(let n of r){let o=b(n,`${s}.jsonl`);try{await oe(o);let a=(await Vs(Js(n,s))).find(c=>c.agentId===e);return a?await li(a.filePath,s,t):[]}catch{continue}}return[]}async function Ci(s,e){if(!H(s))throw new Error(`Invalid sessionId: ${s}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(fe(await ie(e.dir),s));return}let t=await N(e);for(let r of t){let n=b(r,`${s}.jsonl`);try{await oe(n),await Promise.all([js(n,{force:!0}),js(b(r,s),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${s} not found`)}import{randomUUID as Ue}from"crypto";import{readdir as Ai,readFile as xi,realpath as Ii,stat as Zs,writeFile as Di}from"fs/promises";import{dirname as Oi,join as pt,resolve as ji}from"path";var er=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ni=new Set(["user","assistant","attachment","system","progress"]);async function sr(s){let e=ji(s);try{return await Ii(e)}catch{return e}}async function Ki(s,e){let t=ne();if(e){let n=T(await sr(e)),o=pt(t,n,`${s}.jsonl`);try{if((await Zs(o)).size>0)return o}catch{}return}let r;try{r=await Ai(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=pt(t,n.name,`${s}.jsonl`);try{if((await Zs(o)).size>0)return o}catch{}}}function rr(s,e){let t=[],r=[],n;for(let o of s){if(o===null||typeof o!="object")continue;let i=o;if(typeof i.type=="string"&&Ni.has(i.type)&&typeof i.uuid=="string"){t.push(i);continue}if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){r.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(n=i.relocatedCwd)}return{transcript:t,contentReplacements:r,relocatedCwd:n}}function Ui(s,e){let t=[];for(let r of s.split(`
27
- `))if(r.trim())try{t.push(JSON.parse(r))}catch{}return rr(t,e)}function qi(s){for(let e of s){if(e===null||typeof e!="object")continue;let t=e;if(t.type!=="user"||t.isMeta===!0||t.isCompactSummary===!0)continue;let r=t.message;if(r===null||typeof r!="object")continue;let n=r.content;if(typeof n=="string"&&n.trim())return n.trim();if(!Array.isArray(n)||n.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=n.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
28
- `).trim();if(o)return o}}function Fi(s){let e,t;for(let r of s){if(r===null||typeof r!="object")continue;let n=r;typeof n.customTitle=="string"&&n.customTitle&&(e=n.customTitle),typeof n.aiTitle=="string"&&n.aiTitle&&(t=n.aiTitle)}return e??t??qi(s)}function tr(s,e,t,r){let n=s.transcript.filter(d=>d.isSidechain!==!0);if(n.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let d=n.findIndex(p=>p.uuid===t.upToMessageId);if(d<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);n=n.slice(0,d+1)}let o=new Map(n.map(d=>[d.uuid,Ue()])),i=n.filter(d=>d.type!=="progress");if(i.length===0)throw new Error(`Session ${e} has no messages to fork`);let a=new Map(n.map(d=>[d.uuid,d])),c=Ue(),u=new Date().toISOString(),l=i.map((d,p)=>{let g=null,S=typeof d.parentUuid=="string"?d.parentUuid:void 0;for(;S;){let k=a.get(S);if(!k)break;if(k.type!=="progress"){g=o.get(S)??null;break}S=typeof k.parentUuid=="string"?k.parentUuid:void 0}let m=typeof d.logicalParentUuid=="string"?o.get(d.logicalParentUuid)??null:d.logicalParentUuid??null,h={...d,...d.type==="system"&&d.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:o.get(d.uuid),parentUuid:g,logicalParentUuid:m,sessionId:c,timestamp:p===i.length-1?u:typeof d.timestamp=="string"?d.timestamp:u,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:d.uuid}};return delete h.teamName,delete h.agentName,delete h.sessionKind,delete h.slug,delete h.sourceToolAssistantUUID,h});s.contentReplacements.length>0&&l.push({type:"content-replacement",sessionId:c,replacements:s.contentReplacements,uuid:Ue(),timestamp:u}),s.relocatedCwd&&l.push({type:"relocated",sessionId:c,relocatedCwd:s.relocatedCwd});let f=t.title?.trim();return l.push({type:"custom-title",sessionId:c,customTitle:f||`${Fi(r)??"Forked session"} (fork)`,uuid:Ue(),timestamp:u}),{sessionId:c,entries:l}}async function $i(s,e={}){if(!er.test(s))throw new Error(`Invalid sessionId: ${s}`);if(e.upToMessageId&&!er.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await sr(e.dir??process.cwd()),a=T(i),c=await e.sessionStore.load({projectKey:a,sessionId:s});if(!c?.length)throw new Error(`Session ${s} not found`);let u=tr(rr(c,s),s,e,c);return await e.sessionStore.append({projectKey:a,sessionId:u.sessionId},u.entries),{sessionId:u.sessionId}}let t=await Ki(s,e.dir);if(!t)throw new Error(`Session ${s} not found`);let r=await xi(t,"utf8"),n=r.split(`
29
- `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=tr(Ui(r,s),s,e,n);return await Di(pt(Oi(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
7
+ ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};var re=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var j=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ge=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},me=class extends Error{cliProtocolVersion;sdkProtocolVersion;constructor(e,t){super(`Wire protocol major mismatch: CLI announced "${e}" but this SDK was built for "${t}". Upgrade either qodercli or @qoder-ai/qoder-agent-sdk so the major versions align.`),this.name="ProtocolVersionMismatchError",this.cliProtocolVersion=e,this.sdkProtocolVersion=t}},he=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var nt="1.2.0";function is(s,e,t,r){return new Promise((n,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(c){o(c);return}n({jsonrpc:"2.0"});return}let a=`${s}:${e.id}`;r.set(a,{resolve:n,reject:o}),t.onmessage?t.onmessage(e):(r.delete(a),o(new Error(`No message handler registered for MCP server "${s}"`)))})}function as(s,e,t){if("id"in e&&e.id!==null){let r=`${s}:${e.id}`,n=t.get(r);if(n)return n.resolve(e),t.delete(r),!0}return!1}function cs(s,e,t){let r=0,n=`${s}:`,o=Array.from(t.entries());for(let i of o){let[a,c]=i;a.startsWith(n)&&(c.reject(e),t.delete(a),r++)}return r}import{randomUUID as Ln}from"crypto";function ls(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var Qn=500,zn=1024*1024,Hn=6e4,Bn=[200,800],je=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=Wn(e.filePath),r=Jn(e.entries),n=ds(t),o=this.states.get(n);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(n,o)),o.entries.push(...r),o.bytes+=Gn(r),(this.options.flushMode==="eager"||o.entries.length>=Qn||o.bytes>=zn)&&this.drain(o)}async flush(){for(let e of this.states.values())this.drain(e);await Promise.all([...this.states.values()].map(e=>e.tail))}drain(e){if(e.entries.length===0)return;let t=e.entries;e.entries=[],e.bytes=0,e.tail=e.tail.then(async()=>{try{await Yn(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??Hn,retryDelaysMs:this.options.retryDelaysMs??Bn})}catch(r){this.options.diagnostics?.record(`[SessionStore] append failed for ${ds(e.key)}`,r),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:r instanceof Error?r.message:String(r),key:{...e.key},uuid:Ln(),session_id:e.key.sessionId})}})}};function Wn(s){let e=s.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),r=e.slice(t+1);if(t<0||r.length<2)throw new Error(`Invalid transcript mirror path: ${s}`);let n=r[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(r[1]);if(r.length===2&&o)return{projectKey:n,sessionId:us(o[1])};let i=us(r[1]),a=r.slice(2),c=a.at(-1);a[a.length-1]=c.endsWith(".jsonl")?c.slice(0,-6):c;let u=a.join("/");return Vn(u),{projectKey:n,sessionId:i,subpath:u}}function Jn(s){return s.map((e,t)=>{if(typeof e!="object"||e===null||typeof e.type!="string")throw new Error(`Transcript mirror entry ${t} is not a typed object`);return e})}function us(s){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s))throw new Error(`Invalid transcript session id: ${s}`);return s}function Vn(s){let e=s.split("/");if(!s||s.includes("\0")||/^[a-z]:/i.test(s)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${s}`)}function ds(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}function Gn(s){return s.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Yn(s,e,t,r){for(let n=0;;n++)try{await Xn(s.append({...e},structuredClone(t)),r.appendTimeoutMs);return}catch(o){if(o instanceof Ne)throw o;let i=r.retryDelaysMs[n];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function Xn(s,e){let t;s.catch(()=>{});try{await Promise.race([s,new Promise((r,n)=>{t=setTimeout(()=>n(new Ne(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Ne=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function ps(){return Math.random().toString(36).substring(2,15)}function fs(s,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:s,request:t}}function gs(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function ms(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function hs(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function ys(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function Ss(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function ne(s){if(typeof s!="object"||s===null)return;let e=s,t=e.subtype;if(typeof t=="string")return t;let r=e.type;return typeof r=="string"?r:void 0}function vs(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function ws(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function ks(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function bs(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function Ps(s){return typeof s=="object"&&s!==null&&s.type==="result"}var Ue=class s{static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,r,n,o,i,a,c,u,p,f,d,l,g,v,m,h,k="batched",S,E){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=r,this.hooks=n??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=d??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=S??{},this.initConfig=a??{},this.onElicitation=c,this.onAuthExpired=p,this.fetchJobToken=g,this.fetchServiceAccountToken=E,this.diagnostics=u,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=v,this.resolveModelTimeoutMs=m??500,this.inputStream=new re(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new je({store:h,flushMode:k,diagnostics:u,onMirrorError:A=>this.inputStream.enqueue(A)})),this.readLoopPromise=this.readMessages().catch(A=>{this.inputStream.error(A)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let A=this.abortController.signal;A.aborted?this.close().catch(()=>{}):A.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let r=e.replace(/\s+/g," ").trim();return r.length>200?`${r.slice(0,200)}...`:r}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let r=t.text;if(typeof r=="string")return this.normalizeLogPreview(r);let n=this.extractMessagePreview(t.content);if(n)return n;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let r=this.getRecord(e)?.type;return typeof r=="string"&&r?r:"unknown"}getMessageSubtype(e){let r=this.getRecord(e)?.subtype;return typeof r=="string"&&r?r:"none"}getMessageUuid(e){let r=this.getRecord(e)?.uuid;return typeof r=="string"&&r?r:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,n=this.getRecord(t)?.content,o=Array.isArray(n)?n.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(ls(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(n){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",n)}continue}if(hs(t)){this.handleControlResponse(t);continue}if(ys(t)){this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",n)});continue}if(Ss(t)){this.handleControlCancelRequest(t);continue}if(vs(t)||ws(t)||ks(t)||bs(t))continue;if(Ps(t)){await this.transcriptMirrorBatcher?.flush();let n=t;this.recordInboundSessionMessage(n),this.resultMessage=n,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(n),this.isSingleTurn&&this.transport.endInput();continue}let r=t;if(this.recordInboundSessionMessage(r),r.type==="system"&&r.subtype==="init")try{let n=r;this.validateProtocolHandshake(n),this.cliCapabilities=new Set(n.capabilities??[])}catch(n){throw this.inputStream.error(n),n}this.notifyAuthExpiredIfNeeded(r),this.inputStream.enqueue(r)}}catch(t){e=t}finally{await this.transcriptMirrorBatcher?.flush();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,r]of this.pendingRequests)r.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let r=e.type==="auth_status"&&!!e.error,n=e.type==="assistant"&&e.error==="authentication_failed";!r&&!n||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}async request(e,t){let r=ps(),n=fs(r,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=ne(n.request)??"unknown",a=Date.now();return new Promise((c,u)=>{let p=null,f=()=>{p&&(clearTimeout(p),p=null)};this.pendingRequests.set(r,{resolve:d=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(d)},reject:d=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=error duration_ms=${Date.now()-a}`,d),u(d)}}),o>0&&Number.isFinite(o)&&(p=setTimeout(()=>{if(this.pendingRequests.has(r)){this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${r} subtype=${i} timeout_ms=${o}`);try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:r})+`
8
+ `)}catch(d){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",d)}u(new Error(`Control request "${ne(n.request)??"unknown"}" timed out after ${o}ms`))}},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${r} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(n)+`
9
+ `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${r} subtype=${i}`)}catch(d){f(),this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${r} subtype=${i}`,d),u(d)}})}handleControlResponse(e){let t=e.response,r=t.request_id,n=this.pendingRequests.get(r);if(!n){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${r} status=${t.subtype}`);return}if(this.pendingRequests.delete(r),t.subtype==="success")n.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),n.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)ne(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",r)})}async handleControlRequest(e){let t=e.request_id,r=ne(e.request)??"unknown",n=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${r}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=gs(t,i);this.transport.write(JSON.stringify(a)+`
10
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${r} status=success duration_ms=${Date.now()-n}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:c}=ro(i),u=ms(t,a,c);this.transport.write(JSON.stringify(u)+`
11
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${r} status=error duration_ms=${Date.now()-n}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new j}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,r=nt;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${r}. Consider upgrading qodercli for the version handshake.`);return}let n=Rs(t),o=Rs(r);if(!n||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${r}"; skipping handshake.`);return}if(n.major!==o.major)throw new me(t,r);n.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${r}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new j;return new Promise((r,n)=>{let o=()=>{n(new j)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),r(i)},i=>{t.removeEventListener("abort",o),n(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let r=e.request,n=ne(r),o=r;switch(n){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,c=e.request_id,u=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!u?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:u.token}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let c=o.tool_use_id,u=o.permission_suggestions??o.suggestions,p=o.blocked_path,f=o.decision_reason,d=o.title,l=o.display_name,g=o.description,v=o.agent_id,m=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:u,blockedPath:p,decisionReason:f,title:d,displayName:l,description:g,toolUseID:c,agentID:v}),t);if(m.behavior==="deny"&&!m.message)throw new Error("Permission deny result must include a message.");return m.behavior==="allow"?{...m,updatedInput:m.updatedInput??a,toolUseID:c}:{...m,toolUseID:c}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"mcp_message":{let i=o.server_name,a=o.message,c=this.sdkMcpTransports.get(i);if(!c)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(is(i,a,c,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,c=Promise.resolve(this.resolveModel(i)),u,p=new Promise((l,g)=>{u=setTimeout(()=>{g(new ge(a))},a)}),f;try{f=await this.awaitAbortable(Promise.race([c,p]),t)}finally{clearTimeout(u)}let d={type:"get_model_policy",model:typeof f.model=="string"?f.model:f.model.model,parameters:f.parameters};if(typeof f.model!="string"){let{model:l,...g}=f.model;d.custom_model={...g,style:g.style??"openai"}}return d}default:throw new Error(`Unhandled control request subtype: ${n??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,initializeTimeoutMs:s.INITIALIZE_TIMEOUT_MS},t={};for(let[n,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let c=a.hooks.map(u=>{let p=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(p,u),p});c.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:c,timeout:a.timeout})}i.length>0&&(t[n]=i)}Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let r=await this.request(e,{timeoutMs:s.INITIALIZE_TIMEOUT_MS});if(r&&typeof r=="object"){let n=r;this.initResponse=n}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,r,n){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,r,{signal:n}),n)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let r of e){if(this.closed)break;t+=1,this.transport.write(JSON.stringify(r)+`
12
+ `),this.recordOutboundSessionMessage(r)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&this.transport.endInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(r=>typeof r=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(s.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(s.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new he(e)}async setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=so(e?.usage),r=to(e?.session);return!t&&!r?null:{...t??{},...r?{session:r}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let r={type:"rewind_files",user_message_id:e};t?.dryRun&&(r.dry_run=!0);let o=await this.request(r);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let n={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(n.dry_run=!0),await this.request(n)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=Dt(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let r=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),n=r?.requiresUserAction===!0,o=typeof r?.authUrl=="string"?r.authUrl:void 0;if(n&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return n?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){if(this.closed)return;this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,r]of this.sdkMcpTransports){try{await r.close()}catch(n){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,n)}cs(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function H(s){return typeof s=="object"&&s!==null}function ot(s){return typeof s=="number"&&Number.isFinite(s)}function it(s){return Object.keys(s).length>0}function D(s,e,t){let r=e[t];ot(r)&&(s[t]=r)}function oe(s,e,t){let r=e[t];typeof r=="string"&&(s[t]=r)}function Ke(s,e,t){let r=e[t];typeof r=="boolean"&&(s[t]=r)}function Ts(s){if(!H(s)||Array.isArray(s))return;let e={};return D(e,s,"total"),D(e,s,"used"),D(e,s,"remaining"),D(e,s,"percentage"),oe(e,s,"unit"),it(e)?e:void 0}function Zn(s){if(!H(s)||Array.isArray(s))return;let e=Ts(s)??{};return oe(e,s,"detailUrl"),it(e)?e:void 0}function eo(s){if(!H(s)||Array.isArray(s))return;let e={};return D(e,s,"used"),D(e,s,"cap"),D(e,s,"remaining"),D(e,s,"percentage"),Ke(e,s,"available"),oe(e,s,"unit"),it(e)?e:void 0}function to(s){if(!H(s)||Array.isArray(s))return;let e=s.total_credits,t=s.model_usage;if(!ot(e)||e<0||!H(t)||Array.isArray(t))return;let r={};for(let[n,o]of Object.entries(t)){if(!H(o)||Array.isArray(o))continue;let i=o.credits;ot(i)&&i>=0&&(r[n]={credits:i})}return{total_credits:e,model_usage:r}}function so(s){if(!H(s)||Array.isArray(s))return null;let e={};oe(e,s,"userId"),oe(e,s,"userType"),D(e,s,"totalUsagePercentage"),Ke(e,s,"isHighestTier"),D(e,s,"expiresAt"),oe(e,s,"upgradeUrl"),Ke(e,s,"isQuotaExceeded"),Ke(e,s,"isPlanQuotaProrated");let t=Ts(s.userQuota);t&&(e.userQuota=t);let r=Zn(s.addOnQuota);r&&(e.addOnQuota=r);let n=eo(s.orgResourcePackage);return n&&(e.orgResourcePackage=n),e}function ro(s){let e=s instanceof Error?s.message:String(s),t=typeof s=="object"&&s!==null?s.code:void 0,r=typeof t=="string"&&t.length>0?t:void 0,n=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(n){let o=r??n[1];return(!r||r===n[1])&&(e=n[2]||e),{error:e,code:o}}return r?{error:e,code:r}:{error:e}}function Rs(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var qe=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as Es}from"crypto";var no="QODER_CLOUD_AGENT_API_BASE",oo="https://api.qoder.com/api/v1/cloud",K={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},io=1024,_s=1*1024*1024,Cs=4*1024*1024,ao=8*1024,ct=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},Fe=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},ut=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},co=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Is(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(o=>s[o]!==void 0&&!co.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(s.auth?.type!=="accessToken")throw new Fe;let{agent:t,session:r}=s.experimentalCloudAgent;if(t&&ie(t)&&at(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(r&&ie(r)&&at(r))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(r&&ie(r)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let n=!!r&&ie(r);if(!n&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!n){if(!r||!at(r))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof r.create.environment_id!="string"||r.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function ie(s){return"id"in s&&s.id!==void 0}function at(s){return"create"in s&&s.create!==void 0}function Os(s){return new dt(s)}var dt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Ro();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=xs();latestModelUsage={};totalCostUsd=0;postedMessages=0;activeInputStreams=0;idleSeen=!1;resultEmitted=!1;constructor(e){if(!e.options.experimentalCloudAgent)throw new Error("options.experimentalCloudAgent is required for CloudAgentQuery.");this.experimentalCloudAgent=e.options.experimentalCloudAgent,this.diagnostics=e.diagnostics,this.onAuthExpired=e.options.onAuthExpired,this.accessToken=uo(e.options.auth,e.options.env),this.apiBase=lo(),this.inputStream=new re(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(r=>{this.sseConnected.reject(r),this.closed||this.inputStream.error(r)}),this.streamInput(bo(e.prompt)).catch(r=>{this.closed||this.inputStream.error(r)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let r=ko(t);this.beginPendingTurn();let n=await this.postSessionEvents([{type:K.userMessage,content:r}]);this.postedMessages+=1,this.activateTurn(n.find(o=>o.type===K.userMessage)?.turnId)}}finally{this.activeInputStreams=Math.max(0,this.activeInputStreams-1),this.finishIfIdle()}})().catch(t=>{this.closed||this.inputStream.error(t)})}async interrupt(){await this.sessionReadyPromise,await this.postSessionEvents([{type:K.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&ie(e))t=e.id;else{let r=await this.resolveAgentId(),n=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:r,...fo(n)}});t=Ms(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(ie(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:po(e.create)});return Ms(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let r=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==r&&(t=0),t+=1,await Po(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),r=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;r&&t.searchParams.set("after_id",r),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let n=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!n.ok)throw this.handleAuthFailure(n.status),await As(n);if(!n.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(n.body)}async readSseBody(e){let t=e.getReader(),r=new TextDecoder,n="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){n+=r.decode(),n.length>0&&this.consumeSseLine(n,o);break}n+=r.decode(a,{stream:!0});let c;for(;(c=n.indexOf(`
13
+ `))!==-1;){let u=n.slice(0,c);n=n.slice(c+1);let p=u.endsWith("\r")?u.slice(0,-1):u;if(this.consumeSseLine(p,o),this.closed)break}n.length>_s&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${_s} bytes; resetting buffer.`),n="",o.id=void 0,o.event=void 0,o.data.length=0,o.dataBytes=0)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}consumeSseLine(e,t){if(e===""){(t.event||t.data.length>0)&&this.handleSseEvent({id:t.id,event:t.event??"message",data:ho(t.data.join(`
14
+ `))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let r=e.indexOf(":"),n=r===-1?e:e.slice(0,r),o=r===-1?"":e.slice(r+1);switch(o.startsWith(" ")&&(o=o.slice(1)),n){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>Cs){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Cs} 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=_(e.data,"type")??e.event,r=_(e.data,"turn_id"),n={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Es(),session_id:this.sessionId??_(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(n),!this.isCurrentTurnEvent(r)){this.bufferPendingTurnEvent(e,t,r);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case K.agentMessage:{let r=So(ye(e.data,"content"));r&&this.assistantTextParts.push(r);return}case K.modelRequestEnd:this.captureUsage(e.data);return;case K.idle:this.idleSeen=!0,this.finishIfIdle();return;case K.error:this.emitErrorResult(e),this.finish();return;case K.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=xs(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let r of t)if(this.isCurrentTurnEvent(r.turnId)&&this.handleCurrentTurnEvent(r.event,r.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,r){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=io&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:r}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(_(e.data,"error")??_($e(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:Es(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,r=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return go(r)}captureUsage(e){let t=$e(e,"usage");if(!t)return;this.latestUsage=vo(this.latestUsage,t);let r=R(e,"total_cost_usd")??R(e,"cost_usd")??R(t,"total_cost_usd")??R(t,"cost_usd");r!==void 0&&(this.totalCostUsd+=r);let n=_(e,"model")??_(t,"model");if(n){let o=this.latestModelUsage[n]?.costUSD??0;this.latestModelUsage[n]=wo(this.latestUsage,o+(r??0))}}async requestJson(e,t){let r=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await As(r);if(r.status===204)return{};try{return await r.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function uo(s,e){if(s?.type!=="accessToken")throw new Fe;if(typeof s.accessToken=="string")return s.accessToken;let t=s.accessToken.envVar,r=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!r)throw new ct(t);return r}function lo(){return process.env[no]?.replace(/\/+$/,"")??oo}function po(s){return lt({name:s.name,model:s.model,system:s.system,description:s.description,tools:s.tools,mcp_servers:s.mcp_servers,skills:s.skills,metadata:s.metadata})}function fo(s){return lt({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>lt({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function lt(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function Ms(s,e){let t=_(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function go(s){let e=yo(s,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:_(t,"id"),turnId:_(t,"turn_id"),type:_(t,"type")}]):[]}async function As(s){let e=await mo(s,ao);return new ut(s.status,e||s.statusText||"unknown error")}async function mo(s,e){if(!s.body)try{return(await s.text()).slice(0,e)}catch{return""}let t=s.body.getReader(),r=new TextDecoder,n=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,n.push(r.decode(a,{stream:!0}))}n.push(r.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return n.join("").slice(0,e)}function ho(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function $e(s,e){let t=ye(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function yo(s,e){let t=ye(s,e);return Array.isArray(t)?t:void 0}function _(s,e){let t=ye(s,e);return typeof t=="string"?t:void 0}function R(s,e){let t=ye(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ye(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function So(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>Ds(t)?t.text:"").filter(Boolean).join("")||void 0}function vo(s,e){let t=$e(e,"cache_creation"),r=$e(e,"server_tool_use");return{...s,cache_creation:{ephemeral_1h_input_tokens:R(t,"ephemeral_1h_input_tokens")??s.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:R(t,"ephemeral_5m_input_tokens")??s.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:R(e,"cache_creation_input_tokens")??s.cache_creation_input_tokens,cache_read_input_tokens:R(e,"cache_read_input_tokens")??s.cache_read_input_tokens,input_tokens:R(e,"input_tokens")??s.input_tokens,output_tokens:R(e,"output_tokens")??s.output_tokens,server_tool_use:{web_fetch_requests:R(r,"web_fetch_requests")??s.server_tool_use.web_fetch_requests,web_search_requests:R(r,"web_search_requests")??s.server_tool_use.web_search_requests}}}function wo(s,e){return{inputTokens:s.input_tokens,outputTokens:s.output_tokens,cacheReadInputTokens:s.cache_read_input_tokens,cacheCreationInputTokens:s.cache_creation_input_tokens,webSearchRequests:s.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function ko(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Ds(t)?t.text:JSON.stringify(t)).join(`
15
+ `):JSON.stringify(e)}function Ds(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function bo(s){return typeof s!="string"?s:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:s}]},parent_tool_use_id:null}}()}function xs(){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 Po(s,e){e.aborted||await new Promise(t=>{let r=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(r),t()},{once:!0})})}function Ro(){let s,e;return{promise:new Promise((r,n)=>{s=r,e=n}),resolve:s,reject:e}}import{access as Io,chmod as Fs,cp as Oo,mkdtemp as Do,mkdir as $s,realpath as jo,rm as Ks,writeFile as No}from"fs/promises";import{homedir as Ko,tmpdir as Uo}from"os";import{dirname as qo,isAbsolute as Ls,join as B,relative as Fo,resolve as pt,sep as $o}from"path";import{homedir as To}from"os";import{join as Ns}from"path";var Eo=y.configDirName,_o=y.cliHomeEnv,Co=y.configDirEnv,js=200;function Mo(){return process.env[_o]||To()}function Ao(){let s=process.env[Co];return s||Ns(Mo(),Eo)}function ae(){return Ns(Ao(),"projects")}function xo(s){let e=5381;for(let t=0;t<s.length;t++)e=e*33^s.charCodeAt(t);return e}function T(s){let e=s.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=js)return e;let t=Math.abs(xo(s)).toString(36);return`${e.slice(0,js)}-${t}`}var Lo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Qo=6e4;async function Qs(s){if(s.resume===void 0&&!s.continue)return;let e=T(await Bo(s.cwd)),t=s.loadTimeoutMs??Qo,r=s.resume!==void 0?s.resume:await Wo(s.store,e,t);if(r===void 0||!Lo.test(r))return;let n={projectKey:e,sessionId:r},o=await Us(s.store,n,t);if(!o)return;let i=s.store.listSubkeys?await ft(s.store.listSubkeys(n),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let u of i){if(!Vo(u)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(u)}`);continue}let p=await Us(s.store,{...n,subpath:u},t);p&&a.push({subpath:u,entries:p})}let c;try{c=await Do(B(Uo(),"qoder-session-store-")),await Fs(c,448),await Ho(zo(s.env),c);let u=B(c,"projects",e),p=B(u,r);await $s(u,{recursive:!0,mode:448}),await qs(B(u,`${r}.jsonl`),o);for(let{subpath:d,entries:l}of a){let g=Go(p,`${d}.jsonl`),v=l.filter(h=>h.type==="agent_metadata"),m=l.filter(h=>h.type!=="agent_metadata");if(m.length>0&&await qs(g,m),v.length>0){let h={...v.at(-1)};delete h.type,await zs(g.slice(0,-6)+".meta.json",JSON.stringify(h))}}let f=c;return{configDir:f,projectKey:e,sessionId:r,cleanup:async()=>{await Ks(f,{recursive:!0,force:!0})}}}catch(u){throw c!==void 0&&await Ks(c,{recursive:!0,force:!0}),u}}function zo(s){let e=s?.[y.cliHomeEnv]??process.env[y.cliHomeEnv]??Ko();return pt(s?.[y.configDirEnv]??process.env[y.configDirEnv]??B(e,y.configDirName))}async function Ho(s,e){for(let t of[".auth","oauth_creds.json"]){let r=B(s,t);try{await Io(r),await Oo(r,B(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(n){if(n.code!=="ENOENT")throw n}}}async function Bo(s){let e=pt(s??process.cwd());try{return await jo(e)}catch{return e}}async function Wo(s,e,t){if(!s.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let r=await ft(s.listSessions(e),t,"listSessions");if(!Array.isArray(r))throw new Error("SessionStore listSessions() must return an array");return r.slice().sort((n,o)=>o.mtime-n.mtime)[0]?.sessionId}async function Us(s,e,t){let r=await ft(s.load({...e}),t,"load");if(!(r===null||r.length===0)){if(!Array.isArray(r))throw new Error("SessionStore load() must return an array or null");return r.map((n,o)=>Jo(n,o))}}function Jo(s,e){if(s===null||typeof s!="object"||typeof s.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(s);if(t===void 0)throw new Error("JSON serialization returned undefined");return JSON.parse(t)}catch(t){throw new Error(`SessionStore entry ${e} is not JSON-safe`,{cause:t})}}function Vo(s){return!(typeof s!="string"||!s||s.includes("\0")||s.includes("\\")||Ls(s)||/^[a-z]:/i.test(s)||s.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Go(s,e){let t=pt(s,e),r=Fo(s,t);if(r===""||r===".."||r.startsWith(`..${$o}`)||Ls(r))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function qs(s,e){let t=e.map(r=>JSON.stringify(r)).join(`
16
+ `);await zs(s,t?`${t}
17
+ `:"")}async function zs(s,e){await $s(qo(s),{recursive:!0,mode:448}),await No(s,e,{encoding:"utf8",mode:384}),await Fs(s,384)}async function ft(s,e,t){let r;s.catch(()=>{});try{return await Promise.race([s,new Promise((n,o)=>{r=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{r!==void 0&&clearTimeout(r)}}var Yo=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function Xo(s){let e=s.replace(/\\/g,"/").split("/").at(-1)??"";return Yo.test(e)}function Hs(s,e,t=process.env){let r=s.pathToQoderCLIExecutable;return r?Xo(r)?{transport:"worker",pathToQoderWorkerRuntime:r}:{transport:"process"}:s.executable!==void 0||s.executableArgs!==void 0||s.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:{transport:e}}var gt=class extends Error{code="auth_not_configured";constructor(){super("The auth option is required when calling query(); configure options.auth so the SDK can create an auth payload file before spawning qodercli."),this.name="AuthNotConfiguredError"}};function Zo(s){if(s.transport!==void 0){if(Vt(s.transport))return s.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let e=Hs(s,Ye);return e.transport==="worker"?new se({pathToQoderWorkerRuntime:e.pathToQoderWorkerRuntime}):ee.default}function mt(s){let{prompt:e,options:t={}}=s,r=Zo(t),n=new De({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");let o=t.auth;if(o==null)throw new gt;if(t.sessionStore&&t.enableFileCheckpointing)throw new Error("sessionStore cannot be combined with enableFileCheckpointing because checkpoint blobs are not part of the SessionStore contract.");if(t.sessionStore&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${y.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(t.sessionStore&&!(r instanceof ee)&&!(r instanceof se))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(t.sessionStore&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(t.sessionStore&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(t.sessionStore&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return Is(t),Os({prompt:e,options:t,diagnostics:n});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,u=a?()=>{c||(c=!0,Promise.resolve(a()).catch(w=>{n.record("[query] onAuthExpired callback threw:",w)}))}:void 0,p=new Map,f=new Map,d=new Map,l={},g={},v={};if(t.mcpServers)for(let[w,x]of Object.entries(t.mcpServers)){let $=x.tools;if(Array.isArray($)&&$.length>0&&(g[w]=$),x.type==="sdk"&&"instance"in x&&x.instance){let G=x.instance;if(p.set(w,G),$){let Pe=Ve(w,$);Pe&&(v[w]=Pe)}let Ct=new qe(Pe=>{as(w,Pe,d)});f.set(w,Ct),G.connect(Ct).catch(()=>{})}else l[w]=x}let m=Object.keys(l).length>0,h=Object.keys(g).length>0,k=t.pathToQoderCLIExecutable,S=t.env,E=o?.type==="jobToken"?o.fetchJobToken:void 0,A=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,F={pathToQoderCLIExecutable:k,executable:t.executable,executableArgs:t.executableArgs,env:S,proxy:t.proxy,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:o,model:i?void 0:t.model,agent:t.agent,debug:t.debug,diagnostics:n,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:t.sessionStore!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,continue:t.continue,resume:t.resume,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let w=t.allowedTools??[];if(t.skills===void 0)return w.length>0?w:void 0;let x=t.skills==="all"?["Skill"]:t.skills.map(G=>`Skill(${G})`),$=new Set(w);return[...w,...x.filter(G=>!$.has(G))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:m?l:void 0,mcpToolPolicies:h?g:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:u},N=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new Oe(async()=>{let w=await Qs({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!w)return{transport:Ae(r,{...F,continue:!1})};try{return{transport:Ae(r,{...F,env:{...F.env??process.env,[y.configDirEnv]:w.configDir},continue:!1,resume:w.sessionId}),cleanup:w.cleanup}}catch(x){throw await w.cleanup(),x}}):Ae(r,F);N.initialize().catch(()=>{});let be=typeof e=="string",V=t.systemPrompt,Et,_t;if(typeof V=="string")Et=V;else if(typeof V=="object"&&V!==null&&V.type==="preset"){let w=V;if(w.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(w.preset)}`);_t=w.append}let br={systemPrompt:Et,appendSystemPrompt:_t,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},We=new Ue(N,be,t.canUseTool,t.hooks,t.abortController,p,br,t.onElicitation,n,u,t.controlRequestTimeoutMs,f,d,E,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",v,A);if(typeof e=="string"){let w={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};We.streamInput(async function*(){yield w}())}else We.streamInput(e);return We}var ht=class{resolvePrompt;prompt=new Promise(e=>{this.resolvePrompt=e});settled=!1;activate(e){if(this.settled)throw new Error("WarmQuery can only be queried once");this.settled=!0,this.resolvePrompt(e)}discard(){this.settled||(this.settled=!0,this.resolvePrompt(void 0))}async*[Symbol.asyncIterator](){let e=await this.prompt;if(e!==void 0){if(typeof e=="string"){yield{type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};return}yield*e}}},yt=class{constructor(e,t){this.session=e;this.gate=t}used=!1;closed=!1;query(e){if(this.closed)throw new Error("WarmQuery is closed");if(this.used)throw new Error("WarmQuery can only be queried once");return this.used=!0,this.gate.activate(e),this.session}close(){this.closed||(this.closed=!0,this.gate.discard(),this.session.close())}async[Symbol.asyncDispose](){this.closed||(this.closed=!0,this.gate.discard()),await this.session.close()}};async function ei(s={}){let e=s.initializeTimeoutMs??6e4;if(!Number.isFinite(e)||e<=0)throw new TypeError("initializeTimeoutMs must be a positive finite number");if(s.options?.experimentalCloudAgent!==void 0)throw new Error("startup is not supported by the experimental Cloud Agent runtime");let t=new ht,r=mt({prompt:t,options:s.options}),n;try{return await Promise.race([r.initializationResult(),new Promise((o,i)=>{n=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new yt(r,t)}catch(o){throw t.discard(),await r.close(),o}finally{n!==void 0&&clearTimeout(n)}}import{readFile as ti}from"node:fs/promises";import si from"node:os";import C from"node:path";var ri=["user","project","local"],wt=new Set(["__proto__","constructor","prototype"]),ni=/^[\p{L}\p{N}\p{M}._ -]+$/u,oi=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,ii=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),ai=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),ci=new Set(["context.fileFiltering.customIgnoreFilePaths","tools.exclude","mcp.enabledProjectMcpServers","mcp.disabledProjectMcpServers","security.approvedExternalImportProjects","advanced.excludedEnvVars","extensions.disabled","extensions.workspacesWithMigrationNudge","plugins.enabled","plugins.disabled","skills.disabled","blockedMarketplaces","allowedHttpHookUrls"]);function W(s){if(s===null||typeof s!="object"||Array.isArray(s))return!1;let e=Object.getPrototypeOf(s);return e===Object.prototype||e===null}function ui(s){let e=s.charCodeAt(0)===65279?s.slice(1):s,t="",r=!1,n=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let c=e[a],u=e[a+1];if(o){c===`
18
+ `||c==="\r"?(o=!1,t+=c):t+=" ";continue}if(i){c==="*"&&u==="/"?(i=!1,t+=" ",a+=1):t+=c===`
19
+ `||c==="\r"?c:" ";continue}if(r){t+=c,n?n=!1:c==="\\"?n=!0:c==='"'&&(r=!1);continue}c==='"'?(r=!0,t+=c):c==="/"&&u==="/"?(o=!0,t+=" ",a+=1):c==="/"&&u==="*"?(i=!0,t+=" ",a+=1):t+=c}return t}function di(s,e){let t;try{t=JSON.parse(ui(s))}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`Unable to parse settings from ${e}: ${n}`)}if(!W(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return Le(t)}function ce(s){return Array.isArray(s)?s.map(ce):W(s)?Le(s):s}function Le(s){let e={};for(let[t,r]of Object.entries(s))wt.has(t)||r===void 0||(e[t]=ce(r));return e}function li(s){let e=s.join(".");if(ai.has(e)||s.length===2&&s[0]==="providers")return"shallow";if(ci.has(e))return"union";if(s.length===2&&s[0]==="hooks")return"concat"}function vt(s,e,t=[]){for(let[r,n]of Object.entries(e)){if(wt.has(r)||n===void 0)continue;let o=[...t,r],i=s[r],a=li(o);if(a==="shallow"&&i&&n){let c={};W(i)&&Object.assign(c,Le(i)),W(n)&&Object.assign(c,Le(n)),s[r]=c;continue}if(Array.isArray(i)){let c=Array.isArray(n)?n:[n];if(a==="concat"){s[r]=[...i.map(ce),...c.map(ce)];continue}if(a==="union"){s[r]=[...new Set([...i,...c])].map(ce);continue}}if(W(i)&&W(n))vt(i,n,o);else if(W(n)){let c={};vt(c,n,o),s[r]=c}else s[r]=ce(n)}}function pi(s){let e=s?.[y.configDirNameEnv];if(e===void 0||e==="")return{user:y.configDirName,project:y.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!ni.test(t)||oi.test(t))throw new Error(`${y.configDirNameEnv} must be a valid directory name`);if(ii.has(t.toLowerCase()))throw new Error(`${y.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function St(s,e){let t;try{t=await ti(e,"utf8")}catch(r){if(r.code==="ENOENT")return;throw r}return{source:s,path:C.resolve(e),settings:di(t,C.resolve(e))}}async function fi(s={}){let e=C.resolve(s.cwd??process.cwd()),t=process.env,r=pi(t),n=t[y.cliHomeEnv]??t.GEMINI_CLI_HOME,o=n?C.resolve(e,n):si.homedir(),i=t[y.configDirEnv]?C.resolve(e,t[y.configDirEnv]):C.join(o,r.user),a=C.join(e,r.project),c=new Set(s.settingSources??ri),u=C.resolve(o)===e,p=[];if(c.has("user")){let l=await St("user",C.join(i,"settings.json"));l&&p.push(l)}if(c.has("project")&&!u){let l=await St("project",C.join(a,"settings.json"));l&&p.push(l)}if(c.has("local")&&!u){let l=await St("local",C.join(a,"settings.local.json"));l&&p.push(l)}let f={},d={};for(let l of p){vt(f,l.settings);for(let g of Object.keys(l.settings))wt.has(g)||(d[g]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:f,provenance:d,sources:p}}import{McpServer as gi}from"@modelcontextprotocol/sdk/server/mcp.js";function mi(s){if(!s.name||typeof s.name!="string"||s.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new gi({name:s.name,version:s.version??"1.0.0"},{capabilities:{tools:s.tools&&s.tools.length>0?{}:void 0}}),t=[];if(s.tools&&s.tools.length>0)for(let r of s.tools){if(!r.name||typeof r.name!="string"||r.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${s.name}".`);if(!r.description||typeof r.description!="string")throw new Error(`[createSdkMcpServer] Tool "${r.name}" must have a non-empty description string.`);Je(s.name,{name:r.name,exposedName:r.exposedName,alwaysLoad:r.alwaysLoad}),(r.exposedName!==void 0||r.alwaysLoad!==void 0||r.permissionPolicy!==void 0)&&t.push({name:r.name,...r.exposedName!==void 0?{exposedName:r.exposedName}:{},...r.alwaysLoad!==void 0?{alwaysLoad:r.alwaysLoad}:{},...r.permissionPolicy!==void 0?{permission_policy:r.permissionPolicy}:{}});try{e.registerTool(r.name,{description:r.description,inputSchema:r.inputSchema,...r.annotations?{annotations:r.annotations}:{}},r.handler)}catch(n){throw n instanceof Error&&n.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${r.name}" in server "${s.name}". Each tool name must be unique within a server.`):n}}return{type:"sdk",name:s.name,instance:e,...t.length>0?{tools:t}:{}}}function hi(s,e,t,r,n){return{name:s,description:e,inputSchema:t,handler:r,annotations:n?.annotations,...n?.exposedName!==void 0?{exposedName:n.exposedName}:{},...n?.alwaysLoad!==void 0?{alwaysLoad:n.alwaysLoad}:{},...n?.permissionPolicy!==void 0?{permissionPolicy:n.permissionPolicy}:{}}}import{readdir as bt,readFile as Qe,stat as ue,appendFile as tr,realpath as yi,rm as Bs}from"fs/promises";import{basename as Si,join as P,resolve as Ws}from"path";import{execFile as vi}from"child_process";import{randomUUID as sr}from"crypto";import{promisify as wi}from"util";var ki=wi(vi),bi=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Pi=new Set(["user","assistant","system","progress","attachment"]);function M(s){return s!==null&&typeof s=="object"}function J(s){return bi.test(s)}function Js(s){let e=[];for(let t of s.split(`
20
+ `)){let r=t.trim();if(r)try{let n=JSON.parse(r);M(n)&&typeof n.uuid=="string"&&typeof n.type=="string"&&Pi.has(n.type)&&e.push(n)}catch{}}return e}function Vs(s,e){let t;for(let r of s.split(`
21
+ `)){let n=r.trim();if(n)try{let o=JSON.parse(n);if(!M(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;if(a!==null&&typeof a!="string")continue;t={leafUuid:a,sessionId:e}}catch{}}return t}function kt(s){if(!M(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}function Se(s){if(s.type!=="assistant"||!M(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function rr(s){return s.type!=="user"||!s.parentUuid?!1:kt(s).some(e=>M(e)&&e.type==="tool_result")}function Ri(s){if(!M(s.message))return null;let e=s.message.id;return typeof e=="string"&&e.length>0?e:null}function Ti(s,e){let t=new Map;for(let[r,n]of s){let o=Ri(n);if(o){let i=t.get(o);i?i.push(r):t.set(o,[r])}}for(let[r,n]of s){let o=Ei(n,n.parentUuid,s,t,e);o!==n.parentUuid&&s.set(r,{...n,parentUuid:o})}}function Ei(s,e,t,r,n){if(!e||t.has(e))return e;let o=r.get(e);return!o||o.length===0?e:o.length===1?o[0]:_i(s,o,t)??Ci(s,o,t,n)??e}function _i(s,e,t){if(!rr(s))return;let r=kt(s).filter(o=>M(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(r.length===0)return;let n=e.filter(o=>{let i=t.get(o);return i?kt(i).some(a=>M(a)&&a.type==="tool_use"&&r.includes(typeof a.id=="string"?a.id:"")):!1});return n.length===1?n[0]:void 0}function Ci(s,e,t,r){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(r.get(o.uuid)??-1)<(r.get(s.uuid)??-1)).at(-1)?.uuid}function Mi(s){for(let e of s.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,r=t?.headUuid,n=t?.anchorUuid,o=t?.tailUuid;if(!r||!n||!o)continue;let i=s.get(r);i&&s.set(r,{...i,parentUuid:n});for(let[a,c]of s)a!==r&&c.parentUuid===n&&s.set(a,{...c,parentUuid:o})}}function Gs(s,e,t){let r=(s.timestamp??"").localeCompare(e.timestamp??"");return r!==0?r:(t.get(s.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function Ai(s,e,t){let r=e.filter(d=>d.type==="assistant");if(r.length===0)return e;let n=new Map,o=0;for(let d of s.keys())n.set(d,o++);let i=new Map;for(let d of r){let l=Se(d);l&&i.set(l,d)}let a=new Map,c=new Map;for(let d of s.values()){let l=Se(d);if(l){let g=a.get(l)??[];g.push(d),a.set(l,g);continue}if(rr(d)&&d.parentUuid){let g=c.get(d.parentUuid)??[];g.push(d),c.set(d.parentUuid,g)}}let u=new Set,p=new Map;for(let d of r){let l=Se(d);if(!l||u.has(l))continue;u.add(l);let g=a.get(l)??[d],v=g.filter(b=>!t.has(b.uuid)),m=[];for(let b of g){let N=c.get(b.uuid)??[];for(let be of N)t.has(be.uuid)||m.push(be)}if(v.length===0&&m.length===0)continue;let h=i.get(l);if(!h)continue;let k=[...g].sort((b,N)=>Gs(b,N,n));m.sort((b,N)=>Gs(b,N,n));let S=k.findIndex(b=>b.uuid===h.uuid),E=k.slice(0,Math.max(S,0)).filter(b=>!t.has(b.uuid)),A=k.slice(S+1).filter(b=>!t.has(b.uuid)),F=[...E,...A,...m];for(let b of F)t.add(b.uuid);p.set(h.uuid,F)}if(p.size===0)return e;let f=[];for(let d of e){let l=p.get(d.uuid);if(l){let g=n.get(d.uuid)??Number.MAX_SAFE_INTEGER,v=[],m=[];for(let h of l)(d.type==="assistant"&&h.type==="assistant"&&Se(h)===Se(d)&&(n.get(h.uuid)??Number.MAX_SAFE_INTEGER)<g?v:m).push(h);f.push(...v,d,...m)}else f.push(d)}return f}function Ys(s,e){if(s.length===0)return[];let t=new Map,r=new Map;for(let[c,u]of s.entries())t.set(u.uuid,u),r.set(u.uuid,c);Mi(t),Ti(t,r);let n;if(e?.leafUuid===null)return[];if(e){let c=t.get(e.leafUuid),u=c?.sessionId??c?.session_id;c&&(u===void 0||u===e.sessionId)&&(n=c)}if(!n){let c=new Set;for(let l of t.values())l.parentUuid&&c.add(l.parentUuid);let u=Array.from(t.values()).filter(l=>!c.has(l.uuid)),p=[];for(let l of u){let g=l,v=new Set;for(;g&&!v.has(g.uuid);){if(v.add(g.uuid),g.type==="user"||g.type==="assistant"){p.push(g);break}g=g.parentUuid?t.get(g.parentUuid):void 0}}if(p.length===0)return[];let f=p.filter(l=>!l.isSidechain&&!l.teamName&&!l.isMeta);n=(f.length>0?f:p).reduce((l,g)=>(r.get(g.uuid)??-1)>(r.get(l.uuid)??-1)?g:l)}let o=[],i=new Set,a=n;for(;a&&!i.has(a.uuid);)i.add(a.uuid),o.push(a),a=a.parentUuid?t.get(a.parentUuid):void 0;return o.reverse(),Ai(t,o,i)}function Xs(s,e){let t=s.type==="user"||s.type==="assistant",r=e&&s.type==="system";return!(!t&&!r||s.isMeta||s.isSidechain||s.teamName)}function xi(s){if(!s)return;let e=s.preservedSegment,t={trigger:s.trigger,pre_tokens:s.preTokens??s.pre_tokens,post_tokens:s.postTokens??s.post_tokens,messages_summarized:s.messagesSummarized??s.messages_summarized,duration_ms:s.durationMs??s.duration_ms};return!e?.headUuid||!e.anchorUuid||!e.tailUuid?t:{...t,preserved_segment:{head_uuid:e.headUuid,anchor_uuid:e.anchorUuid,tail_uuid:e.tailUuid}}}function Zs(s){let e=s.type==="system"?xi(s.compactMetadata):void 0;return{type:s.type,uuid:s.uuid,session_id:s.sessionId??s.session_id??"",message:s.message,parent_tool_use_id:null,parent_agent_id:null,...typeof s.timestamp=="string"&&s.timestamp.length>0?{timestamp:s.timestamp}:{},...s.type==="system"&&s.subtype?{subtype:s.subtype}:{},...e?{compact_metadata:e}:{}}}function er(s,e){let t=Math.max(0,e?.offset??0),r=e?.limit;return r!==void 0&&r>0?s.slice(t,t+r):t>0?s.slice(t):s}async function ze(s){try{return await yi(Ws(s))}catch{return Ws(s)}}async function Ii(s){return T(await ze(s))}async function U(s){let e=ae();if(s?.dir){let t=await ze(s.dir),r=[P(e,T(t))];if(s.includeWorktrees!==!1)try{let{stdout:n}=await ki("git",["worktree","list","--porcelain"],{cwd:s.dir}),o=n.split(`
22
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)r.push(P(e,await Ii(i)))}catch{}return r}try{return(await bt(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>P(e,r.name))}catch{return[]}}async function nr(s){try{let[e,t]=await Promise.all([Qe(s,"utf-8"),ue(s)]),r=e.trim().split(`
23
+ `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return M(i)?[i]:[]}catch{return[]}});if(r.length===0)return null;let n=Si(s,".jsonl");return Pt(n,r,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function or(s,e){return P(s,e,"subagents")}function ir(s){if(typeof s!="object"||s===null)return!1;let e=s;return(e.type==="user"||e.type==="assistant")&&typeof e.uuid=="string"}async function ar(s){let e=[];async function t(r){let n;try{n=await bt(r,{withFileTypes:!0})}catch{return}for(let o of n){let i=P(r,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(s),e}async function Oi(s){try{let e=await Qe(s.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function cr(s){if(s.length===0)return[];let e=new Map(s.map(i=>[i.uuid,i])),t=s[s.length-1],r=[],n=new Set,o=t;for(;o&&!n.has(o.uuid);)n.add(o.uuid),r.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return r.reverse()}async function Di(s,e,t){let[r,n]=await Promise.all([Qe(s,"utf-8"),Oi(s)]),o=[];for(let p of r.trim().split(`
24
+ `).filter(Boolean))try{let f=JSON.parse(p);ir(f)&&o.push(f)}catch{}let a=cr(o).map(p=>({type:p.type,uuid:p.uuid,session_id:p.sessionId??e,message:p.message,parent_tool_use_id:n.parentToolUseId,parent_agent_id:n.parentAgentId})),c=t?.offset??0,u=t?.limit;return u!==void 0?a.slice(c,c+u):a.slice(c)}async function de(s){return T(await ze(s??process.cwd()))}function ve(s,e){return{projectKey:s,sessionId:e}}function ji(s){return s.map(e=>JSON.stringify(e)).join(`
25
+ `)}function Ni(s){let e=0;for(let t of s){if(typeof t.timestamp!="string")continue;let r=Date.parse(t.timestamp);Number.isFinite(r)&&(e=Math.max(e,r))}return e}function Ki(s){let e=s.at(-1)?.timestamp;if(typeof e=="string"){let t=Date.parse(e);if(Number.isFinite(t))return t}return Date.now()}var Ui=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function qi(s){let e=s;for(let t=0;t<10;t+=1){let r=e.normalize("NFKC").replace(Ui,"");if(r===e)return r;e=r}return e}var Fi=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,$i=/<command-name>(.*?)<\/command-name>/,Li=/<bash-input>([\s\S]*?)<\/bash-input>/;function Qi(s){if(s.length<=200)return s;let e=s.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function zi(s,e){if(s.type!=="user"||s.isMeta===!0||s.isCompactSummary===!0)return;let t=s.message;if(!M(t))return;let r=t.content,n=[];if(typeof r=="string")n.push(r);else if(Array.isArray(r)){for(let o of r)if(M(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&n.push(o.text)}}for(let o of n){let i=o.replaceAll(`
26
+ `," ").trim();if(!i)continue;let a=$i.exec(i);if(a){e.commandFallback??=a[1];continue}let c=Li.exec(i);if(c)return`! ${c[1].trim()}`;if(!Fi.test(i))return Qi(i)}}function Pt(s,e,t,r={}){if(e.length===0)return;let n,o,i,a,c,u,p,f,d,l,g;for(let k of e){let S=k;if(g??=S.isSidechain===!0,l===void 0&&typeof S.timestamp=="string"){let E=Date.parse(S.timestamp);Number.isFinite(E)&&(l=E)}if(!n){let E={commandFallback:o};n=zi(S,E),o=E.commandFallback}S.type==="custom-title"&&typeof S.customTitle=="string"&&(i=S.customTitle),S.type==="ai-title"&&typeof S.aiTitle=="string"&&(a=S.aiTitle),typeof S.lastPrompt=="string"&&(c=S.lastPrompt),typeof S.summary=="string"&&(u=S.summary),S.type==="tag"&&(d=typeof S.tag=="string"&&S.tag?S.tag:void 0),typeof S.gitBranch=="string"&&(p=S.gitBranch),f===void 0&&typeof S.cwd=="string"&&(f=S.cwd),S.type==="relocated"&&typeof S.relocatedCwd=="string"&&(f=S.relocatedCwd)}if(g)return;let v=n??o,m=i||a,h=m||c||u||v;if(h)return{sessionId:s,summary:h,lastModified:t??Ni(e),fileSize:r.fileSize,customTitle:m,firstPrompt:v,gitBranch:p,cwd:f||r.defaultCwd,tag:d,createdAt:l}}async function ur(s,e,t){let r=ve(await de(t),e),n=await s.load(r);return n?{key:r,entries:n}:void 0}async function Hi(s){if(s?.sessionStore){let u=s.sessionStore;if(!u.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let p=await ze(s.dir??process.cwd()),f=T(p),d=(await u.listSessions(f)).slice().sort((m,h)=>h.mtime-m.mtime),l=Math.max(0,s.offset??0),g=s.limit!==void 0&&s.limit>0?d.slice(l,l+s.limit):l>0?d.slice(l):d;return(await Promise.allSettled(g.map(async({sessionId:m,mtime:h})=>{let k=await u.load(ve(f,m));return k?Pt(m,k,h,{defaultCwd:p}):void 0}))).flatMap((m,h)=>{if(m.status==="fulfilled")return m.value?[m.value]:[];let k=g[h];return[{sessionId:k.sessionId,summary:"",lastModified:k.mtime}]})}let e=await U(s),r=(await Promise.all(e.map(async u=>{try{return(await bt(u)).filter(f=>f.endsWith(".jsonl")).map(f=>P(u,f))}catch{return[]}}))).flat(),n=await Promise.all(r.map(nr)),o=new Map;for(let u of n){if(!u)continue;let p=o.get(u.sessionId);(!p||u.lastModified>p.lastModified)&&o.set(u.sessionId,u)}let i=Array.from(o.values()).sort((u,p)=>p.lastModified-u.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function Bi(s,e){if(e?.sessionStore){if(!J(s))return;let r=await ur(e.sessionStore,s,e.dir);return r?Pt(s,r.entries,Ki(r.entries)):void 0}let t=await U(e);for(let r of t){let n=P(r,`${s}.jsonl`),o=await nr(n);if(o)return o}}async function Wi(s,e){if(!J(s))return[];let t=e?.includeSystemMessages===!0;if(e?.sessionStore){let n=await ur(e.sessionStore,s,e.dir);if(!n)return[];let o=ji(n.entries),i=Ys(Js(o),Vs(o,s));return er(i.filter(a=>Xs(a,t)).map(Zs),e)}let r=await U(e);for(let n of r){let o=P(n,`${s}.jsonl`);try{let i=await Qe(o,"utf-8"),c=Ys(Js(i),Vs(i,s)).filter(u=>Xs(u,t)).map(Zs);return er(c,e)}catch{continue}}return[]}async function Ji(s,e,t){if(!J(s))throw new Error(`Invalid sessionId: ${s}`);let r=e.trim();if(!r)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(ve(await de(t.dir),s),[{type:"custom-title",sessionId:s,customTitle:r,uuid:sr(),timestamp:new Date().toISOString()}]);return}let n=await U(t);for(let o of n){let i=P(o,`${s}.jsonl`);try{await ue(i);let a=JSON.stringify({type:"custom-title",sessionId:s,customTitle:r,timestamp:new Date().toISOString()});await tr(i,a+`
27
+ `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function Vi(s,e,t){if(!J(s))throw new Error(`Invalid sessionId: ${s}`);let r=e===null?null:qi(e).trim();if(r!==null&&!r)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(ve(await de(t.dir),s),[{type:"tag",sessionId:s,tag:r??"",uuid:sr(),timestamp:new Date().toISOString()}]);return}let n=await U(t);for(let o of n){let i=P(o,`${s}.jsonl`);try{await ue(i);let a=JSON.stringify({type:"tag",sessionId:s,tag:r??"",timestamp:new Date().toISOString()});await tr(i,a+`
28
+ `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function Gi(s,e){if(e?.sessionStore){if(!J(s))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let r=await e.sessionStore.listSubkeys({projectKey:await de(e.dir),sessionId:s});return Array.from(new Set(r.map(n=>{if(!n.startsWith("subagents/"))return;let o=n.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(n=>n!==void 0)))}let t=await U(e);for(let r of t){let n=P(r,`${s}.jsonl`);try{await ue(n);let o=await ar(or(r,s));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function Yi(s,e,t){if(t?.sessionStore){if(!J(s)||!e)return[];let n=await de(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:n,sessionId:s}),g=`agent-${e}`,v=l.find(m=>m.startsWith("subagents/")&&m.split("/").at(-1)===g);if(!v)return[];o=v}let i=await t.sessionStore.load({projectKey:n,sessionId:s,subpath:o});if(!i)return[];let a=i.filter(ir),c=i.filter(l=>l.type==="agent_metadata").at(-1),u=typeof c?.toolUseId=="string"?c.toolUseId:null,p=typeof c?.parentAgentId=="string"?c.parentAgentId:null,f=cr(a).map(l=>({type:l.type,uuid:l.uuid,session_id:l.sessionId??s,message:l.message,parent_tool_use_id:u,parent_agent_id:p})),d=Math.max(0,t.offset??0);return t.limit!==void 0?f.slice(d,d+t.limit):f.slice(d)}let r=await U(t);for(let n of r){let o=P(n,`${s}.jsonl`);try{await ue(o);let a=(await ar(or(n,s))).find(c=>c.agentId===e);return a?await Di(a.filePath,s,t):[]}catch{continue}}return[]}async function Xi(s,e){if(!J(s))throw new Error(`Invalid sessionId: ${s}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(ve(await de(e.dir),s));return}let t=await U(e);for(let r of t){let n=P(r,`${s}.jsonl`);try{await ue(n),await Promise.all([Bs(n,{force:!0}),Bs(P(r,s),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${s} not found`)}import{randomUUID as He}from"crypto";import{readdir as Zi,readFile as ea,realpath as ta,stat as dr,writeFile as sa}from"fs/promises";import{dirname as ra,join as Rt,resolve as na}from"path";var lr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,oa=new Set(["user","assistant","attachment","system","progress"]);async function fr(s){let e=na(s);try{return await ta(e)}catch{return e}}async function ia(s,e){let t=ae();if(e){let n=T(await fr(e)),o=Rt(t,n,`${s}.jsonl`);try{if((await dr(o)).size>0)return o}catch{}return}let r;try{r=await Zi(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=Rt(t,n.name,`${s}.jsonl`);try{if((await dr(o)).size>0)return o}catch{}}}function gr(s,e){let t=[],r=[],n;for(let o of s){if(o===null||typeof o!="object")continue;let i=o;if(typeof i.type=="string"&&oa.has(i.type)&&typeof i.uuid=="string"){t.push(i);continue}if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){r.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(n=i.relocatedCwd)}return{transcript:t,contentReplacements:r,relocatedCwd:n}}function aa(s,e){let t=[];for(let r of s.split(`
29
+ `))if(r.trim())try{t.push(JSON.parse(r))}catch{}return gr(t,e)}function ca(s){for(let e of s){if(e===null||typeof e!="object")continue;let t=e;if(t.type!=="user"||t.isMeta===!0||t.isCompactSummary===!0)continue;let r=t.message;if(r===null||typeof r!="object")continue;let n=r.content;if(typeof n=="string"&&n.trim())return n.trim();if(!Array.isArray(n)||n.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=n.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
30
+ `).trim();if(o)return o}}function ua(s){let e,t;for(let r of s){if(r===null||typeof r!="object")continue;let n=r;typeof n.customTitle=="string"&&n.customTitle&&(e=n.customTitle),typeof n.aiTitle=="string"&&n.aiTitle&&(t=n.aiTitle)}return e??t??ca(s)}function pr(s,e,t,r){let n=s.transcript.filter(d=>d.isSidechain!==!0);if(n.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let d=n.findIndex(l=>l.uuid===t.upToMessageId);if(d<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);n=n.slice(0,d+1)}let o=new Map(n.map(d=>[d.uuid,He()])),i=n.filter(d=>d.type!=="progress");if(i.length===0)throw new Error(`Session ${e} has no messages to fork`);let a=new Map(n.map(d=>[d.uuid,d])),c=He(),u=new Date().toISOString(),p=i.map((d,l)=>{let g=null,v=typeof d.parentUuid=="string"?d.parentUuid:void 0;for(;v;){let k=a.get(v);if(!k)break;if(k.type!=="progress"){g=o.get(v)??null;break}v=typeof k.parentUuid=="string"?k.parentUuid:void 0}let m=typeof d.logicalParentUuid=="string"?o.get(d.logicalParentUuid)??null:d.logicalParentUuid??null,h={...d,...d.type==="system"&&d.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:o.get(d.uuid),parentUuid:g,logicalParentUuid:m,sessionId:c,timestamp:l===i.length-1?u:typeof d.timestamp=="string"?d.timestamp:u,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:d.uuid}};return delete h.teamName,delete h.agentName,delete h.sessionKind,delete h.slug,delete h.sourceToolAssistantUUID,h});s.contentReplacements.length>0&&p.push({type:"content-replacement",sessionId:c,replacements:s.contentReplacements,uuid:He(),timestamp:u}),s.relocatedCwd&&p.push({type:"relocated",sessionId:c,relocatedCwd:s.relocatedCwd});let f=t.title?.trim();return p.push({type:"custom-title",sessionId:c,customTitle:f||`${ua(r)??"Forked session"} (fork)`,uuid:He(),timestamp:u}),{sessionId:c,entries:p}}async function da(s,e={}){if(!lr.test(s))throw new Error(`Invalid sessionId: ${s}`);if(e.upToMessageId&&!lr.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await fr(e.dir??process.cwd()),a=T(i),c=await e.sessionStore.load({projectKey:a,sessionId:s});if(!c?.length)throw new Error(`Session ${s} not found`);let u=pr(gr(c,s),s,e,c);return await e.sessionStore.append({projectKey:a,sessionId:u.sessionId},u.entries),{sessionId:u.sessionId}}let t=await ia(s,e.dir);if(!t)throw new Error(`Session ${s} not found`);let r=await ea(t,"utf8"),n=r.split(`
31
+ `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=pr(aa(r,s),s,e,n);return await sa(Rt(ra(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
30
32
  `)}
31
- `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function qe(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}var ft=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let r=qe(e),n=this.entries.get(r)??[];n.push(...t),this.entries.set(r,n),this.keys.set(r,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(r,o)}async load(e){let t=this.entries.get(qe(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[r,n]of this.keys)n.projectKey!==e||n.subpath!==void 0||t.push({sessionId:n.sessionId,mtime:this.modifiedAt.get(r)??0});return t.sort((r,n)=>n.mtime-r.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(qe(e));return}for(let[t,r]of this.keys)r.projectKey===e.projectKey&&r.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let r of this.keys.values())r.projectKey===e.projectKey&&r.sessionId===e.sessionId&&r.subpath!==void 0&&t.push(r.subpath);return t.sort()}getEntries(e){return[...this.entries.get(qe(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 Li}from"fs";import{readdir as ar,readFile as Qi,realpath as zi,stat as nr}from"fs/promises";import{basename as or,dirname as Hi,join as ge,relative as Bi,resolve as Wi,sep as Ji}from"path";import{createInterface as Gi}from"readline";var Vi=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Yi=500,Xi=1024*1024;async function Zi(s){let e=Wi(s);try{return await zi(e)}catch{return e}}async function ea(s,e){let t=ne();if(e){let n=T(await Zi(e)),o=ge(t,n,`${s}.jsonl`);try{if((await nr(o)).size>0)return{filePath:o,projectKey:n}}catch{}return}let r;try{r=await ar(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=ge(t,n.name,`${s}.jsonl`);try{if((await nr(o)).size>0)return{filePath:o,projectKey:n.name}}catch{}}}async function ta(s){let e=[];async function t(r){let n;try{n=await ar(r,{withFileTypes:!0})}catch{return}n.sort((o,i)=>o.name.localeCompare(i.name));for(let o of n){let i=ge(r,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(s),e}async function ir(s,e,t,r){let n=Gi({input:Li(s,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of n){if(!a.trim())continue;let c;try{c=JSON.parse(a)}catch(u){console.warn(`importSessionToStore: skipping unparseable line in ${s}: ${String(u)}`);continue}if(c===null||typeof c!="object"){console.warn(`importSessionToStore: skipping non-object line in ${s}`);continue}o.push(c),i+=Buffer.byteLength(a),(o.length>=r||i>=Xi)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function sa(s,e,t={}){if(!Vi.test(s))throw new Error(`Invalid sessionId: ${s}`);let r=await ea(s,t.dir);if(!r)throw new Error(`Session ${s} not found`);let n=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Yi;if(await ir(r.filePath,{projectKey:r.projectKey,sessionId:s},e,n),t.includeSubagents===!1)return;let o=r.filePath.replace(/\.jsonl$/,""),i=ge(o,"subagents");for(let a of await ta(i)){let u=Bi(o,a).split(Ji);u[u.length-1]=or(u[u.length-1],".jsonl");let l={projectKey:r.projectKey,sessionId:s,subpath:u.join("/")};await ir(a,l,e,n);let f=ge(Hi(a),`${or(a,".jsonl")}.meta.json`);try{let d=JSON.parse(await Qi(f,"utf8"));await e.append(l,[{type:"agent_metadata",...d}])}catch(d){if(typeof d=="object"&&d!==null&&"code"in d&&d.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${f}: ${String(d)}`)}}}import{spawn as ra}from"child_process";async function na(s){let e=s?.cliPath??me(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let r=await he(e,t,s?.env);return JSON.parse(r.stdout).map(o=>({id:o.id,name:o.name,source:o.source,path:o.installPath??o.path,version:o.version??"unknown",scope:o.scope,enabled:o.enabled,canDisable:o.canDisable,displayName:o.displayName,description:o.description,installedAt:o.installedAt,lastUpdated:o.lastUpdated,resources:o.resources}))}async function oa(s,e){let t=e?.cliPath??me(),r=await he(t,["plugins","enable",s,"--scope","user"],e?.env);r.exitCode!==0&&Fe(r)}async function ia(s,e){let t=e?.cliPath??me(),r=await he(t,["plugins","disable",s,"--scope","user"],e?.env);r.exitCode!==0&&Fe(r)}async function aa(s,e){let t=e?.cliPath??me(),r=await he(t,["plugins","install",s,"--scope","user","--json"],e?.env);r.exitCode!==0&&Fe(r);let n=JSON.parse(r.stdout);return{pluginId:n.pluginId,version:n.version??"local",path:n.path}}async function ca(s,e){let t=e?.cliPath??me(),r=["plugins","uninstall",s,"--scope","user","--json"];e?.keepData&&r.push("--keep-data");let n=await he(t,r,e?.env);n.exitCode!==0&&Fe(n);let o=JSON.parse(n.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}function me(){return G()}var cr=3e4;function he(s,e,t){return new Promise((r,n)=>{let o=ra(s,e,{env:{...process.env,...t},stdio:["ignore","pipe","pipe"]}),i="",a="",c=!1,u=setTimeout(()=>{c||(c=!0,o.kill("SIGTERM"),n(new Error(`qodercli subprocess timed out after ${cr}ms`)))},cr);o.stdout.on("data",l=>{i+=l.toString()}),o.stderr.on("data",l=>{a+=l.toString()}),o.on("error",l=>{c||(c=!0,clearTimeout(u),n(l))}),o.on("close",l=>{c||(c=!0,clearTimeout(u),r({stdout:i,stderr:a,exitCode:l??1}))})})}function Fe(s){let e="plugin_operation_failed",t=s.stderr||s.stdout;try{let n=JSON.parse(s.stdout);n.error&&n.code&&(e=n.code,t=n.message??t)}catch{}let r=new Error(t);throw r.code=e,r}import{execFile as ua}from"child_process";function da(){return G()}async function la(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??da(),r=e?.timeout??6e4,n=["feedback","-c",s.content,"--json"];if(e?.storageDir&&n.push("--storage-dir",e.storageDir),s.sessionId&&n.push("-s",s.sessionId),s.workdir&&n.push("--workdir",s.workdir),s.email&&n.push("--email",s.email),s.include)for(let o of s.include)n.push("--include",o);if(s.imagePaths)for(let o of s.imagePaths)n.push("--images",o);if(s.callerVersion&&n.push("--caller-version",s.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&n.push("--ide-type",o)}return new Promise(o=>{ua(t,n,{env:e?.env??process.env,timeout:r,maxBuffer:1024*1024},(i,a)=>{let c=a.trim();if(c)try{let u=JSON.parse(c);o({success:!!u.success,message:u.success?u.message||"Feedback submitted successfully":u.error||u.message||"Failed to submit feedback",requestId:u.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:c||"Feedback submitted successfully"})})})}var dr={};fr(dr,{filterEscalatingDefaultMode:()=>ur});var pa=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function ur(s){let e=s.effective.permissions?.defaultMode;if(!e||!pa.has(e))return s.effective;for(let t=s.sources.length-1;t>=0;t-=1){let r=s.sources[t];if(r.settings.permissions?.defaultMode!==void 0){if(r.source==="project"){let{defaultMode:n,...o}=s.effective.permissions??{};return{...s.effective,permissions:o}}return s.effective}}return s.effective}export{L as AbortError,ke as AuthAccessTokenEnvVarError,Pe as AuthServiceAccountEnvVarError,bt as DEFAULT_ACCESS_TOKEN_ENV_VAR,He as DEFAULT_RUNTIME_TRANSPORT,ve as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,mr as EXIT_REASONS,gr as HOOK_EVENTS,ft as InMemorySessionStore,ce as ModelPolicyTimeoutError,Y as ProcessTransport,ue as ProtocolVersionMismatchError,V as QoderCliProcessError,$ as QoderWorkerRuntimeError,de as UnsupportedCliCapabilityError,Xe as WIRE_PROTOCOL_VERSION,Z as WorkerTransport,kr as accessToken,Pr as accessTokenFromEnv,dr as coreTypes,Bo as createSdkMcpServer,Ci as deleteSession,ia as disablePlugin,oa as enablePlugin,ur as filterEscalatingDefaultMode,$i as forkSession,bi as getSessionInfo,Ri as getSessionMessages,Mi as getSubagentMessages,bn as hasResolvableQoderWorkerRuntime,sa as importSessionToStore,aa as installPlugin,Er as jobToken,na as listPlugins,Pi as listSessions,_i as listSubagents,br as qodercliAuth,zo as query,Ti as renameSession,Ye as resolveQoderWorkerRuntimePath,Rr as serviceAccount,Tr as serviceAccountFromEnv,la as submitFeedback,Ei as tagSession,Wo as tool,ca as uninstallPlugin};
33
+ `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Be(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}var Tt=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let r=Be(e),n=this.entries.get(r)??[];n.push(...t),this.entries.set(r,n),this.keys.set(r,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(r,o)}async load(e){let t=this.entries.get(Be(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[r,n]of this.keys)n.projectKey!==e||n.subpath!==void 0||t.push({sessionId:n.sessionId,mtime:this.modifiedAt.get(r)??0});return t.sort((r,n)=>n.mtime-r.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Be(e));return}for(let[t,r]of this.keys)r.projectKey===e.projectKey&&r.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let r of this.keys.values())r.projectKey===e.projectKey&&r.sessionId===e.sessionId&&r.subpath!==void 0&&t.push(r.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Be(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 la}from"fs";import{readdir as Sr,readFile as pa,realpath as fa,stat as mr}from"fs/promises";import{basename as hr,dirname as ga,join as we,relative as ma,resolve as ha,sep as ya}from"path";import{createInterface as Sa}from"readline";var va=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,wa=500,ka=1024*1024;async function ba(s){let e=ha(s);try{return await fa(e)}catch{return e}}async function Pa(s,e){let t=ae();if(e){let n=T(await ba(e)),o=we(t,n,`${s}.jsonl`);try{if((await mr(o)).size>0)return{filePath:o,projectKey:n}}catch{}return}let r;try{r=await Sr(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=we(t,n.name,`${s}.jsonl`);try{if((await mr(o)).size>0)return{filePath:o,projectKey:n.name}}catch{}}}async function Ra(s){let e=[];async function t(r){let n;try{n=await Sr(r,{withFileTypes:!0})}catch{return}n.sort((o,i)=>o.name.localeCompare(i.name));for(let o of n){let i=we(r,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(s),e}async function yr(s,e,t,r){let n=Sa({input:la(s,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of n){if(!a.trim())continue;let c;try{c=JSON.parse(a)}catch(u){console.warn(`importSessionToStore: skipping unparseable line in ${s}: ${String(u)}`);continue}if(c===null||typeof c!="object"){console.warn(`importSessionToStore: skipping non-object line in ${s}`);continue}o.push(c),i+=Buffer.byteLength(a),(o.length>=r||i>=ka)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function Ta(s,e,t={}){if(!va.test(s))throw new Error(`Invalid sessionId: ${s}`);let r=await Pa(s,t.dir);if(!r)throw new Error(`Session ${s} not found`);let n=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:wa;if(await yr(r.filePath,{projectKey:r.projectKey,sessionId:s},e,n),t.includeSubagents===!1)return;let o=r.filePath.replace(/\.jsonl$/,""),i=we(o,"subagents");for(let a of await Ra(i)){let u=ma(o,a).split(ya);u[u.length-1]=hr(u[u.length-1],".jsonl");let p={projectKey:r.projectKey,sessionId:s,subpath:u.join("/")};await yr(a,p,e,n);let f=we(ga(a),`${hr(a,".jsonl")}.meta.json`);try{let d=JSON.parse(await pa(f,"utf8"));await e.append(p,[{type:"agent_metadata",...d}])}catch(d){if(typeof d=="object"&&d!==null&&"code"in d&&d.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${f}: ${String(d)}`)}}}import{spawn as Ea}from"child_process";async function _a(s){let e=s?.cliPath??le(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let r=await pe(e,t,s?.env);return JSON.parse(r.stdout).map(o=>({id:o.id,name:o.name,source:o.source,path:o.installPath??o.path,version:o.version??"unknown",scope:o.scope,enabled:o.enabled,canDisable:o.canDisable,displayName:o.displayName,description:o.description,installedAt:o.installedAt,lastUpdated:o.lastUpdated,resources:o.resources}))}async function Ca(s,e){let t=e?.cliPath??le(),r=await pe(t,["plugins","enable",s,"--scope","user"],e?.env);r.exitCode!==0&&ke(r)}async function Ma(s,e){let t=e?.cliPath??le(),r=await pe(t,["plugins","disable",s,"--scope","user"],e?.env);r.exitCode!==0&&ke(r)}async function Aa(s,e){let t=e?.cliPath??le(),r=await pe(t,["plugins","install",s,"--scope","user","--json"],e?.env);r.exitCode!==0&&ke(r);let n=JSON.parse(r.stdout);return{pluginId:n.pluginId,version:n.version??"local",path:n.path}}async function xa(s,e){let t=e?.cliPath??le(),r=["plugins","uninstall",s,"--scope","user","--json"];e?.keepData&&r.push("--keep-data");let n=await pe(t,r,e?.env);n.exitCode!==0&&ke(n);let o=JSON.parse(n.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}async function Ia(s,e){let t=e?.cliPath??le(),r;try{r=await pe(t,["plugins","validate",s,"--json"],e?.env,e?.signal)}catch(o){if(e?.signal?.aborted||o instanceof Error&&o.name==="AbortError")throw new j("Plugin validation was aborted");let i=o instanceof Error?o.message:String(o);throw q("plugin_validation_failed",`Failed to run qodercli plugin validation: ${i}`)}let n;try{n=JSON.parse(r.stdout)}catch{let o=Oa(`${r.stderr}
34
+ ${r.stdout}`);throw q(o?"plugin_validation_unsupported":"plugin_validation_protocol_error",o?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(n&&typeof n=="object"&&"ok"in n&&n.schemaVersion!==1)throw q("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(n&&typeof n=="object"&&n.ok===!0&&n.report){let o=n.report;if(Da(o))return o;throw q("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(n&&typeof n=="object"&&n.ok===!1){let o=n.error;if(!o||typeof o!="object"||typeof o.code!="string"||typeof o.message!="string")throw q("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let i=o;throw q(i.code,i.message)}throw r.exitCode!==0&&ke(r),q("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function Oa(s){return/unknown option[^\n]*--json/i.test(s)||/unknown command[^\n]*validate/i.test(s)}function le(){return X()}var vr=3e4;function pe(s,e,t,r){return new Promise((n,o)=>{let i=Ea(s,e,{env:{...process.env,...t},stdio:["ignore","pipe","pipe"],signal:r}),a="",c="",u=!1,p=setTimeout(()=>{u||(u=!0,i.kill("SIGTERM"),o(new Error(`qodercli subprocess timed out after ${vr}ms`)))},vr);i.stdout.on("data",f=>{a+=f.toString()}),i.stderr.on("data",f=>{c+=f.toString()}),i.on("error",f=>{u||(u=!0,clearTimeout(p),o(f))}),i.on("close",f=>{u||(u=!0,clearTimeout(p),n({stdout:a,stderr:c,exitCode:f??1}))})})}function ke(s){let e="plugin_operation_failed",t=s.stderr||s.stdout;try{let r=JSON.parse(s.stdout);r.error&&r.code?(e=r.code,t=r.message??t):r.ok===!1&&r.error&&(e=r.error.code??e,t=r.error.message??t)}catch{}throw q(e,t)}function q(s,e){let t=new Error(e);return t.code=s,t}function Da(s){if(!s||typeof s!="object")return!1;let e=s;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(r=>r!==null&&typeof r=="object"&&(r.severity==="error"||r.severity==="warning")&&typeof r.code=="string"&&typeof r.message=="string"&&typeof r.phase=="string"&&t.has(r.phase)&&(r.location===void 0||r.location!==null&&typeof r.location=="object"&&typeof r.location.path=="string"))}import{execFile as ja}from"child_process";function Na(){return X()}async function Ka(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??Na(),r=e?.timeout??6e4,n=["feedback","-c",s.content,"--json"];if(e?.storageDir&&n.push("--storage-dir",e.storageDir),s.sessionId&&n.push("-s",s.sessionId),s.workdir&&n.push("--workdir",s.workdir),s.email&&n.push("--email",s.email),s.include)for(let o of s.include)n.push("--include",o);if(s.imagePaths)for(let o of s.imagePaths)n.push("--images",o);if(s.callerVersion&&n.push("--caller-version",s.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&n.push("--ide-type",o)}return new Promise(o=>{ja(t,n,{env:e?.env??process.env,timeout:r,maxBuffer:1024*1024},(i,a)=>{let c=a.trim();if(c)try{let u=JSON.parse(c);o({success:!!u.success,message:u.success?u.message||"Feedback submitted successfully":u.error||u.message||"Failed to submit feedback",requestId:u.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:c||"Feedback submitted successfully"})})})}var kr={};Rr(kr,{filterEscalatingDefaultMode:()=>wr});var Ua=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function wr(s){let e=s.effective.permissions?.defaultMode;if(!e||!Ua.has(e))return s.effective;for(let t=s.sources.length-1;t>=0;t-=1){let r=s.sources[t];if(r.settings.permissions?.defaultMode!==void 0){if(r.source==="project"){let{defaultMode:n,...o}=s.effective.permissions??{};return{...s.effective,permissions:o}}return s.effective}}return s.effective}export{j as AbortError,Ee as AuthAccessTokenEnvVarError,_e as AuthServiceAccountEnvVarError,jt as DEFAULT_ACCESS_TOKEN_ENV_VAR,Ye as DEFAULT_RUNTIME_TRANSPORT,Te as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,Er as EXIT_REASONS,Tr as HOOK_EVENTS,Tt as InMemorySessionStore,ge as ModelPolicyTimeoutError,ee as ProcessTransport,me as ProtocolVersionMismatchError,Z as QoderCliProcessError,z as QoderWorkerRuntimeError,he as UnsupportedCliCapabilityError,nt as WIRE_PROTOCOL_VERSION,se as WorkerTransport,Ir as accessToken,Or as accessTokenFromEnv,kr as coreTypes,mi as createSdkMcpServer,Xi as deleteSession,Ma as disablePlugin,Ca as enablePlugin,wr as filterEscalatingDefaultMode,da as forkSession,Bi as getSessionInfo,Wi as getSessionMessages,Yi as getSubagentMessages,On as hasResolvableQoderWorkerRuntime,Ta as importSessionToStore,Aa as installPlugin,Kr as jobToken,_a as listPlugins,Hi as listSessions,Gi as listSubagents,Dr as qodercliAuth,mt as query,Ji as renameSession,rt as resolveQoderWorkerRuntimePath,fi as resolveSettings,jr as serviceAccount,Nr as serviceAccountFromEnv,ei as startup,Ka as submitFeedback,Vi as tagSession,hi as tool,xa as uninstallPlugin,Ia as validatePlugin};
@@ -4,5 +4,7 @@
4
4
  * This is the main entry point for the Qoder Agent SDK query functionality.
5
5
  */
6
6
  export { query } from './query.js';
7
+ export { startup } from './startup.js';
8
+ export type { StartupParams, WarmQuery } from './startup.js';
7
9
  export { QueryRunner } from './query-runner.js';
8
10
  export { generateRequestId, createControlRequest, createControlResponse, createControlErrorResponse, isControlResponse, isControlRequest, isControlCancelRequest, isKeepAlive, isStreamlinedText, isStreamlinedToolUseSummary, isPostTurnSummary, isResultMessage, } from './control-protocol.js';
@@ -0,0 +1,11 @@
1
+ import type { Options, Query } from '../types/options.js';
2
+ import type { SDKUserMessage } from '../types/messages.js';
3
+ export interface WarmQuery extends AsyncDisposable {
4
+ query(prompt: string | AsyncIterable<SDKUserMessage>): Query;
5
+ close(): void;
6
+ }
7
+ export interface StartupParams {
8
+ options?: Options;
9
+ initializeTimeoutMs?: number;
10
+ }
11
+ export declare function startup(params?: StartupParams): Promise<WarmQuery>;
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "version": 1,
3
3
  "brand": "global",
4
- "sdkVersion": "1.0.20",
5
- "qoderCliVersion": "1.1.18",
4
+ "sdkVersion": "1.0.21",
5
+ "qoderCliVersion": "1.1.20",
6
6
  "defaultTransport": "worker",
7
7
  "workerRuntime": {
8
8
  "packaged": false,
9
9
  "delivery": "install",
10
10
  "source": "qodercli-worker-runtime",
11
- "url": "https://download.qoder.com/qodercli/releases/1.1.18/qodercli-worker-runtime-universal.tgz",
11
+ "url": "https://download.qoder.com/qodercli/releases/1.1.20/qodercli-worker-runtime-universal.tgz",
12
12
  "artifactName": "qodercli-worker-runtime-universal.tgz",
13
- "sdkVersion": "1.0.20",
14
- "qoderCliVersion": "1.1.18"
13
+ "sdkVersion": "1.0.21",
14
+ "qoderCliVersion": "1.1.20"
15
15
  }
16
16
  }
@@ -0,0 +1,2 @@
1
+ import type { ResolveSettingsOptions, ResolvedSettings } from '../types/settings.js';
2
+ export declare function resolveSettings(options?: ResolveSettingsOptions): Promise<ResolvedSettings>;
@@ -48,4 +48,56 @@ export type UninstallPluginResult = {
48
48
  pluginId: string;
49
49
  fullyRemoved: boolean;
50
50
  reverseDependents: string[];
51
+ };
52
+ export type PluginValidationSeverity = 'error' | 'warning';
53
+ export type PluginValidationPhase = 'target' | 'manifest' | 'component' | 'load-simulation' | 'installability';
54
+ export type PluginValidationPosition = {
55
+ line: number;
56
+ character: number;
57
+ };
58
+ export type PluginValidationLocation = {
59
+ path: string;
60
+ jsonPointer?: string;
61
+ range?: {
62
+ start: PluginValidationPosition;
63
+ end: PluginValidationPosition;
64
+ };
65
+ };
66
+ export type PluginValidationDiagnostic = {
67
+ severity: PluginValidationSeverity;
68
+ code: string;
69
+ message: string;
70
+ phase: PluginValidationPhase;
71
+ location?: PluginValidationLocation;
72
+ suggestion?: string;
73
+ };
74
+ export type PluginValidationReport = {
75
+ schemaVersion: 1;
76
+ validator: {
77
+ name: 'qodercli';
78
+ version: string;
79
+ };
80
+ valid: boolean;
81
+ target: {
82
+ inputPath: string;
83
+ resolvedPath: string;
84
+ manifestPath?: string;
85
+ };
86
+ plugin?: {
87
+ name: string;
88
+ version?: string;
89
+ displayName?: string;
90
+ };
91
+ diagnostics: PluginValidationDiagnostic[];
92
+ summary: {
93
+ errorCount: number;
94
+ warningCount: number;
95
+ componentCount: number;
96
+ };
97
+ resources?: PluginResources;
98
+ };
99
+ export type ValidatePluginOptions = {
100
+ cliPath?: string;
101
+ env?: Record<string, string>;
102
+ signal?: AbortSignal;
51
103
  };
@@ -1,4 +1,5 @@
1
1
  import type { PermissionMode } from './permissions.js';
2
+ import type { SettingSource } from './options.js';
2
3
  /**
3
4
  * Settings fields with a verified qodercli execution path.
4
5
  *
@@ -42,13 +43,25 @@ export interface Settings {
42
43
  }>;
43
44
  [k: string]: unknown;
44
45
  }
46
+ export type ResolvedSettingSource = SettingSource;
45
47
  export type ResolvedSettingsSource = {
46
- source: 'user' | 'project' | 'local' | 'managed' | 'flag' | string;
48
+ source: ResolvedSettingSource;
47
49
  settings: Settings;
48
50
  path?: string;
49
51
  };
52
+ export type SettingsProvenanceEntry = {
53
+ source: ResolvedSettingSource;
54
+ path?: string;
55
+ };
56
+ export type ResolveSettingsOptions = {
57
+ /** Directory used to resolve project and local settings. */
58
+ cwd?: string;
59
+ /** Filesystem settings sources to load. Omit for all sources; pass [] for none. */
60
+ settingSources?: SettingSource[];
61
+ };
50
62
  export type ResolvedSettings = {
51
63
  effective: Settings;
64
+ provenance: Record<string, SettingsProvenanceEntry>;
52
65
  sources: ResolvedSettingsSource[];
53
66
  };
54
67
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qoder-ai/qoder-agent-sdk",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
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.18",
53
+ "qoderCliVersion": "1.1.20",
54
54
  "qoderSdkBrand": "global",
55
55
  "license": "SEE LICENSE IN LICENSE"
56
56
  }
@@ -143,6 +143,7 @@ function normalizePlatformOverride(value) {
143
143
  'linux-x64',
144
144
  'linux-x64-baseline',
145
145
  'linux-x64-musl',
146
+ 'openharmony-arm64',
146
147
  'windows-arm64',
147
148
  'windows-x64',
148
149
  ]);
@@ -182,6 +183,15 @@ function getPlatformTarget() {
182
183
  }
183
184
  }
184
185
 
186
+ // HarmonyOS reports process.platform === 'openharmony'. Only aarch64 is
187
+ // produced; the artifact is qodercli-openharmony-arm64.tar.gz.
188
+ if (process.platform === 'openharmony') {
189
+ if (process.arch !== 'arm64') {
190
+ throw new Error(`Unsupported OpenHarmony architecture: ${process.arch}`);
191
+ }
192
+ return 'openharmony-arm64';
193
+ }
194
+
185
195
  throw new Error(`Unsupported platform: ${process.platform}/${process.arch}`);
186
196
  }
187
197