@qoder-ai/qoder-agent-sdk 1.0.37 → 1.0.38

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.
@@ -1,4 +1,4 @@
1
- import type { PluginDetails, InstallPluginResult, PluginToggleOptions, PluginValidationReport, ValidatePluginOptions, UninstallPluginResult } from '../types/plugins.js';
1
+ import type { PluginDetails, InstallPluginOptions, InstallPluginResult, PluginToggleOptions, PluginValidationReport, ValidatePluginOptions, UninstallPluginOptions, UninstallPluginResult } from '../types/plugins.js';
2
2
  export declare function listPlugins(opts?: {
3
3
  orgId?: string;
4
4
  cliPath?: string;
@@ -6,15 +6,8 @@ export declare function listPlugins(opts?: {
6
6
  }): Promise<PluginDetails[]>;
7
7
  export declare function enablePlugin(id: string, opts?: PluginToggleOptions): Promise<void>;
8
8
  export declare function disablePlugin(id: string, opts?: PluginToggleOptions): Promise<void>;
9
- export declare function installPlugin(path: string, opts?: {
10
- cliPath?: string;
11
- env?: Record<string, string>;
12
- }): Promise<InstallPluginResult>;
13
- export declare function uninstallPlugin(id: string, opts?: {
14
- keepData?: boolean;
15
- cliPath?: string;
16
- env?: Record<string, string>;
17
- }): Promise<UninstallPluginResult>;
9
+ export declare function installPlugin(path: string, opts?: InstallPluginOptions): Promise<InstallPluginResult>;
10
+ export declare function uninstallPlugin(id: string, opts?: UninstallPluginOptions): Promise<UninstallPluginResult>;
18
11
  /**
19
12
  * Statically validate a local plugin without creating a session or executing
20
13
  * plugin hooks, MCP servers, or binaries. Invalid plugin content is returned
package/dist/index.d.ts CHANGED
@@ -74,7 +74,7 @@ export { importSessionToStore } from './session/session-import.js';
74
74
  export type { ImportSessionToStoreOptions } from './session/session-import.js';
75
75
  export type { SessionKey, SessionStore, SessionStoreEntry, SessionStoreFlush, } from './session/session-store.js';
76
76
  export { listPlugins, enablePlugin, disablePlugin, installPlugin, uninstallPlugin, validatePlugin, } from './global/plugins.js';
77
- export type { PluginScope, PluginToggleOptions, PluginDetails, PluginResources, InstallPluginResult, UninstallPluginResult, PluginValidationSeverity, PluginValidationPhase, PluginValidationPosition, PluginValidationLocation, PluginValidationDiagnostic, PluginValidationReport, ValidatePluginOptions, } from './types/plugins.js';
77
+ export type { PluginScope, PluginToggleOptions, InstallPluginOptions, UninstallPluginOptions, PluginDetails, PluginResources, InstallPluginResult, UninstallPluginResult, PluginValidationSeverity, PluginValidationPhase, PluginValidationPosition, PluginValidationLocation, PluginValidationDiagnostic, PluginValidationReport, ValidatePluginOptions, } from './types/plugins.js';
78
78
  export { submitFeedback } from './feedback.js';
79
79
  export type { SubmitFeedbackParams, SubmitFeedbackOptions, IntegrationMode, } from './feedback.js';
80
80
  export { AbortError, ControlRequestError, ModelPolicyTimeoutError, ProtocolVersionMismatchError, UnsupportedCliCapabilityError, } from './core/errors.js';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var io=Object.defineProperty;var ao=(n,e)=>{for(var t in e)io(n,t,{get:e[t],enumerable:!0})};import{spawn as Lo}from"child_process";import{createInterface as Bo}from"readline";var uo=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],co=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Je=2e3,On=5e3;var Ve="1.0.37";var he=41,In=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],An=["TaskCreate","TaskGet","TaskUpdate","TaskList"],lo="QODER_FEATURE_TASKS";function Dn(n){let e=n[lo];if(e!=="0"&&e!=="false")return[...In];let t=new Set(An);return In.flatMap(s=>s===An[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Kn,mkdtemp as ko,rm as Un,writeFile as _o}from"fs/promises";import{existsSync as et,mkdtempSync as Ro,readFileSync as Eo,rmSync as Co,writeFileSync as Po}from"fs";import{homedir as To,tmpdir as Ln}from"os";import{dirname as Hn,join as L}from"path";import{fileURLToPath as Mo}from"url";var po=/^[A-Za-z0-9_-]{1,64}$/,mo=new Set(["mcp_list","mcp_get","mcp_call"]);function Tt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!po.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(mo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Mt(n,e){let t={};for(let s of e)Tt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function It(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Mt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function xn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=It(t,s,r)}return e}var fo="global",Nn=fo==="cn",go=Nn?"QODERCN_":"QODER_",At=`${go}VPC_ENDPOINT`,v=Nn?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var qn=v.accessTokenEnv,Ye=v.serviceAccountEnv;function ho(n){return{type:"accessToken",accessToken:n}}function yo(n=qn){return{type:"accessToken",accessToken:{envVar:n}}}function So(){return{type:"qodercli"}}function wo(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function vo(n=Ye){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function bo(n){return{type:"jobToken",fetchJobToken:n}}var jn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Fn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(jn),t=Object.keys(n).filter(s=>!e.has(s));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let s of jn){let r=n[s];if(r!==void 0&&typeof r!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var Bn="QODER_AGENT_SDK_ENTRYPOINT",$n="QODER_AGENT_SDK_VERSION",zn="QODER_SDK_AUTH_PAYLOAD_FILE",Io="sdk-ts",Ao=Mo(import.meta.url),Qn=Hn(Ao),Xe=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},Ze=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function tt(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function H(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Oo();if(n)return n;let e=Do();if(et(e))return e;let t=xo();return t||v.cliCommands[0]}function Oo(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,"dist","_bundled",t);if(et(s))return s}return null}function Do(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[L(n,"node_modules",".bin",t),L(n,"..","..",".bin",t)];for(let r of s)if(et(r))return r}return v.cliCommands[0]}function xo(){let n=process.env[v.cliHomeEnv]??To();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,v.configDirName,"local",t);if(et(s))return s}return null}function Jn(){let n=[L(Qn,".."),L(Qn,"..","..")];return[...new Set(n)]}function No(){return{allow:[],ask:[],deny:[]}}function Gn(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function qo(n,e){if(e.startsWith("mcp__"))return e;let t=Gn(n),s=e==="*"?"*":Gn(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function Wn(n,e){if(e.length===0)return;let t=new Set(n);for(let s of e)t.has(s)||(n.push(s),t.add(s))}function jo(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var G=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Co(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupLaunchArtifacts(){this.cleanupGeneratedSettings(),await this.cleanupAuthPayload()}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Hn(this.authPayloadPath);try{await Un(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);delete t[Bn],delete t[$n],delete t[zn];for(let s of this.serviceAccountCredentialEnvVars())Fo(t,s);if(t[Bn]=Io,t[$n]=Ve,this.authPayloadPath&&(t[zn]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[At]=s:delete t[At]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Ye];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Dn(t.env??process.env);if(Array.isArray(s)?e.push("--tools",s.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let r=this.buildSettingsArg();if(r!==void 0&&e.push("--settings",r),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let s={...e??{}};this.applySettingsCompatibility(s),this.applyAdditionalDirectories(s),this.applyMcpPolicyRules(s,t),this.applySecurityScanSetting(s);let r=this.applyFileCheckpointingSetting(s);return Object.keys(r).length>0?JSON.stringify(r):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?jo(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Fn(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},r=this.toQoderDefaultPermissionMode(t.defaultMode);r!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=r),e.general=s}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},r=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];Wn(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=It(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=No(),t=new Map;for(let[s,r]of Object.entries(this.options.mcpToolPolicies??{}))r.length>0&&t.set(s,r);for(let[s,r]of Object.entries(this.options.mcpServers??{})){let o=r.tools;Array.isArray(o)&&o.length>0&&t.set(s,[...t.get(s)??[],...o])}for(let[s,r]of t)for(let o of r){let i=qo(s,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=s;for(let r of["allow","ask","deny"]){let o=Array.isArray(s[r])?[...s[r]]:[];Wn(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Eo(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Ro(L(Ln(),"qoder-agent-sdk-settings-"));let t=L(this.generatedSettingsDir,"settings.json");return Po(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await ko(L(Ln(),"qoder-sdk-auth-"));try{await Kn(s,448);let r=L(s,"payload.json");return await _o(r,JSON.stringify(t),{mode:384}),await Kn(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await Un(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Ze(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Xe(t);return s}};function Fo(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function nt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var Ko=new Set(["--mcp-config","--proxy","--settings"]);function st(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),Ko.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as Uo}from"node:stream";var B=16*1024*1024,Oe=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},J=class extends Uo{constructor(t=B,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ye(n,e=B,t="JSONL output"){let s=n.endsWith(`
1
+ var io=Object.defineProperty;var ao=(n,e)=>{for(var t in e)io(n,t,{get:e[t],enumerable:!0})};import{spawn as Lo}from"child_process";import{createInterface as Bo}from"readline";var uo=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],co=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Je=2e3,On=5e3;var Ve="1.0.38";var he=41,In=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],An=["TaskCreate","TaskGet","TaskUpdate","TaskList"],lo="QODER_FEATURE_TASKS";function Dn(n){let e=n[lo];if(e!=="0"&&e!=="false")return[...In];let t=new Set(An);return In.flatMap(s=>s===An[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Kn,mkdtemp as ko,rm as Un,writeFile as _o}from"fs/promises";import{existsSync as et,mkdtempSync as Ro,readFileSync as Eo,rmSync as Co,writeFileSync as Po}from"fs";import{homedir as To,tmpdir as Ln}from"os";import{dirname as Hn,join as L}from"path";import{fileURLToPath as Mo}from"url";var po=/^[A-Za-z0-9_-]{1,64}$/,mo=new Set(["mcp_list","mcp_get","mcp_call"]);function Tt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!po.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(mo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Mt(n,e){let t={};for(let s of e)Tt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function It(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Mt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function xn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=It(t,s,r)}return e}var fo="global",Nn=fo==="cn",go=Nn?"QODERCN_":"QODER_",At=`${go}VPC_ENDPOINT`,v=Nn?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var qn=v.accessTokenEnv,Ye=v.serviceAccountEnv;function ho(n){return{type:"accessToken",accessToken:n}}function yo(n=qn){return{type:"accessToken",accessToken:{envVar:n}}}function So(){return{type:"qodercli"}}function wo(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function vo(n=Ye){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function bo(n){return{type:"jobToken",fetchJobToken:n}}var jn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Fn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(jn),t=Object.keys(n).filter(s=>!e.has(s));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let s of jn){let r=n[s];if(r!==void 0&&typeof r!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var Bn="QODER_AGENT_SDK_ENTRYPOINT",$n="QODER_AGENT_SDK_VERSION",zn="QODER_SDK_AUTH_PAYLOAD_FILE",Io="sdk-ts",Ao=Mo(import.meta.url),Qn=Hn(Ao),Xe=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},Ze=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function tt(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function H(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Oo();if(n)return n;let e=Do();if(et(e))return e;let t=xo();return t||v.cliCommands[0]}function Oo(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,"dist","_bundled",t);if(et(s))return s}return null}function Do(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[L(n,"node_modules",".bin",t),L(n,"..","..",".bin",t)];for(let r of s)if(et(r))return r}return v.cliCommands[0]}function xo(){let n=process.env[v.cliHomeEnv]??To();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,v.configDirName,"local",t);if(et(s))return s}return null}function Jn(){let n=[L(Qn,".."),L(Qn,"..","..")];return[...new Set(n)]}function No(){return{allow:[],ask:[],deny:[]}}function Gn(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function qo(n,e){if(e.startsWith("mcp__"))return e;let t=Gn(n),s=e==="*"?"*":Gn(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function Wn(n,e){if(e.length===0)return;let t=new Set(n);for(let s of e)t.has(s)||(n.push(s),t.add(s))}function jo(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var G=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Co(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupLaunchArtifacts(){this.cleanupGeneratedSettings(),await this.cleanupAuthPayload()}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Hn(this.authPayloadPath);try{await Un(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);delete t[Bn],delete t[$n],delete t[zn];for(let s of this.serviceAccountCredentialEnvVars())Fo(t,s);if(t[Bn]=Io,t[$n]=Ve,this.authPayloadPath&&(t[zn]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[At]=s:delete t[At]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Ye];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Dn(t.env??process.env);if(Array.isArray(s)?e.push("--tools",s.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let r=this.buildSettingsArg();if(r!==void 0&&e.push("--settings",r),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let s={...e??{}};this.applySettingsCompatibility(s),this.applyAdditionalDirectories(s),this.applyMcpPolicyRules(s,t),this.applySecurityScanSetting(s);let r=this.applyFileCheckpointingSetting(s);return Object.keys(r).length>0?JSON.stringify(r):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?jo(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Fn(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},r=this.toQoderDefaultPermissionMode(t.defaultMode);r!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=r),e.general=s}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},r=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];Wn(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=It(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=No(),t=new Map;for(let[s,r]of Object.entries(this.options.mcpToolPolicies??{}))r.length>0&&t.set(s,r);for(let[s,r]of Object.entries(this.options.mcpServers??{})){let o=r.tools;Array.isArray(o)&&o.length>0&&t.set(s,[...t.get(s)??[],...o])}for(let[s,r]of t)for(let o of r){let i=qo(s,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=s;for(let r of["allow","ask","deny"]){let o=Array.isArray(s[r])?[...s[r]]:[];Wn(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Eo(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Ro(L(Ln(),"qoder-agent-sdk-settings-"));let t=L(this.generatedSettingsDir,"settings.json");return Po(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await ko(L(Ln(),"qoder-sdk-auth-"));try{await Kn(s,448);let r=L(s,"payload.json");return await _o(r,JSON.stringify(t),{mode:384}),await Kn(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await Un(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Ze(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Xe(t);return s}};function Fo(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function nt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var Ko=new Set(["--mcp-config","--proxy","--settings"]);function st(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),Ko.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as Uo}from"node:stream";var B=16*1024*1024,Oe=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},J=class extends Uo{constructor(t=B,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ye(n,e=B,t="JSONL output"){let s=n.endsWith(`
2
2
  `)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new Oe(t,e)}var Vn=8192,I=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},Se=class n{static default=new n;process=null;customHandle=null;options;ready=!1;closed=!1;shutdownStarted=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;processStopped=!1;closeTimer;killTimer;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new G(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(nt(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupLaunchArtifacts();return}let s=e.env,{command:r,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${r} ${st(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:r,args:o,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,this.observeProcess(i)}else this.process=Lo(r,o,{cwd:this.options.cwd,env:s,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.observeProcess(this.process),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!this.closed&&!this.shutdownStarted&&!this.processStopped,this.flushPendingInput()}catch(e){throw this.process||this.customHandle?this.shutdownProcess():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
3
3
  `)?e:e+`
4
4
  `;if(ye(t,B,"SDK process input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=new J(B,"SDK process output");e.pipe(t);let s=Bo({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){this.closed||(this.closed=!0,this.shutdownProcess())}shutdownProcess(){if(this.shutdownStarted)return;this.shutdownStarted=!0,this.ready=!1,this.pendingInput=[];let e=this.process??this.customHandle;if(!e)return;if(this.hasProcessStopped()){this.finishProcess();return}if(this.endInput(),this.hasProcessStopped()){this.finishProcess();return}let t=r=>{try{e.kill(r)}catch(o){this.diagnostics?.record(`[ProcessTransport] Failed to send ${r}:`,o)}},s=this.options.closeGraceMs??Je;this.closeTimer=setTimeout(()=>{this.closeTimer=void 0,!this.hasProcessStopped()&&(t("SIGTERM"),!this.hasProcessStopped()&&(this.killTimer=setTimeout(()=>{this.killTimer=void 0,this.hasProcessStopped()||t("SIGKILL")},On),this.killTimer.unref()))},s),this.closeTimer.unref()}hasProcessStopped(){let e=this.process??this.customHandle;return this.processStopped||e!==null&&e.exitCode!==null||this.process!==null&&this.process.signalCode!==null}finishProcess(){this.processStopped||(this.processStopped=!0,this.ready=!1,clearTimeout(this.closeTimer),clearTimeout(this.killTimer),this.closeTimer=void 0,this.killTimer=void 0,this.cleanupLaunchArtifacts().catch(()=>{}))}observeProcess(e){e.on("error",t=>{this.ready=!1,this.closed||(this.processExitError??=this.createSpawnError(t)),this.diagnostics?.record("[ProcessTransport] Process error:",t),this.hasProcessStopped()?this.finishProcess():this.shutdownProcess()}),e.once("exit",(t,s)=>{if(this.finishProcess(),this.diagnostics?.record(`[ProcessTransport] Process exited: code=${t}, signal=${s}`),!this.closed&&!this.processExitError){t===he&&this.fireAuthExpired();let r=this.createProcessExitError(t,s);r&&(this.processExitError=r)}})}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>Vn&&(this.stderrTail=this.stderrTail.slice(-Vn))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",r=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new I(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==he){if(e!==0&&e!==null)return new I(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new I(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(this.hasProcessStopped()){let t=this.createProcessExitError(e.exitCode,this.process?.signalCode??null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let r=(i,a)=>{if(e.off("error",o),this.closed){t();return}let u=this.processExitError??this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.processExitError??this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??H();if(tt(t)){let s=this.options.executable??"node",r=this.options.executableArgs??[];return{command:s,commandArgs:[...r,t,...e]}}return{command:t,commandArgs:e}}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function $o(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var se=$o();function Yn(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function rt(n,e){return n.create(e)}import{existsSync as fi}from"fs";import{createInterface as gi}from"readline";import{Worker as hi}from"worker_threads";import{createHash as zo}from"node:crypto";import{existsSync as Qo}from"node:fs";import{chmod as Go,lstat as Wo,mkdir as De,readFile as Xn,readdir as Ho,readlink as Jo,rename as Vo,rm as ot,stat as Yo,symlink as Xo,writeFile as Zn}from"node:fs/promises";import{tmpdir as Zo,userInfo as ei}from"node:os";import{basename as es,dirname as we,join as $,relative as ti}from"node:path";var ni="QODER_WORKER_RUNTIME_ASSET_ROOT",ts=/(^|[\\/])app\.asar([\\/]|$)/,Dt=".qoder-worker-runtime-ready";function ns(n){return ts.test(n)}function xt(n){return ns(n)?n.replace(ts,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ve(n,e={}){let t=xt(n);if(!e.forceMaterialize&&t){let u=we(t);if(Qo(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Ot(t,u,!1,we(n))}if(!(e.forceMaterialize||ns(n))){let u=we(n);return Ot(n,u,!1)}let r=we(n),o=await si(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=ti(r,n)||es(n),a=$(o,i);return Ot(a,o,!0,r)}function Ot(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[ni]:e}}}async function si(n,e,t){let s=await ri(n,e),r=t.cacheDir??ai(),o=$(r,s),i=$(o,Dt);if(await rs(i)===s)return o;let a=$(r,`.setup-${s}-${process.pid}-${Date.now()}`);await De(r,{recursive:!0,mode:448}),await ot(a,{recursive:!0,force:!0}),await ot(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await De(a,{recursive:!0,mode:448}),await ss(n,a),await Zn($(a,Dt),s,{mode:384}),await ii(a,o,s),o}catch(u){throw await ot(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function ri(n,e){let t=zo("sha256");t.update("qoder-worker-runtime-v1\0");let s=await os($(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await Yo(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function ss(n,e){let t=await Ho(n,{withFileTypes:!0});await De(e,{recursive:!0,mode:448});for(let s of t){let r=$(n,s.name),o=$(e,s.name);if(s.isDirectory()){await ss(r,o);continue}if(s.isSymbolicLink()){await De(we(o),{recursive:!0,mode:448}),await Xo(await Jo(r),o);continue}if(!s.isFile())continue;let i=await oi(r);await De(we(o),{recursive:!0,mode:448}),await Zn(o,await Xn(r),{mode:i}),process.platform!=="win32"&&await Go(o,i)}}async function oi(n){let e=((await Wo(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=es(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function ii(n,e,t){try{await Vo(n,e)}catch(s){if(await rs($(e,Dt))===t){await ot(n,{recursive:!0,force:!0});return}throw s}}async function rs(n){let e=await os(n);return e?e.toString("utf8"):null}async function os(n){try{return await Xn(n)}catch{return null}}function ai(){let n=ui(ei().username||process.env.USER||process.env.USERNAME||"user");return $(Zo(),`qoder-sdk-worker-runtime-${n}`)}function ui(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var ci="QODER_WORKER_CWD";function it(n,e){return{env:{...e.env,[ci]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as Nt}from"node:fs";import{dirname as li,join as re}from"node:path";import{fileURLToPath as di}from"node:url";var pi=di(import.meta.url),qt=li(pi);function V(n){if(n)return n;let e=[];for(let t of mi())e.push(re(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),re(t,"dist","_worker","qoder-worker-runtime.mjs"),re(t,"_worker","qoder-worker-runtime.obf.mjs"),re(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(Nt(t))return t;return e[0]??re(qt,"..","_worker","qoder-worker-runtime.obf.mjs")}function is(n){let e=V(n);if(Nt(e))return!0;let t=xt(e);return t!==null&&Nt(t)}function mi(){let n=[re(qt,".."),re(qt,"..","..")];return[...new Set(n)]}var as=8192,oe=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},be=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new jt(nt(this.options,e))}},jt=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new G(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupLaunchArtifacts();return}let t=V(this.options.pathToQoderWorkerRuntime),s;try{s=await ve(t,{diagnostics:this.diagnostics})}catch(a){throw new oe(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!fi(r))throw new oe(`Qoder worker runtime not found: ${r}`);if(this.closed){await this.cleanupLaunchArtifacts();return}let o=this.options.cwd??process.cwd(),i=it(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${st(e.args)}`),this.worker=new hi(r,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker)}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupLaunchArtifacts().catch(()=>{});return}a===he&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupLaunchArtifacts().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw this.worker?this.close():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
@@ -31,5 +31,5 @@ ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(
31
31
  `).trim();if(o)return o}}function Qc(n){let e,t;for(let s of n){if(s===null||typeof s!="object")continue;let r=s;typeof r.customTitle=="string"&&r.customTitle&&(e=r.customTitle),typeof r.aiTitle=="string"&&r.aiTitle&&(t=r.aiTitle)}return e??t??zc(n)}function Lr(n,e,t,s){let r=n.transcript.filter(l=>l.isSidechain!==!0);if(r.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let l=r.findIndex(f=>f.uuid===t.upToMessageId);if(l<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);r=r.slice(0,l+1)}let o=new Set(r.map(l=>l.uuid)),i=new Map(r.map(l=>[l.uuid,Et()])),a=r.filter(l=>l.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(r.map(l=>[l.uuid,l])),c=Et(),d=new Date().toISOString(),m=a.map((l,f)=>{let y=null,g=typeof l.parentUuid=="string"?l.parentUuid:void 0;for(;g;){let h=u.get(g);if(!h)break;if(h.type!=="progress"){y=i.get(g)??null;break}g=typeof h.parentUuid=="string"?h.parentUuid:void 0}let S=typeof l.logicalParentUuid=="string"?i.get(l.logicalParentUuid)??null:l.logicalParentUuid??null,b={...l,...l.type==="system"&&l.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(l.uuid),parentUuid:y,logicalParentUuid:S,sessionId:c,timestamp:f===a.length-1?d:typeof l.timestamp=="string"?l.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:l.uuid}};return delete b.teamName,delete b.agentName,delete b.sessionKind,delete b.slug,delete b.sourceToolAssistantUUID,b});if(n.contentReplacements.length>0){let l=n.contentReplacements.flatMap(f=>{if(f===null||typeof f!="object")return[];let y=f.messageUuid;if(typeof y!="string"||!o.has(y))return[];let g=i.get(y);return g?[{...f,messageUuid:g}]:[]});l.length>0&&m.push({type:"content-replacement",sessionId:c,replacements:l,uuid:Et(),timestamp:d})}n.relocatedCwd&&m.push({type:"relocated",sessionId:c,relocatedCwd:n.relocatedCwd});let p=t.title?.trim();return m.push({type:"custom-title",sessionId:c,customTitle:p||`${Qc(s)??"Forked session"} (fork)`,uuid:Et(),timestamp:d}),{sessionId:c,entries:m}}async function Gc(n,e={}){if(!Ur.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!Ur.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await Br(e.dir??process.cwd()),a=O(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=Lr($r(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Bc(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await qc(t,"utf8"),r=s.split(`
32
32
  `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Lr($c(s,n),n,e,r);return await Fc(_n(Kc(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
33
33
  `)}
34
- `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Ct(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Rn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Ct(e),r=this.entries.get(s)??[];r.push(...t),this.entries.set(s,r),this.keys.set(s,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(s,o)}async load(e){let t=this.entries.get(Ct(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,r]of this.keys)r.projectKey!==e||r.subpath!==void 0||t.push({sessionId:r.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,r)=>r.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Ct(e));return}for(let[t,s]of this.keys)s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let s of this.keys.values())s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&s.subpath!==void 0&&t.push(s.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Ct(e))??[]]}get size(){let e=0;for(let t of this.keys.values())t.subpath===void 0&&(e+=1);return e}clear(){this.entries.clear(),this.keys.clear(),this.modifiedAt.clear(),this.lastModifiedAt=0}deleteSerialized(e){this.entries.delete(e),this.keys.delete(e),this.modifiedAt.delete(e)}};import{createReadStream as Wc}from"fs";import{readdir as Wr,readFile as Hc,realpath as Jc,stat as zr}from"fs/promises";import{basename as Qr,dirname as Vc,join as ze,relative as Yc,resolve as Xc,sep as Zc}from"path";import{createInterface as el}from"readline";var tl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,nl=500,sl=1024*1024;async function rl(n){let e=Xc(n);try{return await Jc(e)}catch{return e}}async function ol(n,e){let t=Ee();if(e){let r=O(await rl(e)),o=ze(t,r,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await Wr(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=ze(t,r.name,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function il(n){let e=[];async function t(s){let r;try{r=await Wr(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=ze(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function Gr(n,e,t,s){let r=el({input:Wc(n,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of r){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${n}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=s||i>=sl)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function al(n,e,t={}){if(!tl.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await ol(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:nl;if(await Gr(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=ze(o,"subagents");for(let a of await il(i)){let c=Yc(o,a).split(Zc);c[c.length-1]=Qr(c[c.length-1],".jsonl");let d={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await Gr(a,d,e,r);let m=ze(Vc(a),`${Qr(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Hc(m,"utf8"));await e.append(d,[{type:"agent_metadata",...p}])}catch(p){if(typeof p=="object"&&p!==null&&"code"in p&&p.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${m}: ${String(p)}`)}}}import{spawn as ul}from"node:child_process";import{existsSync as cl}from"node:fs";import{Worker as ll}from"node:worker_threads";var En=3e4;async function Hr(n,e={}){let t=Ce({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},se);return t.transport==="worker"?pl(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):dl(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??H()})}function dl(n,e){return new Promise((t,s)=>{let r=ul(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:Jr(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(Vr(e.timeoutMs)))},e.timeoutMs??En);r.stdout.on("data",c=>{o+=c.toString()}),r.stderr.on("data",c=>{i+=c.toString()}),r.on("error",c=>{a||(a=!0,clearTimeout(u),s(c))}),r.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function pl(n,e){fl(e.signal);let t=V(e.pathToQoderWorkerRuntime),s=await ve(t);ml(s);let r=e.cwd??process.cwd(),o=Jr(e.env);delete o.NODE_OPTIONS;let i=it(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new ll(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),d="",m="",p=!1,l,f=c.stdout===null,y=c.stderr===null,g=()=>{clearTimeout(E),e.signal?.removeEventListener("abort",h)},S=C=>{p||(p=!0,g(),u(C))},b=()=>{p||l===void 0||!f||!y||(p=!0,g(),a({stdout:d,stderr:m,exitCode:l}))},h=()=>{c.terminate(),S(Yr(e.signal))},E=setTimeout(()=>{c.terminate(),S(Vr(e.timeoutMs))},e.timeoutMs??En);c.stdin?.end(),c.stdout?.on("data",C=>{d+=C.toString()}),c.stdout?.on("end",()=>{f=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{y=!0,b()}),c.once("error",S),c.once("exit",C=>{l=C,b()}),e.signal?.addEventListener("abort",h,{once:!0}),e.signal?.aborted&&h()})}function Jr(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function ml(n){if(!cl(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function Vr(n){return new Error(`qodercli subprocess timed out after ${n??En}ms`)}function fl(n){if(n?.aborted)throw Yr(n)}function Yr(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function gl(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ae(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,resources:r.resources}))}async function hl(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function yl(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function Sl(n,e){let t=await Ae(["plugins","install",n,"--scope","user","--json"],e);t.exitCode!==0&&Qe(t);let s=JSON.parse(t.stdout);return{pluginId:s.pluginId,version:s.version??"local",path:s.path}}async function wl(n,e){let t=["plugins","uninstall",n,"--scope","user","--json"];e?.keepData&&t.push("--keep-data");let s=await Ae(t,e);s.exitCode!==0&&Qe(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,fullyRemoved:r.fullyRemoved,reverseDependents:r.reverseDependents??[]}}async function vl(n,e){let t;try{t=await Ae(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new N("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw ee("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=bl(`${t.stderr}
34
+ `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Ct(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Rn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Ct(e),r=this.entries.get(s)??[];r.push(...t),this.entries.set(s,r),this.keys.set(s,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(s,o)}async load(e){let t=this.entries.get(Ct(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,r]of this.keys)r.projectKey!==e||r.subpath!==void 0||t.push({sessionId:r.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,r)=>r.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Ct(e));return}for(let[t,s]of this.keys)s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let s of this.keys.values())s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&s.subpath!==void 0&&t.push(s.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Ct(e))??[]]}get size(){let e=0;for(let t of this.keys.values())t.subpath===void 0&&(e+=1);return e}clear(){this.entries.clear(),this.keys.clear(),this.modifiedAt.clear(),this.lastModifiedAt=0}deleteSerialized(e){this.entries.delete(e),this.keys.delete(e),this.modifiedAt.delete(e)}};import{createReadStream as Wc}from"fs";import{readdir as Wr,readFile as Hc,realpath as Jc,stat as zr}from"fs/promises";import{basename as Qr,dirname as Vc,join as ze,relative as Yc,resolve as Xc,sep as Zc}from"path";import{createInterface as el}from"readline";var tl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,nl=500,sl=1024*1024;async function rl(n){let e=Xc(n);try{return await Jc(e)}catch{return e}}async function ol(n,e){let t=Ee();if(e){let r=O(await rl(e)),o=ze(t,r,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await Wr(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=ze(t,r.name,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function il(n){let e=[];async function t(s){let r;try{r=await Wr(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=ze(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function Gr(n,e,t,s){let r=el({input:Wc(n,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of r){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${n}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=s||i>=sl)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function al(n,e,t={}){if(!tl.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await ol(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:nl;if(await Gr(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=ze(o,"subagents");for(let a of await il(i)){let c=Yc(o,a).split(Zc);c[c.length-1]=Qr(c[c.length-1],".jsonl");let d={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await Gr(a,d,e,r);let m=ze(Vc(a),`${Qr(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Hc(m,"utf8"));await e.append(d,[{type:"agent_metadata",...p}])}catch(p){if(typeof p=="object"&&p!==null&&"code"in p&&p.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${m}: ${String(p)}`)}}}import{spawn as ul}from"node:child_process";import{existsSync as cl}from"node:fs";import{Worker as ll}from"node:worker_threads";var En=3e4;async function Hr(n,e={}){let t=Ce({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},se);return t.transport==="worker"?pl(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):dl(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??H()})}function dl(n,e){return new Promise((t,s)=>{let r=ul(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:Jr(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(Vr(e.timeoutMs)))},e.timeoutMs??En);r.stdout.on("data",c=>{o+=c.toString()}),r.stderr.on("data",c=>{i+=c.toString()}),r.on("error",c=>{a||(a=!0,clearTimeout(u),s(c))}),r.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function pl(n,e){fl(e.signal);let t=V(e.pathToQoderWorkerRuntime),s=await ve(t);ml(s);let r=e.cwd??process.cwd(),o=Jr(e.env);delete o.NODE_OPTIONS;let i=it(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new ll(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),d="",m="",p=!1,l,f=c.stdout===null,y=c.stderr===null,g=()=>{clearTimeout(E),e.signal?.removeEventListener("abort",h)},S=C=>{p||(p=!0,g(),u(C))},b=()=>{p||l===void 0||!f||!y||(p=!0,g(),a({stdout:d,stderr:m,exitCode:l}))},h=()=>{c.terminate(),S(Yr(e.signal))},E=setTimeout(()=>{c.terminate(),S(Vr(e.timeoutMs))},e.timeoutMs??En);c.stdin?.end(),c.stdout?.on("data",C=>{d+=C.toString()}),c.stdout?.on("end",()=>{f=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{y=!0,b()}),c.once("error",S),c.once("exit",C=>{l=C,b()}),e.signal?.addEventListener("abort",h,{once:!0}),e.signal?.aborted&&h()})}function Jr(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function ml(n){if(!cl(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function Vr(n){return new Error(`qodercli subprocess timed out after ${n??En}ms`)}function fl(n){if(n?.aborted)throw Yr(n)}function Yr(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function gl(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ae(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,resources:r.resources}))}async function hl(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function yl(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function Sl(n,e){let t=e?.scope??"user",s=await Ae(["plugins","install",n,"--scope",t,"--json"],e);s.exitCode!==0&&Qe(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,version:r.version??"local",path:r.path}}async function wl(n,e){let t=e?.scope??"user",s=["plugins","uninstall",n,"--scope",t,"--json"];e?.keepData&&s.push("--keep-data");let r=await Ae(s,e);r.exitCode!==0&&Qe(r);let o=JSON.parse(r.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}async function vl(n,e){let t;try{t=await Ae(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new N("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw ee("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=bl(`${t.stderr}
35
35
  ${t.stdout}`);throw ee(r?"plugin_validation_unsupported":"plugin_validation_protocol_error",r?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(s&&typeof s=="object"&&"ok"in s&&s.schemaVersion!==1)throw ee("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(s&&typeof s=="object"&&s.ok===!0&&s.report){let r=s.report;if(_l(r))return r;throw ee("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(s&&typeof s=="object"&&s.ok===!1){let r=s.error;if(!r||typeof r!="object"||typeof r.code!="string"||typeof r.message!="string")throw ee("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=r;throw ee(o.code,o.message)}throw t.exitCode!==0&&Qe(t),ee("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function bl(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var kl=3e4;function Ae(n,e){return Hr(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:kl})}function Qe(n){let e="plugin_operation_failed",t=n.stderr||n.stdout;try{let s=JSON.parse(n.stdout);s.error&&s.code?(e=s.code,t=s.message??t):s.ok===!1&&s.error&&(e=s.error.code??e,t=s.error.message??t)}catch{}throw ee(e,t)}function ee(n,e){let t=new Error(e);return t.code=n,t}function _l(n){if(!n||typeof n!="object")return!1;let e=n;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(s=>s!==null&&typeof s=="object"&&(s.severity==="error"||s.severity==="warning")&&typeof s.code=="string"&&typeof s.message=="string"&&typeof s.phase=="string"&&t.has(s.phase)&&(s.location===void 0||s.location!==null&&typeof s.location=="object"&&typeof s.location.path=="string"))}import{execFile as Rl}from"child_process";function El(){return H()}async function Cl(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??El(),s=e?.timeout??6e4,r=["feedback","-c",n.content,"--json"];if(e?.storageDir&&r.push("--storage-dir",e.storageDir),n.sessionId&&r.push("-s",n.sessionId),n.workdir&&r.push("--workdir",n.workdir),n.email&&r.push("--email",n.email),n.include)for(let o of n.include)r.push("--include",o);if(n.imagePaths)for(let o of n.imagePaths)r.push("--images",o);if(n.callerVersion&&r.push("--caller-version",n.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&r.push("--ide-type",o)}return new Promise(o=>{Rl(t,r,{env:e?.env??process.env,timeout:s,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);o({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var eo={};ao(eo,{filterEscalatingDefaultMode:()=>Xr,isBashToolBackgroundLaunchResult:()=>Zr});var Pl=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function Xr(n){let e=n.effective.permissions?.defaultMode;if(!e||!Pl.has(e))return n.effective;for(let t=n.sources.length-1;t>=0;t-=1){let s=n.sources[t];if(s.settings.permissions?.defaultMode!==void 0){if(s.source==="project"){let{defaultMode:r,...o}=n.effective.permissions??{};return{...n.effective,permissions:o}}return n.effective}}return n.effective}function Zr(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=o=>o===void 0||typeof o=="string",s=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,r=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&s(e.totalLines)&&s(e.totalBytes)&&(r===void 0||r==="user"||r==="model"||r==="timeout"||r==="auto")}export{N as AbortError,Xe as AuthAccessTokenEnvVarError,Ze as AuthServiceAccountEnvVarError,qe as ControlRequestError,qn as DEFAULT_ACCESS_TOKEN_ENV_VAR,se as DEFAULT_RUNTIME_TRANSPORT,Ye as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,St as DaemonRpcError,co as EXIT_REASONS,uo as HOOK_EVENTS,Rn as InMemorySessionStore,gt as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Ne as ModelPolicyTimeoutError,Se as ProcessTransport,q as ProtocolVersionMismatchError,I as QoderCliProcessError,oe as QoderWorkerRuntimeError,W as UnsupportedCliCapabilityError,Kt as WIRE_PROTOCOL_VERSION,be as WorkerTransport,ho as accessToken,yo as accessTokenFromEnv,eo as coreTypes,Wu as createSdkMcpServer,xc as deleteSession,yl as disablePlugin,hl as enablePlugin,Xr as filterEscalatingDefaultMode,Gc as forkSession,Tc as getSessionInfo,Mc as getSessionMessages,Dc as getSubagentMessages,is as hasResolvableQoderWorkerRuntime,al as importSessionToStore,br as initDaemon,Sl as installPlugin,Zr as isBashToolBackgroundLaunchResult,bo as jobToken,gl as listPlugins,Pc as listSessions,Oc as listSubagents,So as qodercliAuth,dn as query,Ic as renameSession,V as resolveQoderWorkerRuntimePath,Lu as resolveSettings,wo as serviceAccount,vo as serviceAccountFromEnv,$u as shutdownDaemon,cn as startDaemon,Tu as startup,Cl as submitFeedback,Ac as tagSession,Hu as tool,wl as uninstallPlugin,vl as validatePlugin};
@@ -68,6 +68,8 @@ export type SDKUserMessage = {
68
68
  message: MessageParam;
69
69
  parent_tool_use_id: string | null;
70
70
  custom_context?: Record<string, string>;
71
+ /** The client has fully composed this message for literal model input. */
72
+ client_composed?: boolean;
71
73
  file_attachments?: SDKFileAttachment[];
72
74
  isSynthetic?: boolean;
73
75
  origin?: SDKMessageOrigin;
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "version": 1,
3
3
  "brand": "global",
4
- "sdkVersion": "1.0.37",
5
- "qoderCliVersion": "1.1.47",
4
+ "sdkVersion": "1.0.38",
5
+ "qoderCliVersion": "1.1.48",
6
6
  "defaultTransport": "worker",
7
7
  "workerRuntime": {
8
8
  "packaged": false,
9
9
  "delivery": "install",
10
10
  "source": "qodercli-worker-runtime",
11
- "urlTemplate": "https://download.qoder.com/qodercli/releases/1.1.47/qodercli-worker-runtime-{target}.tgz",
11
+ "urlTemplate": "https://download.qoder.com/qodercli/releases/1.1.48/qodercli-worker-runtime-{target}.tgz",
12
12
  "artifactNameTemplate": "qodercli-worker-runtime-{target}.tgz",
13
- "sdkVersion": "1.0.37",
14
- "qoderCliVersion": "1.1.47"
13
+ "sdkVersion": "1.0.38",
14
+ "qoderCliVersion": "1.1.48"
15
15
  }
16
16
  }
@@ -15,6 +15,11 @@ export type SDKUserMessage = {
15
15
  message: MessageParam;
16
16
  parent_tool_use_id: string | null;
17
17
  custom_context?: Record<string, string>;
18
+ /**
19
+ * When true, the client has fully composed this message. The CLI treats
20
+ * leading slash syntax and attachment-like text as literal model input.
21
+ */
22
+ client_composed?: boolean;
18
23
  isSynthetic?: boolean;
19
24
  origin?: import('../protocol/index.js').SDKMessageOrigin;
20
25
  tool_use_result?: unknown;
@@ -10,6 +10,19 @@ export type PluginToggleOptions = {
10
10
  cliPath?: string;
11
11
  env?: Record<string, string>;
12
12
  };
13
+ export type InstallPluginOptions = {
14
+ /** Directory used to resolve project and local plugin state. */
15
+ cwd?: string;
16
+ /** Installation scope. Defaults to user. */
17
+ scope?: PluginScope;
18
+ /** Optional qodercli executable or qoder Worker runtime entry override. */
19
+ cliPath?: string;
20
+ env?: Record<string, string>;
21
+ };
22
+ export type UninstallPluginOptions = InstallPluginOptions & {
23
+ /** Preserve the plugin data directory after uninstalling. */
24
+ keepData?: boolean;
25
+ };
13
26
  export type PluginResources = {
14
27
  skills: {
15
28
  name: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qoder-ai/qoder-agent-sdk",
3
- "version": "1.0.37",
3
+ "version": "1.0.38",
4
4
  "description": "TypeScript SDK for building Qoder-powered coding agents.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -50,7 +50,7 @@
50
50
  "peerDependencies": {
51
51
  "zod": "^3.25.0 || ^4.0.0"
52
52
  },
53
- "qoderCliVersion": "1.1.47",
53
+ "qoderCliVersion": "1.1.48",
54
54
  "qoderSdkBrand": "global",
55
55
  "license": "SEE LICENSE IN LICENSE"
56
56
  }