@qoder-ai/qoder-agent-sdk 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import{McpServer as Y}from"@modelcontextprotocol/sdk/server/mcp.js";function ee(n){if(!n.name||typeof n.name!="string"||n.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new Y({name:n.name,version:n.version??"1.0.0"},{capabilities:{tools:n.tools&&n.tools.length>0?{}:void 0}});if(n.tools&&n.tools.length>0)for(let t of n.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 "${n.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(s){throw s instanceof Error&&s.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${t.name}" in server "${n.name}". Each tool name must be unique within a server.`):s}}return{type:"sdk",name:n.name,instance:e}}function te(n,e,t,s,r){return{name:n,description:e,inputSchema:t,handler:s,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,ne=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,s)=>{this.readyResolve=t,this.readyReject=s}),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 s=new Error("WebSocket connection timeout");this.readyReject?.(s),e.close()}},ne);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
3
  `)},se)},e.onmessage=s=>{let r=String(s.data).split(`
4
- `);for(let o of r)if(o.trim())try{let i=JSON.parse(o);this.messages.enqueue(i)}catch{}},e.onerror=()=>{let s=new Error("WebSocket connection error");this.exitError=s,this.readyReject?.(s),this.messages.done()},e.onclose=s=>{this.ready=!1,this.keepAliveTimer&&(clearInterval(this.keepAliveTimer),this.keepAliveTimer=void 0),s.code!==1e3&&s.code!==1001&&(this.exitError=new Error(`WebSocket closed abnormally: ${s.code} ${s.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 P=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}},_=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 E="ExitPlanMode";import*as Z from"fs";function K(n,e,t,s){return new Promise((r,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(c){o(c);return}r({jsonrpc:"2.0"});return}let a=`${n}:${e.id}`;s.set(a,{resolve:r,reject:o}),t.onmessage?t.onmessage(e):(s.delete(a),o(new Error(`No message handler registered for MCP server "${n}"`)))})}function O(n,e,t){if("id"in e&&e.id!==null){let s=`${n}:${e.id}`,r=t.get(s);if(r)return r.resolve(e),t.delete(s),!0}return!1}function j(n,e,t){let s=0,r=`${n}:`,o=Array.from(t.entries());for(let i of o){let[a,c]=i;a.startsWith(r)&&(c.reject(e),t.delete(a),s++)}return s}function U(){return Math.random().toString(36).substring(2,15)}function N(n,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:n,request:t}}function $(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function Q(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function z(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function J(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function H(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function b(n){if(typeof n!="object"||n===null)return;let e=n,t=e.subtype;if(typeof t=="string")return t;let s=e.type;return typeof s=="string"?s:void 0}function L(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function F(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function B(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function V(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function W(n){return typeof n=="object"&&n!==null&&n.type==="result"}var q=class n{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,s,r,o,i,a,c,u,p,d,l,h,m,f,y,w){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=s,this.hooks=r??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=h??new Map,this.pendingMcpResponses=m??new Map,this.jsonSchema=a,this.initConfig=c??{},this.onElicitation=u,this.onAuthExpired=d,this.fetchJobToken=f,this.diagnostics=p,this.controlRequestTimeoutMs=l??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=w??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})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let s=e.replace(/\s+/g," ").trim();return s.length>200?`${s.slice(0,200)}...`:s}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let s=t.text;if(typeof s=="string")return this.normalizeLogPreview(s);let r=this.extractMessagePreview(t.content);if(r)return r;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let s=this.getRecord(e)?.type;return typeof s=="string"&&s?s:"unknown"}getMessageSubtype(e){let s=this.getRecord(e)?.subtype;return typeof s=="string"&&s?s:"none"}getMessageUuid(e){let s=this.getRecord(e)?.uuid;return typeof s=="string"&&s?s:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,r=this.getRecord(t)?.content,o=Array.isArray(r)?r.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(z(t)){this.handleControlResponse(t);continue}if(J(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(H(t)){this.handleControlCancelRequest(t);continue}if(L(t)||F(t)||B(t)||V(t))continue;if(W(t)){let r=t;this.recordInboundSessionMessage(r),this.resultMessage=r,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(r),this.isSingleTurn&&this.transport.endInput();continue}let s=t;if(this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{this.validateProtocolHandshake(s)}catch(r){throw this.inputStream.error(r),r}if(this.onAuthExpired&&!this.authExpiredFired){let r=!1;(s.type==="auth_status"&&s.error||s.type==="assistant"&&s.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(s)}}catch(t){e=t}finally{let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,s]of this.pendingRequests)s.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}async request(e,t){let s=U(),r=N(s,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=b(r.request)??"unknown",a=Date.now();return new Promise((c,u)=>{let p=null,d=()=>{p&&(clearTimeout(p),p=null)};this.pendingRequests.set(s,{resolve:l=>{d(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(l)},reject:l=>{d(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=error duration_ms=${Date.now()-a}`,l),u(l)}}),o>0&&Number.isFinite(o)&&(p=setTimeout(()=>{if(this.pendingRequests.has(s)){this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${s} subtype=${i} timeout_ms=${o}`);try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:s})+`
4
+ `);for(let o of r)if(o.trim())try{let i=JSON.parse(o);this.messages.enqueue(i)}catch{}},e.onerror=()=>{let s=new Error("WebSocket connection error");this.exitError=s,this.readyReject?.(s),this.messages.done()},e.onclose=s=>{this.ready=!1,this.keepAliveTimer&&(clearInterval(this.keepAliveTimer),this.keepAliveTimer=void 0),s.code!==1e3&&s.code!==1001&&(this.exitError=new Error(`WebSocket closed abnormally: ${s.code} ${s.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 P=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}},_=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 E="ExitPlanMode";import*as Z from"fs";function K(n,e,t,s){return new Promise((r,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(c){o(c);return}r({jsonrpc:"2.0"});return}let a=`${n}:${e.id}`;s.set(a,{resolve:r,reject:o}),t.onmessage?t.onmessage(e):(s.delete(a),o(new Error(`No message handler registered for MCP server "${n}"`)))})}function O(n,e,t){if("id"in e&&e.id!==null){let s=`${n}:${e.id}`,r=t.get(s);if(r)return r.resolve(e),t.delete(s),!0}return!1}function j(n,e,t){let s=0,r=`${n}:`,o=Array.from(t.entries());for(let i of o){let[a,c]=i;a.startsWith(r)&&(c.reject(e),t.delete(a),s++)}return s}function U(){return Math.random().toString(36).substring(2,15)}function N(n,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:n,request:t}}function $(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function Q(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function z(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function J(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function H(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function b(n){if(typeof n!="object"||n===null)return;let e=n,t=e.subtype;if(typeof t=="string")return t;let s=e.type;return typeof s=="string"?s:void 0}function L(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function F(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function W(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function B(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function V(n){return typeof n=="object"&&n!==null&&n.type==="result"}var q=class n{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,s,r,o,i,a,c,u,p,d,l,m,h,f,y,w){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=s,this.hooks=r??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=m??new Map,this.pendingMcpResponses=h??new Map,this.jsonSchema=a,this.initConfig=c??{},this.onElicitation=u,this.onAuthExpired=d,this.fetchJobToken=f,this.diagnostics=p,this.controlRequestTimeoutMs=l??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=w??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})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let s=e.replace(/\s+/g," ").trim();return s.length>200?`${s.slice(0,200)}...`:s}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let s=t.text;if(typeof s=="string")return this.normalizeLogPreview(s);let r=this.extractMessagePreview(t.content);if(r)return r;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let s=this.getRecord(e)?.type;return typeof s=="string"&&s?s:"unknown"}getMessageSubtype(e){let s=this.getRecord(e)?.subtype;return typeof s=="string"&&s?s:"none"}getMessageUuid(e){let s=this.getRecord(e)?.uuid;return typeof s=="string"&&s?s:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,r=this.getRecord(t)?.content,o=Array.isArray(r)?r.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(z(t)){this.handleControlResponse(t);continue}if(J(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(H(t)){this.handleControlCancelRequest(t);continue}if(L(t)||F(t)||W(t)||B(t))continue;if(V(t)){let r=t;this.recordInboundSessionMessage(r),this.resultMessage=r,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(r),this.isSingleTurn&&this.transport.endInput();continue}let s=t;if(this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{this.validateProtocolHandshake(s)}catch(r){throw this.inputStream.error(r),r}if(this.onAuthExpired&&!this.authExpiredFired){let r=!1;(s.type==="auth_status"&&s.error||s.type==="assistant"&&s.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(s)}}catch(t){e=t}finally{let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,s]of this.pendingRequests)s.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}async request(e,t){let s=U(),r=N(s,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=b(r.request)??"unknown",a=Date.now();return new Promise((c,u)=>{let p=null,d=()=>{p&&(clearTimeout(p),p=null)};this.pendingRequests.set(s,{resolve:l=>{d(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(l)},reject:l=>{d(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=error duration_ms=${Date.now()-a}`,l),u(l)}}),o>0&&Number.isFinite(o)&&(p=setTimeout(()=>{if(this.pendingRequests.has(s)){this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${s} subtype=${i} timeout_ms=${o}`);try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:s})+`
5
5
  `)}catch(l){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",l)}u(new Error(`Control request "${b(r.request)??"unknown"}" timed out after ${o}ms`))}},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${s} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(r)+`
6
6
  `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(l){d(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,l),u(l)}})}handleControlResponse(e){let t=e.response,s=t.request_id,r=this.pendingRequests.get(s);if(!r){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")r.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),r.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)b(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",s)})}async handleControlRequest(e){let t=e.request_id,s=b(e.request)??"unknown",r=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=$(t,i);this.transport.write(JSON.stringify(a)+`
7
7
  `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=success duration_ms=${Date.now()-r}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:c}=ce(i),u=Q(t,a,c);this.transport.write(JSON.stringify(u)+`
8
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-r}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new k}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=A;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${s}. Consider upgrading qodercli for the version handshake.`);return}let r=G(t),o=G(s);if(!r||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(r.major!==o.major)throw new _(t,s);r.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${s}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new k;return new Promise((s,r)=>{let o=()=>{r(new k)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),s(i)},i=>{t.removeEventListener("abort",o),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,r=b(s),o=s;switch(r){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,c=e.request_id,u=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!u?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:u.token}}case"can_use_tool":case"permission_response":{let i=o.tool_name,a=o.input??o.tool_input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let c=o.tool_use_id,u=o.permission_suggestions??o.suggestions,p=o.blocked_path,d=o.decision_reason,l=o.decision_reason_type,h=o.classifier_approvable,m=o.title,f=o.display_name,y=o.description,w=o.agent_id,S=ue(i,o.details,o.plan_path,o.plan_content),R=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:u,blockedPath:p,decisionReason:d,decisionReasonType:l,classifierApprovable:h,title:m,displayName:f,description:y,toolUseID:c,agentID:w,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:c}:{...R,toolUseID:c}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"mcp_message":{let i=o.server_name,a=o.message,c=this.sdkMcpTransports.get(i);if(!c)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(K(i,a,c,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,c=Promise.resolve(this.resolveModel(i)),u,p=new Promise((h,m)=>{u=setTimeout(()=>{m(new P(a))},a)}),d;try{d=await this.awaitAbortable(Promise.race([c,p]),t)}finally{clearTimeout(u)}let l={type:"get_model_policy",model:typeof d.model=="string"?d.model:d.model.model,parameters:d.parameters};if(typeof d.model!="string"){let{model:h,...m}=d.model;l.custom_model={...m,style:m.style??"openai"}}return l}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:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let c=a.hooks.map(u=>{let p=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(p,u),p});c.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:c,timeout:a.timeout})}i.length>0&&(t[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 s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let r=s;this.initResponse=r}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,s,r){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,s,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let s of e){if(this.closed)break;t+=1,this.transport.write(JSON.stringify(s)+`
9
- `),this.recordOutboundSessionMessage(s)}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(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"});return 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 s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async 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 s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){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,s]of this.sdkMcpTransports){try{await s.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 T(n){return typeof n=="object"&&n!==null}function oe(n){return typeof n=="number"&&Number.isFinite(n)}function x(n){return Object.keys(n).length>0}function g(n,e,t){let s=e[t];oe(s)&&(n[t]=s)}function M(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function I(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function X(n){if(!T(n)||Array.isArray(n))return;let e={};return g(e,n,"total"),g(e,n,"used"),g(e,n,"remaining"),g(e,n,"percentage"),M(e,n,"unit"),x(e)?e:void 0}function re(n){if(!T(n)||Array.isArray(n))return;let e=X(n)??{};return M(e,n,"detailUrl"),x(e)?e:void 0}function ie(n){if(!T(n)||Array.isArray(n))return;let e={};return g(e,n,"used"),g(e,n,"cap"),g(e,n,"remaining"),g(e,n,"percentage"),I(e,n,"available"),M(e,n,"unit"),x(e)?e:void 0}function ae(n){if(!T(n)||Array.isArray(n))return null;let e={};M(e,n,"userId"),M(e,n,"userType"),g(e,n,"totalUsagePercentage"),I(e,n,"isHighestTier"),g(e,n,"expiresAt"),M(e,n,"upgradeUrl"),I(e,n,"isQuotaExceeded"),I(e,n,"isPlanQuotaProrated");let t=X(n.userQuota);t&&(e.userQuota=t);let s=re(n.addOnQuota);s&&(e.addOnQuota=s);let r=ie(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function ce(n){let e=n instanceof Error?n.message:String(n),t=typeof n=="object"&&n!==null?n.code:void 0,s=typeof t=="string"&&t.length>0?t:void 0,r=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(r){let o=s??r[1];return(!s||s===r[1])&&(e=r[2]||e),{error:e,code:o}}return s?{error:e,code:s}:{error:e}}function ue(n,e,t,s){if(n!==E)return;let r=e!==null&&typeof e=="object"?e:void 0,o=r?.type===E||r?.type==="ExitPlanMode",i=o&&typeof r?.planPath=="string"&&r.planPath.length>0?r.planPath:typeof t=="string"&&t.length>0?t:void 0,a=o&&typeof r?.planContent=="string"&&r.planContent.length>0?r.planContent:typeof s=="string"&&s.length>0?s:void 0;if(!a&&i&&(a=Z.readFileSync(i,"utf8").trim()||void 0),!(!i&&!a))return{planPath:i,planContent:a}}function G(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var D=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 le(n){let{prompt:e,websocket:t,abortController:s,canUseTool:r,hooks:o,mcpServers:i,jsonSchema:a}=n,c=new Map,u=new Map,p=new Map;if(i)for(let[h,m]of Object.entries(i))if(m.type==="sdk"&&"instance"in m){let f=m.instance;c.set(h,f);let y=new D(w=>{O(h,w,p)});u.set(h,y),f.connect(y).catch(()=>{})}else throw new Error(`Browser SDK only supports SDK MCP servers. Server "${h}" has type "${m.type}".`);let d=new C({url:t.url,headers:t.headers,authMessage:t.authMessage,abortController:s}),l=new q(d,!0,r,o,s,c,a,{},void 0,void 0,void 0,void 0,u,p);return l.streamInput(e),l}export{ee as createSdkMcpServer,le as query,te as tool};
8
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-r}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new k}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=A;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${s}. Consider upgrading qodercli for the version handshake.`);return}let r=G(t),o=G(s);if(!r||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(r.major!==o.major)throw new _(t,s);r.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${s}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new k;return new Promise((s,r)=>{let o=()=>{r(new k)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),s(i)},i=>{t.removeEventListener("abort",o),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,r=b(s),o=s;switch(r){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,c=e.request_id,u=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!u?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:u.token}}case"can_use_tool":case"permission_response":{let i=o.tool_name,a=o.input??o.tool_input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let c=o.tool_use_id,u=o.permission_suggestions??o.suggestions,p=o.blocked_path,d=o.decision_reason,l=o.decision_reason_type,m=o.classifier_approvable,h=o.title,f=o.display_name,y=o.description,w=o.agent_id,S=ue(i,o.details,o.plan_path,o.plan_content),R=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:u,blockedPath:p,decisionReason:d,decisionReasonType:l,classifierApprovable:m,title:h,displayName:f,description:y,toolUseID:c,agentID:w,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:c}:{...R,toolUseID:c}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"mcp_message":{let i=o.server_name,a=o.message,c=this.sdkMcpTransports.get(i);if(!c)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(K(i,a,c,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,c=Promise.resolve(this.resolveModel(i)),u,p=new Promise((m,h)=>{u=setTimeout(()=>{h(new P(a))},a)}),d;try{d=await this.awaitAbortable(Promise.race([c,p]),t)}finally{clearTimeout(u)}let l={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,...h}=d.model;l.custom_model={...h,style:h.style??"openai"}}return l}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:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let c=a.hooks.map(u=>{let p=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(p,u),p});c.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:c,timeout:a.timeout})}i.length>0&&(t[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 s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let r=s;this.initResponse=r}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,s,r){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,s,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let s of e){if(this.closed)break;t+=1,this.transport.write(JSON.stringify(s)+`
9
+ `),this.recordOutboundSessionMessage(s)}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(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"});return 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 s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async 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 s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){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,s]of this.sdkMcpTransports){try{await s.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 T(n){return typeof n=="object"&&n!==null}function oe(n){return typeof n=="number"&&Number.isFinite(n)}function x(n){return Object.keys(n).length>0}function g(n,e,t){let s=e[t];oe(s)&&(n[t]=s)}function M(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function I(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function X(n){if(!T(n)||Array.isArray(n))return;let e={};return g(e,n,"total"),g(e,n,"used"),g(e,n,"remaining"),g(e,n,"percentage"),M(e,n,"unit"),x(e)?e:void 0}function re(n){if(!T(n)||Array.isArray(n))return;let e=X(n)??{};return M(e,n,"detailUrl"),x(e)?e:void 0}function ie(n){if(!T(n)||Array.isArray(n))return;let e={};return g(e,n,"used"),g(e,n,"cap"),g(e,n,"remaining"),g(e,n,"percentage"),I(e,n,"available"),M(e,n,"unit"),x(e)?e:void 0}function ae(n){if(!T(n)||Array.isArray(n))return null;let e={};M(e,n,"userId"),M(e,n,"userType"),g(e,n,"totalUsagePercentage"),I(e,n,"isHighestTier"),g(e,n,"expiresAt"),M(e,n,"upgradeUrl"),I(e,n,"isQuotaExceeded"),I(e,n,"isPlanQuotaProrated");let t=X(n.userQuota);t&&(e.userQuota=t);let s=re(n.addOnQuota);s&&(e.addOnQuota=s);let r=ie(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function ce(n){let e=n instanceof Error?n.message:String(n),t=typeof n=="object"&&n!==null?n.code:void 0,s=typeof t=="string"&&t.length>0?t:void 0,r=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(r){let o=s??r[1];return(!s||s===r[1])&&(e=r[2]||e),{error:e,code:o}}return s?{error:e,code:s}:{error:e}}function ue(n,e,t,s){if(n!==E)return;let r=e!==null&&typeof e=="object"?e:void 0,o=r?.type===E||r?.type==="ExitPlanMode",i=o&&typeof r?.planPath=="string"&&r.planPath.length>0?r.planPath:typeof t=="string"&&t.length>0?t:void 0,a=o&&typeof r?.planContent=="string"&&r.planContent.length>0?r.planContent:typeof s=="string"&&s.length>0?s:void 0;if(!a&&i&&(a=Z.readFileSync(i,"utf8").trim()||void 0),!(!i&&!a))return{planPath:i,planContent:a}}function G(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var D=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 le(n){let{prompt:e,websocket:t,abortController:s,canUseTool:r,hooks:o,mcpServers:i,jsonSchema:a}=n,c=new Map,u=new Map,p=new Map;if(i)for(let[m,h]of Object.entries(i))if(h.type==="sdk"&&"instance"in h){let f=h.instance;c.set(m,f);let y=new D(w=>{O(m,w,p)});u.set(m,y),f.connect(y).catch(()=>{})}else throw new Error(`Browser SDK only supports SDK MCP servers. Server "${m}" has type "${h.type}".`);let d=new C({url:t.url,headers:t.headers,authMessage:t.authMessage,abortController:s}),l=new q(d,!0,r,o,s,c,a,{},void 0,void 0,void 0,void 0,u,p);return l.streamInput(e),l}export{ee as createSdkMcpServer,le as query,te as tool};
@@ -33,6 +33,16 @@ export declare const SDK_VERSION = "0.1.0";
33
33
  * to resolve them via the `canUseTool` callback.
34
34
  */
35
35
  export declare const PERMISSION_PROMPT_TOOL_STDIO = "stdio";
36
+ /**
37
+ * Built-in qodercli tools exposed by SDK sessions when callers do not pass
38
+ * `options.tools`.
39
+ *
40
+ * Keep this list explicit so new qodercli built-ins do not automatically
41
+ * become SDK-visible. Goal, cron, workflow, plan-mode transition, Bash PTY,
42
+ * worktree, tracker, topic, and task-control tools remain opt-in via
43
+ * `options.tools`.
44
+ */
45
+ export declare const SDK_DEFAULT_TOOLS: readonly ["Agent", "AskUserQuestion", "Bash", "Edit", "Glob", "Grep", "ImageGen", "ImageSearch", "NotebookEdit", "Read", "Skill", "TodoWrite", "WebFetch", "WebSearch", "Write"];
36
46
  /**
37
47
  * Tool names with SDK-side enrichment. Tracked as constants so callers and
38
48
  * the runner agree on the exact string the CLI emits.
@@ -1,4 +1,4 @@
1
- import type { PluginDetails } from '../types/plugins.js';
1
+ import type { PluginDetails, InstallPluginResult, UninstallPluginResult } from '../types/plugins.js';
2
2
  export declare function listPlugins(opts?: {
3
3
  orgId?: string;
4
4
  cliPath?: string;
@@ -11,4 +11,13 @@ export declare function enablePlugin(id: string, opts?: {
11
11
  export declare function disablePlugin(id: string, opts?: {
12
12
  cliPath?: string;
13
13
  env?: Record<string, string>;
14
- }): Promise<void>;
14
+ }): Promise<void>;
15
+ export declare function installPlugin(path: string, opts?: {
16
+ cliPath?: string;
17
+ env?: Record<string, string>;
18
+ }): Promise<InstallPluginResult>;
19
+ export declare function uninstallPlugin(id: string, opts?: {
20
+ keepData?: boolean;
21
+ cliPath?: string;
22
+ env?: Record<string, string>;
23
+ }): Promise<UninstallPluginResult>;
package/dist/index.d.ts CHANGED
@@ -62,8 +62,8 @@ export type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
62
62
  export type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';
63
63
  export { listSessions, getSessionInfo, getSessionMessages, getSubagentMessages, listSubagents, renameSession, tagSession, } from './session/session-manager.js';
64
64
  export { forkSession } from './session/session-fork.js';
65
- export { listPlugins, enablePlugin, disablePlugin } from './global/plugins.js';
66
- export type { PluginDetails, PluginResources } from './types/plugins.js';
65
+ export { listPlugins, enablePlugin, disablePlugin, installPlugin, uninstallPlugin } from './global/plugins.js';
66
+ export type { PluginDetails, PluginResources, InstallPluginResult, UninstallPluginResult } from './types/plugins.js';
67
67
  export { submitFeedback } from './feedback.js';
68
68
  export type { SubmitFeedbackParams, SubmitFeedbackOptions, IntegrationMode, } from './feedback.js';
69
69
  export { AbortError, DirectConnectError, ModelPolicyTimeoutError, ProtocolVersionMismatchError, } from './core/errors.js';
package/dist/index.js CHANGED
@@ -1,25 +1,25 @@
1
- var ts=Object.defineProperty;var ss=(s,e)=>{for(var t in e)ts(s,t,{get:e[t],enumerable:!0})};import{spawn as bs}from"child_process";import{createInterface as ws}from"readline";var ns=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest"],rs=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"];var Fe="0.1.0";var he="ExitPlanMode";import{chmod as Le,mkdtemp as os,rm as He,writeFile as is}from"fs/promises";import{existsSync as ye,mkdtempSync as as,readFileSync as cs,rmSync as ds,writeFileSync as us}from"fs";import{tmpdir as Qe}from"os";import{dirname as Ve,join as C}from"path";import{fileURLToPath as ls}from"url";var $e="QODER_AGENT_SDK_ENTRYPOINT",Be="QODER_AGENT_SDK_VERSION",ze="QODER_SDK_AUTH_PAYLOAD_FILE",ps="sdk-ts",gs=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],fs=ls(import.meta.url),Je=Ve(fs),me=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 Ye(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function Xe(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=hs();if(s)return s;let e=ms();return ye(e)?e:"qodercli"}function hs(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of Ze()){let t=C(e,"dist","_bundled",s);if(ye(t))return t}return null}function ms(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of Ze()){let t=[C(e,"node_modules",".bin",s),C(e,"..","..",".bin",s)];for(let n of t)if(ye(n))return n}return"qodercli"}function Ze(){let s=[C(Je,".."),C(Je,"..","..")];return[...new Set(s)]}function ys(){return{allow:[],ask:[],deny:[]}}function We(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function Ss(s,e){if(e.startsWith("mcp__"))return e;let t=We(s),n=e==="*"?"*":We(e);if(!t||!n)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${n}`}function Ge(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 vs(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 N=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{ds(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Ve(this.authPayloadPath);try{await He(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[$e],delete t[Be],delete t[ze],t[$e]=ps,t[Be]=Fe,this.authPayloadPath&&(t[ze]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let n of gs)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?vs(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]:[];Ge(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=ys(),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=Ss(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]]:[];Ge(r,t[o]),n[o]=r}}readSettingsFile(e){let t=cs(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=as(C(Qe(),"qoder-agent-sdk-settings-"));let t=C(this.generatedSettingsDir,"settings.json");return us(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),n=await os(C(Qe(),"qoder-sdk-auth-"));try{await Le(n,448);let o=C(n,"payload.json");return await is(o,JSON.stringify(t),{mode:384}),await Le(o,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${o}`),o}catch(o){throw await He(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 me(t);return n}};function se(s,e){let t={...s};for(let[n,o]of Object.entries(e))o!==void 0&&(t[n]=o);return t}var Ps=41,et=8192,K=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}},z=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 N(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(se(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let 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=bs(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===Ps&&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 ss=Object.defineProperty;var ns=(s,e)=>{for(var t in e)ss(s,t,{get:e[t],enumerable:!0})};import{spawn as ws}from"child_process";import{createInterface as Ps}from"readline";var rs=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest"],os=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"];var Le="0.1.0";var He=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TodoWrite","WebFetch","WebSearch","Write"],Se="ExitPlanMode";import{chmod as Qe,mkdtemp as is,rm as $e,writeFile as as}from"fs/promises";import{existsSync as ke,mkdtempSync as cs,readFileSync as us,rmSync as ds,writeFileSync as ls}from"fs";import{tmpdir as Be}from"os";import{dirname as Xe,join as C}from"path";import{fileURLToPath as ps}from"url";var ze="QODER_AGENT_SDK_ENTRYPOINT",We="QODER_AGENT_SDK_VERSION",Je="QODER_SDK_AUTH_PAYLOAD_FILE",gs="sdk-ts",fs=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],hs=ps(import.meta.url),Ge=Xe(hs),ve=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}};function Ze(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function et(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=ms();if(s)return s;let e=ys();return ke(e)?e:"qodercli"}function ms(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of tt()){let t=C(e,"dist","_bundled",s);if(ke(t))return t}return null}function ys(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of tt()){let t=[C(e,"node_modules",".bin",s),C(e,"..","..",".bin",s)];for(let n of t)if(ke(n))return n}return"qodercli"}function tt(){let s=[C(Ge,".."),C(Ge,"..","..")];return[...new Set(s)]}function Ss(){return{allow:[],ask:[],deny:[]}}function Ve(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function vs(s,e){if(e.startsWith("mcp__"))return e;let t=Ve(s),n=e==="*"?"*":Ve(e);if(!t||!n)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${n}`}function Ye(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 ks(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 N=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{ds(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Xe(this.authPayloadPath);try{await $e(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[ze],delete t[We],delete t[Je],t[ze]=gs,t[We]=Le,this.authPayloadPath&&(t[Je]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let n of fs)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);let n=t.tools??[...He];if(Array.isArray(n)?e.push("--tools",n.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 o=this.buildSettingsArg();if(o!==void 0&&e.push("--settings",o),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),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?ks(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]:[];Ye(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=Ss(),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=vs(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]]:[];Ye(r,t[o]),n[o]=r}}readSettingsFile(e){let t=us(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=cs(C(Be(),"qoder-agent-sdk-settings-"));let t=C(this.generatedSettingsDir,"settings.json");return ls(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),n=await is(C(Be(),"qoder-sdk-auth-"));try{await Qe(n,448);let o=C(n,"payload.json");return await as(o,JSON.stringify(t),{mode:384}),await Qe(o,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${o}`),o}catch(o){throw await $e(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 ve(t);return n}};function re(s,e){let t={...s};for(let[n,o]of Object.entries(e))o!==void 0&&(t[n]=o);return t}var Rs=41,st=8192,K=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}},z=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 N(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(re(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let 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 u=this.createProcessExitError(a,c);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})})}else this.process=ws(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===Rs&&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=ws({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?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!n)return;let o=()=>e?!e.killed&&e.exitCode===null:!0,r=this.options.closeGraceMs??2e3,i=setTimeout(()=>{if(o()){n("SIGTERM");let a=setTimeout(()=>{o()&&n("SIGKILL")},5e3);typeof a=="object"&&"unref"in a&&a.unref()}},r);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>et&&(this.stderrTail=this.stderrTail.slice(-et))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",o=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new K(o,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==0&&e!==null)return new K(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new K(`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??Xe();if(Ye(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 Rs(){switch("process"){case"worker":return"worker";case"process":return"process"}return"process"}var ve=Rs();function tt(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function st(s,e){return s.create(e)}import{existsSync as we}from"fs";import{createInterface as Ts}from"readline";import{dirname as Cs,join as O}from"path";import{fileURLToPath as Ms}from"url";import{Worker as Es}from"worker_threads";var _s=41,nt=8192,rt="QODER_WORKER_RUNTIME_PATH",xs="QODER_WORKER_CWD",Is=new Set(["--mcp-config","--settings"]),As=Ms(import.meta.url),ke=Cs(As),F=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},J=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new be(se(this.options,e))}},be=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new N(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=Pe(this.options.pathToQoderWorkerRuntime);if(!we(t))throw new F(`Qoder worker runtime not found: ${t}`);let n=this.options.cwd??process.cwd(),o={...e.env,[xs]:n};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${t}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${n}`),this.diagnostics?.record(`[WorkerTransport] Args: ${Os(e.args)}`),this.worker=new Es(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.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(r)),this.diagnostics?.record("[WorkerTransport] Worker error:",r),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",r=>{if(this.ready=!1,this.observedExitCode=r,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(r),this.closed){r!==0&&this.recordSuppressedWorkerExit(r),this.cleanupAuthPayload().catch(()=>{});return}r===_s&&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():(this.abortSignal=r,this.abortListener=()=>this.close(),r.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
3
+ `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=Ps({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?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!n)return;let o=()=>e?!e.killed&&e.exitCode===null:!0,r=this.options.closeGraceMs??2e3,i=setTimeout(()=>{if(o()){n("SIGTERM");let a=setTimeout(()=>{o()&&n("SIGKILL")},5e3);typeof a=="object"&&"unref"in a&&a.unref()}},r);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>st&&(this.stderrTail=this.stderrTail.slice(-st))}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 K(o,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==0&&e!==null)return new K(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new K(`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??et();if(Ze(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 Ts(){switch("process"){case"worker":return"worker";case"process":return"process"}return"process"}var we=Ts();function nt(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function rt(s,e){return s.create(e)}import{existsSync as Te}from"fs";import{createInterface as Cs}from"readline";import{dirname as Ms,join as O}from"path";import{fileURLToPath as Es}from"url";import{Worker as _s}from"worker_threads";var xs=41,ot=8192,it="QODER_WORKER_RUNTIME_PATH",Is="QODER_WORKER_CWD",As=new Set(["--mcp-config","--settings"]),Os=Es(import.meta.url),Pe=Ms(Os),F=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},W=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new Re(re(this.options,e))}},Re=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new N(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=Ce(this.options.pathToQoderWorkerRuntime);if(!Te(t))throw new F(`Qoder worker runtime not found: ${t}`);let n=this.options.cwd??process.cwd(),o={...e.env,[Is]:n};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${t}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${n}`),this.diagnostics?.record(`[WorkerTransport] Args: ${Ds(e.args)}`),this.worker=new _s(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.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(r)),this.diagnostics?.record("[WorkerTransport] Worker error:",r),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",r=>{if(this.ready=!1,this.observedExitCode=r,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(r),this.closed){r!==0&&this.recordSuppressedWorkerExit(r),this.cleanupAuthPayload().catch(()=>{});return}r===xs&&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():(this.abortSignal=r,this.abortListener=()=>this.close(),r.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
4
4
  `)?e:e+`
5
- `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=Ts({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.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??2e3;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>nt&&(this.stderrTail=this.stderrTail.slice(-nt))}createWorkerError(e){return new F(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(e!==0)return new F(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,n)=>{let o=i=>{if(e.off("error",r),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,n(a)):t()},r=i=>{if(e.off("exit",o),this.closed){t();return}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)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function Pe(s){if(s)return s;if(process.env[rt])return process.env[rt];let e=[];for(let t of Us())e.push(O(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),O(t,"dist","_worker","qoder-worker-runtime.mjs"),O(t,"_worker","qoder-worker-runtime.obf.mjs"),O(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(we(t))return t;return e[0]??O(ke,"..","_worker","qoder-worker-runtime.obf.mjs")}function Os(s){let e=[];for(let t=0;t<s.length;t+=1){let n=s[t];e.push(n),Is.has(n)&&t+1<s.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}function Ds(s){return we(Pe(s))}function Us(){let s=[O(ke,".."),O(ke,"..","..")];return[...new Set(s)]}import{appendFileSync as js,mkdirSync as qs}from"fs";import{dirname as Ns}from"path";var Ks="QODER_AGENT_SDK_DEBUG";function Fs(s){return s.debugFile?!0:s.debug===!0||Hs(process.env[Ks])}function Ls(s){if(s.debugFile)return s.debugFile}function Hs(s){if(s===void 0)return!1;let e=s.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var ne=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=Fs(e),this.debugFile=Ls(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{qs(Ns(e),{recursive:!0}),js(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}
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=Cs({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.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??2e3;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>ot&&(this.stderrTail=this.stderrTail.slice(-ot))}createWorkerError(e){return new F(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(e!==0)return new F(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,n)=>{let o=i=>{if(e.off("error",r),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,n(a)):t()},r=i=>{if(e.off("exit",o),this.closed){t();return}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)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function Ce(s){if(s)return s;if(process.env[it])return process.env[it];let e=[];for(let t of js())e.push(O(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),O(t,"dist","_worker","qoder-worker-runtime.mjs"),O(t,"_worker","qoder-worker-runtime.obf.mjs"),O(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(Te(t))return t;return e[0]??O(Pe,"..","_worker","qoder-worker-runtime.obf.mjs")}function Ds(s){let e=[];for(let t=0;t<s.length;t+=1){let n=s[t];e.push(n),As.has(n)&&t+1<s.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}function Us(s){return Te(Ce(s))}function js(){let s=[O(Pe,".."),O(Pe,"..","..")];return[...new Set(s)]}import{appendFileSync as qs,mkdirSync as Ns}from"fs";import{dirname as Ks}from"path";var Fs="QODER_AGENT_SDK_DEBUG";function Ls(s){return s.debugFile?!0:s.debug===!0||Qs(process.env[Fs])}function Hs(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 oe=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=Ls(e),this.debugFile=Hs(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{Ns(Ks(e),{recursive:!0}),qs(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 D=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},x=class extends Error{constructor(e){super(e),this.name="DirectConnectError"}},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}},G=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 Re="1.0.0";import*as bt from"fs";function ot(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 it(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 at(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 ct(){return Math.random().toString(36).substring(2,15)}function dt(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 ut(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function lt(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function pt(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function gt(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function ft(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function L(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 ht(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function mt(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function yt(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function St(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function vt(s){return typeof s=="object"&&s!==null&&s.type==="result"}var oe=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,p,g,u,l,f,v,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=v,this.diagnostics=p,this.controlRequestTimeoutMs=u??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=S??500,this.inputStream=new _(()=>{this.close().catch(()=>{})}),this.readLoopPromise=this.readMessages().catch(k=>{this.inputStream.error(k)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let k=this.abortController.signal;k.aborted?this.close().catch(()=>{}):k.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let n=e.replace(/\s+/g," ").trim();return n.length>200?`${n.slice(0,200)}...`:n}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let n=t.text;if(typeof n=="string")return this.normalizeLogPreview(n);let o=this.extractMessagePreview(t.content);if(o)return o;let r=this.getRecord(t.message);return r?this.extractMessagePreview(r):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let n=this.getRecord(e)?.type;return typeof n=="string"&&n?n:"unknown"}getMessageSubtype(e){let n=this.getRecord(e)?.subtype;return typeof n=="string"&&n?n:"none"}getMessageUuid(e){let n=this.getRecord(e)?.uuid;return typeof n=="string"&&n?n:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,o=this.getRecord(t)?.content,r=Array.isArray(o)?o.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${r}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(pt(t)){this.handleControlResponse(t);continue}if(gt(t)){this.handleControlRequest(t).catch(o=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",o)});continue}if(ft(t)){this.handleControlCancelRequest(t);continue}if(ht(t)||mt(t)||yt(t)||St(t))continue;if(vt(t)){let o=t;this.recordInboundSessionMessage(o),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(this.recordInboundSessionMessage(n),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=ct(),o=dt(n,e),r=t?.timeoutMs??this.controlRequestTimeoutMs,i=L(o.request)??"unknown",a=Date.now();return new Promise((c,d)=>{let p=null,g=()=>{p&&(clearTimeout(p),p=null)};this.pendingRequests.set(n,{resolve:u=>{g(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${n} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(u)},reject:u=>{g(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${n} subtype=${i} status=error duration_ms=${Date.now()-a}`,u),d(u)}}),r>0&&Number.isFinite(r)&&(p=setTimeout(()=>{if(this.pendingRequests.has(n)){this.pendingRequests.delete(n),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${n} subtype=${i} timeout_ms=${r}`);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)}d(new Error(`Control request "${L(o.request)??"unknown"}" timed out after ${r}ms`))}},r));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${n} subtype=${i} timeout_ms=${r}`),this.transport.write(JSON.stringify(o)+`
9
- `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${n} subtype=${i}`)}catch(u){g(),this.pendingRequests.delete(n),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${n} subtype=${i}`,u),d(u)}})}handleControlResponse(e){let t=e.response,n=t.request_id,o=this.pendingRequests.get(n);if(!o){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${n} status=${t.subtype}`);return}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)L(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=L(e.request)??"unknown",o=Date.now(),r=new AbortController;this.pendingInboundRequests.set(t,{abortController:r}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${n}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,r.signal),r.signal);if(!r.signal.aborted){let a=ut(t,i);this.transport.write(JSON.stringify(a)+`
10
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=success duration_ms=${Date.now()-o}`)}}catch(i){if(!r.signal.aborted){let{error:a,code:c}=Js(i),d=lt(t,a,c);this.transport.write(JSON.stringify(d)+`
11
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=error duration_ms=${Date.now()-o}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new D}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,n=Re;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=kt(t),r=kt(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 G(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 D;return new Promise((n,o)=>{let r=()=>{o(new D)};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=L(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,p=r.blocked_path,g=r.decision_reason,u=r.decision_reason_type,l=r.classifier_approvable,f=r.title,v=r.display_name,y=r.description,S=r.agent_id,k=Ws(i,r.details,r.plan_path,r.plan_content),P=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:d,blockedPath:p,decisionReason:g,decisionReasonType:u,classifierApprovable:l,title:f,displayName:v,description:y,toolUseID:c,agentID:S,exitPlanMode:k}),t);if(P.behavior==="deny"&&!P.message)throw new Error("Permission deny result must include a message.");return P.behavior==="allow"?{...P,updatedInput:P.updatedInput??a,toolUseID:c}:{...P,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(ot(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,p=new Promise((l,f)=>{d=setTimeout(()=>{f(new W(a))},a)}),g;try{g=await this.awaitAbortable(Promise.race([c,p]),t)}finally{clearTimeout(d)}let u={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;u.custom_model={...f,style:f.style??"openai"}}return u}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 p=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(p,d),p});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
- `),this.recordOutboundSessionMessage(n)}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(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"});return zs(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)}at(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}};function ie(s){return typeof s=="object"&&s!==null}function Qs(s){return typeof s=="number"&&Number.isFinite(s)}function Te(s){return Object.keys(s).length>0}function T(s,e,t){let n=e[t];Qs(n)&&(s[t]=n)}function H(s,e,t){let n=e[t];typeof n=="string"&&(s[t]=n)}function re(s,e,t){let n=e[t];typeof n=="boolean"&&(s[t]=n)}function wt(s){if(!ie(s)||Array.isArray(s))return;let e={};return T(e,s,"total"),T(e,s,"used"),T(e,s,"remaining"),T(e,s,"percentage"),H(e,s,"unit"),Te(e)?e:void 0}function $s(s){if(!ie(s)||Array.isArray(s))return;let e=wt(s)??{};return H(e,s,"detailUrl"),Te(e)?e:void 0}function Bs(s){if(!ie(s)||Array.isArray(s))return;let e={};return T(e,s,"used"),T(e,s,"cap"),T(e,s,"remaining"),T(e,s,"percentage"),re(e,s,"available"),H(e,s,"unit"),Te(e)?e:void 0}function zs(s){if(!ie(s)||Array.isArray(s))return null;let e={};H(e,s,"userId"),H(e,s,"userType"),T(e,s,"totalUsagePercentage"),re(e,s,"isHighestTier"),T(e,s,"expiresAt"),H(e,s,"upgradeUrl"),re(e,s,"isQuotaExceeded"),re(e,s,"isPlanQuotaProrated");let t=wt(s.userQuota);t&&(e.userQuota=t);let n=$s(s.addOnQuota);n&&(e.addOnQuota=n);let o=Bs(s.orgResourcePackage);return o&&(e.orgResourcePackage=o),e}function Js(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 Ws(s,e,t,n){if(s!==he)return;let o=e!==null&&typeof e=="object"?e:void 0,r=o?.type===he||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=bt.readFileSync(i,"utf8").trim()||void 0),!(!i&&!a))return{planPath:i,planContent:a}}function kt(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var ae=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 Pt}from"crypto";var Gs="QODER_CLOUD_AGENT_API_BASE",Vs="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"},Ys=1024,Rt=1*1024*1024,Tt=4*1024*1024,Xs=8*1024,Me=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"}},ce=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Ee=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}},Zs=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function _t(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(r=>s[r]!==void 0&&!Zs.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 ce;let{agent:t,session:n}=s.experimentalCloudAgent;if(t&&Q(t)&&Ce(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(n&&Q(n)&&Ce(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||!Ce(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 Ce(s){return"create"in s&&s.create!==void 0}function xt(s){return new _e(s)}var _e=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=hn();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Et();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=en(e.options.auth,e.options.env),this.apiBase=tn(),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(gn(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=pn(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,...nn(o)}});t=Ct(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:sn(e.create)});return Ct(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 fn(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 Mt(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 p=d.endsWith("\r")?d.slice(0,-1):d;if(this.consumeSseLine(p,r),this.closed)break}o.length>Rt&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Rt} 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:an(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>Tt){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Tt} 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??Pt(),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=dn(V(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=Et(),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>=Ys&&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(de(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:Pt(),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 rn(n)}captureUsage(e){let t=de(e,"usage");if(!t)return;this.latestUsage=un(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]=ln(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 Mt(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 en(s,e){if(s?.type!=="accessToken")throw new ce;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 Me(t);return n}function tn(){return process.env[Gs]?.replace(/\/+$/,"")??Vs}function sn(s){return xe({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 nn(s){return xe({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>xe({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function xe(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function Ct(s,e){let t=R(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function rn(s){let e=cn(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 Mt(s){let e=await on(s,Xs);return new Ee(s.status,e||s.statusText||"unknown error")}async function on(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 an(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function de(s,e){let t=V(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function cn(s,e){let t=V(s,e);return Array.isArray(t)?t:void 0}function R(s,e){let t=V(s,e);return typeof t=="string"?t:void 0}function b(s,e){let t=V(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function V(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function dn(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>It(t)?t.text:"").filter(Boolean).join("")||void 0}function un(s,e){let t=de(e,"cache_creation"),n=de(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 ln(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 pn(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>It(t)?t.text:JSON.stringify(t)).join(`
15
- `):JSON.stringify(e)}function It(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function gn(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 Et(){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 fn(s,e){e.aborted||await new Promise(t=>{let n=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(n),t()},{once:!0})})}function hn(){let s,e;return{promise:new Promise((n,o)=>{s=n,e=o}),resolve:s,reject:e}}var Ie=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 mn(s){if(s.transport!==void 0){if(tt(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 ve==="worker"?J.default:z.default}function yn(s){let{prompt:e,options:t={}}=s,n=mn(t),o=new ne({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 Ie;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 _t(t),xt({prompt:e,options:t,diagnostics:o});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,d=a?()=>{c||(c=!0,Promise.resolve(a()).catch(m=>{o.record("[query] onAuthExpired callback threw:",m)}))}:void 0,p=new Map,g=new Map,u=new Map,l={},f={};if(t.mcpServers)for(let[m,E]of Object.entries(t.mcpServers)){let B=E.tools;if(Array.isArray(B)&&B.length>0&&(f[m]=B),E.type==="sdk"&&"instance"in E&&E.instance){let q=E.instance;p.set(m,q);let Ke=new ae(es=>{it(m,es,u)});g.set(m,Ke),q.connect(Ke).catch(()=>{})}else l[m]=E}let v=Object.keys(l).length>0,y=Object.keys(f).length>0,S=t.pathToQoderCLIExecutable,k=t.env,P=r?.type==="jobToken"?r.fetchJobToken:void 0,ge={pathToQoderCLIExecutable:S,executable:t.executable,executableArgs:t.executableArgs,env:k,proxy:t.proxy,cwd:t.cwd,closeGraceMs:t.closeGraceMs,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 m=t.allowedTools??[];if(t.skills===void 0)return m.length>0?m:void 0;let E=t.skills==="all"?["Skill"]:t.skills.map(q=>`Skill(${q})`),B=new Set(m);return[...m,...E.filter(q=>!B.has(q))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:v?l:void 0,mcpToolPolicies:y?f:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:d},ee=st(n,ge);ee.initialize().catch(()=>{});let te=typeof e=="string",h=t.systemPrompt,M,$;if(typeof h=="string")M=h;else if(typeof h=="object"&&h!==null&&h.type==="preset"){let m=h;if(m.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(m.preset)}`);$=m.append}let Zt={systemPrompt:M,appendSystemPrompt:$,planModeInstructions:t.planModeInstructions,agents:t.agents,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},fe=new oe(ee,te,t.canUseTool,t.hooks,t.abortController,p,void 0,Zt,t.onElicitation,o,d,t.controlRequestTimeoutMs,g,u,P,t.resolveModel,t.resolveModelTimeoutMs);if(typeof e=="string"){let m={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};fe.streamInput(async function*(){yield m}())}else fe.streamInput(e);return fe}var At="QODER_PERSONAL_ACCESS_TOKEN";function Sn(s){return{type:"accessToken",accessToken:s}}function vn(s=At){return{type:"accessToken",accessToken:{envVar:s}}}function kn(){return{type:"qodercli"}}function bn(s){return{type:"jobToken",fetchJobToken:s}}import{McpServer as wn}from"@modelcontextprotocol/sdk/server/mcp.js";function Pn(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 wn({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 Rn(s,e,t,n,o){return{name:s,description:e,inputSchema:t,handler:n,annotations:o?.annotations}}import{readdir as Oe,readFile as le,stat as Z,appendFile as qt,realpath as An}from"fs/promises";import{basename as On,join as w,resolve as Ut}from"path";import{execFile as Dn}from"child_process";import{promisify as Un}from"util";import{homedir as Tn}from"os";import{join as Dt}from"path";var Cn=".qoder",Mn="QODER_CLI_HOME",En="QODER_CONFIG_DIR",Ot=200;function _n(){return process.env[Mn]||Tn()}function xn(){let s=process.env[En];return s||Dt(_n(),Cn)}function ue(){return Dt(xn(),"projects")}function In(s){let e=5381;for(let t=0;t<s.length;t++)e=e*33^s.charCodeAt(t);return e}function Y(s){let e=s.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Ot)return e;let t=Math.abs(In(s)).toString(36);return`${e.slice(0,Ot)}-${t}`}var jn=Un(Dn),qn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Nn=new Set(["user","assistant","system","progress","attachment"]);function U(s){return s!==null&&typeof s=="object"}function Kn(s){return qn.test(s)}function Fn(s){let e=[];for(let t of s.split(`
16
- `)){let n=t.trim();if(n)try{let o=JSON.parse(n);U(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&Nn.has(o.type)&&e.push(o)}catch{}}return e}function Ae(s){if(!U(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}function X(s){if(s.type!=="assistant"||!U(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function Nt(s){return s.type!=="user"||!s.parentUuid?!1:Ae(s).some(e=>U(e)&&e.type==="tool_result")}function Ln(s){if(!U(s.message))return null;let e=s.message.id;return typeof e=="string"&&e.length>0?e:null}function Hn(s,e){let t=new Map;for(let[n,o]of s){let r=Ln(o);if(r){let i=t.get(r);i?i.push(n):t.set(r,[n])}}for(let[n,o]of s){let r=Qn(o,o.parentUuid,s,t,e);r!==o.parentUuid&&s.set(n,{...o,parentUuid:r})}}function Qn(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]:$n(s,r,t)??Bn(s,r,t,o)??e}function $n(s,e,t){if(!Nt(s))return;let n=Ae(s).filter(r=>U(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?Ae(i).some(a=>U(a)&&a.type==="tool_use"&&n.includes(typeof a.id=="string"?a.id:"")):!1});return o.length===1?o[0]:void 0}function Bn(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 zn(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 jt(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 Jn(s,e,t){let n=e.filter(u=>u.type==="assistant");if(n.length===0)return e;let o=new Map,r=0;for(let u of s.keys())o.set(u,r++);let i=new Map;for(let u of n){let l=X(u);l&&i.set(l,u)}let a=new Map,c=new Map;for(let u of s.values()){let l=X(u);if(l){let f=a.get(l)??[];f.push(u),a.set(l,f);continue}if(Nt(u)&&u.parentUuid){let f=c.get(u.parentUuid)??[];f.push(u),c.set(u.parentUuid,f)}}let d=new Set,p=new Map;for(let u of n){let l=X(u);if(!l||d.has(l))continue;d.add(l);let f=a.get(l)??[u],v=f.filter(h=>!t.has(h.uuid)),y=[];for(let h of f){let M=c.get(h.uuid)??[];for(let $ of M)t.has($.uuid)||y.push($)}if(v.length===0&&y.length===0)continue;let S=i.get(l);if(!S)continue;let k=[...f].sort((h,M)=>jt(h,M,o));y.sort((h,M)=>jt(h,M,o));let P=k.findIndex(h=>h.uuid===S.uuid),ge=k.slice(0,Math.max(P,0)).filter(h=>!t.has(h.uuid)),ee=k.slice(P+1).filter(h=>!t.has(h.uuid)),te=[...ge,...ee,...y];for(let h of te)t.add(h.uuid);p.set(S.uuid,te)}if(p.size===0)return e;let g=[];for(let u of e){let l=p.get(u.uuid);if(l){let f=o.get(u.uuid)??Number.MAX_SAFE_INTEGER,v=[],y=[];for(let S of l)(u.type==="assistant"&&S.type==="assistant"&&X(S)===X(u)&&(o.get(S.uuid)??Number.MAX_SAFE_INTEGER)<f?v:y).push(S);g.push(...v,u,...y)}else g.push(u)}return g}function Wn(s){if(s.length===0)return[];let e=new Map,t=new Map;for(let[u,l]of s.entries())e.set(l.uuid,l),t.set(l.uuid,u);zn(e),Hn(e,t);let n=new Set;for(let u of e.values())u.parentUuid&&n.add(u.parentUuid);let o=Array.from(e.values()).filter(u=>!n.has(u.uuid)),r=[];for(let u of o){let l=u,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(u=>!u.isSidechain&&!u.teamName&&!u.isMeta),c=(i.length>0?i:r).reduce((u,l)=>(t.get(l.uuid)??-1)>(t.get(u.uuid)??-1)?l:u),d=[],p=new Set,g=c;for(;g&&!p.has(g.uuid);)p.add(g.uuid),d.push(g),g=g.parentUuid?e.get(g.parentUuid):void 0;return d.reverse(),Jn(e,d,p)}function Gn(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 Vn(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 Yn(s){let e=s.type==="system"?Vn(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 Xn(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 Kt(s){try{return await An(Ut(s))}catch{return Ut(s)}}async function Zn(s){return Y(await Kt(s))}async function j(s){let e=ue();if(s?.dir){let t=await Kt(s.dir),n=[w(e,Y(t))];if(s.includeWorktrees!==!1)try{let{stdout:o}=await jn("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(w(e,await Zn(i)))}catch{}return n}try{return(await Oe(e,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>w(e,n.name))}catch{return[]}}async function Ft(s){try{let[e,t]=await Promise.all([le(s,"utf-8"),Z(s)]),n=e.trim().split(`
18
- `).filter(Boolean);if(n.length===0)return null;let o=On(s,".jsonl"),r,i,a,c,d,p,g;for(let u of n)try{let l=JSON.parse(u);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 v=f.find(y=>y.type==="text");v?.text&&(r=v.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"&&(p=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:p,createdAt:g}}catch{return null}}function Lt(s,e){return w(s,e,"subagents")}function er(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 Ht(s){let e=[];async function t(n){let o;try{o=await Oe(n,{withFileTypes:!0})}catch{return}for(let r of o){let i=w(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 tr(s){try{let e=await le(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 sr(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 nr(s,e,t){let[n,o]=await Promise.all([le(s,"utf-8"),tr(s)]),r=[];for(let p of n.trim().split(`
19
- `).filter(Boolean))try{let g=JSON.parse(p);er(g)&&r.push(g)}catch{}let a=sr(r).map(p=>({type:p.type,uuid:p.uuid,session_id:p.sessionId??e,message:p.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 rr(s){let e=await j(s),n=(await Promise.all(e.map(async d=>{try{return(await Oe(d)).filter(g=>g.endsWith(".jsonl")).map(g=>w(d,g))}catch{return[]}}))).flat(),o=await Promise.all(n.map(Ft)),r=new Map;for(let d of o){if(!d)continue;let p=r.get(d.sessionId);(!p||d.lastModified>p.lastModified)&&r.set(d.sessionId,d)}let i=Array.from(r.values()).sort((d,p)=>p.lastModified-d.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function or(s,e){let t=await j(e);for(let n of t){let o=w(n,`${s}.jsonl`),r=await Ft(o);if(r)return r}}async function ir(s,e){if(!Kn(s))return[];let t=e?.includeSystemMessages===!0,n=await j(e);for(let o of n){let r=w(o,`${s}.jsonl`);try{let i=await le(r,"utf-8"),c=Wn(Fn(i)).filter(d=>Gn(d,t)).map(Yn);return Xn(c,e)}catch{continue}}return[]}async function ar(s,e,t){let n=await j(t);for(let o of n){let r=w(o,`${s}.jsonl`);try{await Z(r);let i=JSON.stringify({type:"custom-title",sessionId:s,customTitle:e,timestamp:new Date().toISOString()});await qt(r,i+`
20
- `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function cr(s,e,t){let n=await j(t);for(let o of n){let r=w(o,`${s}.jsonl`);try{await Z(r);let i=JSON.stringify({type:"tag",sessionId:s,tag:e??"",timestamp:new Date().toISOString()});await qt(r,i+`
21
- `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function dr(s,e){let t=await j(e);for(let n of t){let o=w(n,`${s}.jsonl`);try{await Z(o);let r=await Ht(Lt(n,s));return Array.from(new Set(r.map(i=>i.agentId)))}catch{continue}}return[]}async function ur(s,e,t){let n=await j(t);for(let o of n){let r=w(o,`${s}.jsonl`);try{await Z(r);let a=(await Ht(Lt(o,s))).find(c=>c.agentId===e);return a?await nr(a.filePath,s,t):[]}catch{continue}}return[]}import{readdir as lr,readFile as pr,writeFile as gr,mkdir as fr,stat as Qt}from"fs/promises";import{join as De,dirname as $t,resolve as hr}from"path";import{randomUUID as zt}from"crypto";function mr(s){return Y(hr(s))}async function yr(s,e){let t=ue();if(e){let n=mr(e),o=De(t,n,`${s}.jsonl`);try{return await Qt(o),o}catch{return null}}try{let n=await lr(t,{withFileTypes:!0});for(let o of n)if(o.isDirectory()){let r=De(t,o.name,`${s}.jsonl`);try{return await Qt(r),r}catch{continue}}}catch{}return null}function Bt(s,e,t){let n={...s};if(typeof s.uuid=="string"){let o=s.uuid;e.has(o)||e.set(o,zt()),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 Sr(s,e){let t=await yr(s,e?.dir);if(!t)throw new Error(`Session ${s} not found`);let o=(await pr(t,"utf-8")).trim().split(`
22
- `).filter(Boolean),r=new Map,i=zt(),a=[];for(let d of o)try{let p=JSON.parse(d);if(e?.upToMessageId&&p.uuid===e.upToMessageId){let u=Bt(p,r,i);a.push(JSON.stringify(u));break}let g=Bt(p,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=De($t(t),`${i}.jsonl`);return await fr($t(c),{recursive:!0}),await gr(c,a.join(`
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 D=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},x=class extends Error{constructor(e){super(e),this.name="DirectConnectError"}},J=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}},G=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 Me="1.0.0";import*as Pt from"fs";function at(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 ct(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 ut(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 dt(){return Math.random().toString(36).substring(2,15)}function lt(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 pt(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function gt(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function ft(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function ht(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function mt(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function L(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 yt(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function St(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function vt(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function kt(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function bt(s){return typeof s=="object"&&s!==null&&s.type==="result"}var ae=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,u,p,g,d,l,f,v,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=u,this.onAuthExpired=g,this.fetchJobToken=v,this.diagnostics=p,this.controlRequestTimeoutMs=d??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=S??500,this.inputStream=new _(()=>{this.close().catch(()=>{})}),this.readLoopPromise=this.readMessages().catch(k=>{this.inputStream.error(k)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let k=this.abortController.signal;k.aborted?this.close().catch(()=>{}):k.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let n=e.replace(/\s+/g," ").trim();return n.length>200?`${n.slice(0,200)}...`:n}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let n=t.text;if(typeof n=="string")return this.normalizeLogPreview(n);let o=this.extractMessagePreview(t.content);if(o)return o;let r=this.getRecord(t.message);return r?this.extractMessagePreview(r):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let n=this.getRecord(e)?.type;return typeof n=="string"&&n?n:"unknown"}getMessageSubtype(e){let n=this.getRecord(e)?.subtype;return typeof n=="string"&&n?n:"none"}getMessageUuid(e){let n=this.getRecord(e)?.uuid;return typeof n=="string"&&n?n:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,o=this.getRecord(t)?.content,r=Array.isArray(o)?o.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${r}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(ft(t)){this.handleControlResponse(t);continue}if(ht(t)){this.handleControlRequest(t).catch(o=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",o)});continue}if(mt(t)){this.handleControlCancelRequest(t);continue}if(yt(t)||St(t)||vt(t)||kt(t))continue;if(bt(t)){let o=t;this.recordInboundSessionMessage(o),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(this.recordInboundSessionMessage(n),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=dt(),o=lt(n,e),r=t?.timeoutMs??this.controlRequestTimeoutMs,i=L(o.request)??"unknown",a=Date.now();return new Promise((c,u)=>{let p=null,g=()=>{p&&(clearTimeout(p),p=null)};this.pendingRequests.set(n,{resolve:d=>{g(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${n} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(d)},reject:d=>{g(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${n} subtype=${i} status=error duration_ms=${Date.now()-a}`,d),u(d)}}),r>0&&Number.isFinite(r)&&(p=setTimeout(()=>{if(this.pendingRequests.has(n)){this.pendingRequests.delete(n),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${n} subtype=${i} timeout_ms=${r}`);try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:n})+`
8
+ `)}catch(d){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",d)}u(new Error(`Control request "${L(o.request)??"unknown"}" timed out after ${r}ms`))}},r));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${n} subtype=${i} timeout_ms=${r}`),this.transport.write(JSON.stringify(o)+`
9
+ `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${n} subtype=${i}`)}catch(d){g(),this.pendingRequests.delete(n),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${n} subtype=${i}`,d),u(d)}})}handleControlResponse(e){let t=e.response,n=t.request_id,o=this.pendingRequests.get(n);if(!o){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${n} status=${t.subtype}`);return}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)L(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=L(e.request)??"unknown",o=Date.now(),r=new AbortController;this.pendingInboundRequests.set(t,{abortController:r}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${n}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,r.signal),r.signal);if(!r.signal.aborted){let a=pt(t,i);this.transport.write(JSON.stringify(a)+`
10
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=success duration_ms=${Date.now()-o}`)}}catch(i){if(!r.signal.aborted){let{error:a,code:c}=Js(i),u=gt(t,a,c);this.transport.write(JSON.stringify(u)+`
11
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=error duration_ms=${Date.now()-o}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new D}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,n=Me;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=wt(t),r=wt(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 G(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 D;return new Promise((n,o)=>{let r=()=>{o(new D)};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=L(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,u=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!u?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:u.token}}case"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,u=r.permission_suggestions??r.suggestions,p=r.blocked_path,g=r.decision_reason,d=r.decision_reason_type,l=r.classifier_approvable,f=r.title,v=r.display_name,y=r.description,S=r.agent_id,k=Gs(i,r.details,r.plan_path,r.plan_content),P=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:u,blockedPath:p,decisionReason:g,decisionReasonType:d,classifierApprovable:l,title:f,displayName:v,description:y,toolUseID:c,agentID:S,exitPlanMode:k}),t);if(P.behavior==="deny"&&!P.message)throw new Error("Permission deny result must include a message.");return P.behavior==="allow"?{...P,updatedInput:P.updatedInput??a,toolUseID:c}:{...P,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(at(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)),u,p=new Promise((l,f)=>{u=setTimeout(()=>{f(new J(a))},a)}),g;try{g=await this.awaitAbortable(Promise.race([c,p]),t)}finally{clearTimeout(u)}let d={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;d.custom_model={...f,style:f.style??"openai"}}return d}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(u=>{let p=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(p,u),p});c.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:c,timeout:a.timeout})}i.length>0&&(t[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
+ `),this.recordOutboundSessionMessage(n)}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(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"});return Ws(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)}ut(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}};function ce(s){return typeof s=="object"&&s!==null}function $s(s){return typeof s=="number"&&Number.isFinite(s)}function Ee(s){return Object.keys(s).length>0}function T(s,e,t){let n=e[t];$s(n)&&(s[t]=n)}function H(s,e,t){let n=e[t];typeof n=="string"&&(s[t]=n)}function ie(s,e,t){let n=e[t];typeof n=="boolean"&&(s[t]=n)}function Rt(s){if(!ce(s)||Array.isArray(s))return;let e={};return T(e,s,"total"),T(e,s,"used"),T(e,s,"remaining"),T(e,s,"percentage"),H(e,s,"unit"),Ee(e)?e:void 0}function Bs(s){if(!ce(s)||Array.isArray(s))return;let e=Rt(s)??{};return H(e,s,"detailUrl"),Ee(e)?e:void 0}function zs(s){if(!ce(s)||Array.isArray(s))return;let e={};return T(e,s,"used"),T(e,s,"cap"),T(e,s,"remaining"),T(e,s,"percentage"),ie(e,s,"available"),H(e,s,"unit"),Ee(e)?e:void 0}function Ws(s){if(!ce(s)||Array.isArray(s))return null;let e={};H(e,s,"userId"),H(e,s,"userType"),T(e,s,"totalUsagePercentage"),ie(e,s,"isHighestTier"),T(e,s,"expiresAt"),H(e,s,"upgradeUrl"),ie(e,s,"isQuotaExceeded"),ie(e,s,"isPlanQuotaProrated");let t=Rt(s.userQuota);t&&(e.userQuota=t);let n=Bs(s.addOnQuota);n&&(e.addOnQuota=n);let o=zs(s.orgResourcePackage);return o&&(e.orgResourcePackage=o),e}function Js(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 Gs(s,e,t,n){if(s!==Se)return;let o=e!==null&&typeof e=="object"?e:void 0,r=o?.type===Se||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=Pt.readFileSync(i,"utf8").trim()||void 0),!(!i&&!a))return{planPath:i,planContent:a}}function wt(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var ue=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 Tt}from"crypto";var Vs="QODER_CLOUD_AGENT_API_BASE",Ys="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"},Xs=1024,Ct=1*1024*1024,Mt=4*1024*1024,Zs=8*1024,xe=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},de=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Ie=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}},en=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function It(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(r=>s[r]!==void 0&&!en.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 de;let{agent:t,session:n}=s.experimentalCloudAgent;if(t&&Q(t)&&_e(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(n&&Q(n)&&_e(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||!_e(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 _e(s){return"create"in s&&s.create!==void 0}function At(s){return new Ae(s)}var Ae=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=mn();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=xt();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=tn(e.options.auth,e.options.env),this.apiBase=sn(),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(fn(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=gn(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,...rn(o)}});t=Et(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:nn(e.create)});return Et(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 hn(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 _t(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 u=o.slice(0,c);o=o.slice(c+1);let p=u.endsWith("\r")?u.slice(0,-1):u;if(this.consumeSseLine(p,r),this.closed)break}o.length>Ct&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Ct} 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:cn(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>Mt){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Mt} 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??Tt(),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=dn(V(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=xt(),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>=Xs&&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(le(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:Tt(),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 on(n)}captureUsage(e){let t=le(e,"usage");if(!t)return;this.latestUsage=ln(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]=pn(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 _t(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 tn(s,e){if(s?.type!=="accessToken")throw new de;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 xe(t);return n}function sn(){return process.env[Vs]?.replace(/\/+$/,"")??Ys}function nn(s){return Oe({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 rn(s){return Oe({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>Oe({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function Oe(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function Et(s,e){let t=R(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function on(s){let e=un(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 _t(s){let e=await an(s,Zs);return new Ie(s.status,e||s.statusText||"unknown error")}async function an(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 cn(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function le(s,e){let t=V(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function un(s,e){let t=V(s,e);return Array.isArray(t)?t:void 0}function R(s,e){let t=V(s,e);return typeof t=="string"?t:void 0}function b(s,e){let t=V(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function V(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function dn(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>Ot(t)?t.text:"").filter(Boolean).join("")||void 0}function ln(s,e){let t=le(e,"cache_creation"),n=le(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 pn(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 gn(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Ot(t)?t.text:JSON.stringify(t)).join(`
15
+ `):JSON.stringify(e)}function Ot(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function fn(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 xt(){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 hn(s,e){e.aborted||await new Promise(t=>{let n=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(n),t()},{once:!0})})}function mn(){let s,e;return{promise:new Promise((n,o)=>{s=n,e=o}),resolve:s,reject:e}}var De=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 yn(s){if(s.transport!==void 0){if(nt(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 we==="worker"?W.default:z.default}function Sn(s){let{prompt:e,options:t={}}=s,n=yn(t),o=new oe({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 De;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 It(t),At({prompt:e,options:t,diagnostics:o});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,u=a?()=>{c||(c=!0,Promise.resolve(a()).catch(m=>{o.record("[query] onAuthExpired callback threw:",m)}))}:void 0,p=new Map,g=new Map,d=new Map,l={},f={};if(t.mcpServers)for(let[m,E]of Object.entries(t.mcpServers)){let B=E.tools;if(Array.isArray(B)&&B.length>0&&(f[m]=B),E.type==="sdk"&&"instance"in E&&E.instance){let q=E.instance;p.set(m,q);let Fe=new ue(ts=>{ct(m,ts,d)});g.set(m,Fe),q.connect(Fe).catch(()=>{})}else l[m]=E}let v=Object.keys(l).length>0,y=Object.keys(f).length>0,S=t.pathToQoderCLIExecutable,k=t.env,P=r?.type==="jobToken"?r.fetchJobToken:void 0,me={pathToQoderCLIExecutable:S,executable:t.executable,executableArgs:t.executableArgs,env:k,proxy:t.proxy,cwd:t.cwd,closeGraceMs:t.closeGraceMs,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 m=t.allowedTools??[];if(t.skills===void 0)return m.length>0?m:void 0;let E=t.skills==="all"?["Skill"]:t.skills.map(q=>`Skill(${q})`),B=new Set(m);return[...m,...E.filter(q=>!B.has(q))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:v?l:void 0,mcpToolPolicies:y?f:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:u},se=rt(n,me);se.initialize().catch(()=>{});let ne=typeof e=="string",h=t.systemPrompt,M,$;if(typeof h=="string")M=h;else if(typeof h=="object"&&h!==null&&h.type==="preset"){let m=h;if(m.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(m.preset)}`);$=m.append}let es={systemPrompt:M,appendSystemPrompt:$,planModeInstructions:t.planModeInstructions,agents:t.agents,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},ye=new ae(se,ne,t.canUseTool,t.hooks,t.abortController,p,void 0,es,t.onElicitation,o,u,t.controlRequestTimeoutMs,g,d,P,t.resolveModel,t.resolveModelTimeoutMs);if(typeof e=="string"){let m={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};ye.streamInput(async function*(){yield m}())}else ye.streamInput(e);return ye}var Dt="QODER_PERSONAL_ACCESS_TOKEN";function vn(s){return{type:"accessToken",accessToken:s}}function kn(s=Dt){return{type:"accessToken",accessToken:{envVar:s}}}function bn(){return{type:"qodercli"}}function wn(s){return{type:"jobToken",fetchJobToken:s}}import{McpServer as Pn}from"@modelcontextprotocol/sdk/server/mcp.js";function Rn(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 Pn({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 Tn(s,e,t,n,o){return{name:s,description:e,inputSchema:t,handler:n,annotations:o?.annotations}}import{readdir as je,readFile as ge,stat as Z,appendFile as Kt,realpath as On}from"fs/promises";import{basename as Dn,join as w,resolve as qt}from"path";import{execFile as Un}from"child_process";import{promisify as jn}from"util";import{homedir as Cn}from"os";import{join as jt}from"path";var Mn=".qoder",En="QODER_CLI_HOME",_n="QODER_CONFIG_DIR",Ut=200;function xn(){return process.env[En]||Cn()}function In(){let s=process.env[_n];return s||jt(xn(),Mn)}function pe(){return jt(In(),"projects")}function An(s){let e=5381;for(let t=0;t<s.length;t++)e=e*33^s.charCodeAt(t);return e}function Y(s){let e=s.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Ut)return e;let t=Math.abs(An(s)).toString(36);return`${e.slice(0,Ut)}-${t}`}var qn=jn(Un),Nn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Kn=new Set(["user","assistant","system","progress","attachment"]);function U(s){return s!==null&&typeof s=="object"}function Fn(s){return Nn.test(s)}function Ln(s){let e=[];for(let t of s.split(`
16
+ `)){let n=t.trim();if(n)try{let o=JSON.parse(n);U(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&Kn.has(o.type)&&e.push(o)}catch{}}return e}function Ue(s){if(!U(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}function X(s){if(s.type!=="assistant"||!U(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function Ft(s){return s.type!=="user"||!s.parentUuid?!1:Ue(s).some(e=>U(e)&&e.type==="tool_result")}function Hn(s){if(!U(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=Hn(o);if(r){let i=t.get(r);i?i.push(n):t.set(r,[n])}}for(let[n,o]of s){let r=$n(o,o.parentUuid,s,t,e);r!==o.parentUuid&&s.set(n,{...o,parentUuid:r})}}function $n(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]:Bn(s,r,t)??zn(s,r,t,o)??e}function Bn(s,e,t){if(!Ft(s))return;let n=Ue(s).filter(r=>U(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?Ue(i).some(a=>U(a)&&a.type==="tool_use"&&n.includes(typeof a.id=="string"?a.id:"")):!1});return o.length===1?o[0]:void 0}function zn(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 Wn(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 Nt(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 Jn(s,e,t){let n=e.filter(d=>d.type==="assistant");if(n.length===0)return e;let o=new Map,r=0;for(let d of s.keys())o.set(d,r++);let i=new Map;for(let d of n){let l=X(d);l&&i.set(l,d)}let a=new Map,c=new Map;for(let d of s.values()){let l=X(d);if(l){let f=a.get(l)??[];f.push(d),a.set(l,f);continue}if(Ft(d)&&d.parentUuid){let f=c.get(d.parentUuid)??[];f.push(d),c.set(d.parentUuid,f)}}let u=new Set,p=new Map;for(let d of n){let l=X(d);if(!l||u.has(l))continue;u.add(l);let f=a.get(l)??[d],v=f.filter(h=>!t.has(h.uuid)),y=[];for(let h of f){let M=c.get(h.uuid)??[];for(let $ of M)t.has($.uuid)||y.push($)}if(v.length===0&&y.length===0)continue;let S=i.get(l);if(!S)continue;let k=[...f].sort((h,M)=>Nt(h,M,o));y.sort((h,M)=>Nt(h,M,o));let P=k.findIndex(h=>h.uuid===S.uuid),me=k.slice(0,Math.max(P,0)).filter(h=>!t.has(h.uuid)),se=k.slice(P+1).filter(h=>!t.has(h.uuid)),ne=[...me,...se,...y];for(let h of ne)t.add(h.uuid);p.set(S.uuid,ne)}if(p.size===0)return e;let g=[];for(let d of e){let l=p.get(d.uuid);if(l){let f=o.get(d.uuid)??Number.MAX_SAFE_INTEGER,v=[],y=[];for(let S of l)(d.type==="assistant"&&S.type==="assistant"&&X(S)===X(d)&&(o.get(S.uuid)??Number.MAX_SAFE_INTEGER)<f?v:y).push(S);g.push(...v,d,...y)}else g.push(d)}return g}function Gn(s){if(s.length===0)return[];let e=new Map,t=new Map;for(let[d,l]of s.entries())e.set(l.uuid,l),t.set(l.uuid,d);Wn(e),Qn(e,t);let n=new Set;for(let d of e.values())d.parentUuid&&n.add(d.parentUuid);let o=Array.from(e.values()).filter(d=>!n.has(d.uuid)),r=[];for(let d of o){let l=d,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(d=>!d.isSidechain&&!d.teamName&&!d.isMeta),c=(i.length>0?i:r).reduce((d,l)=>(t.get(l.uuid)??-1)>(t.get(d.uuid)??-1)?l:d),u=[],p=new Set,g=c;for(;g&&!p.has(g.uuid);)p.add(g.uuid),u.push(g),g=g.parentUuid?e.get(g.parentUuid):void 0;return u.reverse(),Jn(e,u,p)}function Vn(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 Yn(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 Xn(s){let e=s.type==="system"?Yn(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 Zn(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 Lt(s){try{return await On(qt(s))}catch{return qt(s)}}async function er(s){return Y(await Lt(s))}async function j(s){let e=pe();if(s?.dir){let t=await Lt(s.dir),n=[w(e,Y(t))];if(s.includeWorktrees!==!1)try{let{stdout:o}=await qn("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(w(e,await er(i)))}catch{}return n}try{return(await je(e,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>w(e,n.name))}catch{return[]}}async function Ht(s){try{let[e,t]=await Promise.all([ge(s,"utf-8"),Z(s)]),n=e.trim().split(`
18
+ `).filter(Boolean);if(n.length===0)return null;let o=Dn(s,".jsonl"),r,i,a,c,u,p,g;for(let d of n)try{let l=JSON.parse(d);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 v=f.find(y=>y.type==="text");v?.text&&(r=v.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"&&(p=l.tag||void 0),l.gitBranch&&(c=l.gitBranch),l.cwd&&(u=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:u,tag:p,createdAt:g}}catch{return null}}function Qt(s,e){return w(s,e,"subagents")}function tr(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 $t(s){let e=[];async function t(n){let o;try{o=await je(n,{withFileTypes:!0})}catch{return}for(let r of o){let i=w(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 sr(s){try{let e=await ge(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 nr(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 rr(s,e,t){let[n,o]=await Promise.all([ge(s,"utf-8"),sr(s)]),r=[];for(let p of n.trim().split(`
19
+ `).filter(Boolean))try{let g=JSON.parse(p);tr(g)&&r.push(g)}catch{}let a=nr(r).map(p=>({type:p.type,uuid:p.uuid,session_id:p.sessionId??e,message:p.message,parent_tool_use_id:o})),c=t?.offset??0,u=t?.limit;return u!==void 0?a.slice(c,c+u):a.slice(c)}async function or(s){let e=await j(s),n=(await Promise.all(e.map(async u=>{try{return(await je(u)).filter(g=>g.endsWith(".jsonl")).map(g=>w(u,g))}catch{return[]}}))).flat(),o=await Promise.all(n.map(Ht)),r=new Map;for(let u of o){if(!u)continue;let p=r.get(u.sessionId);(!p||u.lastModified>p.lastModified)&&r.set(u.sessionId,u)}let i=Array.from(r.values()).sort((u,p)=>p.lastModified-u.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function ir(s,e){let t=await j(e);for(let n of t){let o=w(n,`${s}.jsonl`),r=await Ht(o);if(r)return r}}async function ar(s,e){if(!Fn(s))return[];let t=e?.includeSystemMessages===!0,n=await j(e);for(let o of n){let r=w(o,`${s}.jsonl`);try{let i=await ge(r,"utf-8"),c=Gn(Ln(i)).filter(u=>Vn(u,t)).map(Xn);return Zn(c,e)}catch{continue}}return[]}async function cr(s,e,t){let n=await j(t);for(let o of n){let r=w(o,`${s}.jsonl`);try{await Z(r);let i=JSON.stringify({type:"custom-title",sessionId:s,customTitle:e,timestamp:new Date().toISOString()});await Kt(r,i+`
20
+ `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function ur(s,e,t){let n=await j(t);for(let o of n){let r=w(o,`${s}.jsonl`);try{await Z(r);let i=JSON.stringify({type:"tag",sessionId:s,tag:e??"",timestamp:new Date().toISOString()});await Kt(r,i+`
21
+ `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function dr(s,e){let t=await j(e);for(let n of t){let o=w(n,`${s}.jsonl`);try{await Z(o);let r=await $t(Qt(n,s));return Array.from(new Set(r.map(i=>i.agentId)))}catch{continue}}return[]}async function lr(s,e,t){let n=await j(t);for(let o of n){let r=w(o,`${s}.jsonl`);try{await Z(r);let a=(await $t(Qt(o,s))).find(c=>c.agentId===e);return a?await rr(a.filePath,s,t):[]}catch{continue}}return[]}import{readdir as pr,readFile as gr,writeFile as fr,mkdir as hr,stat as Bt}from"fs/promises";import{join as qe,dirname as zt,resolve as mr}from"path";import{randomUUID as Jt}from"crypto";function yr(s){return Y(mr(s))}async function Sr(s,e){let t=pe();if(e){let n=yr(e),o=qe(t,n,`${s}.jsonl`);try{return await Bt(o),o}catch{return null}}try{let n=await pr(t,{withFileTypes:!0});for(let o of n)if(o.isDirectory()){let r=qe(t,o.name,`${s}.jsonl`);try{return await Bt(r),r}catch{continue}}}catch{}return null}function Wt(s,e,t){let n={...s};if(typeof s.uuid=="string"){let o=s.uuid;e.has(o)||e.set(o,Jt()),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 vr(s,e){let t=await Sr(s,e?.dir);if(!t)throw new Error(`Session ${s} not found`);let o=(await gr(t,"utf-8")).trim().split(`
22
+ `).filter(Boolean),r=new Map,i=Jt(),a=[];for(let u of o)try{let p=JSON.parse(u);if(e?.upToMessageId&&p.uuid===e.upToMessageId){let d=Wt(p,r,i);a.push(JSON.stringify(d));break}let g=Wt(p,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=qe(zt(t),`${i}.jsonl`);return await hr(zt(c),{recursive:!0}),await fr(c,a.join(`
23
23
  `)+`
24
- `),{sessionId:i}}import{spawn as vr}from"child_process";async function kr(s){let e=s?.cliPath??Ue(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let n=await je(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 br(s,e){let t=e?.cliPath??Ue(),n=await je(t,["plugins","enable",s,"--scope","user"],e?.env);n.exitCode!==0&&Wt(n)}async function wr(s,e){let t=e?.cliPath??Ue(),n=await je(t,["plugins","disable",s,"--scope","user"],e?.env);n.exitCode!==0&&Wt(n)}function Ue(){return process.env.QODERCLI_PATH??"qodercli"}var Jt=3e4;function je(s,e,t){return new Promise((n,o)=>{let r=vr(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 ${Jt}ms`)))},Jt);r.stdout.on("data",p=>{i+=p.toString()}),r.stderr.on("data",p=>{a+=p.toString()}),r.on("error",p=>{c||(c=!0,clearTimeout(d),o(p))}),r.on("close",p=>{c||(c=!0,clearTimeout(d),n({stdout:i,stderr:a,exitCode:p??1}))})})}function Wt(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 Pr}from"child_process";import{fileURLToPath as Rr}from"url";import{join as A,dirname as Tr,delimiter as Cr}from"path";import{existsSync as pe}from"fs";import{homedir as Mr}from"os";var Er=Rr(import.meta.url),Gt=Tr(Er);function _r(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let o of Vt()){let r=A(o,"dist","_bundled",s);if(pe(r))return r}for(let o of Vt()){let r=[A(o,"node_modules",".bin",s),A(o,"..","..",".bin",s)];for(let i of r)if(pe(i))return i}let e=process.env.PATH||"";for(let o of e.split(Cr)){if(!o)continue;let r=A(o,s);if(pe(r))return r}let t=Mr(),n=[A(t,".qoder","local",s),A(t,".local","bin",s),"/usr/local/bin/qodercli"];for(let o of n)if(pe(o))return o;throw new Error("qodercli not found. Provide the cliPath option or ensure qodercli is on PATH.")}function Vt(){let s=[A(Gt,".."),A(Gt,"..","..")];return[...new Set(s)]}async function xr(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??_r(),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=>{Pr(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 qe(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 Ne=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}=qe(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 p of d)if(p.trim())try{this.messages.enqueue(JSON.parse(p))}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 Xt={};ss(Xt,{filterEscalatingDefaultMode:()=>Yt});var Ir=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function Yt(s){let e=s.effective.permissions?.defaultMode;if(!e||!Ir.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{D as AbortError,At as DEFAULT_ACCESS_TOKEN_ENV_VAR,ve as DEFAULT_RUNTIME_TRANSPORT,x as DirectConnectError,Ne as DirectConnectTransport,rs as EXIT_REASONS,ns as HOOK_EVENTS,W as ModelPolicyTimeoutError,z as ProcessTransport,G as ProtocolVersionMismatchError,K as QoderCliProcessError,F as QoderWorkerRuntimeError,Re as WIRE_PROTOCOL_VERSION,J as WorkerTransport,Sn as accessToken,vn as accessTokenFromEnv,Xt as coreTypes,Pn as createSdkMcpServer,wr as disablePlugin,br as enablePlugin,Yt as filterEscalatingDefaultMode,Sr as forkSession,or as getSessionInfo,ir as getSessionMessages,ur as getSubagentMessages,Ds as hasResolvableQoderWorkerRuntime,bn as jobToken,kr as listPlugins,rr as listSessions,dr as listSubagents,qe as parseDirectConnectUrl,kn as qodercliAuth,yn as query,ar as renameSession,Pe as resolveQoderWorkerRuntimePath,xr as submitFeedback,cr as tagSession,Rn as tool};
24
+ `),{sessionId:i}}import{spawn as kr}from"child_process";async function br(s){let e=s?.cliPath??ee(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let n=await te(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 wr(s,e){let t=e?.cliPath??ee(),n=await te(t,["plugins","enable",s,"--scope","user"],e?.env);n.exitCode!==0&&fe(n)}async function Pr(s,e){let t=e?.cliPath??ee(),n=await te(t,["plugins","disable",s,"--scope","user"],e?.env);n.exitCode!==0&&fe(n)}async function Rr(s,e){let t=e?.cliPath??ee(),n=await te(t,["plugins","install",s,"--scope","user","--json"],e?.env);n.exitCode!==0&&fe(n);let o=JSON.parse(n.stdout);return{pluginId:o.pluginId,version:o.version??"local",path:o.path}}async function Tr(s,e){let t=e?.cliPath??ee(),n=["plugins","uninstall",s,"--scope","user","--json"];e?.keepData&&n.push("--keep-data");let o=await te(t,n,e?.env);o.exitCode!==0&&fe(o);let r=JSON.parse(o.stdout);return{pluginId:r.pluginId,fullyRemoved:r.fullyRemoved,reverseDependents:r.reverseDependents??[]}}function ee(){return process.env.QODERCLI_PATH??"qodercli"}var Gt=3e4;function te(s,e,t){return new Promise((n,o)=>{let r=kr(s,e,{env:{...process.env,...t},stdio:["ignore","pipe","pipe"]}),i="",a="",c=!1,u=setTimeout(()=>{c||(c=!0,r.kill("SIGTERM"),o(new Error(`qodercli subprocess timed out after ${Gt}ms`)))},Gt);r.stdout.on("data",p=>{i+=p.toString()}),r.stderr.on("data",p=>{a+=p.toString()}),r.on("error",p=>{c||(c=!0,clearTimeout(u),o(p))}),r.on("close",p=>{c||(c=!0,clearTimeout(u),n({stdout:i,stderr:a,exitCode:p??1}))})})}function fe(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 Cr}from"child_process";import{fileURLToPath as Mr}from"url";import{join as A,dirname as Er,delimiter as _r}from"path";import{existsSync as he}from"fs";import{homedir as xr}from"os";var Ir=Mr(import.meta.url),Vt=Er(Ir);function Ar(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let o of Yt()){let r=A(o,"dist","_bundled",s);if(he(r))return r}for(let o of Yt()){let r=[A(o,"node_modules",".bin",s),A(o,"..","..",".bin",s)];for(let i of r)if(he(i))return i}let e=process.env.PATH||"";for(let o of e.split(_r)){if(!o)continue;let r=A(o,s);if(he(r))return r}let t=xr(),n=[A(t,".qoder","local",s),A(t,".local","bin",s),"/usr/local/bin/qodercli"];for(let o of n)if(he(o))return o;throw new Error("qodercli not found. Provide the cliPath option or ensure qodercli is on PATH.")}function Yt(){let s=[A(Vt,".."),A(Vt,"..","..")];return[...new Set(s)]}async function Or(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??Ar(),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=>{Cr(t,o,{env:e?.env??process.env,timeout:n,maxBuffer:1024*1024},(i,a)=>{let c=a.trim();if(c)try{let u=JSON.parse(c);r({success:!!u.success,message:u.success?u.message||"Feedback submitted successfully":u.error||u.message||"Failed to submit feedback",requestId:u.request_id});return}catch{}r(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:c||"Feedback submitted successfully"})})})}function Ne(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 Ke=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}=Ne(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 u=(this.partialLine+String(a.data)).split(`
25
+ `);this.partialLine=u.pop()??"";for(let p of u)if(p.trim())try{this.messages.enqueue(JSON.parse(p))}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 Zt={};ns(Zt,{filterEscalatingDefaultMode:()=>Xt});var Dr=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function Xt(s){let e=s.effective.permissions?.defaultMode;if(!e||!Dr.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{D as AbortError,Dt as DEFAULT_ACCESS_TOKEN_ENV_VAR,we as DEFAULT_RUNTIME_TRANSPORT,x as DirectConnectError,Ke as DirectConnectTransport,os as EXIT_REASONS,rs as HOOK_EVENTS,J as ModelPolicyTimeoutError,z as ProcessTransport,G as ProtocolVersionMismatchError,K as QoderCliProcessError,F as QoderWorkerRuntimeError,Me as WIRE_PROTOCOL_VERSION,W as WorkerTransport,vn as accessToken,kn as accessTokenFromEnv,Zt as coreTypes,Rn as createSdkMcpServer,Pr as disablePlugin,wr as enablePlugin,Xt as filterEscalatingDefaultMode,vr as forkSession,ir as getSessionInfo,ar as getSessionMessages,lr as getSubagentMessages,Us as hasResolvableQoderWorkerRuntime,Rr as installPlugin,wn as jobToken,br as listPlugins,or as listSessions,dr as listSubagents,Ne as parseDirectConnectUrl,bn as qodercliAuth,Sn as query,cr as renameSession,Ce as resolveQoderWorkerRuntimePath,Or as submitFeedback,ur as tagSession,Tn as tool,Tr as uninstallPlugin};
@@ -300,6 +300,11 @@ export type ModelInfo = {
300
300
  format?: string;
301
301
  /** Usage scene this entry belongs to, e.g. `'chat'`, `'assistant'`. */
302
302
  scene?: string;
303
+ /**
304
+ * Original top-level key in the server model-list response before client-side
305
+ * merging, e.g. `'assistant'` or `'byok_enterprise'`.
306
+ */
307
+ serverScene?: string;
303
308
  /**
304
309
  * Optional model icon — server-provided string (URL, emoji, or provider
305
310
  * identifier). Forwarded verbatim from the model catalog; consumers decide
@@ -38,4 +38,14 @@ export type PluginDetails = PluginInfo & {
38
38
  installedAt?: string;
39
39
  lastUpdated?: string;
40
40
  resources: PluginResources;
41
+ };
42
+ export type InstallPluginResult = {
43
+ pluginId: string;
44
+ version: string;
45
+ path: string;
46
+ };
47
+ export type UninstallPluginResult = {
48
+ pluginId: string;
49
+ fullyRemoved: boolean;
50
+ reverseDependents: string[];
41
51
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qoder-ai/qoder-agent-sdk",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
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.29",
115
+ "qoderCliVersion": "1.0.33",
116
116
  "license": "SEE LICENSE IN LICENSE"
117
117
  }
@@ -25,8 +25,6 @@ const path = require('path');
25
25
  const GLOBAL_PROD_DOWNLOAD_BASE_URL =
26
26
  'https://download.qoder.com/qodercli/releases';
27
27
  const GLOBAL_DEV_DOWNLOAD_BASE_URL =
28
- 'https://qs-cli-dev.oss-cn-hangzhou.aliyuncs.com/qodercli/releases';
29
- const GLOBAL_DEV_WORKER_RUNTIME_DOWNLOAD_BASE_URL =
30
28
  'https://qs-cli-dev.oss-cn-hangzhou.aliyuncs.com/qodercli/dev/releases';
31
29
  const CN_PROD_DOWNLOAD_BASE_URL =
32
30
  'https://static.qoder.com.cn/qoder-cli-cn/releases';
@@ -111,7 +109,7 @@ function getWorkerRuntimeDownloadBaseUrl(version = getCliVersion()) {
111
109
  : CN_PROD_DOWNLOAD_BASE_URL;
112
110
  }
113
111
  return isDevCliVersion(version)
114
- ? GLOBAL_DEV_WORKER_RUNTIME_DOWNLOAD_BASE_URL
112
+ ? GLOBAL_DEV_DOWNLOAD_BASE_URL
115
113
  : GLOBAL_PROD_DOWNLOAD_BASE_URL;
116
114
  }
117
115