@qoder-ai/qoder-agent-sdk 1.0.16 → 1.0.17

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
@@ -95,52 +95,59 @@ single call needs to override the package default.
95
95
 
96
96
  Every SDK query needs an explicit authentication option.
97
97
 
98
- To reuse the local `qodercli` login state:
98
+ | Authentication method | Identity | Use case |
99
+ | --- | --- | --- |
100
+ | Personal Access Token (PAT) | A Qoder user | Automation that needs the user's permissions and data |
101
+ | Service Account | An organization workload | Services and jobs that should not depend on a personal account |
102
+ | Local `qodercli` session | The signed-in user | Interactive development on a workstation |
103
+
104
+ For a PAT, generate a token at
105
+ [qoder.com/account/integrations](https://qoder.com/account/integrations), store
106
+ it in a secret manager, and expose it through the default environment variable:
107
+
108
+ ```bash
109
+ export QODER_PERSONAL_ACCESS_TOKEN=your-token
110
+ ```
99
111
 
100
112
  ```ts
101
- import { qodercliAuth, query } from "@qoder-ai/qoder-agent-sdk";
113
+ import { accessTokenFromEnv, query } from "@qoder-ai/qoder-agent-sdk";
102
114
 
103
115
  const q = query({
104
116
  prompt: "Summarize this repository.",
105
117
  options: {
106
- auth: qodercliAuth(),
118
+ auth: accessTokenFromEnv(),
107
119
  cwd: process.cwd(),
108
120
  },
109
121
  });
110
122
  ```
111
123
 
112
- To authenticate with a personal access token:
113
-
114
- Generate a Personal Access Token at
115
- [qoder.com/account/integrations](https://qoder.com/account/integrations):
116
-
117
- 1. Sign in to your Qoder account.
118
- 2. Open the integrations page.
119
- 3. Create a new PAT, choosing the expiry and scopes you need.
120
- 4. Copy the token immediately. The value cannot be retrieved again after the
121
- page is closed.
122
-
123
- Use separate tokens for local scripts, CI, and production services when
124
- possible, so each environment can be revoked independently. Do not hard-code
125
- tokens in source code.
126
-
127
- ```bash
128
- export QODER_PERSONAL_ACCESS_TOKEN=your-token
129
- ```
124
+ For a Service Account, read the key from your secret manager and pass it
125
+ directly to the SDK:
130
126
 
131
127
  ```ts
132
- import { accessTokenFromEnv, query } from "@qoder-ai/qoder-agent-sdk";
128
+ import { query, serviceAccount } from "@qoder-ai/qoder-agent-sdk";
129
+
130
+ // Get the Service Account key from the host's secret manager adapter.
131
+ const serviceAccountKey = await readSecret("qoder-service-account-key");
133
132
 
134
133
  const q = query({
135
134
  prompt: "Summarize this repository.",
136
135
  options: {
137
- auth: accessTokenFromEnv(),
136
+ auth: serviceAccount({ serviceAccountKey }),
138
137
  cwd: process.cwd(),
139
138
  },
140
139
  });
141
140
  ```
142
141
 
143
- `accessTokenFromEnv()` reads `QODER_PERSONAL_ACCESS_TOKEN` by default.
142
+ The SDK and CLI obtain and refresh short-lived Service Account tokens for this
143
+ authentication method. A host can retain the Service Account key and use
144
+ `serviceAccount({ fetchServiceAccountToken })` to obtain and refresh
145
+ short-lived SATs for qodercli. See the
146
+ [host callback example](examples/service-account-token-demo/demo.mjs) for a
147
+ complete Token exchange and query. To reuse a signed-in developer
148
+ workstation, use `qodercliAuth()`. See the
149
+ [SDK authentication guide](docs/public/en/cli/sdk/authentication.mdx) for
150
+ complete setup instructions and security guidance.
144
151
 
145
152
  ## Quick Start
146
153
 
package/dist/auth.d.ts CHANGED
@@ -1,6 +1,9 @@
1
- import type { AuthOptions, FetchJobToken, JobTokenAuthOptions } from './types/auth.js';
1
+ import type { AuthOptions, FetchJobToken, JobTokenAuthOptions, ServiceAccountAuthOptions, ServiceAccountCredentials } from './types/auth.js';
2
2
  export declare const DEFAULT_ACCESS_TOKEN_ENV_VAR = "QODER_PERSONAL_ACCESS_TOKEN";
3
+ export declare const DEFAULT_SERVICE_ACCOUNT_ENV_VAR = "QODER_SERVICE_ACCOUNT_KEY";
3
4
  export declare function accessToken(token: string): AuthOptions;
4
5
  export declare function accessTokenFromEnv(envVar?: string): AuthOptions;
5
6
  export declare function qodercliAuth(): AuthOptions;
7
+ export declare function serviceAccount(credentials: ServiceAccountCredentials): ServiceAccountAuthOptions;
8
+ export declare function serviceAccountFromEnv(envVar?: string): ServiceAccountAuthOptions;
6
9
  export declare function jobToken(fetchJobToken: FetchJobToken): JobTokenAuthOptions;
@@ -33,6 +33,11 @@ export declare const SDK_VERSION = "1.0.16";
33
33
  * to resolve them via the `canUseTool` callback.
34
34
  */
35
35
  export declare const PERMISSION_PROMPT_TOOL_STDIO = "stdio";
36
+ /**
37
+ * Exit code the Qoder CLI emits for `FATAL_AUTHENTICATION_ERROR`.
38
+ * See qodercli-next packages/core/src/utils/exitCodes.ts.
39
+ */
40
+ export declare const CLI_EXIT_CODE_AUTH_ERROR = 41;
36
41
  /**
37
42
  * Built-in qodercli tools exposed by SDK sessions when callers do not pass
38
43
  * `options.tools`.
@@ -9,6 +9,10 @@ export declare class AuthAccessTokenEnvVarError extends Error {
9
9
  readonly code: "auth_access_token_env_var_not_configured";
10
10
  constructor(envVar: string);
11
11
  }
12
+ export declare class AuthServiceAccountEnvVarError extends Error {
13
+ readonly code: "auth_service_account_env_var_not_configured";
14
+ constructor(envVar: string);
15
+ }
12
16
  type ToolsOption = string[] | {
13
17
  type: 'preset';
14
18
  preset: 'qodercli';
@@ -68,6 +72,7 @@ export declare class RuntimeLaunchOptionsBuilder {
68
72
  cleanupGeneratedSettings(): void;
69
73
  cleanupAuthPayload(): Promise<void>;
70
74
  buildEnv(): Record<string, string>;
75
+ private serviceAccountCredentialEnvVars;
71
76
  buildArgs(): string[];
72
77
  private buildSettingsArg;
73
78
  private applyFileCheckpointingSetting;
@@ -82,6 +87,7 @@ export declare class RuntimeLaunchOptionsBuilder {
82
87
  private writeGeneratedSettingsFile;
83
88
  private createAuthPayloadFile;
84
89
  private buildAuthPayload;
90
+ private resolveServiceAccountKey;
85
91
  private resolveAccessToken;
86
92
  }
87
93
  export {};
package/dist/index.d.ts CHANGED
@@ -55,7 +55,7 @@ export { query } from './query/query.js';
55
55
  export { DEFAULT_RUNTIME_TRANSPORT, } from './core/default-runtime.js';
56
56
  export { ProcessTransport, QoderCliProcessError, } from './core/process-transport.js';
57
57
  export { hasResolvableQoderWorkerRuntime, QoderWorkerRuntimeError, WorkerTransport, resolveQoderWorkerRuntimePath, } from './core/worker-transport.js';
58
- export { DEFAULT_ACCESS_TOKEN_ENV_VAR, accessToken, accessTokenFromEnv, jobToken, qodercliAuth, } from './auth.js';
58
+ export { DEFAULT_ACCESS_TOKEN_ENV_VAR, DEFAULT_SERVICE_ACCOUNT_ENV_VAR, accessToken, accessTokenFromEnv, jobToken, qodercliAuth, serviceAccount, serviceAccountFromEnv, } from './auth.js';
59
59
  export { createSdkMcpServer, tool } from './mcp/sdk-mcp-server.js';
60
60
  export type { AnyZodRawShape, InferShape, SdkMcpToolDefinition, ToolExtras, CreateSdkMcpServerOptions, } from './mcp/sdk-mcp-server.js';
61
61
  export type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
@@ -71,17 +71,18 @@ export type { PluginDetails, PluginResources, InstallPluginResult, UninstallPlug
71
71
  export { submitFeedback } from './feedback.js';
72
72
  export type { SubmitFeedbackParams, SubmitFeedbackOptions, IntegrationMode, } from './feedback.js';
73
73
  export { AbortError, ModelPolicyTimeoutError, ProtocolVersionMismatchError, } from './core/errors.js';
74
+ export { AuthAccessTokenEnvVarError, AuthServiceAccountEnvVarError, } from './core/runtime-launch-options.js';
74
75
  export { WIRE_PROTOCOL_VERSION } from './protocol/version.js';
75
76
  export type { ModelPromptPatch, ModelPromptPatches, } from './protocol/model-prompt-patches.js';
76
77
  export { HOOK_EVENTS, EXIT_REASONS } from './core/constants.js';
77
78
  import * as coreTypes from './types/index.js';
78
79
  export { coreTypes };
79
- export type { AccessTokenInput, AuthOptions } from './types/auth.js';
80
+ export type { AccessTokenInput, AuthOptions, FetchServiceAccountToken, ServiceAccountAuthOptions, ServiceAccountCredentials, ServiceAccountKeyInput, ServiceAccountTokenResult, } from './types/auth.js';
80
81
  /**
81
82
  * @internal Internal auth types for first-party host integration, not general public use.
82
83
  */
83
84
  export type { FetchJobToken, JobTokenAuthOptions, JobTokenRequest, JobTokenResult, } from './types/auth.js';
84
- export type { AccountInfo, UsageAddOnQuotaBucket, UsageInfo, UsageOrgResourcePackage, UsageQuotaBucket, ApiKeySource, ExitReason, FastModeState, ConfigScope, SettingSource, SDKAssistantMessageError, SDKStatus, EffortLevel, ThinkingAdaptive, ThinkingEnabled, ThinkingDisabled, ThinkingConfig, ModelInfo, ModelSource, ServerModelJson, ServerModelJsonValue, ModelStrategy, ModelPromotion, LocalizedModelText, ModelContextConfig, ModelContextWindowEntry, ModelEffortEntry, ModelThinkingConfig, ModelThinkingDisabled, ModelThinkingEnabled, ModelUsage, NonNullableUsage, SlashCommand, ToolConfig, SdkPluginConfig, } from './types/common.js';
85
+ export type { AccountInfo, UsageAddOnQuotaBucket, UsageInfo, UsageOrgResourcePackage, UsageQuotaBucket, SessionCreditsUsage, ApiKeySource, ExitReason, FastModeState, ConfigScope, SettingSource, SDKAssistantMessageError, SDKStatus, EffortLevel, ThinkingAdaptive, ThinkingEnabled, ThinkingDisabled, ThinkingConfig, ModelInfo, ModelSource, ServerModelJson, ServerModelJsonValue, ModelStrategy, ModelPromotion, LocalizedModelText, ModelContextConfig, ModelContextWindowEntry, ModelEffortEntry, ModelThinkingConfig, ModelThinkingDisabled, ModelThinkingEnabled, ModelUsage, NonNullableUsage, SlashCommand, ToolConfig, SdkPluginConfig, } from './types/common.js';
85
86
  export type { SDKMessage, SDKAssistantMessage, SDKUserMessage, SDKUserMessageReplay, SDKResultMessage, SDKResultSuccess, SDKResultError, SDKSystemMessage, SDKSystemInitMessage, SDKSystemMessageSubtype, SDKSystemMessageBySubtype, SDKPartialAssistantMessage, SDKCompactBoundaryMessage, SDKStatusMessage, SDKAPIRetryMessage, SDKHookStartedMessage, SDKHookProgressMessage, SDKHookResponseMessage, SDKPermissionDeniedMessage, SDKMirrorErrorMessage, SDKTaskNotificationMessage, SDKTaskStartedMessage, SDKTaskProgressMessage, SDKSessionStateChangedMessage, SDKSessionTitleChangedMessage, SDKFilesPersistedEvent, SDKElicitationCompleteMessage, SDKPromptSuggestionMessage, SDKCloudAgentEventMessage, SDKPermissionDenial, } from './types/messages.js';
86
87
  export type { DefaultRuntimeTransport, } from './core/default-runtime.js';
87
88
  export type { QueryTransportCreateOptions, QueryTransportProviderOption, } from './core/query-transport.js';
package/dist/index.js CHANGED
@@ -1,30 +1,30 @@
1
- var nr=Object.defineProperty;var or=(s,e)=>{for(var t in e)nr(s,t,{get:e[t],enumerable:!0})};import{spawn as Mr}from"child_process";import{createInterface as Er}from"readline";var ir=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],ar=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"];var lt="1.0.16";var pt=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TodoWrite","WebFetch","WebSearch","Write"];import{chmod as gt,mkdtemp as dr,rm as mt,writeFile as lr}from"fs/promises";import{existsSync as Ue,mkdtempSync as pr,readFileSync as fr,rmSync as gr,writeFileSync as mr}from"fs";import{tmpdir as ht}from"os";import{dirname as bt,join as A}from"path";import{fileURLToPath as hr}from"url";var cr=/^[A-Za-z0-9_-]{1,64}$/,ur=new Set(["mcp_list","mcp_get","mcp_call"]);function De(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(ur.has(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function je(s,e){let t={};for(let r of e)De(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 Ne(s,e,t=e.tools??[]){let{tools:r,...n}=e,o=je(s,t);return{...n,...o?{toolOverrides:o}:{}}}function ft(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]=Ne(t,r,n)}return e}var yt="QODER_AGENT_SDK_ENTRYPOINT",St="QODER_AGENT_SDK_VERSION",wt="QODER_SDK_AUTH_PAYLOAD_FILE",yr="sdk-ts",Sr=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],wr=hr(import.meta.url),vt=bt(wr),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"}};function Rt(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function Tt(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=vr();if(s)return s;let e=kr();return Ue(e)?e:"qodercli"}function vr(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of Mt()){let t=A(e,"dist","_bundled",s);if(Ue(t))return t}return null}function kr(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of Mt()){let t=[A(e,"node_modules",".bin",s),A(e,"..","..",".bin",s)];for(let r of t)if(Ue(r))return r}return"qodercli"}function Mt(){let s=[A(vt,".."),A(vt,"..","..")];return[...new Set(s)]}function Pr(){return{allow:[],ask:[],deny:[]}}function kt(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function br(s,e){if(e.startsWith("mcp__"))return e;let t=kt(s),r=e==="*"?"*":kt(e);if(!t||!r)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${r}`}function Pt(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 Rr(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 H=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{gr(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=bt(this.authPayloadPath);try{await mt(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);if(delete t[yt],delete t[St],delete t[wt],t[yt]=yr,t[St]=lt,this.authPayloadPath&&(t[wt]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let r of Sr)t[r]=this.options.proxy;return 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??[...pt];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?Rr(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]:[];Pt(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]=Ne(r,n,o)}return t}collectMcpPolicyPermissionRules(){let e=Pr(),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=br(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]]:[];Pt(o,t[n]),r[n]=o}}readSettingsFile(e){let t=fr(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=pr(A(ht(),"qoder-agent-sdk-settings-"));let t=A(this.generatedSettingsDir,"settings.json");return mr(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),r=await dr(A(ht(),"qoder-sdk-auth-"));try{await gt(r,448);let n=A(r,"payload.json");return await lr(n,JSON.stringify(t),{mode:384}),await gt(n,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${n}`),n}catch(n){throw await mt(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",hostTokenCallback:!0}}}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 fe(s,e){let t={...s};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}var _r=41,Et=8192,B=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}},W=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 H(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(fe(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;let d=this.createProcessExitError(a,c);d&&(this.processExitError=d),this.cleanupAuthPayload().catch(()=>{})})}else this.process=Mr(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===_r&&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 ur=Object.defineProperty;var dr=(s,e)=>{for(var t in e)ur(s,t,{get:e[t],enumerable:!0})};import{spawn as Ur}from"child_process";import{createInterface as qr}from"readline";var lr=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],pr=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"];var ht="1.0.16";var yt=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TodoWrite","WebFetch","WebSearch","Write"];import{chmod as vt,mkdtemp as kr,rm as kt,writeFile as Pr}from"fs/promises";import{existsSync as Le,mkdtempSync as br,readFileSync as Rr,rmSync as Tr,writeFileSync as Er}from"fs";import{tmpdir as Pt}from"os";import{dirname as Ct,join as I}from"path";import{fileURLToPath as Mr}from"url";var fr=/^[A-Za-z0-9_-]{1,64}$/,gr=new Set(["mcp_list","mcp_get","mcp_call"]);function qe(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(!fr.test(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(gr.has(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Fe(s,e){let t={};for(let r of e)qe(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 $e(s,e,t=e.tools??[]){let{tools:r,...n}=e,o=Fe(s,t);return{...n,...o?{toolOverrides:o}:{}}}function St(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]=$e(t,r,n)}return e}var wt="QODER_PERSONAL_ACCESS_TOKEN",ye="QODER_SERVICE_ACCOUNT_KEY";function mr(s){return{type:"accessToken",accessToken:s}}function hr(s=wt){return{type:"accessToken",accessToken:{envVar:s}}}function yr(){return{type:"qodercli"}}function Sr(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 wr(s=ye){return{type:"serviceAccount",serviceAccountKey:{envVar:s}}}function vr(s){return{type:"jobToken",fetchJobToken:s}}var bt="QODER_AGENT_SDK_ENTRYPOINT",Rt="QODER_AGENT_SDK_VERSION",Tt="QODER_SDK_AUTH_PAYLOAD_FILE",_r="sdk-ts",Cr=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],Ar=Mr(import.meta.url),Et=Ct(Ar),Se=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"}},we=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function At(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function xt(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=xr();if(s)return s;let e=Ir();return Le(e)?e:"qodercli"}function xr(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of It()){let t=I(e,"dist","_bundled",s);if(Le(t))return t}return null}function Ir(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of It()){let t=[I(e,"node_modules",".bin",s),I(e,"..","..",".bin",s)];for(let r of t)if(Le(r))return r}return"qodercli"}function It(){let s=[I(Et,".."),I(Et,"..","..")];return[...new Set(s)]}function Or(){return{allow:[],ask:[],deny:[]}}function Mt(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function Dr(s,e){if(e.startsWith("mcp__"))return e;let t=Mt(s),r=e==="*"?"*":Mt(e);if(!t||!r)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${r}`}function _t(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 jr(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 W=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{Tr(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Ct(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[bt],delete t[Rt],delete t[Tt];for(let r of this.serviceAccountCredentialEnvVars())Kr(t,r);if(t[bt]=_r,t[Rt]=ht,this.authPayloadPath&&(t[Tt]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let r of Cr)t[r]=this.options.proxy;return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[ye];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(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??[...yt];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?jr(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]:[];_t(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]=$e(r,n,o)}return t}collectMcpPolicyPermissionRules(){let e=Or(),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=Dr(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]]:[];_t(o,t[n]),r[n]=o}}readSettingsFile(e){let t=Rr(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=br(I(Pt(),"qoder-agent-sdk-settings-"));let t=I(this.generatedSettingsDir,"settings.json");return Er(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),r=await kr(I(Pt(),"qoder-sdk-auth-"));try{await vt(r,448);let n=I(r,"payload.json");return await Pr(n,JSON.stringify(t),{mode:384}),await vt(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 we(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 Se(t);return r}};function Kr(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 ve(s,e){let t={...s};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}var Ot=8192,G=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}},V=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 W(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(ve(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===41&&this.fireAuthExpired();let d=this.createProcessExitError(a,c);d&&(this.processExitError=d),this.cleanupAuthPayload().catch(()=>{})})}else this.process=Ur(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===41&&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=Er({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??2e3,i=setTimeout(()=>{if(n()){r("SIGTERM");let a=setTimeout(()=>{n()&&r("SIGKILL")},5e3);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>Et&&(this.stderrTail=this.stderrTail.slice(-Et))}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 B(n,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==0&&e!==null)return new B(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new B(`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??Tt();if(Rt(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 Cr(){switch("process"){case"worker":return"worker";case"process":return"process"}return"process"}var Fe=Cr();function _t(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function ge(s,e){return s.create(e)}import{existsSync as He}from"fs";import{createInterface as Vr}from"readline";import{dirname as Yr,join as U}from"path";import{fileURLToPath as Xr}from"url";import{Worker as Zr}from"worker_threads";import{createHash as xr}from"node:crypto";import{existsSync as Ir}from"node:fs";import{chmod as Ar,lstat as Or,mkdir as re,readFile as Ct,readdir as Dr,readlink as jr,rename as Nr,rm as me,stat as Kr,symlink as Ur,writeFile as xt}from"node:fs/promises";import{tmpdir as qr,userInfo as Fr}from"node:os";import{basename as It,dirname as J,join as _,relative as $r}from"node:path";var Lr="QODER_WORKER_RUNTIME_ASSET_ROOT",At=/(^|[\\/])app\.asar([\\/]|$)/,Le=".qoder-worker-runtime-ready";function Ot(s){return At.test(s)}function zr(s){return Ot(s)?s.replace(At,(e,t,r)=>`${t}app.asar.unpacked${r}`):null}async function Dt(s,e={}){let t=zr(s);if(!e.forceMaterialize&&t){let c=J(t);if(Ir(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),$e(t,c,!1,J(s))}if(!(e.forceMaterialize||Ot(s))){let c=J(s);return $e(s,c,!1)}let n=J(s),o=await Qr(n,s,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=$r(n,s)||It(s),a=_(o,i);return $e(a,o,!0,n)}function $e(s,e,t,r){return{runtimePath:s,runtimeRoot:e,materialized:t,sourceRuntimeRoot:r,env:{[Lr]:e}}}async function Qr(s,e,t){let r=await Hr(s,e),n=t.cacheDir??Jr(),o=_(n,r),i=_(o,Le);if(await Nt(i)===r)return o;let a=_(n,`.setup-${r}-${process.pid}-${Date.now()}`);await re(n,{recursive:!0,mode:448}),await me(a,{recursive:!0,force:!0}),await me(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${s} -> ${o}`);try{return await re(a,{recursive:!0,mode:448}),await jt(s,a),await xt(_(a,Le),r,{mode:384}),await Wr(a,o,r),o}catch(c){throw await me(a,{recursive:!0,force:!0}).catch(()=>{}),c}}async function Hr(s,e){let t=xr("sha256");t.update("qoder-worker-runtime-v1\0");let r=await Kt(_(s,"runtime-info.json"));if(r)t.update(r);else{t.update(e);let n=await Kr(e).catch(()=>null);n&&t.update(`${n.size}\0${n.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function jt(s,e){let t=await Dr(s,{withFileTypes:!0});await re(e,{recursive:!0,mode:448});for(let r of t){let n=_(s,r.name),o=_(e,r.name);if(r.isDirectory()){await jt(n,o);continue}if(r.isSymbolicLink()){await re(J(o),{recursive:!0,mode:448}),await Ur(await jr(n),o);continue}if(!r.isFile())continue;let i=await Br(n);await re(J(o),{recursive:!0,mode:448}),await xt(o,await Ct(n),{mode:i}),process.platform!=="win32"&&await Ar(o,i)}}async function Br(s){let e=((await Or(s)).mode||420)&511;if(process.platform==="win32")return e||420;let t=It(s);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Wr(s,e,t){try{await Nr(s,e)}catch(r){if(await Nt(_(e,Le))===t){await me(s,{recursive:!0,force:!0});return}throw r}}async function Nt(s){let e=await Kt(s);return e?e.toString("utf8"):null}async function Kt(s){try{return await Ct(s)}catch{return null}}function Jr(){let s=Gr(Fr().username||process.env.USER||process.env.USERNAME||"user");return _(qr(),`qoder-sdk-worker-runtime-${s}`)}function Gr(s){return s.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var en=41,Ut=8192,qt="QODER_WORKER_RUNTIME_PATH",tn="QODER_WORKER_CWD",sn=new Set(["--mcp-config","--settings"]),rn=Xr(import.meta.url),ze=Yr(rn),q=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}},G=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new Qe(fe(this.options,e))}},Qe=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new H(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=Be(this.options.pathToQoderWorkerRuntime),r;try{r=await Dt(t,{diagnostics:this.diagnostics})}catch(a){throw new q(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let n=r.runtimePath;if(!He(n))throw new q(`Qoder worker runtime not found: ${n}`);let o=this.options.cwd??process.cwd(),i={...e.env,[tn]:o,...r.env};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${n}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${nn(e.args)}`),this.worker=new Zr(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===en&&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 d=c.trim();d&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${d}`)}),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=qr({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??2e3,i=setTimeout(()=>{if(n()){r("SIGTERM");let a=setTimeout(()=>{n()&&r("SIGKILL")},5e3);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>Ot&&(this.stderrTail=this.stderrTail.slice(-Ot))}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 G(n,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==41){if(e!==0&&e!==null)return new G(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new G(`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??xt();if(At(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 Fr(){switch("process"){case"worker":return"worker";case"process":return"process"}return"process"}var Qe=Fr();function Dt(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function ke(s,e){return s.create(e)}import{existsSync as Ge}from"fs";import{createInterface as cn}from"readline";import{dirname as un,join as q}from"path";import{fileURLToPath as dn}from"url";import{Worker as ln}from"worker_threads";import{createHash as $r}from"node:crypto";import{existsSync as Lr}from"node:fs";import{chmod as zr,lstat as Qr,mkdir as ie,readFile as jt,readdir as Hr,readlink as Br,rename as Wr,rm as Pe,stat as Jr,symlink as Gr,writeFile as Kt}from"node:fs/promises";import{tmpdir as Vr,userInfo as Yr}from"node:os";import{basename as Nt,dirname as Y,join as C,relative as Xr}from"node:path";var Zr="QODER_WORKER_RUNTIME_ASSET_ROOT",Ut=/(^|[\\/])app\.asar([\\/]|$)/,Be=".qoder-worker-runtime-ready";function qt(s){return Ut.test(s)}function en(s){return qt(s)?s.replace(Ut,(e,t,r)=>`${t}app.asar.unpacked${r}`):null}async function Ft(s,e={}){let t=en(s);if(!e.forceMaterialize&&t){let c=Y(t);if(Lr(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),He(t,c,!1,Y(s))}if(!(e.forceMaterialize||qt(s))){let c=Y(s);return He(s,c,!1)}let n=Y(s),o=await tn(n,s,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=Xr(n,s)||Nt(s),a=C(o,i);return He(a,o,!0,n)}function He(s,e,t,r){return{runtimePath:s,runtimeRoot:e,materialized:t,sourceRuntimeRoot:r,env:{[Zr]:e}}}async function tn(s,e,t){let r=await sn(s,e),n=t.cacheDir??on(),o=C(n,r),i=C(o,Be);if(await Lt(i)===r)return o;let a=C(n,`.setup-${r}-${process.pid}-${Date.now()}`);await ie(n,{recursive:!0,mode:448}),await Pe(a,{recursive:!0,force:!0}),await Pe(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${s} -> ${o}`);try{return await ie(a,{recursive:!0,mode:448}),await $t(s,a),await Kt(C(a,Be),r,{mode:384}),await nn(a,o,r),o}catch(c){throw await Pe(a,{recursive:!0,force:!0}).catch(()=>{}),c}}async function sn(s,e){let t=$r("sha256");t.update("qoder-worker-runtime-v1\0");let r=await zt(C(s,"runtime-info.json"));if(r)t.update(r);else{t.update(e);let n=await Jr(e).catch(()=>null);n&&t.update(`${n.size}\0${n.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function $t(s,e){let t=await Hr(s,{withFileTypes:!0});await ie(e,{recursive:!0,mode:448});for(let r of t){let n=C(s,r.name),o=C(e,r.name);if(r.isDirectory()){await $t(n,o);continue}if(r.isSymbolicLink()){await ie(Y(o),{recursive:!0,mode:448}),await Gr(await Br(n),o);continue}if(!r.isFile())continue;let i=await rn(n);await ie(Y(o),{recursive:!0,mode:448}),await Kt(o,await jt(n),{mode:i}),process.platform!=="win32"&&await zr(o,i)}}async function rn(s){let e=((await Qr(s)).mode||420)&511;if(process.platform==="win32")return e||420;let t=Nt(s);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function nn(s,e,t){try{await Wr(s,e)}catch(r){if(await Lt(C(e,Be))===t){await Pe(s,{recursive:!0,force:!0});return}throw r}}async function Lt(s){let e=await zt(s);return e?e.toString("utf8"):null}async function zt(s){try{return await jt(s)}catch{return null}}function on(){let s=an(Yr().username||process.env.USER||process.env.USERNAME||"user");return C(Vr(),`qoder-sdk-worker-runtime-${s}`)}function an(s){return s.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Qt=8192,Ht="QODER_WORKER_RUNTIME_PATH",pn="QODER_WORKER_CWD",fn=new Set(["--mcp-config","--settings"]),gn=dn(import.meta.url),We=un(gn),F=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}},X=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new Je(ve(this.options,e))}},Je=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 W(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=Ve(this.options.pathToQoderWorkerRuntime),r;try{r=await Ft(t,{diagnostics:this.diagnostics})}catch(a){throw new F(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let n=r.runtimePath;if(!Ge(n))throw new F(`Qoder worker runtime not found: ${n}`);let o=this.options.cwd??process.cwd(),i={...e.env,[pn]:o,...r.env};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${n}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${mn(e.args)}`),this.worker=new ln(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===41&&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 d=c.trim();d&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${d}`)}),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=Vr({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??2e3;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>Ut&&(this.stderrTail=this.stderrTail.slice(-Ut))}createWorkerError(e){return new q(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(e!==0)return new q(`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 Be(s){if(s)return s;if(process.env[qt])return process.env[qt];let e=[];for(let t of an())e.push(U(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),U(t,"dist","_worker","qoder-worker-runtime.mjs"),U(t,"_worker","qoder-worker-runtime.obf.mjs"),U(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(He(t))return t;return e[0]??U(ze,"..","_worker","qoder-worker-runtime.obf.mjs")}function nn(s){let e=[];for(let t=0;t<s.length;t+=1){let r=s[t];e.push(r),sn.has(r)&&t+1<s.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}function on(s){return He(Be(s))}function an(){let s=[U(ze,".."),U(ze,"..","..")];return[...new Set(s)]}var he=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 cn,mkdirSync as un}from"fs";import{dirname as dn}from"path";var ln="QODER_AGENT_SDK_DEBUG";function pn(s){return s.debugFile?!0:s.debug===!0||gn(process.env[ln])}function fn(s){if(s.debugFile)return s.debugFile}function gn(s){if(s===void 0)return!1;let e=s.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var ye=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=pn(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{un(dn(e),{recursive:!0}),cn(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=cn({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??2e3;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>Qt&&(this.stderrTail=this.stderrTail.slice(-Qt))}createWorkerError(e){return new F(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===41))return new F(`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 Ve(s){if(s)return s;if(process.env[Ht])return process.env[Ht];let e=[];for(let t of yn())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(Ge(t))return t;return e[0]??q(We,"..","_worker","qoder-worker-runtime.obf.mjs")}function mn(s){let e=[];for(let t=0;t<s.length;t+=1){let r=s[t];e.push(r),fn.has(r)&&t+1<s.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}function hn(s){return Ge(Ve(s))}function yn(){let s=[q(We,".."),q(We,"..","..")];return[...new Set(s)]}var be=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 Sn,mkdirSync as wn}from"fs";import{dirname as vn}from"path";var kn="QODER_AGENT_SDK_DEBUG";function Pn(s){return s.debugFile?!0:s.debug===!0||Rn(process.env[kn])}function bn(s){if(s.debugFile)return s.debugFile}function Rn(s){if(s===void 0)return!1;let e=s.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var Re=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=Pn(e),this.debugFile=bn(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{wn(vn(e),{recursive:!0}),Sn(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 V=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var F=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ne=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}},oe=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}};var We="1.1.0";function Ft(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 $t(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 Lt(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 mn}from"crypto";function Ht(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var hn=500,yn=1024*1024,Sn=6e4,wn=[200,800],Se=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=vn(e.filePath),r=kn(e.entries),n=Qt(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+=bn(r),(this.options.flushMode==="eager"||o.entries.length>=hn||o.bytes>=yn)&&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 Rn(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??Sn,retryDelaysMs:this.options.retryDelaysMs??wn})}catch(r){this.options.diagnostics?.record(`[SessionStore] append failed for ${Qt(e.key)}`,r),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:r instanceof Error?r.message:String(r),key:{...e.key},uuid:mn(),session_id:e.key.sessionId})}})}};function vn(s){let e=s.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),r=e.slice(t+1);if(t<0||r.length<2)throw new Error(`Invalid transcript mirror path: ${s}`);let n=r[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(r[1]);if(r.length===2&&o)return{projectKey:n,sessionId:zt(o[1])};let i=zt(r[1]),a=r.slice(2),c=a.at(-1);a[a.length-1]=c.endsWith(".jsonl")?c.slice(0,-6):c;let d=a.join("/");return Pn(d),{projectKey:n,sessionId:i,subpath:d}}function kn(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 zt(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 Pn(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 Qt(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}function bn(s){return s.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Rn(s,e,t,r){for(let n=0;;n++)try{await Tn(s.append({...e},structuredClone(t)),r.appendTimeoutMs);return}catch(o){if(o instanceof we)throw o;let i=r.retryDelaysMs[n];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function Tn(s,e){let t;s.catch(()=>{});try{await Promise.race([s,new Promise((r,n)=>{t=setTimeout(()=>n(new we(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var we=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Bt(){return Math.random().toString(36).substring(2,15)}function Wt(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 Jt(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function Gt(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function Vt(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function Yt(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function Xt(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function Y(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 Zt(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function es(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function ts(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function ss(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function rs(s){return typeof s=="object"&&s!==null&&s.type==="result"}var ke=class s{static INITIALIZE_TIMEOUT_MS=12e4;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;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,r,n,o,i,a,c,d,l,f,u,p,g,S,m,h,v="batched",y){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=r,this.hooks=n??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=u??new Map,this.pendingMcpResponses=p??new Map,this.sdkMcpToolOverrides=y??{},this.initConfig=a??{},this.onElicitation=c,this.onAuthExpired=l,this.fetchJobToken=g,this.diagnostics=d,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=S,this.resolveModelTimeoutMs=m??500,this.inputStream=new V(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new Se({store:h,flushMode:v,diagnostics:d,onMirrorError:P=>this.inputStream.enqueue(P)})),this.readLoopPromise=this.readMessages().catch(P=>{this.inputStream.error(P)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let P=this.abortController.signal;P.aborted?this.close().catch(()=>{}):P.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(Ht(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(n){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",n)}continue}if(Vt(t)){this.handleControlResponse(t);continue}if(Yt(t)){this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",n)});continue}if(Xt(t)){this.handleControlCancelRequest(t);continue}if(Zt(t)||es(t)||ts(t)||ss(t))continue;if(rs(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{this.validateProtocolHandshake(r)}catch(n){throw this.inputStream.error(n),n}if(this.onAuthExpired&&!this.authExpiredFired){let n=!1;(r.type==="auth_status"&&r.error||r.type==="assistant"&&r.error==="authentication_failed")&&(n=!0),n&&(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(i=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",i)}))}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()}}async request(e,t){let r=Bt(),n=Wt(r,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=Y(n.request)??"unknown",a=Date.now();return new Promise((c,d)=>{let l=null,f=()=>{l&&(clearTimeout(l),l=null)};this.pendingRequests.set(r,{resolve:u=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(u)},reject:u=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=error duration_ms=${Date.now()-a}`,u),d(u)}}),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(u){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",u)}d(new Error(`Control request "${Y(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(u){f(),this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${r} subtype=${i}`,u),d(u)}})}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)Y(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=Y(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=Jt(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}=xn(i),d=Gt(t,a,c);this.transport.write(JSON.stringify(d)+`
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 F}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,r=We;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=ns(t),o=ns(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 oe(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 F;return new Promise((r,n)=>{let o=()=>{n(new F)};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=Y(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,d=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!d?.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:d.token}}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,d=o.permission_suggestions??o.suggestions,l=o.blocked_path,f=o.decision_reason,u=o.title,p=o.display_name,g=o.description,S=o.agent_id,m=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:d,blockedPath:l,decisionReason:f,title:u,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(Ft(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)),d,l=new Promise((p,g)=>{d=setTimeout(()=>{g(new ne(a))},a)}),f;try{f=await this.awaitAbortable(Promise.race([c,l]),t)}finally{clearTimeout(d)}let u={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;u.custom_model={...g,style:g.style??"openai"}}return u}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(d=>{let l=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(l,d),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&&this.hasBidirectionalNeeds()&&await this.waitForFirstResult(),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 setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}hasBidirectionalNeeds(){return this.sdkMcpTransports.size>0||Object.keys(this.hooks).length>0||this.canUseTool!==void 0||this.onElicitation!==void 0||this.fetchJobToken!==void 0||this.resolveModel!==void 0}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async 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"});return Cn(e?.usage)}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 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=ft(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)}Lt(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function Pe(s){return typeof s=="object"&&s!==null}function Mn(s){return typeof s=="number"&&Number.isFinite(s)}function Je(s){return Object.keys(s).length>0}function C(s,e,t){let r=e[t];Mn(r)&&(s[t]=r)}function X(s,e,t){let r=e[t];typeof r=="string"&&(s[t]=r)}function ve(s,e,t){let r=e[t];typeof r=="boolean"&&(s[t]=r)}function os(s){if(!Pe(s)||Array.isArray(s))return;let e={};return C(e,s,"total"),C(e,s,"used"),C(e,s,"remaining"),C(e,s,"percentage"),X(e,s,"unit"),Je(e)?e:void 0}function En(s){if(!Pe(s)||Array.isArray(s))return;let e=os(s)??{};return X(e,s,"detailUrl"),Je(e)?e:void 0}function _n(s){if(!Pe(s)||Array.isArray(s))return;let e={};return C(e,s,"used"),C(e,s,"cap"),C(e,s,"remaining"),C(e,s,"percentage"),ve(e,s,"available"),X(e,s,"unit"),Je(e)?e:void 0}function Cn(s){if(!Pe(s)||Array.isArray(s))return null;let e={};X(e,s,"userId"),X(e,s,"userType"),C(e,s,"totalUsagePercentage"),ve(e,s,"isHighestTier"),C(e,s,"expiresAt"),X(e,s,"upgradeUrl"),ve(e,s,"isQuotaExceeded"),ve(e,s,"isPlanQuotaProrated");let t=os(s.userQuota);t&&(e.userQuota=t);let r=En(s.addOnQuota);r&&(e.addOnQuota=r);let n=_n(s.orgResourcePackage);return n&&(e.orgResourcePackage=n),e}function xn(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 ns(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var be=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 is}from"crypto";var In="QODER_CLOUD_AGENT_API_BASE",An="https://api.qoder.com/api/v1/cloud",O={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},On=1024,as=1*1024*1024,cs=4*1024*1024,Dn=8*1024,Ve=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"}},Re=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Ye=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}},jn=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function ps(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(o=>s[o]!==void 0&&!jn.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 Re;let{agent:t,session:r}=s.experimentalCloudAgent;if(t&&Z(t)&&Ge(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(r&&Z(r)&&Ge(r))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(r&&Z(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&&Z(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||!Ge(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 Z(s){return"id"in s&&s.id!==void 0}function Ge(s){return"create"in s&&s.create!==void 0}function fs(s){return new Xe(s)}var Xe=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Vn();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=ls();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=Nn(e.options.auth,e.options.env),this.apiBase=Kn(),this.inputStream=new V(()=>{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(Jn(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=Wn(t);this.beginPendingTurn();let n=await this.postSessionEvents([{type:O.userMessage,content:r}]);this.postedMessages+=1,this.activateTurn(n.find(o=>o.type===O.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:O.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}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 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&&Z(e))t=e.id;else{let r=await this.resolveAgentId(),n=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:r,...qn(n)}});t=us(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(Z(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Un(e.create)});return us(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 Gn(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 ds(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 d=n.slice(0,c);n=n.slice(c+1);let l=d.endsWith("\r")?d.slice(0,-1):d;if(this.consumeSseLine(l,o),this.closed)break}n.length>as&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${as} 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:Ln(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=M(e.data,"type")??e.event,r=M(e.data,"turn_id"),n={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??is(),session_id:this.sessionId??M(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(n),!this.isCurrentTurnEvent(r)){this.bufferPendingTurnEvent(e,t,r);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case O.agentMessage:{let r=Qn(ie(e.data,"content"));r&&this.assistantTextParts.push(r);return}case O.modelRequestEnd:this.captureUsage(e.data);return;case O.idle:this.idleSeen=!0,this.finishIfIdle();return;case O.error:this.emitErrorResult(e),this.finish();return;case O.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=ls(),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>=On&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:r}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(M(e.data,"error")??M(Te(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:is(),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 Fn(r)}captureUsage(e){let t=Te(e,"usage");if(!t)return;this.latestUsage=Hn(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=M(e,"model")??M(t,"model");if(n){let o=this.latestModelUsage[n]?.costUSD??0;this.latestModelUsage[n]=Bn(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 ds(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 Nn(s,e){if(s?.type!=="accessToken")throw new Re;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 Ve(t);return r}function Kn(){return process.env[In]?.replace(/\/+$/,"")??An}function Un(s){return Ze({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 qn(s){return Ze({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>Ze({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function Ze(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function us(s,e){let t=M(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function Fn(s){let e=zn(s,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:M(t,"id"),turnId:M(t,"turn_id"),type:M(t,"type")}]):[]}async function ds(s){let e=await $n(s,Dn);return new Ye(s.status,e||s.statusText||"unknown error")}async function $n(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 Ln(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function Te(s,e){let t=ie(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function zn(s,e){let t=ie(s,e);return Array.isArray(t)?t:void 0}function M(s,e){let t=ie(s,e);return typeof t=="string"?t:void 0}function R(s,e){let t=ie(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ie(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function Qn(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>gs(t)?t.text:"").filter(Boolean).join("")||void 0}function Hn(s,e){let t=Te(e,"cache_creation"),r=Te(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 Bn(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 Wn(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>gs(t)?t.text:JSON.stringify(t)).join(`
15
- `):JSON.stringify(e)}function gs(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function Jn(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 ls(){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 Gn(s,e){e.aborted||await new Promise(t=>{let r=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(r),t()},{once:!0})})}function Vn(){let s,e;return{promise:new Promise((r,n)=>{s=r,e=n}),resolve:s,reject:e}}import{access as no,chmod as vs,cp as oo,mkdtemp as io,mkdir as ks,realpath as ao,rm as ys,writeFile as co}from"fs/promises";import{homedir as uo,tmpdir as lo}from"os";import{dirname as po,isAbsolute as Ps,join as $,relative as fo,resolve as et,sep as go}from"path";import{homedir as Yn}from"os";import{join as hs}from"path";var Xn=".qoder",Zn="QODER_CLI_HOME",eo="QODER_CONFIG_DIR",ms=200;function to(){return process.env[Zn]||Yn()}function so(){let s=process.env[eo];return s||hs(to(),Xn)}function ee(){return hs(so(),"projects")}function ro(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<=ms)return e;let t=Math.abs(ro(s)).toString(36);return`${e.slice(0,ms)}-${t}`}var mo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,ho=6e4;async function bs(s){if(s.resume===void 0&&!s.continue)return;let e=T(await wo(s.cwd)),t=s.loadTimeoutMs??ho,r=s.resume!==void 0?s.resume:await vo(s.store,e,t);if(r===void 0||!mo.test(r))return;let n={projectKey:e,sessionId:r},o=await Ss(s.store,n,t);if(!o)return;let i=s.store.listSubkeys?await tt(s.store.listSubkeys(n),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let d of i){if(!Po(d)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(d)}`);continue}let l=await Ss(s.store,{...n,subpath:d},t);l&&a.push({subpath:d,entries:l})}let c;try{c=await io($(lo(),"qoder-session-store-")),await vs(c,448),await So(yo(s.env),c);let d=$(c,"projects",e),l=$(d,r);await ks(d,{recursive:!0,mode:448}),await ws($(d,`${r}.jsonl`),o);for(let{subpath:u,entries:p}of a){let g=bo(l,`${u}.jsonl`),S=p.filter(h=>h.type==="agent_metadata"),m=p.filter(h=>h.type!=="agent_metadata");if(m.length>0&&await ws(g,m),S.length>0){let h={...S.at(-1)};delete h.type,await Rs(g.slice(0,-6)+".meta.json",JSON.stringify(h))}}let f=c;return{configDir:f,projectKey:e,sessionId:r,cleanup:async()=>{await ys(f,{recursive:!0,force:!0})}}}catch(d){throw c!==void 0&&await ys(c,{recursive:!0,force:!0}),d}}function yo(s){return et(s?.QODER_CONFIG_DIR??process.env.QODER_CONFIG_DIR??$(uo(),".qoder"))}async function So(s,e){for(let t of[".auth","oauth_creds.json"]){let r=$(s,t);try{await no(r),await oo(r,$(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(n){if(n.code!=="ENOENT")throw n}}}async function wo(s){let e=et(s??process.cwd());try{return await ao(e)}catch{return e}}async function vo(s,e,t){if(!s.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let r=await tt(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 Ss(s,e,t){let r=await tt(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)=>ko(n,o))}}function ko(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 Po(s){return!(typeof s!="string"||!s||s.includes("\0")||s.includes("\\")||Ps(s)||/^[a-z]:/i.test(s)||s.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function bo(s,e){let t=et(s,e),r=fo(s,t);if(r===""||r===".."||r.startsWith(`..${go}`)||Ps(r))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function ws(s,e){let t=e.map(r=>JSON.stringify(r)).join(`
16
- `);await Rs(s,t?`${t}
17
- `:"")}async function Rs(s,e){await ks(po(s),{recursive:!0,mode:448}),await co(s,e,{encoding:"utf8",mode:384}),await vs(s,384)}async function tt(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 st=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 Ro(s){if(s.transport!==void 0){if(_t(s.transport))return s.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}return Fe==="worker"?G.default:W.default}function To(s){let{prompt:e,options:t={}}=s,r=Ro(t),n=new ye({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 st;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 QODER_CONFIG_DIR=/tmp for ephemeral local writes with external mirroring.");if(t.sessionStore&&!(r instanceof W)&&!(r instanceof G))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 ps(t),fs({prompt:e,options:t,diagnostics:n});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,d=a?()=>{c||(c=!0,Promise.resolve(a()).catch(w=>{n.record("[query] onAuthExpired callback threw:",w)}))}:void 0,l=new Map,f=new Map,u=new Map,p={},g={},S={};if(t.mcpServers)for(let[w,E]of Object.entries(t.mcpServers)){let K=E.tools;if(Array.isArray(K)&&K.length>0&&(g[w]=K),E.type==="sdk"&&"instance"in E&&E.instance){let Q=E.instance;if(l.set(w,Q),K){let pe=je(w,K);pe&&(S[w]=pe)}let dt=new be(pe=>{$t(w,pe,u)});f.set(w,dt),Q.connect(dt).catch(()=>{})}else p[w]=E}let m=Object.keys(p).length>0,h=Object.keys(g).length>0,v=t.pathToQoderCLIExecutable,y=t.env,P=o?.type==="jobToken"?o.fetchJobToken:void 0,z={pathToQoderCLIExecutable:v,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 E=t.skills==="all"?["Skill"]:t.skills.map(Q=>`Skill(${Q})`),K=new Set(w);return[...w,...E.filter(Q=>!K.has(Q))]})(),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:d},k=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new he(async()=>{let w=await bs({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!w)return{transport:ge(r,{...z,continue:!1})};try{return{transport:ge(r,{...z,env:{...z.env??process.env,QODER_CONFIG_DIR:w.configDir},continue:!1,resume:w.sessionId}),cleanup:w.cleanup}}catch(E){throw await w.cleanup(),E}}):ge(r,z);k.initialize().catch(()=>{});let N=typeof e=="string",I=t.systemPrompt,ct,ut;if(typeof I=="string")ct=I;else if(typeof I=="object"&&I!==null&&I.type==="preset"){let w=I;if(w.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(w.preset)}`);ut=w.append}let rr={systemPrompt:ct,appendSystemPrompt:ut,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},Oe=new ke(k,N,t.canUseTool,t.hooks,t.abortController,l,rr,t.onElicitation,n,d,t.controlRequestTimeoutMs,f,u,P,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",S);if(typeof e=="string"){let w={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};Oe.streamInput(async function*(){yield w}())}else Oe.streamInput(e);return Oe}var Ts="QODER_PERSONAL_ACCESS_TOKEN";function Mo(s){return{type:"accessToken",accessToken:s}}function Eo(s=Ts){return{type:"accessToken",accessToken:{envVar:s}}}function _o(){return{type:"qodercli"}}function Co(s){return{type:"jobToken",fetchJobToken:s}}import{McpServer as xo}from"@modelcontextprotocol/sdk/server/mcp.js";function Io(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 xo({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.`);De(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 Ao(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 nt,readFile as Me,stat as te,appendFile as Ds,realpath as Oo,rm as Ms}from"fs/promises";import{basename as Do,join as b,resolve as Es}from"path";import{execFile as jo}from"child_process";import{randomUUID as js}from"crypto";import{promisify as No}from"util";var Ko=No(jo),Uo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,qo=new Set(["user","assistant","system","progress","attachment"]);function x(s){return s!==null&&typeof s=="object"}function L(s){return Uo.test(s)}function _s(s){let e=[];for(let t of s.split(`
18
- `)){let r=t.trim();if(r)try{let n=JSON.parse(r);x(n)&&typeof n.uuid=="string"&&typeof n.type=="string"&&qo.has(n.type)&&e.push(n)}catch{}}return e}function rt(s){if(!x(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}function ae(s){if(s.type!=="assistant"||!x(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function Ns(s){return s.type!=="user"||!s.parentUuid?!1:rt(s).some(e=>x(e)&&e.type==="tool_result")}function Fo(s){if(!x(s.message))return null;let e=s.message.id;return typeof e=="string"&&e.length>0?e:null}function $o(s,e){let t=new Map;for(let[r,n]of s){let o=Fo(n);if(o){let i=t.get(o);i?i.push(r):t.set(o,[r])}}for(let[r,n]of s){let o=Lo(n,n.parentUuid,s,t,e);o!==n.parentUuid&&s.set(r,{...n,parentUuid:o})}}function Lo(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]:zo(s,o,t)??Qo(s,o,t,n)??e}function zo(s,e,t){if(!Ns(s))return;let r=rt(s).filter(o=>x(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?rt(i).some(a=>x(a)&&a.type==="tool_use"&&r.includes(typeof a.id=="string"?a.id:"")):!1});return n.length===1?n[0]:void 0}function Qo(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 Ho(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 Cs(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 Bo(s,e,t){let r=e.filter(u=>u.type==="assistant");if(r.length===0)return e;let n=new Map,o=0;for(let u of s.keys())n.set(u,o++);let i=new Map;for(let u of r){let p=ae(u);p&&i.set(p,u)}let a=new Map,c=new Map;for(let u of s.values()){let p=ae(u);if(p){let g=a.get(p)??[];g.push(u),a.set(p,g);continue}if(Ns(u)&&u.parentUuid){let g=c.get(u.parentUuid)??[];g.push(u),c.set(u.parentUuid,g)}}let d=new Set,l=new Map;for(let u of r){let p=ae(u);if(!p||d.has(p))continue;d.add(p);let g=a.get(p)??[u],S=g.filter(k=>!t.has(k.uuid)),m=[];for(let k of g){let N=c.get(k.uuid)??[];for(let I of N)t.has(I.uuid)||m.push(I)}if(S.length===0&&m.length===0)continue;let h=i.get(p);if(!h)continue;let v=[...g].sort((k,N)=>Cs(k,N,n));m.sort((k,N)=>Cs(k,N,n));let y=v.findIndex(k=>k.uuid===h.uuid),P=v.slice(0,Math.max(y,0)).filter(k=>!t.has(k.uuid)),z=v.slice(y+1).filter(k=>!t.has(k.uuid)),Ae=[...P,...z,...m];for(let k of Ae)t.add(k.uuid);l.set(h.uuid,Ae)}if(l.size===0)return e;let f=[];for(let u of e){let p=l.get(u.uuid);if(p){let g=n.get(u.uuid)??Number.MAX_SAFE_INTEGER,S=[],m=[];for(let h of p)(u.type==="assistant"&&h.type==="assistant"&&ae(h)===ae(u)&&(n.get(h.uuid)??Number.MAX_SAFE_INTEGER)<g?S:m).push(h);f.push(...S,u,...m)}else f.push(u)}return f}function xs(s){if(s.length===0)return[];let e=new Map,t=new Map;for(let[u,p]of s.entries())e.set(p.uuid,p),t.set(p.uuid,u);Ho(e),$o(e,t);let r=new Set;for(let u of e.values())u.parentUuid&&r.add(u.parentUuid);let n=Array.from(e.values()).filter(u=>!r.has(u.uuid)),o=[];for(let u of n){let p=u,g=new Set;for(;p&&!g.has(p.uuid);){if(g.add(p.uuid),p.type==="user"||p.type==="assistant"){o.push(p);break}p=p.parentUuid?e.get(p.parentUuid):void 0}}if(o.length===0)return[];let i=o.filter(u=>!u.isSidechain&&!u.teamName&&!u.isMeta),c=(i.length>0?i:o).reduce((u,p)=>(t.get(p.uuid)??-1)>(t.get(u.uuid)??-1)?p:u),d=[],l=new Set,f=c;for(;f&&!l.has(f.uuid);)l.add(f.uuid),d.push(f),f=f.parentUuid?e.get(f.parentUuid):void 0;return d.reverse(),Bo(e,d,l)}function Is(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 Wo(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 As(s){let e=s.type==="system"?Wo(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 Os(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 Ee(s){try{return await Oo(Es(s))}catch{return Es(s)}}async function Jo(s){return T(await Ee(s))}async function D(s){let e=ee();if(s?.dir){let t=await Ee(s.dir),r=[b(e,T(t))];if(s.includeWorktrees!==!1)try{let{stdout:n}=await Ko("git",["worktree","list","--porcelain"],{cwd:s.dir}),o=n.split(`
19
- `).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 Jo(i)))}catch{}return r}try{return(await nt(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>b(e,r.name))}catch{return[]}}async function Ks(s){try{let[e,t]=await Promise.all([Me(s,"utf-8"),te(s)]),r=e.trim().split(`
20
- `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return x(i)?[i]:[]}catch{return[]}});if(r.length===0)return null;let n=Do(s,".jsonl");return ot(n,r,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function Us(s,e){return b(s,e,"subagents")}function qs(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 Fs(s){let e=[];async function t(r){let n;try{n=await nt(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 Go(s){try{let e=await Me(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 $s(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 Vo(s,e,t){let[r,n]=await Promise.all([Me(s,"utf-8"),Go(s)]),o=[];for(let l of r.trim().split(`
21
- `).filter(Boolean))try{let f=JSON.parse(l);qs(f)&&o.push(f)}catch{}let a=$s(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,d=t?.limit;return d!==void 0?a.slice(c,c+d):a.slice(c)}async function se(s){return T(await Ee(s??process.cwd()))}function ce(s,e){return{projectKey:s,sessionId:e}}function Yo(s){return s.map(e=>JSON.stringify(e)).join(`
22
- `)}function Xo(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 Zo(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 ei=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function ti(s){let e=s;for(let t=0;t<10;t+=1){let r=e.normalize("NFKC").replace(ei,"");if(r===e)return r;e=r}return e}var si=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,ri=/<command-name>(.*?)<\/command-name>/,ni=/<bash-input>([\s\S]*?)<\/bash-input>/;function oi(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 ii(s,e){if(s.type!=="user"||s.isMeta===!0||s.isCompactSummary===!0)return;let t=s.message;if(!x(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(x(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(`
23
- `," ").trim();if(!i)continue;let a=ri.exec(i);if(a){e.commandFallback??=a[1];continue}let c=ni.exec(i);if(c)return`! ${c[1].trim()}`;if(!si.test(i))return oi(i)}}function ot(s,e,t,r={}){if(e.length===0)return;let n,o,i,a,c,d,l,f,u,p,g;for(let v of e){let y=v;if(g??=y.isSidechain===!0,p===void 0&&typeof y.timestamp=="string"){let P=Date.parse(y.timestamp);Number.isFinite(P)&&(p=P)}if(!n){let P={commandFallback:o};n=ii(y,P),o=P.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"&&(d=y.summary),y.type==="tag"&&(u=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||d||S;if(h)return{sessionId:s,summary:h,lastModified:t??Xo(e),fileSize:r.fileSize,customTitle:m,firstPrompt:S,gitBranch:l,cwd:f||r.defaultCwd,tag:u,createdAt:p}}async function Ls(s,e,t){let r=ce(await se(t),e),n=await s.load(r);return n?{key:r,entries:n}:void 0}async function ai(s){if(s?.sessionStore){let d=s.sessionStore;if(!d.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let l=await Ee(s.dir??process.cwd()),f=T(l),u=(await d.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?u.slice(p,p+s.limit):p>0?u.slice(p):u;return(await Promise.allSettled(g.map(async({sessionId:m,mtime:h})=>{let v=await d.load(ce(f,m));return v?ot(m,v,h,{defaultCwd:l}):void 0}))).flatMap((m,h)=>{if(m.status==="fulfilled")return m.value?[m.value]:[];let v=g[h];return[{sessionId:v.sessionId,summary:"",lastModified:v.mtime}]})}let e=await D(s),r=(await Promise.all(e.map(async d=>{try{return(await nt(d)).filter(f=>f.endsWith(".jsonl")).map(f=>b(d,f))}catch{return[]}}))).flat(),n=await Promise.all(r.map(Ks)),o=new Map;for(let d of n){if(!d)continue;let l=o.get(d.sessionId);(!l||d.lastModified>l.lastModified)&&o.set(d.sessionId,d)}let i=Array.from(o.values()).sort((d,l)=>l.lastModified-d.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function ci(s,e){if(e?.sessionStore){if(!L(s))return;let r=await Ls(e.sessionStore,s,e.dir);return r?ot(s,r.entries,Zo(r.entries)):void 0}let t=await D(e);for(let r of t){let n=b(r,`${s}.jsonl`),o=await Ks(n);if(o)return o}}async function ui(s,e){if(!L(s))return[];let t=e?.includeSystemMessages===!0;if(e?.sessionStore){let n=await Ls(e.sessionStore,s,e.dir);if(!n)return[];let o=xs(_s(Yo(n.entries)));return Os(o.filter(i=>Is(i,t)).map(As),e)}let r=await D(e);for(let n of r){let o=b(n,`${s}.jsonl`);try{let i=await Me(o,"utf-8"),c=xs(_s(i)).filter(d=>Is(d,t)).map(As);return Os(c,e)}catch{continue}}return[]}async function di(s,e,t){if(!L(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(ce(await se(t.dir),s),[{type:"custom-title",sessionId:s,customTitle:r,uuid:js(),timestamp:new Date().toISOString()}]);return}let n=await D(t);for(let o of n){let i=b(o,`${s}.jsonl`);try{await te(i);let a=JSON.stringify({type:"custom-title",sessionId:s,customTitle:r,timestamp:new Date().toISOString()});await Ds(i,a+`
24
- `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function li(s,e,t){if(!L(s))throw new Error(`Invalid sessionId: ${s}`);let r=e===null?null:ti(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(ce(await se(t.dir),s),[{type:"tag",sessionId:s,tag:r??"",uuid:js(),timestamp:new Date().toISOString()}]);return}let n=await D(t);for(let o of n){let i=b(o,`${s}.jsonl`);try{await te(i);let a=JSON.stringify({type:"tag",sessionId:s,tag:r??"",timestamp:new Date().toISOString()});await Ds(i,a+`
25
- `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function pi(s,e){if(e?.sessionStore){if(!L(s))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let r=await e.sessionStore.listSubkeys({projectKey:await se(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 D(e);for(let r of t){let n=b(r,`${s}.jsonl`);try{await te(n);let o=await Fs(Us(r,s));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function fi(s,e,t){if(t?.sessionStore){if(!L(s)||!e)return[];let n=await se(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(qs),c=i.filter(p=>p.type==="agent_metadata").at(-1),d=typeof c?.toolUseId=="string"?c.toolUseId:null,l=typeof c?.parentAgentId=="string"?c.parentAgentId:null,f=$s(a).map(p=>({type:p.type,uuid:p.uuid,session_id:p.sessionId??s,message:p.message,parent_tool_use_id:d,parent_agent_id:l})),u=Math.max(0,t.offset??0);return t.limit!==void 0?f.slice(u,u+t.limit):f.slice(u)}let r=await D(t);for(let n of r){let o=b(n,`${s}.jsonl`);try{await te(o);let a=(await Fs(Us(n,s))).find(c=>c.agentId===e);return a?await Vo(a.filePath,s,t):[]}catch{continue}}return[]}async function gi(s,e){if(!L(s))throw new Error(`Invalid sessionId: ${s}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(ce(await se(e.dir),s));return}let t=await D(e);for(let r of t){let n=b(r,`${s}.jsonl`);try{await te(n),await Promise.all([Ms(n,{force:!0}),Ms(b(r,s),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${s} not found`)}import{randomUUID as _e}from"crypto";import{readdir as mi,readFile as hi,realpath as yi,stat as zs,writeFile as Si}from"fs/promises";import{dirname as wi,join as it,resolve as vi}from"path";var Qs=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,ki=new Set(["user","assistant","attachment","system","progress"]);async function Bs(s){let e=vi(s);try{return await yi(e)}catch{return e}}async function Pi(s,e){let t=ee();if(e){let n=T(await Bs(e)),o=it(t,n,`${s}.jsonl`);try{if((await zs(o)).size>0)return o}catch{}return}let r;try{r=await mi(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=it(t,n.name,`${s}.jsonl`);try{if((await zs(o)).size>0)return o}catch{}}}function Ws(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"&&ki.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 bi(s,e){let t=[];for(let r of s.split(`
26
- `))if(r.trim())try{t.push(JSON.parse(r))}catch{}return Ws(t,e)}function Ri(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(`
27
- `).trim();if(o)return o}}function Ti(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??Ri(s)}function Hs(s,e,t,r){let n=s.transcript.filter(u=>u.isSidechain!==!0);if(n.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let u=n.findIndex(p=>p.uuid===t.upToMessageId);if(u<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);n=n.slice(0,u+1)}let o=new Map(n.map(u=>[u.uuid,_e()])),i=n.filter(u=>u.type!=="progress");if(i.length===0)throw new Error(`Session ${e} has no messages to fork`);let a=new Map(n.map(u=>[u.uuid,u])),c=_e(),d=new Date().toISOString(),l=i.map((u,p)=>{let g=null,S=typeof u.parentUuid=="string"?u.parentUuid:void 0;for(;S;){let v=a.get(S);if(!v)break;if(v.type!=="progress"){g=o.get(S)??null;break}S=typeof v.parentUuid=="string"?v.parentUuid:void 0}let m=typeof u.logicalParentUuid=="string"?o.get(u.logicalParentUuid)??null:u.logicalParentUuid??null,h={...u,...u.type==="system"&&u.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:o.get(u.uuid),parentUuid:g,logicalParentUuid:m,sessionId:c,timestamp:p===i.length-1?d:typeof u.timestamp=="string"?u.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:u.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:_e(),timestamp:d}),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||`${Ti(r)??"Forked session"} (fork)`,uuid:_e(),timestamp:d}),{sessionId:c,entries:l}}async function Mi(s,e={}){if(!Qs.test(s))throw new Error(`Invalid sessionId: ${s}`);if(e.upToMessageId&&!Qs.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await Bs(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 d=Hs(Ws(c,s),s,e,c);return await e.sessionStore.append({projectKey:a,sessionId:d.sessionId},d.entries),{sessionId:d.sessionId}}let t=await Pi(s,e.dir);if(!t)throw new Error(`Session ${s} not found`);let r=await hi(t,"utf8"),n=r.split(`
28
- `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Hs(bi(r,s),s,e,n);return await Si(it(wi(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 Z=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var $=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ae=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}},ce=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}};var Ye="1.1.0";function Bt(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 Wt(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 Jt(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 Tn}from"crypto";function Yt(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 En=500,Mn=1024*1024,_n=6e4,Cn=[200,800],Te=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=An(e.filePath),r=xn(e.entries),n=Vt(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+=On(r),(this.options.flushMode==="eager"||o.entries.length>=En||o.bytes>=Mn)&&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 Dn(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??_n,retryDelaysMs:this.options.retryDelaysMs??Cn})}catch(r){this.options.diagnostics?.record(`[SessionStore] append failed for ${Vt(e.key)}`,r),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:r instanceof Error?r.message:String(r),key:{...e.key},uuid:Tn(),session_id:e.key.sessionId})}})}};function An(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:Gt(o[1])};let i=Gt(r[1]),a=r.slice(2),c=a.at(-1);a[a.length-1]=c.endsWith(".jsonl")?c.slice(0,-6):c;let d=a.join("/");return In(d),{projectKey:n,sessionId:i,subpath:d}}function xn(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 Gt(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 In(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 Vt(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}function On(s){return s.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Dn(s,e,t,r){for(let n=0;;n++)try{await jn(s.append({...e},structuredClone(t)),r.appendTimeoutMs);return}catch(o){if(o instanceof Ee)throw o;let i=r.retryDelaysMs[n];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function jn(s,e){let t;s.catch(()=>{});try{await Promise.race([s,new Promise((r,n)=>{t=setTimeout(()=>n(new Ee(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Ee=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Xt(){return Math.random().toString(36).substring(2,15)}function Zt(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 es(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function ts(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function ss(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function rs(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function ns(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function ee(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 os(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function is(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function as(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function cs(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function us(s){return typeof s=="object"&&s!==null&&s.type==="result"}var _e=class s{static INITIALIZE_TIMEOUT_MS=12e4;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;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,r,n,o,i,a,c,d,l,f,u,p,g,S,m,h,v="batched",y,T){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=r,this.hooks=n??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=u??new Map,this.pendingMcpResponses=p??new Map,this.sdkMcpToolOverrides=y??{},this.initConfig=a??{},this.onElicitation=c,this.onAuthExpired=l,this.fetchJobToken=g,this.fetchServiceAccountToken=T,this.diagnostics=d,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=S,this.resolveModelTimeoutMs=m??500,this.inputStream=new Z(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new Te({store:h,flushMode:v,diagnostics:d,onMirrorError:M=>this.inputStream.enqueue(M)})),this.readLoopPromise=this.readMessages().catch(M=>{this.inputStream.error(M)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let M=this.abortController.signal;M.aborted?this.close().catch(()=>{}):M.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(Yt(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(n){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",n)}continue}if(ss(t)){this.handleControlResponse(t);continue}if(rs(t)){this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",n)});continue}if(ns(t)){this.handleControlCancelRequest(t);continue}if(os(t)||is(t)||as(t)||cs(t))continue;if(us(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{this.validateProtocolHandshake(r)}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=Xt(),n=Zt(r,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=ee(n.request)??"unknown",a=Date.now();return new Promise((c,d)=>{let l=null,f=()=>{l&&(clearTimeout(l),l=null)};this.pendingRequests.set(r,{resolve:u=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(u)},reject:u=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=error duration_ms=${Date.now()-a}`,u),d(u)}}),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(u){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",u)}d(new Error(`Control request "${ee(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(u){f(),this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${r} subtype=${i}`,u),d(u)}})}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)ee(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=ee(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=es(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}=Fn(i),d=ts(t,a,c);this.transport.write(JSON.stringify(d)+`
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 $}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,r=Ye;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=ds(t),o=ds(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 ce(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 $;return new Promise((r,n)=>{let o=()=>{n(new $)};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=ee(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,d=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!d?.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:d.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,d=o.permission_suggestions??o.suggestions,l=o.blocked_path,f=o.decision_reason,u=o.title,p=o.display_name,g=o.description,S=o.agent_id,m=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:d,blockedPath:l,decisionReason:f,title:u,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(Bt(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)),d,l=new Promise((p,g)=>{d=setTimeout(()=>{g(new ae(a))},a)}),f;try{f=await this.awaitAbortable(Promise.race([c,l]),t)}finally{clearTimeout(d)}let u={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;u.custom_model={...g,style:g.style??"openai"}}return u}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(d=>{let l=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(l,d),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&&this.hasBidirectionalNeeds()&&await this.waitForFirstResult(),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 setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}hasBidirectionalNeeds(){return this.sdkMcpTransports.size>0||Object.keys(this.hooks).length>0||this.canUseTool!==void 0||this.onElicitation!==void 0||this.fetchJobToken!==void 0||this.fetchServiceAccountToken!==void 0||this.resolveModel!==void 0}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async 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=qn(e?.usage),r=Un(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 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=St(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)}Jt(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function L(s){return typeof s=="object"&&s!==null}function Xe(s){return typeof s=="number"&&Number.isFinite(s)}function Ze(s){return Object.keys(s).length>0}function A(s,e,t){let r=e[t];Xe(r)&&(s[t]=r)}function te(s,e,t){let r=e[t];typeof r=="string"&&(s[t]=r)}function Me(s,e,t){let r=e[t];typeof r=="boolean"&&(s[t]=r)}function ls(s){if(!L(s)||Array.isArray(s))return;let e={};return A(e,s,"total"),A(e,s,"used"),A(e,s,"remaining"),A(e,s,"percentage"),te(e,s,"unit"),Ze(e)?e:void 0}function Kn(s){if(!L(s)||Array.isArray(s))return;let e=ls(s)??{};return te(e,s,"detailUrl"),Ze(e)?e:void 0}function Nn(s){if(!L(s)||Array.isArray(s))return;let e={};return A(e,s,"used"),A(e,s,"cap"),A(e,s,"remaining"),A(e,s,"percentage"),Me(e,s,"available"),te(e,s,"unit"),Ze(e)?e:void 0}function Un(s){if(!L(s)||Array.isArray(s))return;let e=s.total_credits,t=s.model_usage;if(!Xe(e)||e<0||!L(t)||Array.isArray(t))return;let r={};for(let[n,o]of Object.entries(t)){if(!L(o)||Array.isArray(o))continue;let i=o.credits;Xe(i)&&i>=0&&(r[n]={credits:i})}return{total_credits:e,model_usage:r}}function qn(s){if(!L(s)||Array.isArray(s))return null;let e={};te(e,s,"userId"),te(e,s,"userType"),A(e,s,"totalUsagePercentage"),Me(e,s,"isHighestTier"),A(e,s,"expiresAt"),te(e,s,"upgradeUrl"),Me(e,s,"isQuotaExceeded"),Me(e,s,"isPlanQuotaProrated");let t=ls(s.userQuota);t&&(e.userQuota=t);let r=Kn(s.addOnQuota);r&&(e.addOnQuota=r);let n=Nn(s.orgResourcePackage);return n&&(e.orgResourcePackage=n),e}function Fn(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 ds(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Ce=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 ps}from"crypto";var $n="QODER_CLOUD_AGENT_API_BASE",Ln="https://api.qoder.com/api/v1/cloud",D={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},zn=1024,fs=1*1024*1024,gs=4*1024*1024,Qn=8*1024,tt=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"}},Ae=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},st=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}},Hn=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Ss(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(o=>s[o]!==void 0&&!Hn.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 Ae;let{agent:t,session:r}=s.experimentalCloudAgent;if(t&&se(t)&&et(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(r&&se(r)&&et(r))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(r&&se(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&&se(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||!et(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 se(s){return"id"in s&&s.id!==void 0}function et(s){return"create"in s&&s.create!==void 0}function ws(s){return new rt(s)}var rt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=io();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=ys();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=Bn(e.options.auth,e.options.env),this.apiBase=Wn(),this.inputStream=new Z(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(r=>{this.sseConnected.reject(r),this.closed||this.inputStream.error(r)}),this.streamInput(no(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=ro(t);this.beginPendingTurn();let n=await this.postSessionEvents([{type:D.userMessage,content:r}]);this.postedMessages+=1,this.activateTurn(n.find(o=>o.type===D.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:D.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}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 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&&se(e))t=e.id;else{let r=await this.resolveAgentId(),n=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:r,...Gn(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(se(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Jn(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 oo(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 hs(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 d=n.slice(0,c);n=n.slice(c+1);let l=d.endsWith("\r")?d.slice(0,-1):d;if(this.consumeSseLine(l,o),this.closed)break}n.length>fs&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${fs} 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:Xn(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>gs){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${gs} 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(e.data,"type")??e.event,r=E(e.data,"turn_id"),n={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??ps(),session_id:this.sessionId??E(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 D.agentMessage:{let r=eo(ue(e.data,"content"));r&&this.assistantTextParts.push(r);return}case D.modelRequestEnd:this.captureUsage(e.data);return;case D.idle:this.idleSeen=!0,this.finishIfIdle();return;case D.error:this.emitErrorResult(e),this.finish();return;case D.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=ys(),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>=zn&&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(e.data,"error")??E(xe(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:ps(),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 Vn(r)}captureUsage(e){let t=xe(e,"usage");if(!t)return;this.latestUsage=to(this.latestUsage,t);let r=b(e,"total_cost_usd")??b(e,"cost_usd")??b(t,"total_cost_usd")??b(t,"cost_usd");r!==void 0&&(this.totalCostUsd+=r);let n=E(e,"model")??E(t,"model");if(n){let o=this.latestModelUsage[n]?.costUSD??0;this.latestModelUsage[n]=so(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 hs(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 Bn(s,e){if(s?.type!=="accessToken")throw new Ae;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 tt(t);return r}function Wn(){return process.env[$n]?.replace(/\/+$/,"")??Ln}function Jn(s){return nt({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 Gn(s){return nt({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>nt({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function nt(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function ms(s,e){let t=E(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function Vn(s){let e=Zn(s,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:E(t,"id"),turnId:E(t,"turn_id"),type:E(t,"type")}]):[]}async function hs(s){let e=await Yn(s,Qn);return new st(s.status,e||s.statusText||"unknown error")}async function Yn(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 Xn(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function xe(s,e){let t=ue(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function Zn(s,e){let t=ue(s,e);return Array.isArray(t)?t:void 0}function E(s,e){let t=ue(s,e);return typeof t=="string"?t:void 0}function b(s,e){let t=ue(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ue(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function eo(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>vs(t)?t.text:"").filter(Boolean).join("")||void 0}function to(s,e){let t=xe(e,"cache_creation"),r=xe(e,"server_tool_use");return{...s,cache_creation:{ephemeral_1h_input_tokens:b(t,"ephemeral_1h_input_tokens")??s.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:b(t,"ephemeral_5m_input_tokens")??s.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:b(e,"cache_creation_input_tokens")??s.cache_creation_input_tokens,cache_read_input_tokens:b(e,"cache_read_input_tokens")??s.cache_read_input_tokens,input_tokens:b(e,"input_tokens")??s.input_tokens,output_tokens:b(e,"output_tokens")??s.output_tokens,server_tool_use:{web_fetch_requests:b(r,"web_fetch_requests")??s.server_tool_use.web_fetch_requests,web_search_requests:b(r,"web_search_requests")??s.server_tool_use.web_search_requests}}}function so(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 ro(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>vs(t)?t.text:JSON.stringify(t)).join(`
15
+ `):JSON.stringify(e)}function vs(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function no(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 ys(){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 oo(s,e){e.aborted||await new Promise(t=>{let r=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(r),t()},{once:!0})})}function io(){let s,e;return{promise:new Promise((r,n)=>{s=r,e=n}),resolve:s,reject:e}}import{access as mo,chmod as Es,cp as ho,mkdtemp as yo,mkdir as Ms,realpath as So,rm as bs,writeFile as wo}from"fs/promises";import{homedir as vo,tmpdir as ko}from"os";import{dirname as Po,isAbsolute as _s,join as z,relative as bo,resolve as ot,sep as Ro}from"path";import{homedir as ao}from"os";import{join as Ps}from"path";var co=".qoder",uo="QODER_CLI_HOME",lo="QODER_CONFIG_DIR",ks=200;function po(){return process.env[uo]||ao()}function fo(){let s=process.env[lo];return s||Ps(po(),co)}function re(){return Ps(fo(),"projects")}function go(s){let e=5381;for(let t=0;t<s.length;t++)e=e*33^s.charCodeAt(t);return e}function R(s){let e=s.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=ks)return e;let t=Math.abs(go(s)).toString(36);return`${e.slice(0,ks)}-${t}`}var To=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Eo=6e4;async function Cs(s){if(s.resume===void 0&&!s.continue)return;let e=R(await Co(s.cwd)),t=s.loadTimeoutMs??Eo,r=s.resume!==void 0?s.resume:await Ao(s.store,e,t);if(r===void 0||!To.test(r))return;let n={projectKey:e,sessionId:r},o=await Rs(s.store,n,t);if(!o)return;let i=s.store.listSubkeys?await it(s.store.listSubkeys(n),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let d of i){if(!Io(d)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(d)}`);continue}let l=await Rs(s.store,{...n,subpath:d},t);l&&a.push({subpath:d,entries:l})}let c;try{c=await yo(z(ko(),"qoder-session-store-")),await Es(c,448),await _o(Mo(s.env),c);let d=z(c,"projects",e),l=z(d,r);await Ms(d,{recursive:!0,mode:448}),await Ts(z(d,`${r}.jsonl`),o);for(let{subpath:u,entries:p}of a){let g=Oo(l,`${u}.jsonl`),S=p.filter(h=>h.type==="agent_metadata"),m=p.filter(h=>h.type!=="agent_metadata");if(m.length>0&&await Ts(g,m),S.length>0){let h={...S.at(-1)};delete h.type,await As(g.slice(0,-6)+".meta.json",JSON.stringify(h))}}let f=c;return{configDir:f,projectKey:e,sessionId:r,cleanup:async()=>{await bs(f,{recursive:!0,force:!0})}}}catch(d){throw c!==void 0&&await bs(c,{recursive:!0,force:!0}),d}}function Mo(s){return ot(s?.QODER_CONFIG_DIR??process.env.QODER_CONFIG_DIR??z(vo(),".qoder"))}async function _o(s,e){for(let t of[".auth","oauth_creds.json"]){let r=z(s,t);try{await mo(r),await ho(r,z(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(n){if(n.code!=="ENOENT")throw n}}}async function Co(s){let e=ot(s??process.cwd());try{return await So(e)}catch{return e}}async function Ao(s,e,t){if(!s.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let r=await it(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 Rs(s,e,t){let r=await it(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)=>xo(n,o))}}function xo(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 Io(s){return!(typeof s!="string"||!s||s.includes("\0")||s.includes("\\")||_s(s)||/^[a-z]:/i.test(s)||s.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Oo(s,e){let t=ot(s,e),r=bo(s,t);if(r===""||r===".."||r.startsWith(`..${Ro}`)||_s(r))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Ts(s,e){let t=e.map(r=>JSON.stringify(r)).join(`
16
+ `);await As(s,t?`${t}
17
+ `:"")}async function As(s,e){await Ms(Po(s),{recursive:!0,mode:448}),await wo(s,e,{encoding:"utf8",mode:384}),await Es(s,384)}async function it(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 at=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 Do(s){if(s.transport!==void 0){if(Dt(s.transport))return s.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}return Qe==="worker"?X.default:V.default}function jo(s){let{prompt:e,options:t={}}=s,r=Do(t),n=new Re({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 at;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 QODER_CONFIG_DIR=/tmp for ephemeral local writes with external mirroring.");if(t.sessionStore&&!(r instanceof V)&&!(r instanceof X))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 Ss(t),ws({prompt:e,options:t,diagnostics:n});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,d=a?()=>{c||(c=!0,Promise.resolve(a()).catch(w=>{n.record("[query] onAuthExpired callback threw:",w)}))}:void 0,l=new Map,f=new Map,u=new Map,p={},g={},S={};if(t.mcpServers)for(let[w,_]of Object.entries(t.mcpServers)){let U=_.tools;if(Array.isArray(U)&&U.length>0&&(g[w]=U),_.type==="sdk"&&"instance"in _&&_.instance){let B=_.instance;if(l.set(w,B),U){let he=Fe(w,U);he&&(S[w]=he)}let mt=new Ce(he=>{Wt(w,he,u)});f.set(w,mt),B.connect(mt).catch(()=>{})}else p[w]=_}let m=Object.keys(p).length>0,h=Object.keys(g).length>0,v=t.pathToQoderCLIExecutable,y=t.env,T=o?.type==="jobToken"?o.fetchJobToken:void 0,M=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,N={pathToQoderCLIExecutable:v,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 _=t.skills==="all"?["Skill"]:t.skills.map(B=>`Skill(${B})`),U=new Set(w);return[...w,..._.filter(B=>!U.has(B))]})(),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:d},O=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new be(async()=>{let w=await Cs({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!w)return{transport:ke(r,{...N,continue:!1})};try{return{transport:ke(r,{...N,env:{...N.env??process.env,QODER_CONFIG_DIR:w.configDir},continue:!1,resume:w.sessionId}),cleanup:w.cleanup}}catch(_){throw await w.cleanup(),_}}):ke(r,N);O.initialize().catch(()=>{});let me=typeof e=="string",H=t.systemPrompt,ft,gt;if(typeof H=="string")ft=H;else if(typeof H=="object"&&H!==null&&H.type==="preset"){let w=H;if(w.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(w.preset)}`);gt=w.append}let cr={systemPrompt:ft,appendSystemPrompt:gt,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},Ue=new _e(O,me,t.canUseTool,t.hooks,t.abortController,l,cr,t.onElicitation,n,d,t.controlRequestTimeoutMs,f,u,T,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",S,M);if(typeof e=="string"){let w={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};Ue.streamInput(async function*(){yield w}())}else Ue.streamInput(e);return Ue}import{McpServer as Ko}from"@modelcontextprotocol/sdk/server/mcp.js";function No(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 Ko({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.`);qe(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 Uo(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 ut,readFile as Ie,stat as ne,appendFile as qs,realpath as qo,rm as xs}from"fs/promises";import{basename as Fo,join as P,resolve as Is}from"path";import{execFile as $o}from"child_process";import{randomUUID as Fs}from"crypto";import{promisify as Lo}from"util";var zo=Lo($o),Qo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ho=new Set(["user","assistant","system","progress","attachment"]);function x(s){return s!==null&&typeof s=="object"}function Q(s){return Qo.test(s)}function Os(s){let e=[];for(let t of s.split(`
18
+ `)){let r=t.trim();if(r)try{let n=JSON.parse(r);x(n)&&typeof n.uuid=="string"&&typeof n.type=="string"&&Ho.has(n.type)&&e.push(n)}catch{}}return e}function ct(s){if(!x(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}function de(s){if(s.type!=="assistant"||!x(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function $s(s){return s.type!=="user"||!s.parentUuid?!1:ct(s).some(e=>x(e)&&e.type==="tool_result")}function Bo(s){if(!x(s.message))return null;let e=s.message.id;return typeof e=="string"&&e.length>0?e:null}function Wo(s,e){let t=new Map;for(let[r,n]of s){let o=Bo(n);if(o){let i=t.get(o);i?i.push(r):t.set(o,[r])}}for(let[r,n]of s){let o=Jo(n,n.parentUuid,s,t,e);o!==n.parentUuid&&s.set(r,{...n,parentUuid:o})}}function Jo(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]:Go(s,o,t)??Vo(s,o,t,n)??e}function Go(s,e,t){if(!$s(s))return;let r=ct(s).filter(o=>x(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?ct(i).some(a=>x(a)&&a.type==="tool_use"&&r.includes(typeof a.id=="string"?a.id:"")):!1});return n.length===1?n[0]:void 0}function Vo(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 Yo(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 Ds(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 Xo(s,e,t){let r=e.filter(u=>u.type==="assistant");if(r.length===0)return e;let n=new Map,o=0;for(let u of s.keys())n.set(u,o++);let i=new Map;for(let u of r){let p=de(u);p&&i.set(p,u)}let a=new Map,c=new Map;for(let u of s.values()){let p=de(u);if(p){let g=a.get(p)??[];g.push(u),a.set(p,g);continue}if($s(u)&&u.parentUuid){let g=c.get(u.parentUuid)??[];g.push(u),c.set(u.parentUuid,g)}}let d=new Set,l=new Map;for(let u of r){let p=de(u);if(!p||d.has(p))continue;d.add(p);let g=a.get(p)??[u],S=g.filter(k=>!t.has(k.uuid)),m=[];for(let k of g){let O=c.get(k.uuid)??[];for(let me of O)t.has(me.uuid)||m.push(me)}if(S.length===0&&m.length===0)continue;let h=i.get(p);if(!h)continue;let v=[...g].sort((k,O)=>Ds(k,O,n));m.sort((k,O)=>Ds(k,O,n));let y=v.findIndex(k=>k.uuid===h.uuid),T=v.slice(0,Math.max(y,0)).filter(k=>!t.has(k.uuid)),M=v.slice(y+1).filter(k=>!t.has(k.uuid)),N=[...T,...M,...m];for(let k of N)t.add(k.uuid);l.set(h.uuid,N)}if(l.size===0)return e;let f=[];for(let u of e){let p=l.get(u.uuid);if(p){let g=n.get(u.uuid)??Number.MAX_SAFE_INTEGER,S=[],m=[];for(let h of p)(u.type==="assistant"&&h.type==="assistant"&&de(h)===de(u)&&(n.get(h.uuid)??Number.MAX_SAFE_INTEGER)<g?S:m).push(h);f.push(...S,u,...m)}else f.push(u)}return f}function js(s){if(s.length===0)return[];let e=new Map,t=new Map;for(let[u,p]of s.entries())e.set(p.uuid,p),t.set(p.uuid,u);Yo(e),Wo(e,t);let r=new Set;for(let u of e.values())u.parentUuid&&r.add(u.parentUuid);let n=Array.from(e.values()).filter(u=>!r.has(u.uuid)),o=[];for(let u of n){let p=u,g=new Set;for(;p&&!g.has(p.uuid);){if(g.add(p.uuid),p.type==="user"||p.type==="assistant"){o.push(p);break}p=p.parentUuid?e.get(p.parentUuid):void 0}}if(o.length===0)return[];let i=o.filter(u=>!u.isSidechain&&!u.teamName&&!u.isMeta),c=(i.length>0?i:o).reduce((u,p)=>(t.get(p.uuid)??-1)>(t.get(u.uuid)??-1)?p:u),d=[],l=new Set,f=c;for(;f&&!l.has(f.uuid);)l.add(f.uuid),d.push(f),f=f.parentUuid?e.get(f.parentUuid):void 0;return d.reverse(),Xo(e,d,l)}function Ks(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 Zo(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 Ns(s){let e=s.type==="system"?Zo(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 Us(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 Oe(s){try{return await qo(Is(s))}catch{return Is(s)}}async function ei(s){return R(await Oe(s))}async function j(s){let e=re();if(s?.dir){let t=await Oe(s.dir),r=[P(e,R(t))];if(s.includeWorktrees!==!1)try{let{stdout:n}=await zo("git",["worktree","list","--porcelain"],{cwd:s.dir}),o=n.split(`
19
+ `).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 ei(i)))}catch{}return r}try{return(await ut(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>P(e,r.name))}catch{return[]}}async function Ls(s){try{let[e,t]=await Promise.all([Ie(s,"utf-8"),ne(s)]),r=e.trim().split(`
20
+ `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return x(i)?[i]:[]}catch{return[]}});if(r.length===0)return null;let n=Fo(s,".jsonl");return dt(n,r,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function zs(s,e){return P(s,e,"subagents")}function Qs(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 Hs(s){let e=[];async function t(r){let n;try{n=await ut(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 ti(s){try{let e=await Ie(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 Bs(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 si(s,e,t){let[r,n]=await Promise.all([Ie(s,"utf-8"),ti(s)]),o=[];for(let l of r.trim().split(`
21
+ `).filter(Boolean))try{let f=JSON.parse(l);Qs(f)&&o.push(f)}catch{}let a=Bs(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,d=t?.limit;return d!==void 0?a.slice(c,c+d):a.slice(c)}async function oe(s){return R(await Oe(s??process.cwd()))}function le(s,e){return{projectKey:s,sessionId:e}}function ri(s){return s.map(e=>JSON.stringify(e)).join(`
22
+ `)}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 oi(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 ii=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function ai(s){let e=s;for(let t=0;t<10;t+=1){let r=e.normalize("NFKC").replace(ii,"");if(r===e)return r;e=r}return e}var ci=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,ui=/<command-name>(.*?)<\/command-name>/,di=/<bash-input>([\s\S]*?)<\/bash-input>/;function li(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 pi(s,e){if(s.type!=="user"||s.isMeta===!0||s.isCompactSummary===!0)return;let t=s.message;if(!x(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(x(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(`
23
+ `," ").trim();if(!i)continue;let a=ui.exec(i);if(a){e.commandFallback??=a[1];continue}let c=di.exec(i);if(c)return`! ${c[1].trim()}`;if(!ci.test(i))return li(i)}}function dt(s,e,t,r={}){if(e.length===0)return;let n,o,i,a,c,d,l,f,u,p,g;for(let v of e){let y=v;if(g??=y.isSidechain===!0,p===void 0&&typeof y.timestamp=="string"){let T=Date.parse(y.timestamp);Number.isFinite(T)&&(p=T)}if(!n){let T={commandFallback:o};n=pi(y,T),o=T.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"&&(d=y.summary),y.type==="tag"&&(u=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||d||S;if(h)return{sessionId:s,summary:h,lastModified:t??ni(e),fileSize:r.fileSize,customTitle:m,firstPrompt:S,gitBranch:l,cwd:f||r.defaultCwd,tag:u,createdAt:p}}async function Ws(s,e,t){let r=le(await oe(t),e),n=await s.load(r);return n?{key:r,entries:n}:void 0}async function fi(s){if(s?.sessionStore){let d=s.sessionStore;if(!d.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let l=await Oe(s.dir??process.cwd()),f=R(l),u=(await d.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?u.slice(p,p+s.limit):p>0?u.slice(p):u;return(await Promise.allSettled(g.map(async({sessionId:m,mtime:h})=>{let v=await d.load(le(f,m));return v?dt(m,v,h,{defaultCwd:l}):void 0}))).flatMap((m,h)=>{if(m.status==="fulfilled")return m.value?[m.value]:[];let v=g[h];return[{sessionId:v.sessionId,summary:"",lastModified:v.mtime}]})}let e=await j(s),r=(await Promise.all(e.map(async d=>{try{return(await ut(d)).filter(f=>f.endsWith(".jsonl")).map(f=>P(d,f))}catch{return[]}}))).flat(),n=await Promise.all(r.map(Ls)),o=new Map;for(let d of n){if(!d)continue;let l=o.get(d.sessionId);(!l||d.lastModified>l.lastModified)&&o.set(d.sessionId,d)}let i=Array.from(o.values()).sort((d,l)=>l.lastModified-d.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function gi(s,e){if(e?.sessionStore){if(!Q(s))return;let r=await Ws(e.sessionStore,s,e.dir);return r?dt(s,r.entries,oi(r.entries)):void 0}let t=await j(e);for(let r of t){let n=P(r,`${s}.jsonl`),o=await Ls(n);if(o)return o}}async function mi(s,e){if(!Q(s))return[];let t=e?.includeSystemMessages===!0;if(e?.sessionStore){let n=await Ws(e.sessionStore,s,e.dir);if(!n)return[];let o=js(Os(ri(n.entries)));return Us(o.filter(i=>Ks(i,t)).map(Ns),e)}let r=await j(e);for(let n of r){let o=P(n,`${s}.jsonl`);try{let i=await Ie(o,"utf-8"),c=js(Os(i)).filter(d=>Ks(d,t)).map(Ns);return Us(c,e)}catch{continue}}return[]}async function hi(s,e,t){if(!Q(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(le(await oe(t.dir),s),[{type:"custom-title",sessionId:s,customTitle:r,uuid:Fs(),timestamp:new Date().toISOString()}]);return}let n=await j(t);for(let o of n){let i=P(o,`${s}.jsonl`);try{await ne(i);let a=JSON.stringify({type:"custom-title",sessionId:s,customTitle:r,timestamp:new Date().toISOString()});await qs(i,a+`
24
+ `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function yi(s,e,t){if(!Q(s))throw new Error(`Invalid sessionId: ${s}`);let r=e===null?null:ai(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(le(await oe(t.dir),s),[{type:"tag",sessionId:s,tag:r??"",uuid:Fs(),timestamp:new Date().toISOString()}]);return}let n=await j(t);for(let o of n){let i=P(o,`${s}.jsonl`);try{await ne(i);let a=JSON.stringify({type:"tag",sessionId:s,tag:r??"",timestamp:new Date().toISOString()});await qs(i,a+`
25
+ `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function Si(s,e){if(e?.sessionStore){if(!Q(s))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let r=await e.sessionStore.listSubkeys({projectKey:await oe(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 j(e);for(let r of t){let n=P(r,`${s}.jsonl`);try{await ne(n);let o=await Hs(zs(r,s));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function wi(s,e,t){if(t?.sessionStore){if(!Q(s)||!e)return[];let n=await oe(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(Qs),c=i.filter(p=>p.type==="agent_metadata").at(-1),d=typeof c?.toolUseId=="string"?c.toolUseId:null,l=typeof c?.parentAgentId=="string"?c.parentAgentId:null,f=Bs(a).map(p=>({type:p.type,uuid:p.uuid,session_id:p.sessionId??s,message:p.message,parent_tool_use_id:d,parent_agent_id:l})),u=Math.max(0,t.offset??0);return t.limit!==void 0?f.slice(u,u+t.limit):f.slice(u)}let r=await j(t);for(let n of r){let o=P(n,`${s}.jsonl`);try{await ne(o);let a=(await Hs(zs(n,s))).find(c=>c.agentId===e);return a?await si(a.filePath,s,t):[]}catch{continue}}return[]}async function vi(s,e){if(!Q(s))throw new Error(`Invalid sessionId: ${s}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(le(await oe(e.dir),s));return}let t=await j(e);for(let r of t){let n=P(r,`${s}.jsonl`);try{await ne(n),await Promise.all([xs(n,{force:!0}),xs(P(r,s),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${s} not found`)}import{randomUUID as De}from"crypto";import{readdir as ki,readFile as Pi,realpath as bi,stat as Js,writeFile as Ri}from"fs/promises";import{dirname as Ti,join as lt,resolve as Ei}from"path";var Gs=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Mi=new Set(["user","assistant","attachment","system","progress"]);async function Ys(s){let e=Ei(s);try{return await bi(e)}catch{return e}}async function _i(s,e){let t=re();if(e){let n=R(await Ys(e)),o=lt(t,n,`${s}.jsonl`);try{if((await Js(o)).size>0)return o}catch{}return}let r;try{r=await ki(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=lt(t,n.name,`${s}.jsonl`);try{if((await Js(o)).size>0)return o}catch{}}}function Xs(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"&&Mi.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 Ci(s,e){let t=[];for(let r of s.split(`
26
+ `))if(r.trim())try{t.push(JSON.parse(r))}catch{}return Xs(t,e)}function Ai(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(`
27
+ `).trim();if(o)return o}}function xi(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??Ai(s)}function Vs(s,e,t,r){let n=s.transcript.filter(u=>u.isSidechain!==!0);if(n.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let u=n.findIndex(p=>p.uuid===t.upToMessageId);if(u<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);n=n.slice(0,u+1)}let o=new Map(n.map(u=>[u.uuid,De()])),i=n.filter(u=>u.type!=="progress");if(i.length===0)throw new Error(`Session ${e} has no messages to fork`);let a=new Map(n.map(u=>[u.uuid,u])),c=De(),d=new Date().toISOString(),l=i.map((u,p)=>{let g=null,S=typeof u.parentUuid=="string"?u.parentUuid:void 0;for(;S;){let v=a.get(S);if(!v)break;if(v.type!=="progress"){g=o.get(S)??null;break}S=typeof v.parentUuid=="string"?v.parentUuid:void 0}let m=typeof u.logicalParentUuid=="string"?o.get(u.logicalParentUuid)??null:u.logicalParentUuid??null,h={...u,...u.type==="system"&&u.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:o.get(u.uuid),parentUuid:g,logicalParentUuid:m,sessionId:c,timestamp:p===i.length-1?d:typeof u.timestamp=="string"?u.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:u.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:De(),timestamp:d}),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||`${xi(r)??"Forked session"} (fork)`,uuid:De(),timestamp:d}),{sessionId:c,entries:l}}async function Ii(s,e={}){if(!Gs.test(s))throw new Error(`Invalid sessionId: ${s}`);if(e.upToMessageId&&!Gs.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await Ys(e.dir??process.cwd()),a=R(i),c=await e.sessionStore.load({projectKey:a,sessionId:s});if(!c?.length)throw new Error(`Session ${s} not found`);let d=Vs(Xs(c,s),s,e,c);return await e.sessionStore.append({projectKey:a,sessionId:d.sessionId},d.entries),{sessionId:d.sessionId}}let t=await _i(s,e.dir);if(!t)throw new Error(`Session ${s} not found`);let r=await Pi(t,"utf8"),n=r.split(`
28
+ `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Vs(Ci(r,s),s,e,n);return await Ri(lt(Ti(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
29
29
  `)}
30
- `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Ce(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}var at=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let r=Ce(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(Ce(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(Ce(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(Ce(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 Ei}from"fs";import{readdir as Ys,readFile as _i,realpath as Ci,stat as Js}from"fs/promises";import{basename as Gs,dirname as xi,join as ue,relative as Ii,resolve as Ai,sep as Oi}from"path";import{createInterface as Di}from"readline";var ji=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ni=500,Ki=1024*1024;async function Ui(s){let e=Ai(s);try{return await Ci(e)}catch{return e}}async function qi(s,e){let t=ee();if(e){let n=T(await Ui(e)),o=ue(t,n,`${s}.jsonl`);try{if((await Js(o)).size>0)return{filePath:o,projectKey:n}}catch{}return}let r;try{r=await Ys(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=ue(t,n.name,`${s}.jsonl`);try{if((await Js(o)).size>0)return{filePath:o,projectKey:n.name}}catch{}}}async function Fi(s){let e=[];async function t(r){let n;try{n=await Ys(r,{withFileTypes:!0})}catch{return}n.sort((o,i)=>o.name.localeCompare(i.name));for(let o of n){let i=ue(r,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(s),e}async function Vs(s,e,t,r){let n=Di({input:Ei(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(d){console.warn(`importSessionToStore: skipping unparseable line in ${s}: ${String(d)}`);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>=Ki)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function $i(s,e,t={}){if(!ji.test(s))throw new Error(`Invalid sessionId: ${s}`);let r=await qi(s,t.dir);if(!r)throw new Error(`Session ${s} not found`);let n=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Ni;if(await Vs(r.filePath,{projectKey:r.projectKey,sessionId:s},e,n),t.includeSubagents===!1)return;let o=r.filePath.replace(/\.jsonl$/,""),i=ue(o,"subagents");for(let a of await Fi(i)){let d=Ii(o,a).split(Oi);d[d.length-1]=Gs(d[d.length-1],".jsonl");let l={projectKey:r.projectKey,sessionId:s,subpath:d.join("/")};await Vs(a,l,e,n);let f=ue(xi(a),`${Gs(a,".jsonl")}.meta.json`);try{let u=JSON.parse(await _i(f,"utf8"));await e.append(l,[{type:"agent_metadata",...u}])}catch(u){if(typeof u=="object"&&u!==null&&"code"in u&&u.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${f}: ${String(u)}`)}}}import{spawn as Li}from"child_process";async function zi(s){let e=s?.cliPath??de(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let r=await le(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 Qi(s,e){let t=e?.cliPath??de(),r=await le(t,["plugins","enable",s,"--scope","user"],e?.env);r.exitCode!==0&&xe(r)}async function Hi(s,e){let t=e?.cliPath??de(),r=await le(t,["plugins","disable",s,"--scope","user"],e?.env);r.exitCode!==0&&xe(r)}async function Bi(s,e){let t=e?.cliPath??de(),r=await le(t,["plugins","install",s,"--scope","user","--json"],e?.env);r.exitCode!==0&&xe(r);let n=JSON.parse(r.stdout);return{pluginId:n.pluginId,version:n.version??"local",path:n.path}}async function Wi(s,e){let t=e?.cliPath??de(),r=["plugins","uninstall",s,"--scope","user","--json"];e?.keepData&&r.push("--keep-data");let n=await le(t,r,e?.env);n.exitCode!==0&&xe(n);let o=JSON.parse(n.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}function de(){return process.env.QODERCLI_PATH??"qodercli"}var Xs=3e4;function le(s,e,t){return new Promise((r,n)=>{let o=Li(s,e,{env:{...process.env,...t},stdio:["ignore","pipe","pipe"]}),i="",a="",c=!1,d=setTimeout(()=>{c||(c=!0,o.kill("SIGTERM"),n(new Error(`qodercli subprocess timed out after ${Xs}ms`)))},Xs);o.stdout.on("data",l=>{i+=l.toString()}),o.stderr.on("data",l=>{a+=l.toString()}),o.on("error",l=>{c||(c=!0,clearTimeout(d),n(l))}),o.on("close",l=>{c||(c=!0,clearTimeout(d),r({stdout:i,stderr:a,exitCode:l??1}))})})}function xe(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 Ji}from"child_process";import{fileURLToPath as Gi}from"url";import{join as j,dirname as Vi,delimiter as Yi}from"path";import{existsSync as Ie}from"fs";import{homedir as Xi}from"os";var Zi=Gi(import.meta.url),Zs=Vi(Zi);function ea(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let n of er()){let o=j(n,"dist","_bundled",s);if(Ie(o))return o}for(let n of er()){let o=[j(n,"node_modules",".bin",s),j(n,"..","..",".bin",s)];for(let i of o)if(Ie(i))return i}let e=process.env.PATH||"";for(let n of e.split(Yi)){if(!n)continue;let o=j(n,s);if(Ie(o))return o}let t=Xi(),r=[j(t,".qoder","local",s),j(t,".local","bin",s),"/usr/local/bin/qodercli"];for(let n of r)if(Ie(n))return n;throw new Error("qodercli not found. Provide the cliPath option or ensure qodercli is on PATH.")}function er(){let s=[j(Zs,".."),j(Zs,"..","..")];return[...new Set(s)]}async function ta(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??ea(),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=>{Ji(t,n,{env:e?.env??process.env,timeout:r,maxBuffer:1024*1024},(i,a)=>{let c=a.trim();if(c)try{let d=JSON.parse(c);o({success:!!d.success,message:d.success?d.message||"Feedback submitted successfully":d.error||d.message||"Failed to submit feedback",requestId:d.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:c||"Feedback submitted successfully"})})})}var sr={};or(sr,{filterEscalatingDefaultMode:()=>tr});var sa=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function tr(s){let e=s.effective.permissions?.defaultMode;if(!e||!sa.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{F as AbortError,Ts as DEFAULT_ACCESS_TOKEN_ENV_VAR,Fe as DEFAULT_RUNTIME_TRANSPORT,ar as EXIT_REASONS,ir as HOOK_EVENTS,at as InMemorySessionStore,ne as ModelPolicyTimeoutError,W as ProcessTransport,oe as ProtocolVersionMismatchError,B as QoderCliProcessError,q as QoderWorkerRuntimeError,We as WIRE_PROTOCOL_VERSION,G as WorkerTransport,Mo as accessToken,Eo as accessTokenFromEnv,sr as coreTypes,Io as createSdkMcpServer,gi as deleteSession,Hi as disablePlugin,Qi as enablePlugin,tr as filterEscalatingDefaultMode,Mi as forkSession,ci as getSessionInfo,ui as getSessionMessages,fi as getSubagentMessages,on as hasResolvableQoderWorkerRuntime,$i as importSessionToStore,Bi as installPlugin,Co as jobToken,zi as listPlugins,ai as listSessions,pi as listSubagents,_o as qodercliAuth,To as query,di as renameSession,Be as resolveQoderWorkerRuntimePath,ta as submitFeedback,li as tagSession,Ao as tool,Wi as uninstallPlugin};
30
+ `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function je(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}var pt=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let r=je(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(je(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(je(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(je(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 Oi}from"fs";import{readdir as sr,readFile as Di,realpath as ji,stat as Zs}from"fs/promises";import{basename as er,dirname as Ki,join as pe,relative as Ni,resolve as Ui,sep as qi}from"path";import{createInterface as Fi}from"readline";var $i=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Li=500,zi=1024*1024;async function Qi(s){let e=Ui(s);try{return await ji(e)}catch{return e}}async function Hi(s,e){let t=re();if(e){let n=R(await Qi(e)),o=pe(t,n,`${s}.jsonl`);try{if((await Zs(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=pe(t,n.name,`${s}.jsonl`);try{if((await Zs(o)).size>0)return{filePath:o,projectKey:n.name}}catch{}}}async function Bi(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=pe(r,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(s),e}async function tr(s,e,t,r){let n=Fi({input:Oi(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(d){console.warn(`importSessionToStore: skipping unparseable line in ${s}: ${String(d)}`);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>=zi)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function Wi(s,e,t={}){if(!$i.test(s))throw new Error(`Invalid sessionId: ${s}`);let r=await Hi(s,t.dir);if(!r)throw new Error(`Session ${s} not found`);let n=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Li;if(await tr(r.filePath,{projectKey:r.projectKey,sessionId:s},e,n),t.includeSubagents===!1)return;let o=r.filePath.replace(/\.jsonl$/,""),i=pe(o,"subagents");for(let a of await Bi(i)){let d=Ni(o,a).split(qi);d[d.length-1]=er(d[d.length-1],".jsonl");let l={projectKey:r.projectKey,sessionId:s,subpath:d.join("/")};await tr(a,l,e,n);let f=pe(Ki(a),`${er(a,".jsonl")}.meta.json`);try{let u=JSON.parse(await Di(f,"utf8"));await e.append(l,[{type:"agent_metadata",...u}])}catch(u){if(typeof u=="object"&&u!==null&&"code"in u&&u.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${f}: ${String(u)}`)}}}import{spawn as Ji}from"child_process";async function Gi(s){let e=s?.cliPath??fe(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let r=await ge(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 Vi(s,e){let t=e?.cliPath??fe(),r=await ge(t,["plugins","enable",s,"--scope","user"],e?.env);r.exitCode!==0&&Ke(r)}async function Yi(s,e){let t=e?.cliPath??fe(),r=await ge(t,["plugins","disable",s,"--scope","user"],e?.env);r.exitCode!==0&&Ke(r)}async function Xi(s,e){let t=e?.cliPath??fe(),r=await ge(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 Zi(s,e){let t=e?.cliPath??fe(),r=["plugins","uninstall",s,"--scope","user","--json"];e?.keepData&&r.push("--keep-data");let n=await ge(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??[]}}function fe(){return process.env.QODERCLI_PATH??"qodercli"}var rr=3e4;function ge(s,e,t){return new Promise((r,n)=>{let o=Ji(s,e,{env:{...process.env,...t},stdio:["ignore","pipe","pipe"]}),i="",a="",c=!1,d=setTimeout(()=>{c||(c=!0,o.kill("SIGTERM"),n(new Error(`qodercli subprocess timed out after ${rr}ms`)))},rr);o.stdout.on("data",l=>{i+=l.toString()}),o.stderr.on("data",l=>{a+=l.toString()}),o.on("error",l=>{c||(c=!0,clearTimeout(d),n(l))}),o.on("close",l=>{c||(c=!0,clearTimeout(d),r({stdout:i,stderr:a,exitCode:l??1}))})})}function Ke(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 ea}from"child_process";import{fileURLToPath as ta}from"url";import{join as K,dirname as sa,delimiter as ra}from"path";import{existsSync as Ne}from"fs";import{homedir as na}from"os";var oa=ta(import.meta.url),nr=sa(oa);function ia(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let n of or()){let o=K(n,"dist","_bundled",s);if(Ne(o))return o}for(let n of or()){let o=[K(n,"node_modules",".bin",s),K(n,"..","..",".bin",s)];for(let i of o)if(Ne(i))return i}let e=process.env.PATH||"";for(let n of e.split(ra)){if(!n)continue;let o=K(n,s);if(Ne(o))return o}let t=na(),r=[K(t,".qoder","local",s),K(t,".local","bin",s),"/usr/local/bin/qodercli"];for(let n of r)if(Ne(n))return n;throw new Error("qodercli not found. Provide the cliPath option or ensure qodercli is on PATH.")}function or(){let s=[K(nr,".."),K(nr,"..","..")];return[...new Set(s)]}async function aa(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??ia(),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=>{ea(t,n,{env:e?.env??process.env,timeout:r,maxBuffer:1024*1024},(i,a)=>{let c=a.trim();if(c)try{let d=JSON.parse(c);o({success:!!d.success,message:d.success?d.message||"Feedback submitted successfully":d.error||d.message||"Failed to submit feedback",requestId:d.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:c||"Feedback submitted successfully"})})})}var ar={};dr(ar,{filterEscalatingDefaultMode:()=>ir});var ca=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function ir(s){let e=s.effective.permissions?.defaultMode;if(!e||!ca.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{$ as AbortError,Se as AuthAccessTokenEnvVarError,we as AuthServiceAccountEnvVarError,wt as DEFAULT_ACCESS_TOKEN_ENV_VAR,Qe as DEFAULT_RUNTIME_TRANSPORT,ye as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,pr as EXIT_REASONS,lr as HOOK_EVENTS,pt as InMemorySessionStore,ae as ModelPolicyTimeoutError,V as ProcessTransport,ce as ProtocolVersionMismatchError,G as QoderCliProcessError,F as QoderWorkerRuntimeError,Ye as WIRE_PROTOCOL_VERSION,X as WorkerTransport,mr as accessToken,hr as accessTokenFromEnv,ar as coreTypes,No as createSdkMcpServer,vi as deleteSession,Yi as disablePlugin,Vi as enablePlugin,ir as filterEscalatingDefaultMode,Ii as forkSession,gi as getSessionInfo,mi as getSessionMessages,wi as getSubagentMessages,hn as hasResolvableQoderWorkerRuntime,Wi as importSessionToStore,Xi as installPlugin,vr as jobToken,Gi as listPlugins,fi as listSessions,Si as listSubagents,yr as qodercliAuth,jo as query,hi as renameSession,Ve as resolveQoderWorkerRuntimePath,Sr as serviceAccount,wr as serviceAccountFromEnv,aa as submitFeedback,yi as tagSession,Uo as tool,Zi as uninstallPlugin};
@@ -43,6 +43,12 @@ export type BetaUsage = {
43
43
  } | null;
44
44
  service_tier?: string | null;
45
45
  speed?: string | null;
46
+ /** Qoder request-level metering value after discounts. */
47
+ credits?: number;
48
+ /** Qoder request-level metering value before discounts. */
49
+ original_credits?: number;
50
+ /** Whether the request contributes to the user's billed usage. */
51
+ billable?: boolean;
46
52
  };
47
53
  export type BetaMessage = {
48
54
  id?: string;
@@ -102,6 +108,12 @@ export type NonNullableUsage = {
102
108
  request_id?: string;
103
109
  /** Context window usage ratio for the completed turn (0~1). */
104
110
  context_usage_ratio?: number;
111
+ /** Qoder request-level metering value after discounts. */
112
+ credits?: number;
113
+ /** Qoder request-level metering value before discounts. */
114
+ original_credits?: number;
115
+ /** Whether the request contributes to the user's billed usage. */
116
+ billable?: boolean;
105
117
  };
106
118
  export type AccountInfo = {
107
119
  userId?: string;
@@ -132,6 +144,12 @@ export type UsageOrgResourcePackage = {
132
144
  available?: boolean;
133
145
  unit?: string;
134
146
  };
147
+ export type SessionCreditsUsage = {
148
+ total_credits: number;
149
+ model_usage: Record<string, {
150
+ credits: number;
151
+ }>;
152
+ };
135
153
  export type UsageInfo = {
136
154
  userId?: string;
137
155
  userType?: string;
@@ -144,6 +162,13 @@ export type UsageInfo = {
144
162
  isQuotaExceeded?: boolean;
145
163
  isPlanQuotaProrated?: boolean;
146
164
  orgResourcePackage?: UsageOrgResourcePackage;
165
+ /**
166
+ * Credits consumed by the current CLI session.
167
+ *
168
+ * This is independent from the account quota fields above and may be present
169
+ * even when the account quota endpoint is unavailable.
170
+ */
171
+ session?: SessionCreditsUsage;
147
172
  };
148
173
  export type ApiKeySource = 'none' | 'user' | 'project' | 'org' | 'temporary' | 'oauth';
149
174
  export type ExitReason = 'clear' | 'resume' | 'logout' | 'prompt_input_exit' | 'other' | 'bypass_permissions_disabled';
@@ -336,6 +361,8 @@ export type ModelUsage = {
336
361
  cacheCreationInputTokens: number;
337
362
  webSearchRequests: number;
338
363
  costUSD: number;
364
+ /** Session-cumulative Qoder credits attributed to this model. */
365
+ credits?: number;
339
366
  contextWindow: number;
340
367
  maxOutputTokens: number;
341
368
  };
@@ -17,7 +17,7 @@ import type { McpServerStatus, McpSetServersResult, McpServerConfigForCliTranspo
17
17
  import type { PermissionMode, PermissionUpdate } from './permissions.js';
18
18
  import type { SDKMessage } from './messages.js';
19
19
  import type { AgentDefinition, AgentInfo } from './agents.js';
20
- import type { AccountInfo, FastModeState, ModelInfo, SlashCommand, SdkPluginConfig, UsageInfo } from './common.js';
20
+ import type { AccountInfo, FastModeState, ModelInfo, SessionCreditsUsage, SlashCommand, SdkPluginConfig, UsageInfo } from './common.js';
21
21
  import type { PluginDetails } from '../types/plugins.js';
22
22
  import type { ModelPromptPatches } from './model-prompt-patches.js';
23
23
  export type SDKControlRequest = {
@@ -247,6 +247,10 @@ export type SDKControlGetUsageInfoRequest = {
247
247
  };
248
248
  export type SDKControlGetUsageInfoResponse = {
249
249
  usage: UsageInfo | null;
250
+ /** Session-local credits, independent from account quota availability. */
251
+ session?: SessionCreditsUsage;
252
+ /** Account quota lookup failure; session credits may still be available. */
253
+ usage_error?: string;
250
254
  };
251
255
  export type SDKControlAccountInfoRequest = {
252
256
  type: 'account_info';
@@ -14,7 +14,7 @@
14
14
  */
15
15
  export { WIRE_PROTOCOL_VERSION, type WireProtocolVersion } from './version.js';
16
16
  export type { ModelPromptPatch, ModelPromptPatches, } from './model-prompt-patches.js';
17
- export type { UUID, BetaMessage, BetaRawMessageStreamEvent, BetaUsage, BetaStopReason, MessageParam, NonNullableUsage, AccountInfo, UsageAddOnQuotaBucket, UsageInfo, UsageOrgResourcePackage, UsageQuotaBucket, ApiKeySource, ExitReason, FastModeState, ConfigScope, SettingSource, SDKAssistantMessageError, SDKStatus, EffortLevel, ThinkingAdaptive, ThinkingEnabled, ThinkingDisabled, ThinkingConfig, ModelInfo, ModelSource, ServerModelJson, ServerModelJsonValue, ModelStrategy, ModelPromotion, LocalizedModelText, ModelContextConfig, ModelContextWindowEntry, ModelEffortEntry, ModelThinkingConfig, ModelThinkingDisabled, ModelThinkingEnabled, PluginInfo, ModelUsage, SlashCommand, ToolConfig, SdkPluginConfig, } from './common.js';
17
+ export type { UUID, BetaMessage, BetaRawMessageStreamEvent, BetaUsage, BetaStopReason, MessageParam, NonNullableUsage, AccountInfo, UsageAddOnQuotaBucket, UsageInfo, UsageOrgResourcePackage, UsageQuotaBucket, SessionCreditsUsage, ApiKeySource, ExitReason, FastModeState, ConfigScope, SettingSource, SDKAssistantMessageError, SDKStatus, EffortLevel, ThinkingAdaptive, ThinkingEnabled, ThinkingDisabled, ThinkingConfig, ModelInfo, ModelSource, ServerModelJson, ServerModelJsonValue, ModelStrategy, ModelPromotion, LocalizedModelText, ModelContextConfig, ModelContextWindowEntry, ModelEffortEntry, ModelThinkingConfig, ModelThinkingDisabled, ModelThinkingEnabled, PluginInfo, ModelUsage, SlashCommand, ToolConfig, SdkPluginConfig, } from './common.js';
18
18
  export type { AICodeTrackingLaunchOptions, QoderAgentLaunchOptions, QoderCliFlagSettings, } from './launch.js';
19
19
  export { buildQoderCliFlagSettings, buildQoderCliFlagSettingsArgs, } from './launch.js';
20
20
  export type { PermissionMode, PermissionBehavior, PermissionDecisionClassification, PermissionUpdateDestination, PermissionRuleValue, PermissionUpdate, PermissionResult, } from './permissions.js';
@@ -1 +1 @@
1
- var r="1.1.0";function i(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function s(e={}){let t={...e.settings??{}},o=e.aiCodeTracking?.installGitCommitHook;if(o!==void 0){let n=t.aiCodeTracking;t.aiCodeTracking={...i(n)?n:{},installGitCommitHook:o}}return t}function l(e={}){let t=s(e);return Object.keys(t).length===0?[]:["--settings",JSON.stringify(t)]}var p={Main:"main",Plan:"plan",Task:"task",Compact:"compact",Title:"title",Suggestion:"suggestion",Generate:"generate",HookPrompt:"hook_prompt",Subagent:"subagent",WebFetch:"web_fetch",ImageGen:"image_gen",Compression:"compression",Utility:"utility"};export{p as QoderModelPurpose,r as WIRE_PROTOCOL_VERSION,s as buildQoderCliFlagSettings,l as buildQoderCliFlagSettingsArgs};
1
+ var r="1.1.0";function i(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function n(e={}){let t={...e.settings??{}},o=e.aiCodeTracking?.installGitCommitHook;if(o!==void 0){let s=t.aiCodeTracking;t.aiCodeTracking={...i(s)?s:{},installGitCommitHook:o}}return t}function l(e={}){let t=n(e);return Object.keys(t).length===0?[]:["--settings",JSON.stringify(t)]}var p={Main:"main",Plan:"plan",Task:"task",Compact:"compact",Title:"title",Suggestion:"suggestion",Generate:"generate",HookPrompt:"hook_prompt",Subagent:"subagent",WebFetch:"web_fetch",ImageGen:"image_gen",Compression:"compression",Utility:"utility"};export{p as QoderModelPurpose,r as WIRE_PROTOCOL_VERSION,n as buildQoderCliFlagSettings,l as buildQoderCliFlagSettingsArgs};
@@ -81,6 +81,8 @@ export type SDKResultSuccess = {
81
81
  result: string;
82
82
  stop_reason: string | null;
83
83
  total_cost_usd: number;
84
+ /** Session-cumulative Qoder credits. Added by newer CLI versions. */
85
+ total_credits?: number;
84
86
  usage: NonNullableUsage;
85
87
  modelUsage: Record<string, ModelUsage>;
86
88
  permission_denials: SDKPermissionDenial[];
@@ -100,6 +102,8 @@ export type SDKResultError = {
100
102
  num_turns: number;
101
103
  stop_reason: string | null;
102
104
  total_cost_usd: number;
105
+ /** Session-cumulative Qoder credits. Added by newer CLI versions. */
106
+ total_credits?: number;
103
107
  usage: NonNullableUsage;
104
108
  modelUsage: Record<string, ModelUsage>;
105
109
  permission_denials: SDKPermissionDenial[];
@@ -25,7 +25,7 @@ import type { ModelPromptPatches } from '../protocol/model-prompt-patches.js';
25
25
  import type { Transport } from '../core/transport.js';
26
26
  import type { SDKMessage, SDKUserMessage } from '../types/messages.js';
27
27
  import type { InternalQuery, OnElicitation } from '../types/options.js';
28
- import type { FetchJobToken } from '../types/auth.js';
28
+ import type { FetchJobToken, FetchServiceAccountToken } from '../types/auth.js';
29
29
  import type { SDKControlInterruptResponse, SDKControlInitializeResponse, SDKControlGetContextUsageResponse, SDKControlGenerateSessionTitleResponse, SDKControlAddDirectoriesResponse, SDKControlReloadPluginsResponse } from '../types/control.js';
30
30
  import type { PermissionMode, CanUseTool } from '../types/permissions.js';
31
31
  import type { HookCallbackMatcher } from '../types/hooks.js';
@@ -71,6 +71,7 @@ export declare class QueryRunner implements InternalQuery {
71
71
  private readonly onElicitation?;
72
72
  private readonly onAuthExpired?;
73
73
  private readonly fetchJobToken?;
74
+ private readonly fetchServiceAccountToken?;
74
75
  private readonly diagnostics?;
75
76
  private readonly controlRequestTimeoutMs;
76
77
  private readonly resolveModel?;
@@ -85,7 +86,7 @@ export declare class QueryRunner implements InternalQuery {
85
86
  private protocolHandshakeValidated;
86
87
  private firstResultReceived;
87
88
  private firstResultReceivedResolve?;
88
- constructor(transport: Transport, isSingleTurn: boolean, canUseTool?: CanUseTool, hooks?: Partial<Record<InternalHookEvent, HookCallbackMatcher[]>>, abortController?: AbortController, sdkMcpServers?: Map<string, McpServer>, initConfig?: InitConfig, onElicitation?: OnElicitation, diagnostics?: DiagnosticsSink, onAuthExpired?: () => void, controlRequestTimeoutMs?: number, sdkMcpTransports?: Map<string, SdkMcpTransport>, pendingMcpResponses?: Map<string, PendingMcpResponse>, fetchJobToken?: FetchJobToken, resolveModel?: ModelPolicyProvider, resolveModelTimeoutMs?: number, sessionStore?: SessionStore, sessionStoreFlush?: SessionStoreFlush, sdkMcpToolOverrides?: Record<string, Record<string, McpToolRuntimeOverride>>);
89
+ constructor(transport: Transport, isSingleTurn: boolean, canUseTool?: CanUseTool, hooks?: Partial<Record<InternalHookEvent, HookCallbackMatcher[]>>, abortController?: AbortController, sdkMcpServers?: Map<string, McpServer>, initConfig?: InitConfig, onElicitation?: OnElicitation, diagnostics?: DiagnosticsSink, onAuthExpired?: () => void, controlRequestTimeoutMs?: number, sdkMcpTransports?: Map<string, SdkMcpTransport>, pendingMcpResponses?: Map<string, PendingMcpResponse>, fetchJobToken?: FetchJobToken, resolveModel?: ModelPolicyProvider, resolveModelTimeoutMs?: number, sessionStore?: SessionStore, sessionStoreFlush?: SessionStoreFlush, sdkMcpToolOverrides?: Record<string, Record<string, McpToolRuntimeOverride>>, fetchServiceAccountToken?: FetchServiceAccountToken);
89
90
  private getRecord;
90
91
  private normalizeLogPreview;
91
92
  private extractMessagePreview;
@@ -107,6 +108,7 @@ export declare class QueryRunner implements InternalQuery {
107
108
  * this method finishes and signals the consumer queue.
108
109
  */
109
110
  private readMessages;
111
+ private notifyAuthExpiredIfNeeded;
110
112
  /**
111
113
  * Send a control request to the CLI and wait for the response.
112
114
  *
@@ -9,12 +9,31 @@
9
9
  export type AccessTokenInput = string | {
10
10
  envVar: string;
11
11
  };
12
+ export type ServiceAccountKeyInput = string | {
13
+ envVar: string;
14
+ };
15
+ export type ServiceAccountTokenResult = {
16
+ token: string;
17
+ /** Absolute expiration time as a Unix timestamp in milliseconds. */
18
+ expiresAt?: number;
19
+ };
20
+ export type FetchServiceAccountToken = () => Promise<ServiceAccountTokenResult | null>;
21
+ export type ServiceAccountCredentials = {
22
+ serviceAccountKey: ServiceAccountKeyInput;
23
+ fetchServiceAccountToken?: never;
24
+ } | {
25
+ serviceAccountKey?: never;
26
+ fetchServiceAccountToken: FetchServiceAccountToken;
27
+ };
28
+ export type ServiceAccountAuthOptions = {
29
+ type: 'serviceAccount';
30
+ } & ServiceAccountCredentials;
12
31
  export type AuthOptions = {
13
32
  type: 'accessToken';
14
33
  accessToken: AccessTokenInput;
15
34
  } | {
16
35
  type: 'qodercli';
17
- };
36
+ } | ServiceAccountAuthOptions;
18
37
  export type JobTokenRequest = {
19
38
  requestId: string;
20
39
  reason: 'initial' | 'unauthorized';
@@ -47,5 +66,11 @@ export type SdkAuthPayload = {
47
66
  type: 'qodercli';
48
67
  } | {
49
68
  type: 'jobToken';
50
- hostTokenCallback: true;
69
+ jobTokenProvider: 'host';
70
+ } | {
71
+ type: 'serviceAccount';
72
+ serviceAccountKey: string;
73
+ } | {
74
+ type: 'serviceAccount';
75
+ serviceAccountTokenProvider: 'host';
51
76
  };
@@ -5,4 +5,4 @@
5
5
  * shim so existing SDK consumer imports (`'./types/common.js'` paths)
6
6
  * keep working.
7
7
  */
8
- export type { UUID, BetaMessage, BetaRawMessageStreamEvent, BetaUsage, BetaStopReason, MessageParam, NonNullableUsage, AccountInfo, UsageAddOnQuotaBucket, UsageInfo, UsageOrgResourcePackage, UsageQuotaBucket, ApiKeySource, ExitReason, FastModeState, ConfigScope, SettingSource, SDKAssistantMessageError, SDKStatus, EffortLevel, ThinkingAdaptive, ThinkingEnabled, ThinkingDisabled, ThinkingConfig, ModelInfo, ModelSource, ServerModelJson, ServerModelJsonValue, ModelStrategy, ModelPromotion, LocalizedModelText, ModelContextConfig, ModelContextWindowEntry, ModelEffortEntry, ModelThinkingConfig, ModelThinkingDisabled, ModelThinkingEnabled, PluginInfo, ModelUsage, SlashCommand, ToolConfig, SdkPluginConfig, } from '../protocol/index.js';
8
+ export type { UUID, BetaMessage, BetaRawMessageStreamEvent, BetaUsage, BetaStopReason, MessageParam, NonNullableUsage, AccountInfo, UsageAddOnQuotaBucket, UsageInfo, UsageOrgResourcePackage, UsageQuotaBucket, SessionCreditsUsage, ApiKeySource, ExitReason, FastModeState, ConfigScope, SettingSource, SDKAssistantMessageError, SDKStatus, EffortLevel, ThinkingAdaptive, ThinkingEnabled, ThinkingDisabled, ThinkingConfig, ModelInfo, ModelSource, ServerModelJson, ServerModelJsonValue, ModelStrategy, ModelPromotion, LocalizedModelText, ModelContextConfig, ModelContextWindowEntry, ModelEffortEntry, ModelThinkingConfig, ModelThinkingDisabled, ModelThinkingEnabled, PluginInfo, ModelUsage, SlashCommand, ToolConfig, SdkPluginConfig, } from '../protocol/index.js';
@@ -15,4 +15,16 @@ export type FetchJobTokenWireRequest = {
15
15
  /** Wire format for fetch_job_token success response. */
16
16
  export type FetchJobTokenWireResponse = {
17
17
  token: string;
18
+ };
19
+ /** Wire format for Service Account token requests sent by qodercli. */
20
+ export type FetchServiceAccountTokenWireRequest = {
21
+ subtype: 'fetch_service_account_token';
22
+ reason: 'initial' | 'expiring' | 'unauthorized';
23
+ required_scopes: string[];
24
+ session_id?: string;
25
+ };
26
+ /** Wire format for successful Service Account token responses. */
27
+ export type FetchServiceAccountTokenWireResponse = {
28
+ token: string;
29
+ expires_at?: number;
18
30
  };
@@ -21,4 +21,4 @@ export * from './cloud-agent.js';
21
21
  export * from './control.js';
22
22
  export * from './model-policy-provider.js';
23
23
  export * from './tools.js';
24
- export type { AccessTokenInput, AuthOptions, FetchJobToken, JobTokenAuthOptions, JobTokenRequest, JobTokenResult, } from './auth.js';
24
+ export type { AccessTokenInput, AuthOptions, FetchServiceAccountToken, FetchJobToken, JobTokenAuthOptions, JobTokenRequest, JobTokenResult, ServiceAccountAuthOptions, ServiceAccountCredentials, ServiceAccountKeyInput, ServiceAccountTokenResult, } from './auth.js';
@@ -66,6 +66,12 @@ export type Options = {
66
66
  * Prefer the `accessTokenFromEnv()` helper in host code.
67
67
  * - `{ type: 'qodercli' }` - Read-only reuse of local `qodercli login`
68
68
  * state. Prefer the `qodercliAuth()` helper in host code.
69
+ * - `{ type: 'serviceAccount', serviceAccountKey }` - Exchange a Service
70
+ * Account key for short-lived model access. Prefer `serviceAccount()` or
71
+ * `serviceAccountFromEnv()`.
72
+ * - `{ type: 'serviceAccount', fetchServiceAccountToken }` - Let the host
73
+ * supply and refresh short-lived Service Account tokens through
74
+ * `serviceAccount()`.
69
75
  * - `{ type: 'jobToken', fetchJobToken }` - Internal first-party host
70
76
  * integration. Prefer the `jobToken(fetchJobToken)` helper in host code.
71
77
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qoder-ai/qoder-agent-sdk",
3
- "version": "1.0.16",
3
+ "version": "1.0.17",
4
4
  "description": "TypeScript SDK for building Qoder-powered coding agents.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -51,6 +51,7 @@
51
51
  "demo:minimal": "npm run demo:chat",
52
52
  "demo:image": "node examples/image-input-demo/demo.mjs",
53
53
  "demo:models": "npm run build && node examples/list-models-demo/demo.mjs",
54
+ "demo:service-account-token": "npm run build && node examples/service-account-token-demo/demo.mjs",
54
55
  "demo:usage": "npm run build && node examples/usage-info-demo/demo.mjs",
55
56
  "demo:steer-control": "npm run build && node examples/steer-control-demo/demo.mjs",
56
57
  "demo:chat": "npm run build && node examples/interactive-chat-demo/demo.mjs",
@@ -102,6 +103,6 @@
102
103
  "typescript": "^5.7.0",
103
104
  "zod": "^4.0.0"
104
105
  },
105
- "qoderCliVersion": "1.1.7",
106
+ "qoderCliVersion": "1.1.11",
106
107
  "license": "SEE LICENSE IN LICENSE"
107
108
  }