@qoder-ai/qoder-agent-sdk 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +8 -8
- package/dist/index.js +21 -21
- package/dist/protocol/common.d.ts +21 -21
- package/package.json +2 -2
package/dist/browser/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{McpServer as
|
|
1
|
+
import{McpServer as Y}from"@modelcontextprotocol/sdk/server/mcp.js";function ee(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 Y({name:s.name,version:s.version??"1.0.0"},{capabilities:{tools:s.tools&&s.tools.length>0?{}:void 0}});if(s.tools&&s.tools.length>0)for(let t of s.tools){if(!t.name||typeof t.name!="string"||t.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${s.name}".`);if(!t.description||typeof t.description!="string")throw new Error(`[createSdkMcpServer] Tool "${t.name}" must have a non-empty description string.`);try{e.registerTool(t.name,{description:t.description,inputSchema:t.inputSchema,...t.annotations?{annotations:t.annotations}:{}},t.handler)}catch(o){throw o instanceof Error&&o.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${t.name}" in server "${s.name}". Each tool name must be unique within a server.`):o}}return{type:"sdk",name:s.name,instance:e}}function te(s,e,t,o,r){return{name:s,description:e,inputSchema:t,handler:o,annotations:r?.annotations}}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 se=3e4,oe=3e4,C=class{options;ws=null;ready=!1;readyResolve;readyReject;readyPromise;messages=new v;keepAliveTimer;exitError;initialized=!1;constructor(e){this.options=e,this.readyPromise=new Promise((t,o)=>{this.readyResolve=t,this.readyReject=o}),this.initialize()}initialize(){return this.initialized||(this.initialized=!0,this.open()),this.readyPromise}open(){let e=new globalThis.WebSocket(this.options.url);this.ws=e;let t=setTimeout(()=>{if(!this.ready){let o=new Error("WebSocket connection timeout");this.readyReject?.(o),e.close()}},oe);e.onopen=()=>{clearTimeout(t),this.ready=!0,this.readyResolve?.(),this.options.authMessage&&e.send(JSON.stringify(this.options.authMessage)+`
|
|
2
2
|
`),this.keepAliveTimer=setInterval(()=>{e.readyState===WebSocket.OPEN&&e.send(JSON.stringify({type:"keep_alive"})+`
|
|
3
|
-
`)},
|
|
4
|
-
`);for(let n of r)if(n.trim())try{let i=JSON.parse(n);this.messages.enqueue(i)}catch{}},e.onerror=()=>{let o=new Error("WebSocket connection error");this.exitError=o,this.readyReject?.(o),this.messages.done()},e.onclose=o=>{this.ready=!1,this.keepAliveTimer&&(clearInterval(this.keepAliveTimer),this.keepAliveTimer=void 0),o.code!==1e3&&o.code!==1001&&(this.exitError=new Error(`WebSocket closed abnormally: ${o.code} ${o.reason}`)),this.messages.done()},this.options.abortController?.signal.addEventListener("abort",()=>{this.close()})}async write(e){this.ready||await this.readyPromise,this.ws?.send(e)}close(){this.keepAliveTimer&&(clearInterval(this.keepAliveTimer),this.keepAliveTimer=void 0),this.ws&&(this.ws.close(1e3),this.ws=null),this.messages.done()}isReady(){return this.ready}async*readMessages(){if(yield*this.messages,this.exitError)throw this.exitError}endInput(){}};var k=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}};var
|
|
5
|
-
`)}catch(
|
|
6
|
-
`)}catch(
|
|
7
|
-
`)}}catch(r){if(!o.signal.aborted){let{error:n,code:i}=
|
|
8
|
-
`)}}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 k}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,o=
|
|
9
|
-
`)}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(){await this.request({type:"interrupt"})}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(){let e={subtype:"get_models"};return(await this.request(e))?.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
|
|
3
|
+
`)},se)},e.onmessage=o=>{let r=String(o.data).split(`
|
|
4
|
+
`);for(let n of r)if(n.trim())try{let i=JSON.parse(n);this.messages.enqueue(i)}catch{}},e.onerror=()=>{let o=new Error("WebSocket connection error");this.exitError=o,this.readyReject?.(o),this.messages.done()},e.onclose=o=>{this.ready=!1,this.keepAliveTimer&&(clearInterval(this.keepAliveTimer),this.keepAliveTimer=void 0),o.code!==1e3&&o.code!==1001&&(this.exitError=new Error(`WebSocket closed abnormally: ${o.code} ${o.reason}`)),this.messages.done()},this.options.abortController?.signal.addEventListener("abort",()=>{this.close()})}async write(e){this.ready||await this.readyPromise,this.ws?.send(e)}close(){this.keepAliveTimer&&(clearInterval(this.keepAliveTimer),this.keepAliveTimer=void 0),this.ws&&(this.ws.close(1e3),this.ws=null),this.messages.done()}isReady(){return this.ready}async*readMessages(){if(yield*this.messages,this.exitError)throw this.exitError}endInput(){}};var k=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}};var w=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}},P=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 A="1.0.0";var D="ExitPlanMode";import*as Z from"fs";function K(s,e,t,o){return new Promise((r,n)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(l){n(l);return}r({jsonrpc:"2.0"});return}let a=`${s}:${e.id}`;o.set(a,{resolve:r,reject:n}),t.onmessage?t.onmessage(e):(o.delete(a),n(new Error(`No message handler registered for MCP server "${s}"`)))})}function O(s,e,t){if("id"in e&&e.id!==null){let o=`${s}:${e.id}`,r=t.get(o);if(r)return r.resolve(e),t.delete(o),!0}return!1}function j(s,e,t){let o=0,r=`${s}:`,n=Array.from(t.entries());for(let i of n){let[a,l]=i;a.startsWith(r)&&(l.reject(e),t.delete(a),o++)}return o}function U(){return Math.random().toString(36).substring(2,15)}function N(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 z(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function J(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function H(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function Q(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function $(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function I(s){if(typeof s!="object"||s===null)return;let e=s,t=e.subtype;if(typeof t=="string")return t;let o=e.type;return typeof o=="string"?o:void 0}function F(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function L(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function B(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function V(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function W(s){return typeof s=="object"&&s!==null&&s.type==="result"}var T=class s{static INITIALIZE_TIMEOUT_MS=12e4;transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;isSingleTurn;canUseTool;abortController;jsonSchema;initConfig;onElicitation;onAuthExpired;fetchJobToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,o,r,n,i,a,l,c,u,d,f,m,p,g,y,M){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=o,this.hooks=r??{},this.abortController=n,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=m??new Map,this.pendingMcpResponses=p??new Map,this.jsonSchema=a,this.initConfig=l??{},this.onElicitation=c,this.onAuthExpired=d,this.fetchJobToken=g,this.diagnostics=u,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=M??500,this.inputStream=new v(()=>{this.close().catch(()=>{})}),this.readLoopPromise=this.readMessages().catch(S=>{this.inputStream.error(S)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let S=this.abortController.signal;S.aborted?this.close().catch(()=>{}):S.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}[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(H(t)){this.handleControlResponse(t);continue}if(Q(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if($(t)){this.handleControlCancelRequest(t);continue}if(F(t)||L(t)||B(t)||V(t))continue;if(W(t)){let r=t;this.resultMessage=r,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(r),this.isSingleTurn&&this.transport.endInput();continue}let o=t;if(o.type==="system"&&o.subtype==="init")try{this.validateProtocolHandshake(o)}catch(r){throw this.inputStream.error(r),r}if(this.onAuthExpired&&!this.authExpiredFired){let r=!1;(o.type==="auth_status"&&o.error||o.type==="assistant"&&o.error==="authentication_failed")&&(r=!0),r&&(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(i=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",i)}))}this.inputStream.enqueue(o)}}catch(t){e=t}finally{let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,o]of this.pendingRequests)o.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}async request(e,t){let o=U(),r=N(o,e),n=t?.timeoutMs??this.controlRequestTimeoutMs;return new Promise((i,a)=>{let l=null,c=()=>{l&&(clearTimeout(l),l=null)};this.pendingRequests.set(o,{resolve:u=>{c(),i(u)},reject:u=>{c(),a(u)}}),n>0&&Number.isFinite(n)&&(l=setTimeout(()=>{if(this.pendingRequests.has(o)){this.pendingRequests.delete(o);try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:o})+`
|
|
5
|
+
`)}catch(u){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",u)}a(new Error(`Control request "${I(r.request)??"unknown"}" timed out after ${n}ms`))}},n));try{this.transport.write(JSON.stringify(r)+`
|
|
6
|
+
`)}catch(u){c(),this.pendingRequests.delete(o),a(u)}})}handleControlResponse(e){let t=e.response,o=t.request_id,r=this.pendingRequests.get(o);if(r)if(this.pendingRequests.delete(o),t.subtype==="success")r.resolve(t.response);else{let n=new Error(t.error);t.code&&(n.code=t.code),r.reject(n),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)I(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(o=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",o)})}async handleControlRequest(e){let t=e.request_id,o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o});try{let r=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let n=z(t,r);this.transport.write(JSON.stringify(n)+`
|
|
7
|
+
`)}}catch(r){if(!o.signal.aborted){let{error:n,code:i}=le(r),a=J(t,n,i);this.transport.write(JSON.stringify(a)+`
|
|
8
|
+
`)}}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 k}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,o=A;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${o}. Consider upgrading qodercli for the version handshake.`);return}let r=G(t),n=G(o);if(!r||!n){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${o}"; skipping handshake.`);return}if(r.major!==n.major)throw new P(t,o);r.minor<n.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${o}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new k;return new Promise((o,r)=>{let n=()=>{r(new k)};t.addEventListener("abort",n,{once:!0}),e.then(i=>{t.removeEventListener("abort",n),o(i)},i=>{t.removeEventListener("abort",n),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let o=e.request,r=I(o),n=o;switch(r){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=n.reason??"initial",a=n.session_id,l=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:l,reason:i,sessionId:a},{signal:t}),t);if(!c?.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:c.token}}case"can_use_tool":case"permission_response":{let i=n.tool_name,a=n.input??n.tool_input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let l=n.tool_use_id,c=n.permission_suggestions??n.suggestions,u=n.blocked_path,d=n.decision_reason,f=n.decision_reason_type,m=n.classifier_approvable,p=n.title,g=n.display_name,y=n.description,M=n.agent_id,S=ce(i,n.details,n.plan_path,n.plan_content),R=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:u,decisionReason:d,decisionReasonType:f,classifierApprovable:m,title:p,displayName:g,description:y,toolUseID:l,agentID:M,exitPlanMode:S}),t);if(R.behavior==="deny"&&!R.message)throw new Error("Permission deny result must include a message.");return R.behavior==="allow"?{...R,updatedInput:R.updatedInput??a,toolUseID:l}:{...R,toolUseID:l}}case"hook_callback":{let i=n.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,n.input,n.tool_use_id,t)}case"mcp_message":{let i=n.server_name,a=n.message,l=this.sdkMcpTransports.get(i);if(!l)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(K(i,a,l,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:n.mcp_server_name??"",message:n.message??n.prompt??"",mode:n.mode,url:n.url,elicitationId:n.elicitation_id,requestedSchema:n.requested_schema,title:n.title,displayName:n.display_name,description:n.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:n.purpose,sessionId:n.sessionId,turnIndex:n.turnIndex,availableModels:n.models??[]},a=this.resolveModelTimeoutMs,l=Promise.resolve(this.resolveModel(i)),c,u=new Promise((m,p)=>{c=setTimeout(()=>{p(new w(a))},a)}),d;try{d=await this.awaitAbortable(Promise.race([l,u]),t)}finally{clearTimeout(c)}let f={type:"get_model_policy",model:typeof d.model=="string"?d.model:d.model.model,parameters:d.parameters};if(typeof d.model!="string"){let{model:m,...p}=d.model;f.custom_model={...p,style:p.style??"openai"}}return f}default:throw new Error(`Unhandled control request subtype: ${r??"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[r,n]of Object.entries(this.hooks)){if(!n||n.length===0)continue;let i=[];for(let a of n){let l=a.hooks.map(c=>{let u=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(u,c),u});l.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:l,timeout:a.timeout})}i.length>0&&(t[r]=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.planModeInstructions!==void 0&&(e.planModeInstructions=this.initConfig.planModeInstructions),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.jsonSchema&&(e.jsonSchema=this.jsonSchema),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()));let o=await this.request(e,{timeoutMs:s.INITIALIZE_TIMEOUT_MS});if(o&&typeof o=="object"){let r=o;this.initResponse=r}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,o,r){let n=this.hookCallbacks.get(e);if(!n)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(n(t,o,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let o of e){if(this.closed)break;t+=1,this.transport.write(JSON.stringify(o)+`
|
|
9
|
+
`)}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(){await this.request({type:"interrupt"})}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(){let e={subtype:"get_models"};return(await this.request(e))?.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 ae(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 o={type:"rewind_files",user_message_id:e};t?.dryRun&&(o.dry_run=!0);let n=await this.request(o);if(!t?.dryRun&&n?.canRewind===!1)throw new Error(typeof n.error=="string"&&n.error.length>0?n.error:"Unable to rewind files.");return n}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){return await this.request({type:"mcp_set_servers",servers:e})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let o=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=o?.requiresUserAction===!0,n=typeof o?.authUrl=="string"?o.authUrl:void 0;if(r&&n===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:n,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,o]of this.sdkMcpTransports){try{await o.close()}catch(r){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,r)}j(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}};function q(s){return typeof s=="object"&&s!==null}function ne(s){return typeof s=="number"&&Number.isFinite(s)}function x(s){return Object.keys(s).length>0}function h(s,e,t){let o=e[t];ne(o)&&(s[t]=o)}function b(s,e,t){let o=e[t];typeof o=="string"&&(s[t]=o)}function _(s,e,t){let o=e[t];typeof o=="boolean"&&(s[t]=o)}function X(s){if(!q(s)||Array.isArray(s))return;let e={};return h(e,s,"total"),h(e,s,"used"),h(e,s,"remaining"),h(e,s,"percentage"),b(e,s,"unit"),x(e)?e:void 0}function re(s){if(!q(s)||Array.isArray(s))return;let e=X(s)??{};return b(e,s,"detailUrl"),x(e)?e:void 0}function ie(s){if(!q(s)||Array.isArray(s))return;let e={};return h(e,s,"used"),h(e,s,"cap"),h(e,s,"remaining"),h(e,s,"percentage"),_(e,s,"available"),b(e,s,"unit"),x(e)?e:void 0}function ae(s){if(!q(s)||Array.isArray(s))return null;let e={};b(e,s,"userId"),b(e,s,"userType"),h(e,s,"totalUsagePercentage"),_(e,s,"isHighestTier"),h(e,s,"expiresAt"),b(e,s,"upgradeUrl"),_(e,s,"isQuotaExceeded"),_(e,s,"isPlanQuotaProrated");let t=X(s.userQuota);t&&(e.userQuota=t);let o=re(s.addOnQuota);o&&(e.addOnQuota=o);let r=ie(s.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function le(s){let e=s instanceof Error?s.message:String(s),t=typeof s=="object"&&s!==null?s.code:void 0,o=typeof t=="string"&&t.length>0?t:void 0,r=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(r){let n=o??r[1];return(!o||o===r[1])&&(e=r[2]||e),{error:e,code:n}}return o?{error:e,code:o}:{error:e}}function ce(s,e,t,o){if(s!==D)return;let r=e!==null&&typeof e=="object"?e:void 0,n=r?.type===D||r?.type==="ExitPlanMode",i=n&&typeof r?.planPath=="string"&&r.planPath.length>0?r.planPath:typeof t=="string"&&t.length>0?t:void 0,a=n&&typeof r?.planContent=="string"&&r.planContent.length>0?r.planContent:typeof o=="string"&&o.length>0?o:void 0;if(!a&&i&&(a=Z.readFileSync(i,"utf8").trim()||void 0),!(!i&&!a))return{planPath:i,planContent:a}}function G(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var E=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}};function ue(s){let{prompt:e,websocket:t,abortController:o,canUseTool:r,hooks:n,mcpServers:i,jsonSchema:a}=s,l=new Map,c=new Map,u=new Map;if(i)for(let[m,p]of Object.entries(i))if(p.type==="sdk"&&"instance"in p){let g=p.instance;l.set(m,g);let y=new E(M=>{O(m,M,u)});c.set(m,y),g.connect(y).catch(()=>{})}else throw new Error(`Browser SDK only supports SDK MCP servers. Server "${m}" has type "${p.type}".`);let d=new C({url:t.url,headers:t.headers,authMessage:t.authMessage,abortController:o}),f=new T(d,!0,r,n,o,l,a,{},void 0,void 0,void 0,void 0,c,u);return f.streamInput(e),f}export{ee as createSdkMcpServer,ue as query,te as tool};
|
package/dist/index.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
var Gt=Object.defineProperty;var Vt=(s,e)=>{for(var t in e)Gt(s,t,{get:e[t],enumerable:!0})};import{spawn as ms}from"child_process";import{createInterface as hs}from"readline";var Yt=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest"],Xt=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"];var Ue="0.1.0";var ue="ExitPlanMode";import{chmod as je,mkdtemp as Zt,rm as qe,writeFile as es}from"fs/promises";import{existsSync as ge,mkdtempSync as ts,readFileSync as ss,rmSync as ns,writeFileSync as rs}from"fs";import{tmpdir as Ne}from"os";import{dirname as ze,join as C}from"path";import{fileURLToPath as os}from"url";var Ke="QODER_AGENT_SDK_ENTRYPOINT",Fe="QODER_AGENT_SDK_VERSION",He="QODER_SDK_AUTH_PAYLOAD_FILE",is="sdk-ts",as=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],cs=os(import.meta.url),Le=ze(cs),pe=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 Je(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function $e(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=ds();if(s)return s;let e=ls();return ge(e)?e:"qodercli"}function ds(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of We()){let t=C(e,"dist","_bundled",s);if(ge(t))return t}return null}function ls(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of We()){let t=[C(e,"node_modules",".bin",s),C(e,"..","..",".bin",s)];for(let n of t)if(ge(n))return n}return"qodercli"}function We(){let s=[C(Le,".."),C(Le,"..","..")];return[...new Set(s)]}function us(){return{allow:[],ask:[],deny:[]}}function Qe(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function ps(s,e){if(e.startsWith("mcp__"))return e;let t=Qe(s),n=e==="*"?"*":Qe(e);if(!t||!n)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${n}`}function Be(s,e){if(e.length===0)return;let t=new Set(s);for(let n of e)t.has(n)||(s.push(n),t.add(n))}function gs(s){let e=s??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},n=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...n,enabled:!0}}}}var F=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,n="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=n}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{ns(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=ze(this.authPayloadPath);try{await qe(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[n,o]of Object.entries(e))o!==void 0&&(t[n]=o);if(delete t[Ke],delete t[Fe],delete t[He],t[Ke]=is,t[Fe]=Ue,this.authPayloadPath&&(t[He]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let n of as)t[n]=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.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 r of t.allowedTools)e.push("--allowed-tools",r);if(t.disallowedTools&&t.disallowedTools.length>0)for(let r of t.disallowedTools)e.push("--disallowed-tools",r);if(t.tools!==void 0&&(Array.isArray(t.tools)?e.push("--tools",t.tools.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 r of t.extensions)e.push("--extensions",r);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 r of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",r);t.strictMcpConfig&&e.push("--strict-mcp-config");let n=this.buildSettingsArg();n!==void 0&&e.push("--settings",n);let o=t.settingSources&&t.settingSources.length>0?t.settingSources.join(","):"";if(e.push("--setting-sources",o),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let r of t.additionalDirectories)e.push("--add-dir",r);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 r of t.plugins)r.type==="local"&&e.push("--plugin-dir",r.path);if(t.extraArgs)for(let[r,i]of Object.entries(t.extraArgs))e.push(`--${r}`),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 r=this.readSettingsFile(e);this.applySettingsCompatibility(r),this.applyAdditionalDirectories(r),this.applyMcpPolicyRules(r,t);let i=this.applyFileCheckpointingSetting(r);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let n={...e??{}};this.applySettingsCompatibility(n),this.applyAdditionalDirectories(n),this.applyMcpPolicyRules(n,t);let o=this.applyFileCheckpointingSetting(n);return Object.keys(o).length>0?JSON.stringify(o):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?gs(e):e}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let n=e.general!==null&&typeof e.general=="object"?e.general:{},o=this.toQoderDefaultPermissionMode(t.defaultMode);o!==void 0&&n.defaultPermissionMode===void 0&&(n.defaultPermissionMode=o),e.general=n}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 n=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},o=Array.isArray(n.additionalDirectories)?[...n.additionalDirectories]:[];Be(o,t),n.additionalDirectories=o,e.permissions=n}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[n,o]of Object.entries(e)){let{tools:r,...i}=o;t[n]=i}return t}collectMcpPolicyPermissionRules(){let e=us(),t=new Map;for(let[n,o]of Object.entries(this.options.mcpToolPolicies??{}))o.length>0&&t.set(n,o);for(let[n,o]of Object.entries(this.options.mcpServers??{})){let r=o.tools;Array.isArray(r)&&r.length>0&&t.set(n,[...t.get(n)??[],...r])}for(let[n,o]of t)for(let r of o){let i=ps(n,r.name);switch(r.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}}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 n=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=n;for(let o of["allow","ask","deny"]){let r=Array.isArray(n[o])?[...n[o]]:[];Be(r,t[o]),n[o]=r}}readSettingsFile(e){let t=ss(e,"utf8").trim();if(!t)return{};let n=JSON.parse(t);if(n===null||typeof n!="object"||Array.isArray(n))throw new Error("Settings file must contain a JSON object.");return n}writeGeneratedSettingsFile(e){this.generatedSettingsDir=ts(C(Ne(),"qoder-agent-sdk-settings-"));let t=C(this.generatedSettingsDir,"settings.json");return rs(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),n=await Zt(C(Ne(),"qoder-sdk-auth-"));try{await je(n,448);let o=C(n,"payload.json");return await es(o,JSON.stringify(t),{mode:384}),await je(o,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${o}`),o}catch(o){throw await qe(n,{recursive:!0,force:!0}).catch(()=>{}),o}}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,n=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!n)throw new pe(t);return n}};var ys=41,Ge=8192,H=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}},J=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 F(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s({...e,...this.options})}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 n=e.env,{command:o,commandArgs:r}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${o} ${r.join(" ")}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:o,args:r,cwd:this.options.cwd,env:n,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=ms(o,r,{cwd:this.options.cwd,env:n,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===ys&&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 Xt=Object.defineProperty;var Zt=(s,e)=>{for(var t in e)Xt(s,t,{get:e[t],enumerable:!0})};import{spawn as Ss}from"child_process";import{createInterface as ks}from"readline";var es=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest"],ts=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"];var Ne="0.1.0";var ge="ExitPlanMode";import{chmod as Ke,mkdtemp as ss,rm as Fe,writeFile as ns}from"fs/promises";import{existsSync as me,mkdtempSync as rs,readFileSync as os,rmSync as is,writeFileSync as as}from"fs";import{tmpdir as He}from"os";import{dirname as We,join as C}from"path";import{fileURLToPath as cs}from"url";var Le="QODER_AGENT_SDK_ENTRYPOINT",Qe="QODER_AGENT_SDK_VERSION",Be="QODER_SDK_AUTH_PAYLOAD_FILE",ds="sdk-ts",us=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],ls=cs(import.meta.url),ze=We(ls),fe=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 Ge(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function Ve(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=ps();if(s)return s;let e=gs();return me(e)?e:"qodercli"}function ps(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of Ye()){let t=C(e,"dist","_bundled",s);if(me(t))return t}return null}function gs(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of Ye()){let t=[C(e,"node_modules",".bin",s),C(e,"..","..",".bin",s)];for(let n of t)if(me(n))return n}return"qodercli"}function Ye(){let s=[C(ze,".."),C(ze,"..","..")];return[...new Set(s)]}function fs(){return{allow:[],ask:[],deny:[]}}function Je(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function ms(s,e){if(e.startsWith("mcp__"))return e;let t=Je(s),n=e==="*"?"*":Je(e);if(!t||!n)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${n}`}function $e(s,e){if(e.length===0)return;let t=new Set(s);for(let n of e)t.has(n)||(s.push(n),t.add(n))}function hs(s){let e=s??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},n=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...n,enabled:!0}}}}var F=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,n="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=n}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{is(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=We(this.authPayloadPath);try{await Fe(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[n,o]of Object.entries(e))o!==void 0&&(t[n]=o);if(delete t[Le],delete t[Qe],delete t[Be],t[Le]=ds,t[Qe]=Ne,this.authPayloadPath&&(t[Be]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let n of us)t[n]=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.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 r of t.allowedTools)e.push("--allowed-tools",r);if(t.disallowedTools&&t.disallowedTools.length>0)for(let r of t.disallowedTools)e.push("--disallowed-tools",r);if(t.tools!==void 0&&(Array.isArray(t.tools)?e.push("--tools",t.tools.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 r of t.extensions)e.push("--extensions",r);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 r of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",r);t.strictMcpConfig&&e.push("--strict-mcp-config");let n=this.buildSettingsArg();n!==void 0&&e.push("--settings",n);let o=t.settingSources&&t.settingSources.length>0?t.settingSources.join(","):"";if(e.push("--setting-sources",o),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let r of t.additionalDirectories)e.push("--add-dir",r);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 r of t.plugins)r.type==="local"&&e.push("--plugin-dir",r.path);if(t.extraArgs)for(let[r,i]of Object.entries(t.extraArgs))e.push(`--${r}`),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 r=this.readSettingsFile(e);this.applySettingsCompatibility(r),this.applyAdditionalDirectories(r),this.applyMcpPolicyRules(r,t);let i=this.applyFileCheckpointingSetting(r);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let n={...e??{}};this.applySettingsCompatibility(n),this.applyAdditionalDirectories(n),this.applyMcpPolicyRules(n,t);let o=this.applyFileCheckpointingSetting(n);return Object.keys(o).length>0?JSON.stringify(o):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?hs(e):e}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let n=e.general!==null&&typeof e.general=="object"?e.general:{},o=this.toQoderDefaultPermissionMode(t.defaultMode);o!==void 0&&n.defaultPermissionMode===void 0&&(n.defaultPermissionMode=o),e.general=n}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 n=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},o=Array.isArray(n.additionalDirectories)?[...n.additionalDirectories]:[];$e(o,t),n.additionalDirectories=o,e.permissions=n}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[n,o]of Object.entries(e)){let{tools:r,...i}=o;t[n]=i}return t}collectMcpPolicyPermissionRules(){let e=fs(),t=new Map;for(let[n,o]of Object.entries(this.options.mcpToolPolicies??{}))o.length>0&&t.set(n,o);for(let[n,o]of Object.entries(this.options.mcpServers??{})){let r=o.tools;Array.isArray(r)&&r.length>0&&t.set(n,[...t.get(n)??[],...r])}for(let[n,o]of t)for(let r of o){let i=ms(n,r.name);switch(r.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}}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 n=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=n;for(let o of["allow","ask","deny"]){let r=Array.isArray(n[o])?[...n[o]]:[];$e(r,t[o]),n[o]=r}}readSettingsFile(e){let t=os(e,"utf8").trim();if(!t)return{};let n=JSON.parse(t);if(n===null||typeof n!="object"||Array.isArray(n))throw new Error("Settings file must contain a JSON object.");return n}writeGeneratedSettingsFile(e){this.generatedSettingsDir=rs(C(He(),"qoder-agent-sdk-settings-"));let t=C(this.generatedSettingsDir,"settings.json");return as(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),n=await ss(C(He(),"qoder-sdk-auth-"));try{await Ke(n,448);let o=C(n,"payload.json");return await ns(o,JSON.stringify(t),{mode:384}),await Ke(o,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${o}`),o}catch(o){throw await Fe(n,{recursive:!0,force:!0}).catch(()=>{}),o}}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,n=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!n)throw new fe(t);return n}};var vs=41,Xe=8192,H=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}},$=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 F(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s({...e,...this.options})}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 n=e.env,{command:o,commandArgs:r}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${o} ${r.join(" ")}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:o,args:r,cwd:this.options.cwd,env:n,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=Ss(o,r,{cwd:this.options.cwd,env:n,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===vs&&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=
|
|
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=ks({input:e,crlfDelay:1/0});try{for await(let n of t){if(this.closed)break;let o=n.trim();if(o)try{yield JSON.parse(o)}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 n=e?i=>{try{e.kill(i)}catch{}}:t?i=>{try{t.kill(i)}catch{}}:void 0;if(!n)return;let o=()=>e?!e.killed&&e.exitCode===null:!0,r=setTimeout(()=>{if(o()){n("SIGTERM");let i=setTimeout(()=>{o()&&n("SIGKILL")},5e3);typeof i=="object"&&"unref"in i&&i.unref()}},2e3);typeof r=="object"&&"unref"in r&&r.unref(),e?e.once("exit",()=>{clearTimeout(r)}):t?.once&&t.once("exit",()=>{clearTimeout(r)})}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>Xe&&(this.stderrTail=this.stderrTail.slice(-Xe))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",o=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new H(o,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==0&&e!==null)return new H(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new H(`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,n)=>{let o=(i,a)=>{e.off("error",r);let c=this.createProcessExitError(i,a);c?(this.processExitError=c,n(c)):t()},r=i=>{e.off("exit",o);let a=this.createSpawnError(i);this.processExitError=a,n(a)};e.once("exit",o),e.once("error",r)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??Ve();if(Ge(t)){let n=this.options.executable??"node",o=this.options.executableArgs??[];return{command:n,commandArgs:[...o,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 ws(){switch("process"){case"worker":return"worker";case"process":return"process"}return"process"}var ye=ws();function Ze(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function et(s,e){return s.create(e)}import{existsSync as ve}from"fs";import{createInterface as bs}from"readline";import{dirname as Ps,join as D}from"path";import{fileURLToPath as Rs}from"url";import{Worker as Ts}from"worker_threads";var Cs=41,tt=8192,st="QODER_WORKER_RUNTIME_PATH",Es="QODER_WORKER_CWD",Ms=Rs(import.meta.url),Se=Ps(Ms),L=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}},W=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new ke({...e,...this.options})}},ke=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new F(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=we(this.options.pathToQoderWorkerRuntime);if(!ve(t))throw new L(`Qoder worker runtime not found: ${t}`);let n=this.options.cwd??process.cwd(),o={...e.env,[Es]:n};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${t}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${n}`),this.worker=new Ts(t,{argv:e.args,env:o,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:{...this.options.workerData??{},qoderWorkerRuntime:{cwd:n}}}),this.worker.once("error",r=>{this.ready=!1,this.workerExitError=this.createWorkerError(r),this.diagnostics?.record("[WorkerTransport] Worker error:",r),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",r=>{this.ready=!1,this.observedExitCode=r,this.clearCloseTimer(),this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${r}`),r===Cs&&this.fireAuthExpired();let i=this.createWorkerExitError(r);i&&(this.workerExitError=i),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",r=>{let i=r.toString();this.appendStderr(i),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(i),this.options.stderr==="inherit"&&process.stderr.write(i);let a=i.trim();a&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${a}`)}),this.options.abortController){let r=this.options.abortController.signal;r.aborted?this.close():r.addEventListener("abort",()=>this.close(),{once:!0})}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
4
4
|
`)?e:e+`
|
|
5
|
-
`;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=
|
|
5
|
+
`;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=bs({input:e,crlfDelay:1/0});try{for await(let n of t){if(this.closed)break;let o=n.trim();if(o)try{yield JSON.parse(o)}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.cleanupAuthPayload().catch(()=>{});let e=this.worker;e&&(this.endInput(),this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},2e3),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()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>tt&&(this.stderrTail=this.stderrTail.slice(-tt))}createWorkerError(e){return new L(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(e!==0)return new L(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForWorkerExit(){if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,n)=>{let o=i=>{e.off("error",r);let a=this.createWorkerExitError(i);a?(this.workerExitError=a,n(a)):t()},r=i=>{e.off("exit",o);let a=this.createWorkerError(i);this.workerExitError=a,n(a)};e.once("exit",o),e.once("error",r)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function we(s){if(s)return s;if(process.env[st])return process.env[st];let e=[];for(let t of xs())e.push(D(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),D(t,"dist","_worker","qoder-worker-runtime.mjs"),D(t,"_worker","qoder-worker-runtime.obf.mjs"),D(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(ve(t))return t;return e[0]??D(Se,"..","_worker","qoder-worker-runtime.obf.mjs")}function _s(s){return ve(we(s))}function xs(){let s=[D(Se,".."),D(Se,"..","..")];return[...new Set(s)]}import{appendFileSync as Is,mkdirSync as As}from"fs";import{dirname as Os}from"path";var Ds="QODER_AGENT_SDK_DEBUG";function Us(s){return s.debugFile?!0:s.debug===!0||qs(process.env[Ds])}function js(s){if(s.debugFile)return s.debugFile}function qs(s){if(s===void 0)return!1;let e=s.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var te=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=Us(e),this.debugFile=js(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let n=this.formatLine(e,t),o=this.debugFile;if(o){this.writeToFile(o,n);return}this.writeToStderr(n)}get filePath(){return this.debugFile}writeToFile(e,t){try{As(Os(e),{recursive:!0}),Is(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let n=new Date().toISOString(),o=this.formatError(t);return`${n} ${e}${o}
|
|
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 _=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 U=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},x=class extends Error{constructor(e){super(e),this.name="DirectConnectError"}},
|
|
8
|
-
`)}catch(
|
|
9
|
-
`)}catch(
|
|
10
|
-
`)}}catch(o){if(!n.signal.aborted){let{error:r,code:i}=
|
|
11
|
-
`)}}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 U}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,n=
|
|
12
|
-
`)}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(){await this.request({type:"interrupt"})}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(){let e={subtype:"get_models"};return(await this.request(e))?.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 js(e?.usage)?e.usage:null}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 n={type:"rewind_files",user_message_id:e};t?.dryRun&&(n.dry_run=!0);let r=await this.request(n);if(!t?.dryRun&&r?.canRewind===!1)throw new Error(typeof r.error=="string"&&r.error.length>0?r.error:"Unable to rewind files.");return r}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){return await this.request({type:"mcp_set_servers",servers:e})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let n=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),o=n?.requiresUserAction===!0,r=typeof n?.authUrl=="string"?n.authUrl:void 0;if(o&&r===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return o?{authUrl:r,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,n]of this.sdkMcpTransports){try{await n.close()}catch(o){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,o)}st(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}};function ne(s){return typeof s=="object"&&s!==null}function T(s){return typeof s=="number"&&Number.isFinite(s)}function mt(s){return ne(s)?T(s.total)&&T(s.used)&&T(s.remaining)&&T(s.percentage)&&typeof s.unit=="string":!1}function Us(s){return ne(s)?T(s.used)&&T(s.cap)&&T(s.remaining)&&T(s.percentage)&&typeof s.available=="boolean"&&typeof s.unit=="string":!1}function js(s){return!ne(s)||typeof s.userId!="string"||s.userId.length===0||typeof s.userType!="string"||s.userType.length===0||!T(s.totalUsagePercentage)||typeof s.isHighestTier!="boolean"||!T(s.expiresAt)||!mt(s.userQuota)||!mt(s.addOnQuota)||typeof s.isQuotaExceeded!="boolean"||typeof s.isPlanQuotaProrated!="boolean"||!Us(s.orgResourcePackage)?!1:(s.upgradeUrl===void 0||typeof s.upgradeUrl=="string")&&(!ne(s.addOnQuota)||s.addOnQuota.detailUrl===void 0||typeof s.addOnQuota.detailUrl=="string")}function qs(s){let e=s instanceof Error?s.message:String(s),t=typeof s=="object"&&s!==null?s.code:void 0,n=typeof t=="string"&&t.length>0?t:void 0,o=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(o){let r=n??o[1];return(!n||n===o[1])&&(e=o[2]||e),{error:e,code:r}}return n?{error:e,code:n}:{error:e}}function Ns(s,e,t,n){if(s!==ue)return;let o=e!==null&&typeof e=="object"?e:void 0,r=o?.type===ue||o?.type==="ExitPlanMode",i=r&&typeof o?.planPath=="string"&&o.planPath.length>0?o.planPath:typeof t=="string"&&t.length>0?t:void 0,a=r&&typeof o?.planContent=="string"&&o.planContent.length>0?o.planContent:typeof n=="string"&&n.length>0?n:void 0;if(!a&&i&&(a=yt.readFileSync(i,"utf8").trim()||void 0),!(!i&&!a))return{planPath:i,planContent:a}}function ht(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var re=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 St}from"crypto";var Ks="QODER_CLOUD_AGENT_API_BASE",Fs="https://api.qoder.com/api/v1/cloud",I={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Hs=1024,vt=1*1024*1024,kt=4*1024*1024,Ls=8*1024,be=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},oe=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Pe=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}},Qs=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Rt(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(r=>s[r]!==void 0&&!Qs.has(r));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(s.auth?.type!=="accessToken")throw new oe;let{agent:t,session:n}=s.experimentalCloudAgent;if(t&&Q(t)&&we(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(n&&Q(n)&&we(n))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(n&&Q(n)&&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 o=!!n&&Q(n);if(!o&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!o){if(!n||!we(n))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof n.create.environment_id!="string"||n.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function Q(s){return"id"in s&&s.id!==void 0}function we(s){return"create"in s&&s.create!==void 0}function Tt(s){return new Re(s)}var Re=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=rn();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Pt();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=Bs(e.options.auth,e.options.env),this.apiBase=zs(),this.inputStream=new _(()=>{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(n=>{this.sseConnected.reject(n),this.closed||this.inputStream.error(n)}),this.streamInput(sn(e.prompt)).catch(n=>{this.closed||this.inputStream.error(n)})}[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 n=tn(t);this.beginPendingTurn();let o=await this.postSessionEvents([{type:I.userMessage,content:n}]);this.postedMessages+=1,this.activateTurn(o.find(r=>r.type===I.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:I.userInterrupt}])}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(){return[]}async getAvailableModels(){return[]}async listByokProviders(){return null}async validateByokModel(e){return null}async supportedAgents(){return[]}async mcpServerStatus(){return[]}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){return null}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){return{}}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&&Q(e))t=e.id;else{let n=await this.resolveAgentId(),o=e.create,r=await this.requestJson("/sessions",{method:"POST",body:{agent:n,...$s(o)}});t=wt(r,"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(Q(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Js(e.create)});return wt(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let n=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==n&&(t=0),t+=1,await nn(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),n=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;n&&t.searchParams.set("after_id",n),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let o=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!o.ok)throw this.handleAuthFailure(o.status),await bt(o);if(!o.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(o.body)}async readSseBody(e){let t=e.getReader(),n=new TextDecoder,o="",r={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){o+=n.decode(),o.length>0&&this.consumeSseLine(o,r);break}o+=n.decode(a,{stream:!0});let c;for(;(c=o.indexOf(`
|
|
13
|
-
`))!==-1;){let d=o.slice(0,c);o=o.slice(c+1);let
|
|
14
|
-
`))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let n=e.indexOf(":"),o=n===-1?e:e.slice(0,n),r=n===-1?"":e.slice(n+1);switch(r.startsWith(" ")&&(r=r.slice(1)),o){case"id":t.id=r;break;case"event":t.event=r;break;case"data":if(t.dataBytes+r.length>
|
|
15
|
-
`):JSON.stringify(e)}function
|
|
16
|
-
`)){let n=t.trim();if(n)try{let o=JSON.parse(n);j(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&
|
|
17
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of r)n.push(P(e,await
|
|
18
|
-
`).filter(Boolean);if(n.length===0)return null;let o=
|
|
19
|
-
`).filter(Boolean))try{let g=JSON.parse(
|
|
20
|
-
`);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function
|
|
21
|
-
`);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function
|
|
22
|
-
`).filter(Boolean),r=new Map,i=
|
|
7
|
+
${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};var _=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 U=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},x=class extends Error{constructor(e){super(e),this.name="DirectConnectError"}},G=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}},V=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 be="1.0.0";import*as kt from"fs";function nt(s,e,t,n){return new Promise((o,r)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(c){r(c);return}o({jsonrpc:"2.0"});return}let a=`${s}:${e.id}`;n.set(a,{resolve:o,reject:r}),t.onmessage?t.onmessage(e):(n.delete(a),r(new Error(`No message handler registered for MCP server "${s}"`)))})}function rt(s,e,t){if("id"in e&&e.id!==null){let n=`${s}:${e.id}`,o=t.get(n);if(o)return o.resolve(e),t.delete(n),!0}return!1}function ot(s,e,t){let n=0,o=`${s}:`,r=Array.from(t.entries());for(let i of r){let[a,c]=i;a.startsWith(o)&&(c.reject(e),t.delete(a),n++)}return n}function it(){return Math.random().toString(36).substring(2,15)}function at(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 ct(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function dt(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function ut(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function lt(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function pt(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function se(s){if(typeof s!="object"||s===null)return;let e=s,t=e.subtype;if(typeof t=="string")return t;let n=e.type;return typeof n=="string"?n:void 0}function gt(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function ft(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function mt(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function ht(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function yt(s){return typeof s=="object"&&s!==null&&s.type==="result"}var re=class s{static INITIALIZE_TIMEOUT_MS=12e4;transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;isSingleTurn;canUseTool;abortController;jsonSchema;initConfig;onElicitation;onAuthExpired;fetchJobToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,n,o,r,i,a,c,d,u,g,p,l,f,k,y,S){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=n,this.hooks=o??{},this.abortController=r,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=l??new Map,this.pendingMcpResponses=f??new Map,this.jsonSchema=a,this.initConfig=c??{},this.onElicitation=d,this.onAuthExpired=g,this.fetchJobToken=k,this.diagnostics=u,this.controlRequestTimeoutMs=p??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=S??500,this.inputStream=new _(()=>{this.close().catch(()=>{})}),this.readLoopPromise=this.readMessages().catch(v=>{this.inputStream.error(v)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let v=this.abortController.signal;v.aborted?this.close().catch(()=>{}):v.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}[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(ut(t)){this.handleControlResponse(t);continue}if(lt(t)){this.handleControlRequest(t).catch(o=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",o)});continue}if(pt(t)){this.handleControlCancelRequest(t);continue}if(gt(t)||ft(t)||mt(t)||ht(t))continue;if(yt(t)){let o=t;this.resultMessage=o,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(o),this.isSingleTurn&&this.transport.endInput();continue}let n=t;if(n.type==="system"&&n.subtype==="init")try{this.validateProtocolHandshake(n)}catch(o){throw this.inputStream.error(o),o}if(this.onAuthExpired&&!this.authExpiredFired){let o=!1;(n.type==="auth_status"&&n.error||n.type==="assistant"&&n.error==="authentication_failed")&&(o=!0),o&&(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(i=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",i)}))}this.inputStream.enqueue(n)}}catch(t){e=t}finally{let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,n]of this.pendingRequests)n.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}async request(e,t){let n=it(),o=at(n,e),r=t?.timeoutMs??this.controlRequestTimeoutMs;return new Promise((i,a)=>{let c=null,d=()=>{c&&(clearTimeout(c),c=null)};this.pendingRequests.set(n,{resolve:u=>{d(),i(u)},reject:u=>{d(),a(u)}}),r>0&&Number.isFinite(r)&&(c=setTimeout(()=>{if(this.pendingRequests.has(n)){this.pendingRequests.delete(n);try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:n})+`
|
|
8
|
+
`)}catch(u){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",u)}a(new Error(`Control request "${se(o.request)??"unknown"}" timed out after ${r}ms`))}},r));try{this.transport.write(JSON.stringify(o)+`
|
|
9
|
+
`)}catch(u){d(),this.pendingRequests.delete(n),a(u)}})}handleControlResponse(e){let t=e.response,n=t.request_id,o=this.pendingRequests.get(n);if(o)if(this.pendingRequests.delete(n),t.subtype==="success")o.resolve(t.response);else{let r=new Error(t.error);t.code&&(r.code=t.code),o.reject(r),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)se(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",n)})}async handleControlRequest(e){let t=e.request_id,n=new AbortController;this.pendingInboundRequests.set(t,{abortController:n});try{let o=await this.awaitAbortable(this.processControlRequest(e,n.signal),n.signal);if(!n.signal.aborted){let r=ct(t,o);this.transport.write(JSON.stringify(r)+`
|
|
10
|
+
`)}}catch(o){if(!n.signal.aborted){let{error:r,code:i}=Ls(o),a=dt(t,r,i);this.transport.write(JSON.stringify(a)+`
|
|
11
|
+
`)}}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 U}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,n=be;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${n}. Consider upgrading qodercli for the version handshake.`);return}let o=St(t),r=St(n);if(!o||!r){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${n}"; skipping handshake.`);return}if(o.major!==r.major)throw new V(t,n);o.minor<r.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${n}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new U;return new Promise((n,o)=>{let r=()=>{o(new U)};t.addEventListener("abort",r,{once:!0}),e.then(i=>{t.removeEventListener("abort",r),n(i)},i=>{t.removeEventListener("abort",r),o(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let n=e.request,o=se(n),r=n;switch(o){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=r.reason??"initial",a=r.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":case"permission_response":{let i=r.tool_name,a=r.input??r.tool_input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let c=r.tool_use_id,d=r.permission_suggestions??r.suggestions,u=r.blocked_path,g=r.decision_reason,p=r.decision_reason_type,l=r.classifier_approvable,f=r.title,k=r.display_name,y=r.description,S=r.agent_id,v=Qs(i,r.details,r.plan_path,r.plan_content),w=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:d,blockedPath:u,decisionReason:g,decisionReasonType:p,classifierApprovable:l,title:f,displayName:k,description:y,toolUseID:c,agentID:S,exitPlanMode:v}),t);if(w.behavior==="deny"&&!w.message)throw new Error("Permission deny result must include a message.");return w.behavior==="allow"?{...w,updatedInput:w.updatedInput??a,toolUseID:c}:{...w,toolUseID:c}}case"hook_callback":{let i=r.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,r.input,r.tool_use_id,t)}case"mcp_message":{let i=r.server_name,a=r.message,c=this.sdkMcpTransports.get(i);if(!c)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(nt(i,a,c,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:r.mcp_server_name??"",message:r.message??r.prompt??"",mode:r.mode,url:r.url,elicitationId:r.elicitation_id,requestedSchema:r.requested_schema,title:r.title,displayName:r.display_name,description:r.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:r.purpose,sessionId:r.sessionId,turnIndex:r.turnIndex,availableModels:r.models??[]},a=this.resolveModelTimeoutMs,c=Promise.resolve(this.resolveModel(i)),d,u=new Promise((l,f)=>{d=setTimeout(()=>{f(new G(a))},a)}),g;try{g=await this.awaitAbortable(Promise.race([c,u]),t)}finally{clearTimeout(d)}let p={type:"get_model_policy",model:typeof g.model=="string"?g.model:g.model.model,parameters:g.parameters};if(typeof g.model!="string"){let{model:l,...f}=g.model;p.custom_model={...f,style:f.style??"openai"}}return p}default:throw new Error(`Unhandled control request subtype: ${o??"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[o,r]of Object.entries(this.hooks)){if(!r||r.length===0)continue;let i=[];for(let a of r){let c=a.hooks.map(d=>{let u=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(u,d),u});c.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:c,timeout:a.timeout})}i.length>0&&(t[o]=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.planModeInstructions!==void 0&&(e.planModeInstructions=this.initConfig.planModeInstructions),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.jsonSchema&&(e.jsonSchema=this.jsonSchema),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()));let n=await this.request(e,{timeoutMs:s.INITIALIZE_TIMEOUT_MS});if(n&&typeof n=="object"){let o=n;this.initResponse=o}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,n,o){let r=this.hookCallbacks.get(e);if(!r)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(r(t,n,{signal:o}),o)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let n of e){if(this.closed)break;t+=1,this.transport.write(JSON.stringify(n)+`
|
|
12
|
+
`)}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(){await this.request({type:"interrupt"})}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(){let e={subtype:"get_models"};return(await this.request(e))?.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 Hs(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 n={type:"rewind_files",user_message_id:e};t?.dryRun&&(n.dry_run=!0);let r=await this.request(n);if(!t?.dryRun&&r?.canRewind===!1)throw new Error(typeof r.error=="string"&&r.error.length>0?r.error:"Unable to rewind files.");return r}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){return await this.request({type:"mcp_set_servers",servers:e})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let n=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),o=n?.requiresUserAction===!0,r=typeof n?.authUrl=="string"?n.authUrl:void 0;if(o&&r===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return o?{authUrl:r,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,n]of this.sdkMcpTransports){try{await n.close()}catch(o){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,o)}ot(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}};function oe(s){return typeof s=="object"&&s!==null}function Ns(s){return typeof s=="number"&&Number.isFinite(s)}function Pe(s){return Object.keys(s).length>0}function T(s,e,t){let n=e[t];Ns(n)&&(s[t]=n)}function Q(s,e,t){let n=e[t];typeof n=="string"&&(s[t]=n)}function ne(s,e,t){let n=e[t];typeof n=="boolean"&&(s[t]=n)}function vt(s){if(!oe(s)||Array.isArray(s))return;let e={};return T(e,s,"total"),T(e,s,"used"),T(e,s,"remaining"),T(e,s,"percentage"),Q(e,s,"unit"),Pe(e)?e:void 0}function Ks(s){if(!oe(s)||Array.isArray(s))return;let e=vt(s)??{};return Q(e,s,"detailUrl"),Pe(e)?e:void 0}function Fs(s){if(!oe(s)||Array.isArray(s))return;let e={};return T(e,s,"used"),T(e,s,"cap"),T(e,s,"remaining"),T(e,s,"percentage"),ne(e,s,"available"),Q(e,s,"unit"),Pe(e)?e:void 0}function Hs(s){if(!oe(s)||Array.isArray(s))return null;let e={};Q(e,s,"userId"),Q(e,s,"userType"),T(e,s,"totalUsagePercentage"),ne(e,s,"isHighestTier"),T(e,s,"expiresAt"),Q(e,s,"upgradeUrl"),ne(e,s,"isQuotaExceeded"),ne(e,s,"isPlanQuotaProrated");let t=vt(s.userQuota);t&&(e.userQuota=t);let n=Ks(s.addOnQuota);n&&(e.addOnQuota=n);let o=Fs(s.orgResourcePackage);return o&&(e.orgResourcePackage=o),e}function Ls(s){let e=s instanceof Error?s.message:String(s),t=typeof s=="object"&&s!==null?s.code:void 0,n=typeof t=="string"&&t.length>0?t:void 0,o=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(o){let r=n??o[1];return(!n||n===o[1])&&(e=o[2]||e),{error:e,code:r}}return n?{error:e,code:n}:{error:e}}function Qs(s,e,t,n){if(s!==ge)return;let o=e!==null&&typeof e=="object"?e:void 0,r=o?.type===ge||o?.type==="ExitPlanMode",i=r&&typeof o?.planPath=="string"&&o.planPath.length>0?o.planPath:typeof t=="string"&&t.length>0?t:void 0,a=r&&typeof o?.planContent=="string"&&o.planContent.length>0?o.planContent:typeof n=="string"&&n.length>0?n:void 0;if(!a&&i&&(a=kt.readFileSync(i,"utf8").trim()||void 0),!(!i&&!a))return{planPath:i,planContent:a}}function St(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var ie=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 wt}from"crypto";var Bs="QODER_CLOUD_AGENT_API_BASE",zs="https://api.qoder.com/api/v1/cloud",I={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Js=1024,bt=1*1024*1024,Pt=4*1024*1024,$s=8*1024,Te=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"}},Ce=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}},Ws=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Et(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(r=>s[r]!==void 0&&!Ws.has(r));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:n}=s.experimentalCloudAgent;if(t&&B(t)&&Re(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(n&&B(n)&&Re(n))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(n&&B(n)&&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 o=!!n&&B(n);if(!o&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!o){if(!n||!Re(n))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof n.create.environment_id!="string"||n.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function B(s){return"id"in s&&s.id!==void 0}function Re(s){return"create"in s&&s.create!==void 0}function Mt(s){return new Ee(s)}var Ee=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=un();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Ct();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=Gs(e.options.auth,e.options.env),this.apiBase=Vs(),this.inputStream=new _(()=>{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(n=>{this.sseConnected.reject(n),this.closed||this.inputStream.error(n)}),this.streamInput(cn(e.prompt)).catch(n=>{this.closed||this.inputStream.error(n)})}[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 n=an(t);this.beginPendingTurn();let o=await this.postSessionEvents([{type:I.userMessage,content:n}]);this.postedMessages+=1,this.activateTurn(o.find(r=>r.type===I.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:I.userInterrupt}])}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(){return[]}async getAvailableModels(){return[]}async listByokProviders(){return null}async validateByokModel(e){return null}async supportedAgents(){return[]}async mcpServerStatus(){return[]}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){return null}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){return{}}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&&B(e))t=e.id;else{let n=await this.resolveAgentId(),o=e.create,r=await this.requestJson("/sessions",{method:"POST",body:{agent:n,...Xs(o)}});t=Rt(r,"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(B(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Ys(e.create)});return Rt(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let n=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==n&&(t=0),t+=1,await dn(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),n=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;n&&t.searchParams.set("after_id",n),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let o=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!o.ok)throw this.handleAuthFailure(o.status),await Tt(o);if(!o.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(o.body)}async readSseBody(e){let t=e.getReader(),n=new TextDecoder,o="",r={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){o+=n.decode(),o.length>0&&this.consumeSseLine(o,r);break}o+=n.decode(a,{stream:!0});let c;for(;(c=o.indexOf(`
|
|
13
|
+
`))!==-1;){let d=o.slice(0,c);o=o.slice(c+1);let u=d.endsWith("\r")?d.slice(0,-1):d;if(this.consumeSseLine(u,r),this.closed)break}o.length>bt&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${bt} bytes; resetting buffer.`),o="",r.id=void 0,r.event=void 0,r.data.length=0,r.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:tn(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 n=e.indexOf(":"),o=n===-1?e:e.slice(0,n),r=n===-1?"":e.slice(n+1);switch(r.startsWith(" ")&&(r=r.slice(1)),o){case"id":t.id=r;break;case"event":t.event=r;break;case"data":if(t.dataBytes+r.length>Pt){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Pt} bytes; dropping event.`),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}t.data.push(r),t.dataBytes+=r.length;break}}handleSseEvent(e){if(this.closed)return;let t=R(e.data,"type")??e.event,n=R(e.data,"turn_id"),o={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??wt(),session_id:this.sessionId??R(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(o),!this.isCurrentTurnEvent(n)){this.bufferPendingTurnEvent(e,t,n);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case I.agentMessage:{let n=nn(Y(e.data,"content"));n&&this.assistantTextParts.push(n);return}case I.modelRequestEnd:this.captureUsage(e.data);return;case I.idle:this.idleSeen=!0,this.finishIfIdle();return;case I.error:this.emitErrorResult(e),this.finish();return;case I.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Ct(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let n of t)if(this.isCurrentTurnEvent(n.turnId)&&this.handleCurrentTurnEvent(n.event,n.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,n){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=Js&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:n}))}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(R(e.data,"error")??R(ce(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:wt(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,n=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return Zs(n)}captureUsage(e){let t=ce(e,"usage");if(!t)return;this.latestUsage=rn(this.latestUsage,t);let n=b(e,"total_cost_usd")??b(e,"cost_usd")??b(t,"total_cost_usd")??b(t,"cost_usd");n!==void 0&&(this.totalCostUsd+=n);let o=R(e,"model")??R(t,"model");if(o){let r=this.latestModelUsage[o]?.costUSD??0;this.latestModelUsage[o]=on(this.latestUsage,r+(n??0))}}async requestJson(e,t){let n=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(!n.ok)throw this.handleAuthFailure(n.status),await Tt(n);if(n.status===204)return{};try{return await n.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 Gs(s,e){if(s?.type!=="accessToken")throw new ae;if(typeof s.accessToken=="string")return s.accessToken;let t=s.accessToken.envVar,n=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!n)throw new Te(t);return n}function Vs(){return process.env[Bs]?.replace(/\/+$/,"")??zs}function Ys(s){return Me({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 Xs(s){return Me({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>Me({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function Me(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function Rt(s,e){let t=R(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function Zs(s){let e=sn(s,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:R(t,"id"),turnId:R(t,"turn_id"),type:R(t,"type")}]):[]}async function Tt(s){let e=await en(s,$s);return new Ce(s.status,e||s.statusText||"unknown error")}async function en(s,e){if(!s.body)try{return(await s.text()).slice(0,e)}catch{return""}let t=s.body.getReader(),n=new TextDecoder,o=[],r=0;try{for(;r<e;){let{done:i,value:a}=await t.read();if(i)break;r+=a.byteLength,o.push(n.decode(a,{stream:!0}))}o.push(n.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return o.join("").slice(0,e)}function tn(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function ce(s,e){let t=Y(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function sn(s,e){let t=Y(s,e);return Array.isArray(t)?t:void 0}function R(s,e){let t=Y(s,e);return typeof t=="string"?t:void 0}function b(s,e){let t=Y(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Y(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function nn(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>_t(t)?t.text:"").filter(Boolean).join("")||void 0}function rn(s,e){let t=ce(e,"cache_creation"),n=ce(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(n,"web_fetch_requests")??s.server_tool_use.web_fetch_requests,web_search_requests:b(n,"web_search_requests")??s.server_tool_use.web_search_requests}}}function on(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 an(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>_t(t)?t.text:JSON.stringify(t)).join(`
|
|
15
|
+
`):JSON.stringify(e)}function _t(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function cn(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 Ct(){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 dn(s,e){e.aborted||await new Promise(t=>{let n=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(n),t()},{once:!0})})}function un(){let s,e;return{promise:new Promise((n,o)=>{s=n,e=o}),resolve:s,reject:e}}var _e=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 ln(s){if(s.transport!==void 0){if(Ze(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 ye==="worker"?W.default:$.default}function pn(s){let{prompt:e,options:t={}}=s,n=ln(t),o=new te({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 r=t.auth;if(r==null)throw new _e;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 Et(t),Mt({prompt:e,options:t,diagnostics:o});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,d=a?()=>{c||(c=!0,Promise.resolve(a()).catch(h=>{o.record("[query] onAuthExpired callback threw:",h)}))}:void 0,u=new Map,g=new Map,p=new Map,l={},f={};if(t.mcpServers)for(let[h,M]of Object.entries(t.mcpServers)){let J=M.tools;if(Array.isArray(J)&&J.length>0&&(f[h]=J),M.type==="sdk"&&"instance"in M&&M.instance){let K=M.instance;u.set(h,K);let qe=new ie(Yt=>{rt(h,Yt,p)});g.set(h,qe),K.connect(qe).catch(()=>{})}else l[h]=M}let k=t.pathToQoderCLIExecutable,y=t.env,S=r?.type==="jobToken"?r.fetchJobToken:void 0,v={pathToQoderCLIExecutable:k,executable:t.executable,executableArgs:t.executableArgs,env:y,proxy:t.proxy,cwd:t.cwd,auth:r,model:i?void 0:t.model,agent:t.agent,debug:t.debug,diagnostics:o,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,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,allowedTools:(()=>{let h=t.allowedTools??[];if(t.skills===void 0)return h.length>0?h:void 0;let M=t.skills==="all"?["Skill"]:t.skills.map(K=>`Skill(${K})`),J=new Set(h);return[...h,...M.filter(K=>!J.has(K))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:l,mcpToolPolicies:f,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},w=et(n,v);w.initialize().catch(()=>{});let pe=typeof e=="string",E=t.systemPrompt,z,m;if(typeof E=="string")z=E;else if(typeof E=="object"&&E!==null&&E.type==="preset"){let h=E;if(h.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(h.preset)}`);m=h.append}let O={systemPrompt:z,appendSystemPrompt:m,planModeInstructions:t.planModeInstructions,agents:t.agents,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},N=new re(w,pe,t.canUseTool,t.hooks,t.abortController,u,void 0,O,t.onElicitation,o,d,t.controlRequestTimeoutMs,g,p,S,t.resolveModel,t.resolveModelTimeoutMs);if(typeof e=="string"){let h={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};N.streamInput(async function*(){yield h}())}else N.streamInput(e);return N}var xt="QODER_PERSONAL_ACCESS_TOKEN";function gn(s){return{type:"accessToken",accessToken:s}}function fn(s=xt){return{type:"accessToken",accessToken:{envVar:s}}}function mn(){return{type:"qodercli"}}function hn(s){return{type:"jobToken",fetchJobToken:s}}import{McpServer as yn}from"@modelcontextprotocol/sdk/server/mcp.js";function Sn(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 yn({name:s.name,version:s.version??"1.0.0"},{capabilities:{tools:s.tools&&s.tools.length>0?{}:void 0}});if(s.tools&&s.tools.length>0)for(let t of s.tools){if(!t.name||typeof t.name!="string"||t.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${s.name}".`);if(!t.description||typeof t.description!="string")throw new Error(`[createSdkMcpServer] Tool "${t.name}" must have a non-empty description string.`);try{e.registerTool(t.name,{description:t.description,inputSchema:t.inputSchema,...t.annotations?{annotations:t.annotations}:{}},t.handler)}catch(n){throw n instanceof Error&&n.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${t.name}" in server "${s.name}". Each tool name must be unique within a server.`):n}}return{type:"sdk",name:s.name,instance:e}}function kn(s,e,t,n,o){return{name:s,description:e,inputSchema:t,handler:n,annotations:o?.annotations}}import{readdir as Ie,readFile as ue,stat as ee,appendFile as Ut,realpath as En}from"fs/promises";import{basename as Mn,join as P,resolve as Ot}from"path";import{execFile as _n}from"child_process";import{promisify as xn}from"util";import{homedir as vn}from"os";import{join as At}from"path";var wn=".qoder",bn="QODER_CLI_HOME",Pn="QODER_CONFIG_DIR",It=200;function Rn(){return process.env[bn]||vn()}function Tn(){let s=process.env[Pn];return s||At(Rn(),wn)}function de(){return At(Tn(),"projects")}function Cn(s){let e=5381;for(let t=0;t<s.length;t++)e=e*33^s.charCodeAt(t);return e}function X(s){let e=s.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=It)return e;let t=Math.abs(Cn(s)).toString(36);return`${e.slice(0,It)}-${t}`}var In=xn(_n),An=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,On=new Set(["user","assistant","system","progress","attachment"]);function j(s){return s!==null&&typeof s=="object"}function Dn(s){return An.test(s)}function Un(s){let e=[];for(let t of s.split(`
|
|
16
|
+
`)){let n=t.trim();if(n)try{let o=JSON.parse(n);j(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&On.has(o.type)&&e.push(o)}catch{}}return e}function xe(s){if(!j(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}function Z(s){if(s.type!=="assistant"||!j(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function jt(s){return s.type!=="user"||!s.parentUuid?!1:xe(s).some(e=>j(e)&&e.type==="tool_result")}function jn(s){if(!j(s.message))return null;let e=s.message.id;return typeof e=="string"&&e.length>0?e:null}function qn(s,e){let t=new Map;for(let[n,o]of s){let r=jn(o);if(r){let i=t.get(r);i?i.push(n):t.set(r,[n])}}for(let[n,o]of s){let r=Nn(o,o.parentUuid,s,t,e);r!==o.parentUuid&&s.set(n,{...o,parentUuid:r})}}function Nn(s,e,t,n,o){if(!e||t.has(e))return e;let r=n.get(e);return!r||r.length===0?e:r.length===1?r[0]:Kn(s,r,t)??Fn(s,r,t,o)??e}function Kn(s,e,t){if(!jt(s))return;let n=xe(s).filter(r=>j(r)&&r.type==="tool_result").map(r=>r.tool_use_id).filter(r=>typeof r=="string");if(n.length===0)return;let o=e.filter(r=>{let i=t.get(r);return i?xe(i).some(a=>j(a)&&a.type==="tool_use"&&n.includes(typeof a.id=="string"?a.id:"")):!1});return o.length===1?o[0]:void 0}function Fn(s,e,t,n){return e.map(r=>t.get(r)).filter(r=>r!==void 0).filter(r=>(n.get(r.uuid)??-1)<(n.get(s.uuid)??-1)).at(-1)?.uuid}function Hn(s){for(let e of s.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,n=t?.headUuid,o=t?.anchorUuid,r=t?.tailUuid;if(!n||!o||!r)continue;let i=s.get(n);i&&s.set(n,{...i,parentUuid:o});for(let[a,c]of s)a!==n&&c.parentUuid===o&&s.set(a,{...c,parentUuid:r})}}function Dt(s,e,t){let n=(s.timestamp??"").localeCompare(e.timestamp??"");return n!==0?n:(t.get(s.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function Ln(s,e,t){let n=e.filter(p=>p.type==="assistant");if(n.length===0)return e;let o=new Map,r=0;for(let p of s.keys())o.set(p,r++);let i=new Map;for(let p of n){let l=Z(p);l&&i.set(l,p)}let a=new Map,c=new Map;for(let p of s.values()){let l=Z(p);if(l){let f=a.get(l)??[];f.push(p),a.set(l,f);continue}if(jt(p)&&p.parentUuid){let f=c.get(p.parentUuid)??[];f.push(p),c.set(p.parentUuid,f)}}let d=new Set,u=new Map;for(let p of n){let l=Z(p);if(!l||d.has(l))continue;d.add(l);let f=a.get(l)??[p],k=f.filter(m=>!t.has(m.uuid)),y=[];for(let m of f){let O=c.get(m.uuid)??[];for(let N of O)t.has(N.uuid)||y.push(N)}if(k.length===0&&y.length===0)continue;let S=i.get(l);if(!S)continue;let v=[...f].sort((m,O)=>Dt(m,O,o));y.sort((m,O)=>Dt(m,O,o));let w=v.findIndex(m=>m.uuid===S.uuid),pe=v.slice(0,Math.max(w,0)).filter(m=>!t.has(m.uuid)),E=v.slice(w+1).filter(m=>!t.has(m.uuid)),z=[...pe,...E,...y];for(let m of z)t.add(m.uuid);u.set(S.uuid,z)}if(u.size===0)return e;let g=[];for(let p of e){let l=u.get(p.uuid);if(l){let f=o.get(p.uuid)??Number.MAX_SAFE_INTEGER,k=[],y=[];for(let S of l)(p.type==="assistant"&&S.type==="assistant"&&Z(S)===Z(p)&&(o.get(S.uuid)??Number.MAX_SAFE_INTEGER)<f?k:y).push(S);g.push(...k,p,...y)}else g.push(p)}return g}function Qn(s){if(s.length===0)return[];let e=new Map,t=new Map;for(let[p,l]of s.entries())e.set(l.uuid,l),t.set(l.uuid,p);Hn(e),qn(e,t);let n=new Set;for(let p of e.values())p.parentUuid&&n.add(p.parentUuid);let o=Array.from(e.values()).filter(p=>!n.has(p.uuid)),r=[];for(let p of o){let l=p,f=new Set;for(;l&&!f.has(l.uuid);){if(f.add(l.uuid),l.type==="user"||l.type==="assistant"){r.push(l);break}l=l.parentUuid?e.get(l.parentUuid):void 0}}if(r.length===0)return[];let i=r.filter(p=>!p.isSidechain&&!p.teamName&&!p.isMeta),c=(i.length>0?i:r).reduce((p,l)=>(t.get(l.uuid)??-1)>(t.get(p.uuid)??-1)?l:p),d=[],u=new Set,g=c;for(;g&&!u.has(g.uuid);)u.add(g.uuid),d.push(g),g=g.parentUuid?e.get(g.parentUuid):void 0;return d.reverse(),Ln(e,d,u)}function Bn(s,e){let t=s.type==="user"||s.type==="assistant",n=e&&s.type==="system";return!(!t&&!n||s.isMeta||s.isSidechain||s.teamName)}function zn(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 Jn(s){let e=s.type==="system"?zn(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,...typeof s.timestamp=="string"&&s.timestamp.length>0?{timestamp:s.timestamp}:{},...s.type==="system"&&s.subtype?{subtype:s.subtype}:{},...e?{compact_metadata:e}:{}}}function $n(s,e){let t=Math.max(0,e?.offset??0),n=e?.limit;return n!==void 0&&n>0?s.slice(t,t+n):t>0?s.slice(t):s}async function qt(s){try{return await En(Ot(s))}catch{return Ot(s)}}async function Wn(s){return X(await qt(s))}async function q(s){let e=de();if(s?.dir){let t=await qt(s.dir),n=[P(e,X(t))];if(s.includeWorktrees!==!1)try{let{stdout:o}=await In("git",["worktree","list","--porcelain"],{cwd:s.dir}),r=o.split(`
|
|
17
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of r)n.push(P(e,await Wn(i)))}catch{}return n}try{return(await Ie(e,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>P(e,n.name))}catch{return[]}}async function Nt(s){try{let[e,t]=await Promise.all([ue(s,"utf-8"),ee(s)]),n=e.trim().split(`
|
|
18
|
+
`).filter(Boolean);if(n.length===0)return null;let o=Mn(s,".jsonl"),r,i,a,c,d,u,g;for(let p of n)try{let l=JSON.parse(p);if(!g&&l.timestamp&&(g=new Date(l.timestamp).getTime()),!r&&l.type==="user"&&l.message?.content){let f=l.message.content;if(typeof f=="string")r=f.substring(0,200);else if(Array.isArray(f)){let k=f.find(y=>y.type==="text");k?.text&&(r=k.text.substring(0,200))}}l.type==="custom-title"&&l.customTitle&&(i=l.customTitle),l.type==="ai-title"&&l.aiTitle&&(a=l.aiTitle),l.type==="tag"&&(u=l.tag||void 0),l.gitBranch&&(c=l.gitBranch),l.cwd&&(d=l.cwd)}catch{}return{sessionId:o,summary:i||a||r||"Untitled session",lastModified:t.mtimeMs,fileSize:t.size,customTitle:i||a,firstPrompt:r,gitBranch:c,cwd:d,tag:u,createdAt:g}}catch{return null}}function Kt(s,e){return P(s,e,"subagents")}function Gn(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 Ft(s){let e=[];async function t(n){let o;try{o=await Ie(n,{withFileTypes:!0})}catch{return}for(let r of o){let i=P(n,r.name);if(r.isDirectory()){await t(i);continue}if(r.isFile()&&r.name.startsWith("agent-")&&r.name.endsWith(".jsonl")){let a=r.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(s),e}async function Vn(s){try{let e=await ue(s.replace(/\.jsonl$/,".meta.json"),"utf-8"),n=JSON.parse(e).toolUseId;return typeof n=="string"&&n.length>0?n:null}catch{return null}}function Yn(s){if(s.length===0)return[];let e=new Map(s.map(i=>[i.uuid,i])),t=s[s.length-1],n=[],o=new Set,r=t;for(;r&&!o.has(r.uuid);)o.add(r.uuid),n.push(r),r=r.parentUuid!==void 0&&r.parentUuid!==null?e.get(r.parentUuid):void 0;return n.reverse()}async function Xn(s,e,t){let[n,o]=await Promise.all([ue(s,"utf-8"),Vn(s)]),r=[];for(let u of n.trim().split(`
|
|
19
|
+
`).filter(Boolean))try{let g=JSON.parse(u);Gn(g)&&r.push(g)}catch{}let a=Yn(r).map(u=>({type:u.type,uuid:u.uuid,session_id:u.sessionId??e,message:u.message,parent_tool_use_id:o})),c=t?.offset??0,d=t?.limit;return d!==void 0?a.slice(c,c+d):a.slice(c)}async function Zn(s){let e=await q(s),n=(await Promise.all(e.map(async d=>{try{return(await Ie(d)).filter(g=>g.endsWith(".jsonl")).map(g=>P(d,g))}catch{return[]}}))).flat(),o=await Promise.all(n.map(Nt)),r=new Map;for(let d of o){if(!d)continue;let u=r.get(d.sessionId);(!u||d.lastModified>u.lastModified)&&r.set(d.sessionId,d)}let i=Array.from(r.values()).sort((d,u)=>u.lastModified-d.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function er(s,e){let t=await q(e);for(let n of t){let o=P(n,`${s}.jsonl`),r=await Nt(o);if(r)return r}}async function tr(s,e){if(!Dn(s))return[];let t=e?.includeSystemMessages===!0,n=await q(e);for(let o of n){let r=P(o,`${s}.jsonl`);try{let i=await ue(r,"utf-8"),c=Qn(Un(i)).filter(d=>Bn(d,t)).map(Jn);return $n(c,e)}catch{continue}}return[]}async function sr(s,e,t){let n=await q(t);for(let o of n){let r=P(o,`${s}.jsonl`);try{await ee(r);let i=JSON.stringify({type:"custom-title",sessionId:s,customTitle:e,timestamp:new Date().toISOString()});await Ut(r,i+`
|
|
20
|
+
`);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function nr(s,e,t){let n=await q(t);for(let o of n){let r=P(o,`${s}.jsonl`);try{await ee(r);let i=JSON.stringify({type:"tag",sessionId:s,tag:e??"",timestamp:new Date().toISOString()});await Ut(r,i+`
|
|
21
|
+
`);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function rr(s,e){let t=await q(e);for(let n of t){let o=P(n,`${s}.jsonl`);try{await ee(o);let r=await Ft(Kt(n,s));return Array.from(new Set(r.map(i=>i.agentId)))}catch{continue}}return[]}async function or(s,e,t){let n=await q(t);for(let o of n){let r=P(o,`${s}.jsonl`);try{await ee(r);let a=(await Ft(Kt(o,s))).find(c=>c.agentId===e);return a?await Xn(a.filePath,s,t):[]}catch{continue}}return[]}import{readdir as ir,readFile as ar,writeFile as cr,mkdir as dr,stat as Ht}from"fs/promises";import{join as Ae,dirname as Lt,resolve as ur}from"path";import{randomUUID as Bt}from"crypto";function lr(s){return X(ur(s))}async function pr(s,e){let t=de();if(e){let n=lr(e),o=Ae(t,n,`${s}.jsonl`);try{return await Ht(o),o}catch{return null}}try{let n=await ir(t,{withFileTypes:!0});for(let o of n)if(o.isDirectory()){let r=Ae(t,o.name,`${s}.jsonl`);try{return await Ht(r),r}catch{continue}}}catch{}return null}function Qt(s,e,t){let n={...s};if(typeof s.uuid=="string"){let o=s.uuid;e.has(o)||e.set(o,Bt()),n.uuid=e.get(o)}return typeof s.parentUuid=="string"&&e.has(s.parentUuid)&&(n.parentUuid=e.get(s.parentUuid)),n.sessionId=t,n}async function gr(s,e){let t=await pr(s,e?.dir);if(!t)throw new Error(`Session ${s} not found`);let o=(await ar(t,"utf-8")).trim().split(`
|
|
22
|
+
`).filter(Boolean),r=new Map,i=Bt(),a=[];for(let d of o)try{let u=JSON.parse(d);if(e?.upToMessageId&&u.uuid===e.upToMessageId){let p=Qt(u,r,i);a.push(JSON.stringify(p));break}let g=Qt(u,r,i);a.push(JSON.stringify(g))}catch{}e?.title&&a.push(JSON.stringify({type:"custom-title",sessionId:i,customTitle:e.title,timestamp:new Date().toISOString()}));let c=Ae(Lt(t),`${i}.jsonl`);return await dr(Lt(c),{recursive:!0}),await cr(c,a.join(`
|
|
23
23
|
`)+`
|
|
24
|
-
`),{sessionId:i}}import{spawn as
|
|
25
|
-
`);this.partialLine=d.pop()??"";for(let
|
|
24
|
+
`),{sessionId:i}}import{spawn as fr}from"child_process";async function mr(s){let e=s?.cliPath??Oe(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let n=await De(e,t,s?.env);return JSON.parse(n.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 hr(s,e){let t=e?.cliPath??Oe(),n=await De(t,["plugins","enable",s,"--scope","user"],e?.env);n.exitCode!==0&&Jt(n)}async function yr(s,e){let t=e?.cliPath??Oe(),n=await De(t,["plugins","disable",s,"--scope","user"],e?.env);n.exitCode!==0&&Jt(n)}function Oe(){return process.env.QODERCLI_PATH??"qodercli"}var zt=3e4;function De(s,e,t){return new Promise((n,o)=>{let r=fr(s,e,{env:{...process.env,...t},stdio:["ignore","pipe","pipe"]}),i="",a="",c=!1,d=setTimeout(()=>{c||(c=!0,r.kill("SIGTERM"),o(new Error(`qodercli subprocess timed out after ${zt}ms`)))},zt);r.stdout.on("data",u=>{i+=u.toString()}),r.stderr.on("data",u=>{a+=u.toString()}),r.on("error",u=>{c||(c=!0,clearTimeout(d),o(u))}),r.on("close",u=>{c||(c=!0,clearTimeout(d),n({stdout:i,stderr:a,exitCode:u??1}))})})}function Jt(s){let e="plugin_operation_failed",t=s.stderr||s.stdout;try{let o=JSON.parse(s.stdout);o.error&&o.code&&(e=o.code,t=o.message??t)}catch{}let n=new Error(t);throw n.code=e,n}import{execFile as Sr}from"child_process";import{fileURLToPath as kr}from"url";import{join as A,dirname as vr,delimiter as wr}from"path";import{existsSync as le}from"fs";import{homedir as br}from"os";var Pr=kr(import.meta.url),$t=vr(Pr);function Rr(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let o of Wt()){let r=A(o,"dist","_bundled",s);if(le(r))return r}for(let o of Wt()){let r=[A(o,"node_modules",".bin",s),A(o,"..","..",".bin",s)];for(let i of r)if(le(i))return i}let e=process.env.PATH||"";for(let o of e.split(wr)){if(!o)continue;let r=A(o,s);if(le(r))return r}let t=br(),n=[A(t,".qoder","local",s),A(t,".local","bin",s),"/usr/local/bin/qodercli"];for(let o of n)if(le(o))return o;throw new Error("qodercli not found. Provide the cliPath option or ensure qodercli is on PATH.")}function Wt(){let s=[A($t,".."),A($t,"..","..")];return[...new Set(s)]}async function Tr(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??Rr(),n=e?.timeout??6e4,o=["feedback","-c",s.content,"--json"];if(e?.storageDir&&o.push("--storage-dir",e.storageDir),s.sessionId&&o.push("-s",s.sessionId),s.workdir&&o.push("--workdir",s.workdir),s.email&&o.push("--email",s.email),s.include)for(let r of s.include)o.push("--include",r);if(s.imagePaths)for(let r of s.imagePaths)o.push("--images",r);if(s.callerVersion&&o.push("--caller-version",s.callerVersion),e?.integrationMode){let r=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;r&&o.push("--ide-type",r)}return new Promise(r=>{Sr(t,o,{env:e?.env??process.env,timeout:n,maxBuffer:1024*1024},(i,a)=>{let c=a.trim();if(c)try{let d=JSON.parse(c);r({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{}r(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:c||"Feedback submitted successfully"})})})}function Ue(s){if(s.startsWith("cc://")){let e=s.substring(5),t=e.indexOf("@");if(t!==-1){let n=e.substring(0,t);return{serverUrl:`http://${e.substring(t+1)}`,authToken:n}}return{serverUrl:`http://${e}`}}if(s.startsWith("http://")||s.startsWith("https://"))return{serverUrl:s};throw new Error(`Invalid direct-connect URL: ${s}. Expected cc://, http://, or https:// scheme.`)}var je=class{options;ws=null;ready=!1;messages=new _;exitError;partialLine="";initializePromise=null;constructor(e){this.options=e,this.initialize().catch(t=>{this.exitError=t,this.messages.error(t)})}initialize(){return this.initializePromise||(this.initializePromise=this.doInitialize()),this.initializePromise}async doInitialize(){let{serverUrl:e,authToken:t}=Ue(this.options.url),n={"Content-Type":"application/json"};t&&(n.Authorization=`Bearer ${t}`);let o=await fetch(`${e}/sessions`,{method:"POST",headers:n,body:JSON.stringify({cwd:this.options.cwd}),signal:this.options.abortController?.signal});if(!o.ok)throw new x(`Failed to create session: ${o.status}`);let r=await o.json(),i=new WebSocket(r.wsUrl);this.ws=i,i.onopen=()=>{this.ready=!0},i.onmessage=a=>{let d=(this.partialLine+String(a.data)).split(`
|
|
25
|
+
`);this.partialLine=d.pop()??"";for(let u of d)if(u.trim())try{this.messages.enqueue(JSON.parse(u))}catch{}},i.onerror=()=>{this.exitError=new x("WebSocket connection error"),this.messages.done()},i.onclose=a=>{if(this.ready=!1,a.code!==1e3&&(this.exitError=new x(`WebSocket closed: ${a.code}`)),this.partialLine.trim()){try{this.messages.enqueue(JSON.parse(this.partialLine))}catch{}this.partialLine=""}this.messages.done()}}async write(e){if(!this.ws||!this.ready)throw new x("Transport not connected");this.ws.send(e)}close(){this.ws?.close(1e3),this.ws=null,this.messages.done()}isReady(){return this.ready}async*readMessages(){if(yield*this.messages,this.exitError)throw this.exitError}endInput(){}};var Vt={};Zt(Vt,{filterEscalatingDefaultMode:()=>Gt});var Cr=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function Gt(s){let e=s.effective.permissions?.defaultMode;if(!e||!Cr.has(e))return s.effective;for(let t=s.sources.length-1;t>=0;t-=1){let n=s.sources[t];if(n.settings.permissions?.defaultMode!==void 0){if(n.source==="project"){let{defaultMode:o,...r}=s.effective.permissions??{};return{...s.effective,permissions:r}}return s.effective}}return s.effective}export{U as AbortError,xt as DEFAULT_ACCESS_TOKEN_ENV_VAR,ye as DEFAULT_RUNTIME_TRANSPORT,x as DirectConnectError,je as DirectConnectTransport,ts as EXIT_REASONS,es as HOOK_EVENTS,G as ModelPolicyTimeoutError,$ as ProcessTransport,V as ProtocolVersionMismatchError,H as QoderCliProcessError,L as QoderWorkerRuntimeError,be as WIRE_PROTOCOL_VERSION,W as WorkerTransport,gn as accessToken,fn as accessTokenFromEnv,Vt as coreTypes,Sn as createSdkMcpServer,yr as disablePlugin,hr as enablePlugin,Gt as filterEscalatingDefaultMode,gr as forkSession,er as getSessionInfo,tr as getSessionMessages,or as getSubagentMessages,_s as hasResolvableQoderWorkerRuntime,hn as jobToken,mr as listPlugins,Zn as listSessions,rr as listSubagents,Ue as parseDirectConnectUrl,mn as qodercliAuth,pn as query,sr as renameSession,we as resolveQoderWorkerRuntimePath,Tr as submitFeedback,nr as tagSession,kn as tool};
|
|
@@ -115,35 +115,35 @@ export type AccountInfo = {
|
|
|
115
115
|
apiProvider?: 'firstParty' | 'bedrock' | 'vertex' | 'foundry';
|
|
116
116
|
};
|
|
117
117
|
export type UsageQuotaBucket = {
|
|
118
|
-
total
|
|
119
|
-
used
|
|
120
|
-
remaining
|
|
121
|
-
percentage
|
|
122
|
-
unit
|
|
118
|
+
total?: number;
|
|
119
|
+
used?: number;
|
|
120
|
+
remaining?: number;
|
|
121
|
+
percentage?: number;
|
|
122
|
+
unit?: string;
|
|
123
123
|
};
|
|
124
124
|
export type UsageAddOnQuotaBucket = UsageQuotaBucket & {
|
|
125
125
|
detailUrl?: string;
|
|
126
126
|
};
|
|
127
127
|
export type UsageOrgResourcePackage = {
|
|
128
|
-
used
|
|
129
|
-
cap
|
|
130
|
-
remaining
|
|
131
|
-
percentage
|
|
132
|
-
available
|
|
133
|
-
unit
|
|
128
|
+
used?: number;
|
|
129
|
+
cap?: number;
|
|
130
|
+
remaining?: number;
|
|
131
|
+
percentage?: number;
|
|
132
|
+
available?: boolean;
|
|
133
|
+
unit?: string;
|
|
134
134
|
};
|
|
135
135
|
export type UsageInfo = {
|
|
136
|
-
userId
|
|
137
|
-
userType
|
|
138
|
-
totalUsagePercentage
|
|
139
|
-
isHighestTier
|
|
140
|
-
expiresAt
|
|
136
|
+
userId?: string;
|
|
137
|
+
userType?: string;
|
|
138
|
+
totalUsagePercentage?: number;
|
|
139
|
+
isHighestTier?: boolean;
|
|
140
|
+
expiresAt?: number;
|
|
141
141
|
upgradeUrl?: string;
|
|
142
|
-
userQuota
|
|
143
|
-
addOnQuota
|
|
144
|
-
isQuotaExceeded
|
|
145
|
-
isPlanQuotaProrated
|
|
146
|
-
orgResourcePackage
|
|
142
|
+
userQuota?: UsageQuotaBucket;
|
|
143
|
+
addOnQuota?: UsageAddOnQuotaBucket;
|
|
144
|
+
isQuotaExceeded?: boolean;
|
|
145
|
+
isPlanQuotaProrated?: boolean;
|
|
146
|
+
orgResourcePackage?: UsageOrgResourcePackage;
|
|
147
147
|
};
|
|
148
148
|
export type ApiKeySource = 'none' | 'user' | 'project' | 'org' | 'temporary' | 'oauth';
|
|
149
149
|
export type ExitReason = 'clear' | 'resume' | 'logout' | 'prompt_input_exit' | 'other' | 'bypass_permissions_disabled';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qoder-ai/qoder-agent-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "TypeScript SDK for building Qoder-powered coding agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -112,6 +112,6 @@
|
|
|
112
112
|
"typescript": "^5.7.0",
|
|
113
113
|
"zod": "^4.0.0"
|
|
114
114
|
},
|
|
115
|
-
"qoderCliVersion": "1.0.
|
|
115
|
+
"qoderCliVersion": "1.0.28",
|
|
116
116
|
"license": "SEE LICENSE IN LICENSE"
|
|
117
117
|
}
|