@kodax-ai/kodax 0.7.43 → 0.7.44

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.
Files changed (41) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/chunks/{chunk-YMRZBS4G.js → chunk-35BDEEC5.js} +1 -1
  3. package/dist/chunks/{chunk-7G5PSL6C.js → chunk-4YPL2UVZ.js} +253 -235
  4. package/dist/chunks/chunk-DI2G3YWL.js +31 -0
  5. package/dist/chunks/chunk-HHQ7YTGM.js +425 -0
  6. package/dist/chunks/chunk-QHILHQBB.js +519 -0
  7. package/dist/chunks/{chunk-IYSK7LUK.js → chunk-RUDYNAK7.js} +1 -1
  8. package/dist/chunks/{compaction-config-3E57ABCT.js → compaction-config-NAPRF7XR.js} +1 -1
  9. package/dist/chunks/{construction-bootstrap-JR63KI5N.js → construction-bootstrap-PHTGBRNU.js} +1 -1
  10. package/dist/chunks/dist-CCYBJJZY.js +2 -0
  11. package/dist/chunks/{dist-XANXEVTU.js → dist-RHIHZAYX.js} +1 -1
  12. package/dist/chunks/{utils-HQ2QCKJA.js → utils-TV3UYCHQ.js} +1 -1
  13. package/dist/index.d.ts +8 -8
  14. package/dist/index.js +2 -2
  15. package/dist/kodax_cli.js +624 -589
  16. package/dist/provider-capabilities.json +167 -0
  17. package/dist/sdk-agent.d.ts +62 -7
  18. package/dist/sdk-agent.js +1 -1
  19. package/dist/sdk-coding.d.ts +367 -13
  20. package/dist/sdk-coding.js +1 -1
  21. package/dist/sdk-llm.d.ts +1 -1
  22. package/dist/sdk-llm.js +1 -1
  23. package/dist/sdk-mcp.js +1 -1
  24. package/dist/sdk-repl.d.ts +6 -6
  25. package/dist/sdk-repl.js +1 -1
  26. package/dist/sdk-session.d.ts +2 -2
  27. package/dist/sdk-session.js +1 -1
  28. package/dist/sdk-skills.js +1 -1
  29. package/dist/types-chunks/{bash-prefix-extractor.d-DMrGImMl.d.ts → bash-prefix-extractor.d-DdoSeghD.d.ts} +417 -5
  30. package/dist/types-chunks/file-tracker.d-DOfaoCbJ.d.ts +633 -0
  31. package/dist/types-chunks/{resolver.d-CA68_NeH.d.ts → resolver.d-B7ZnVuuf.d.ts} +16 -13
  32. package/dist/types-chunks/{storage.d-DPAEX7zS.d.ts → storage.d-DFD9ln5c.d.ts} +1 -1
  33. package/dist/types-chunks/{file-tracker.d-zaLZeNBK.d.ts → types.d-DM8zEJgF.d.ts} +1029 -535
  34. package/dist/types-chunks/{types.d-mM8vqvhT.d.ts → types.d-HBbWT-iA.d.ts} +41 -3
  35. package/dist/types-chunks/{utils.d-DkLZD_wa.d.ts → utils.d-C5fzCE9W.d.ts} +3 -3
  36. package/package.json +2 -2
  37. package/dist/chunks/chunk-K75O2CAE.js +0 -31
  38. package/dist/chunks/chunk-UG4262JI.js +0 -502
  39. package/dist/chunks/chunk-VHKAJDQD.js +0 -425
  40. package/dist/chunks/dist-KWHUKXEL.js +0 -2
  41. package/dist/types-chunks/types.d-CKJtjo-6.d.ts +0 -1127
@@ -0,0 +1,31 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{a as i}from"./chunk-V4WSBIXB.js";var G=class extends Error{static{i(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},w=class extends G{static{i(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},me=class extends G{static{i(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},Ze=class extends G{static{i(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},et=class extends G{static{i(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var tt=32768,An=32e3,Sn=64e3,On=.5;var Dn=["off","auto","quick","balanced","deep"],Ut={low:6e3,medium:1e4,high:2e4},jt=4096;function nt(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}i(nt,"getReasoningCapability");function Q(t){return Ce(t).enabled}i(Q,"isReasoningEnabled");function Ce(t){if(typeof t=="boolean")return{enabled:t,mode:t?"auto":"off",depth:t?"medium":"off",taskType:"unknown",executionMode:"implementation"};let e=t?.mode??"off",n=t?.depth??Xt(e),o=t?.enabled??(e!=="off"&&n!=="off");return{enabled:o&&e!=="off"&&n!=="off",mode:e,depth:o?n:"off",taskType:t?.taskType??"unknown",executionMode:t?.executionMode??"implementation"}}i(Ce,"normalizeReasoningRequest");function Xt(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}i(Xt,"getDefaultThinkingDepthForMode");function Z(t,e,n="unknown"){if(e==="off")return 0;let o={...Ut,...t.defaultThinkingBudgets??{}},s=t.taskBudgetOverrides?.[n]?.[e]??o[e];return t.thinkingBudgetCap?Math.min(s,t.thinkingBudgetCap):s}i(Z,"resolveThinkingBudget");function ee(t,e,n=jt){let o=Math.max(1024,e-n);return Math.max(1024,Math.min(t,o))}i(ee,"clampThinkingBudget");function ot(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}i(ot,"mapDepthToOpenAIReasoningEffort");import xe from"fs";import In from"os";import st from"path";var it=null;function Bn(t){return t==="budget"||t==="effort"||t==="toggle"||t==="none"}i(Bn,"isReasoningOverride");function Ln(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t.providerReasoningOverrides;return e===void 0?!0:!e||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).every(Bn)}i(Ln,"isStoredConfig");function Kn(){return process.env.KODAX_HOME??st.join(In.homedir(),".kodax")}i(Kn,"getKodaxDir");function Wt(){return process.env.KODAX_CONFIG_FILE??st.join(Kn(),"config.json")}i(Wt,"getConfigFilePath");function rt(t,e){return it={filePath:t,config:e},e}i(rt,"updateStoredConfigCache");function Nn(t){let e=JSON.parse(xe.readFileSync(t,"utf-8"));return Ln(e)?e:{}}i(Nn,"readStoredConfigFromDisk");function at(t){switch(t){case"native-budget":return"budget";case"native-effort":return"effort";case"native-toggle":return"toggle";case"none":return"none";default:return}}i(at,"reasoningCapabilityToOverride");function ct(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}i(ct,"reasoningOverrideToCapability");function te(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}i(te,"buildReasoningOverrideKey");function lt(){let t=Wt();if(it?.filePath===t)return it.config;try{if(xe.existsSync(t))return rt(t,Nn(t))}catch{}return rt(t,{})}i(lt,"loadStoredConfig");function zt(t){let e=Wt();try{xe.mkdirSync(st.dirname(e),{recursive:!0}),xe.writeFileSync(e,JSON.stringify(t,null,2)),rt(e,t)}catch(n){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",n)}}i(zt,"saveStoredConfig");function Te(t,e,n){let o=lt(),r=te(t,e,n);return o.providerReasoningOverrides?.[r]}i(Te,"loadReasoningOverride");function ut(t,e,n,o){let r=lt(),s=te(t,e,o);r.providerReasoningOverrides={...r.providerReasoningOverrides??{},[s]:n},zt(r)}i(ut,"saveReasoningOverride");function Fn(t,e,n){let o=lt(),r=te(t,e,n);if(!o.providerReasoningOverrides?.[r])return;let s={...o.providerReasoningOverrides};delete s[r],o.providerReasoningOverrides=Object.keys(s).length>0?s:void 0,zt(o)}i(Fn,"clearReasoningOverride");function Gt(t,e){if(!t)return;if(typeof t.get=="function")return t.get(e)??void 0;let n=t,o=e.toLowerCase(),r=n[e]??n[o]??n[o.replace(/\b\w/g,s=>s.toUpperCase())];if(r!==void 0)return Array.isArray(r)?r[0]:r}i(Gt,"readHeader");function Vt(t){if(!t)return;let e=t.trim();if(e.length===0)return;let n=Number(e);if(!(!Number.isFinite(n)||n<=0))return n}i(Vt,"parsePositiveNumber");function $n(t,e){if(!t)return;let n=t.trim();if(n.length===0)return;let o=Date.parse(n);if(!Number.isFinite(o))return;let r=o-e;return r>0?r:void 0}i($n,"parseHttpDate");function Me(t,e){let n=e.baseBackoffMs??1e3,o=e.maxBackoffMs??3e4,r=e.maxHeaderWaitMs??12e4,s=e.now?e.now():Date.now(),a=Vt(Gt(t,"retry-after-ms"));if(a!==void 0){let y=Math.min(a,r);return{type:"header",waitMs:Math.round(y),source:"retry-after-ms",cappedFromHeader:y!==a}}let c=Gt(t,"retry-after");if(c!==void 0&&c.trim().length>0){let y=Vt(c);if(y!==void 0){let v=y*1e3,f=Math.min(v,r);return{type:"header",waitMs:Math.round(f),source:"retry-after-seconds",cappedFromHeader:f!==v}}let g=$n(c,s);if(g!==void 0){let v=Math.min(g,r);return{type:"header",waitMs:Math.round(v),source:"retry-after-date",cappedFromHeader:v!==g}}}let d=n*Math.pow(2,Math.max(0,e.attempt)),p=Math.min(d,o),u=e.withJitter!==!1?Math.random()*.25*p:0;return{type:"backoff",waitMs:Math.round(p+u),source:"exponential-backoff",attempt:e.attempt}}i(Me,"parseRetryAfter");function Ee(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}i(Ee,"extractHeadersFromError");var Y={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},Ht={...Y,multimodalSupport:"image-input"},ge={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},Jt={...ge,multimodalSupport:"image-input"};function Pe(t){return{transport:t.transport,conversationSemantics:t.conversationSemantics,mcpSupport:t.mcpSupport,contextFidelity:t.contextFidelity??"full",toolCallingFidelity:t.toolCallingFidelity??"full",sessionSupport:t.sessionSupport??"full",longRunningSupport:t.longRunningSupport??"full",multimodalSupport:t.multimodalSupport??"none",evidenceSupport:t.evidenceSupport??"full"}}i(Pe,"normalizeCapabilityProfile");function $(t){return{...Pe(t)}}i($,"cloneCapabilityProfile");function Un(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}i(Un,"parseEnvInt");var z=class{static{i(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let n=Un(process.env.KODAX_MAX_OUTPUT_TOKENS);if(n!==void 0)return n;let o=this.getModelDescriptor(e)?.maxOutputTokens;return o!==void 0?o:this.config.maxOutputTokens??32768}getStreamMaxDurationMs(e){let n=this.getModelDescriptor(e)?.streamMaxDurationMs;return n!==void 0?n:this.config.streamMaxDurationMs}getEffectiveReplayReasoningContent(e){let n=this.getModelDescriptor(e)?.replayReasoningContent;return n!==void 0?n:this.config.replayReasoningContent??!1}getEffectiveStrictThinkingSignature(e){let n=this.getModelDescriptor(e)?.strictThinkingSignature;return n!==void 0?n:this.config.strictThinkingSignature??!1}supportsNonStreamingFallback(){return!1}async complete(e,n,o,r,s,a){throw new w(`${this.name} does not support non-streaming fallback`)}isConfigured(){return!!process.env[this.config.apiKeyEnv]}getModel(){return this.config.model}getAvailableModels(){return this.config.models?.length?[...new Set([this.config.model,...this.config.models.map(e=>e.id)])]:[this.config.model]}getModelDescriptor(e){return!e||e===this.config.model?{id:this.config.model}:this.config.models?.find(n=>n.id===e)}getBaseUrl(){return this.config.baseUrl}getApiKeyEnv(){return this.config.apiKeyEnv}getCapabilityProfile(){return $(this.config.capabilityProfile??Y)}getConfiguredReasoningCapability(e){let n=this.getModelDescriptor(e);return n?.reasoningCapability?n.reasoningCapability:nt(this.config)}getReasoningCapability(e){let n=Te(this.name,this.config,e);return n?ct(n):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return Te(this.name,this.config,e)}getReasoningOverrideKey(e){return te(this.name,this.config,e)}persistReasoningCapabilityOverride(e,n){let o=at(e);o&&ut(this.name,this.config,o,n)}shouldFallbackForReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase(),s=n.map(c=>c.toLowerCase()).some(c=>o.includes(c)),a=o.includes("parameter")||s;return o.includes("unknown parameter")||o.includes("invalid parameter")||o.includes("unsupported")&&a}shouldFallbackForSpecificReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return n.map(a=>a.toLowerCase()).some(a=>o.includes(a))?o.includes("unknown parameter")||o.includes("invalid parameter")||o.includes("unsupported"):!1}getReasoningFallbackChain(e){switch(e){case"native-budget":return["native-budget","native-toggle","none"];case"native-effort":return["native-effort","none"];case"native-toggle":return["native-toggle","none"];default:return["none"]}}getContextWindow(){return this.getEffectiveContextWindow()}getEffectiveContextWindow(e){let n=this.getModelDescriptor(e)?.contextWindow;return n!==void 0?n:this.config.contextWindow??2e5}getApiKey(){let e=process.env[this.config.apiKeyEnv];if(!e)throw new Error(`${this.config.apiKeyEnv} not set`);return e}shouldLogStreamDiagnostics(){return!!process.env.KODAX_DEBUG_STREAM}logStreamDiagnostic(...e){this.shouldLogStreamDiagnostics()&&console.error(...e)}normalizeReasoning(e){return Ce(e)}onStaleConnection(){}isRateLimitError(e){if(!(e instanceof Error))return!1;let n=e.message.toLowerCase();return["rate","limit","\u901F\u7387","\u9891\u7387","1302","429","too many","overload","overwhelmed","503","529","busy"].some(o=>n.includes(o))}classifyRateLimitReason(e){let n=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return n.includes("overload")||n.includes("overwhelmed")||n.includes("503")||n.includes("529")||n.includes("busy")?"overloaded":"rate-limit"}extractRetryAfterMs(e){let n=Ee(e);if(!n)return;let o=Me(n,{attempt:0,withJitter:!1});return o.type==="header"?o.waitMs:void 0}parseContextOverflow(e){let n=String(e?.message??""),o=[/(\d[\d,]*)\s*tokens?.*?(\d[\d,]*)\s*(?:maximum|limit|context)/i,/maximum.*?(\d[\d,]*)\s*tokens?.*?requested.*?(\d[\d,]*)/i,/exceeds?\s+.*?(\d[\d,]*)\s*.*?(?:limit|max|上限).*?(\d[\d,]*)/i];for(let r of o){let s=n.match(r);if(s){let a=Number(s[1].replace(/,/g,"")),c=Number(s[2].replace(/,/g,"")),d=Math.min(a,c),p=Math.max(a,c);return Math.max(3e3,p-d-1e3)}}}isContextOverflowError(e){let n=String(e?.message??"").toLowerCase();return n.includes("prompt is too long")||n.includes("prompt too long")||n.includes("context length")||n.includes("context_length_exceeded")||n.includes("context window")||n.includes("\u4E0A\u4E0B\u6587\u957F\u5EA6")}async withRateLimit(e,n,o=3,r,s){for(let a=0;a<o;a++)try{let c=await e();return this.maxOutputTokensOverride=void 0,c}catch(c){if(this.isContextOverflowError(c)&&!this.maxOutputTokensOverride){let d=this.parseContextOverflow(c);if(d){this.maxOutputTokensOverride=d,r?.(a+1,o,0);continue}}if(this.isRateLimitError(c)){if(a===o-1)throw new me(`API rate limit exceeded after ${o} retries. Please wait and try again later.`,6e4);let d=Ee(c)??{},p=Me(d,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),l=p.waitMs,u=this.classifyRateLimitReason(c);if(s?.({provider:this.name,waitMs:l,reason:u,source:p.source,attempt:a+1,maxAttempts:o}),r?r(a+1,o,l):s||console.log(`[Rate Limit] Retrying in ${l/1e3}s (${a+1}/${o})...`),n?.aborted)throw new DOMException("Request aborted","AbortError");if(await new Promise(y=>setTimeout(y,l)),n?.aborted)throw new DOMException("Request aborted","AbortError");continue}if(c instanceof Error){if((c.name==="AbortError"||c.name==="APIUserAbortError")&&n?.aborted)throw c.name==="AbortError"?c:new DOMException(c.message||"Request aborted","AbortError");let d=c?.cause?.code??c?.code??"";throw(d==="ECONNRESET"||d==="EPIPE")&&this.onStaleConnection(),new w(`${this.name} API error: ${c.message}`,this.name)}throw c}throw new G("Unexpected end of withRateLimit")}};import Gn from"@anthropic-ai/sdk";import{parse as jn}from"partial-json";function ne(t){if(!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{}try{let e=jn(t);return process.env.KODAX_DEBUG_TOOL_STREAM&&console.warn("[Tool Block Salvaged] partial JSON recovered, rawLength=",t.length),e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}i(ne,"parseToolInputWithSalvage");function dt(t,e){let n=t[t.length-1];if(n&&oe(n)&&n.hint===e)return t;let o=e?{type:"cache-boundary",hint:e}:{type:"cache-boundary"};return[...t,o]}i(dt,"insertCacheBoundary");function oe(t){if(typeof t!="object"||t===null||t.type!=="cache-boundary")return!1;let e=Object.keys(t);return e.length<=2&&e.every(n=>n==="type"||n==="hint")}i(oe,"isCacheBoundary");function pt(t,e){let n=[];for(let o of t){if(oe(o)){if(e==="attach"&&n.length>0){let r=n[n.length-1];n[n.length-1]={...r,cache_control:{type:"ephemeral"}}}continue}n.push(o)}return n}i(pt,"lowerCacheBoundaries");function he(t){return t.filter(e=>!oe(e))}i(he,"stripCacheBoundaries");import{readFile as Xn}from"node:fs/promises";import Wn from"node:path";var zn={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function Re(t,e){return e??zn[Wn.extname(t).toLowerCase()]??"image/png"}i(Re,"resolveImageMediaType");async function we(t){return(await Xn(t)).toString("base64")}i(we,"readImageFileAsBase64");async function Yt(t,e){let n=Re(t,e),o=await we(t);return`data:${n};base64,${o}`}i(Yt,"buildImageDataUrl");var Vn="KodaX";function Hn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Vn}}i(Hn,"getAnthropicCompatDefaultHeaders");function ft(t,e){if(!t)return e;let n=t.input_tokens!==void 0&&t.input_tokens!==null||t.cache_creation_input_tokens!==void 0&&t.cache_creation_input_tokens!==null||t.cache_read_input_tokens!==void 0&&t.cache_read_input_tokens!==null,o=typeof t.input_tokens=="number"?t.input_tokens:n?0:e?.inputTokens??0,r=typeof t.cache_creation_input_tokens=="number"?t.cache_creation_input_tokens:n?0:e?.cachedWriteTokens??0,s=typeof t.cache_read_input_tokens=="number"?t.cache_read_input_tokens:n?0:e?.cachedReadTokens??0,a=typeof t.output_tokens=="number"?t.output_tokens:e?.outputTokens??0,c=n?o+r+s:e?.inputTokens??0;if(![c,a].some(d=>!Number.isFinite(d)||d<0))return{inputTokens:c,outputTokens:a,totalTokens:c+a,cachedReadTokens:s||void 0,cachedWriteTokens:r||void 0}}i(ft,"normalizeAnthropicUsage");var L=class extends z{static{i(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;client;initClient(){let e=Hn(this.config);this.client=new Gn({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}applyCacheControlToSystem(e){if(!e.trim()||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=dt([{type:"text",text:e}],"system");return pt(n,"attach")}applyCacheControlToTools(e){if(e.length===0||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=e.slice(),o=n[n.length-1];return n[n.length-1]={...o,cache_control:{type:"ephemeral"}},n}async stream(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(r),d=s?.modelOverride??this.config.model,p=this.getEffectiveMaxOutputTokens(d),l=await this.convertMessages(e,d),u=c.enabled?this.getReasoningCapability(d):"none",y=c.enabled?this.getReasoningFallbackChain(u).filter(x=>x==="native-budget"||x==="native-toggle"||x==="none"):["none"],g=i(x=>{let P={model:d,max_tokens:p,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n),stream:!0};if(x==="native-budget"){let S=Z(this.config,c.depth,c.taskType);P.thinking={type:"enabled",budget_tokens:ee(S,p)}}else x==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let v=[],f=[],_=[],k,C=null,m="",h="",M="",R="",j="",D="",X="",E=!1,W,A=Date.now(),_e=Date.now(),de,pe;for(let x of y)try{de=await this.client.messages.create(g(x),a?{signal:a}:{}),x!==u&&this.persistReasoningCapabilityOverride(x,d);break}catch(P){pe=P;let S=x==="native-budget"?["budget_tokens","thinking"]:x==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...S))throw P}if(!de)throw pe??new w("All reasoning capability attempts failed without a captured error",this.name);let fe=Date.now(),T=0,I=0,B=3e4;for await(let x of de){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let P=Date.now(),S=P-fe;if(S>B&&(T++,I+=S,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(S/1e3)}s gap before ${x.type}`,{stallCount:T,totalStallMs:I,eventType:x.type})),fe=P,x.type==="content_block_start"||x.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),x.type==="content_block_start"){A=Date.now();let b=x.content_block;C=b.type,process.env.KODAX_DEBUG_TOOL_STREAM&&b.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:b.type,id:b.id,name:b.name}),b.type==="thinking"?(h="",M=b.signature??""):b.type==="redacted_thinking"?(C="redacted_thinking",R=b.data??""):b.type==="text"?m="":b.type==="tool_use"&&(j=b.id,D=b.name,X="")}else if(x.type==="content_block_delta"){A=Date.now();let b=x.delta;b.type==="thinking_delta"?(h+=b.thinking??"",s?.onThinkingDelta?.(b.thinking??"")):b.type==="text_delta"?(m+=b.text??"",s?.onTextDelta?.(b.text??"")):b.type==="input_json_delta"&&(X+=b.partial_json??"",s?.onToolInputDelta?.(D,b.partial_json??"",j?{toolId:j}:void 0))}else if(x.type==="content_block_stop")A=Date.now(),C==="thinking"?h&&(_.push({type:"thinking",thinking:h,signature:M}),s?.onThinkingEnd?.(h)):C==="redacted_thinking"?(R&&_.push({type:"redacted_thinking",data:R}),R=""):C==="text"?m&&v.push({type:"text",text:m}):C==="tool_use"&&(!j||!D?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify(j),name:JSON.stringify(D),input:X.slice(0,100)}):f.push({type:"tool_use",id:j,name:D,input:ne(X)})),C=null;else if(x.type==="message_stop"){if(E=!0,A=Date.now(),process.env.KODAX_DEBUG_STREAM){let b=Date.now()-_e;this.logStreamDiagnostic(`[Stream] message_stop received after ${b}ms`)}}else if(x.type==="message_delta"){A=Date.now(),k=ft(x.usage,k);let b=x.delta;b?.stop_reason&&(W=b.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${W}`))}else x.type==="message_start"&&(A=Date.now(),k=ft(x.message?.usage,k),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!E){let x=Date.now()-_e,P=Date.now()-A;if(a?.aborted){let b=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before message_stop:",{duration:x,lastEventAge:P,reason:b,textBlocks:v.length,toolBlocks:f.length,thinkingBlocks:_.length}),new DOMException(b,"AbortError")}let S=new Error(`Stream incomplete: message_stop event not received. Duration: ${x}ms, Last event: ${P}ms ago. This may indicate a network disconnection or API timeout.`);throw S.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:x,lastEventAge:P,textBlocks:v.length,toolBlocks:f.length,thinkingBlocks:_.length}),S}return{textBlocks:v,toolBlocks:f,thinkingBlocks:_,usage:k,stopReason:W}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(r),d=s?.modelOverride??this.config.model,p=this.getEffectiveMaxOutputTokens(d),l=await this.convertMessages(e,d),u=c.enabled?this.getReasoningCapability(d):"none",y=c.enabled?this.getReasoningFallbackChain(u).filter(m=>m==="native-budget"||m==="native-toggle"||m==="none"):["none"],g=i(m=>{let h={model:d,max_tokens:p,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n)};if(m==="native-budget"){let M=Z(this.config,c.depth,c.taskType);h.thinking={type:"enabled",budget_tokens:ee(M,p)}}else m==="native-toggle"&&(h.thinking={type:"enabled"});return h},"buildRequest"),v,f;for(let m of y)try{v=await this.client.messages.create(g(m),a?{signal:a}:{}),m!==u&&this.persistReasoningCapabilityOverride(m,d);break}catch(h){f=h;let M=m==="native-budget"?["budget_tokens","thinking"]:m==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(h,...M))throw h}if(!v)throw f??new w("All reasoning capability attempts failed without a captured error",this.name);let _=[],k=[],C=[];for(let m of v.content)m.type==="text"?(_.push({type:"text",text:m.text}),s?.onTextDelta?.(m.text)):m.type==="thinking"?(C.push({type:"thinking",thinking:m.thinking,signature:m.signature??""}),s?.onThinkingDelta?.(m.thinking),s?.onThinkingEnd?.(m.thinking)):m.type==="redacted_thinking"?C.push({type:"redacted_thinking",data:m.data}):m.type==="tool_use"&&k.push({type:"tool_use",id:m.id,name:m.name,input:typeof m.input=="object"&&m.input!==null?m.input:{}});return{textBlocks:_,toolBlocks:k,thinkingBlocks:C,usage:ft(v.usage),stopReason:v.stop_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}serializeSystemMessageContent(e){if(typeof e=="string")return e.trim();for(let n of e)if(oe(n))throw new w("cache-boundary marker reached system message serialization unlowered. Provider base class lowering must run before any wire-level serialization.",this.name);return e.filter(n=>n.type==="text").map(n=>n.text.trim()).filter(Boolean).join(`
3
+ `)}buildSystemPrompt(e,n){let o=n.filter(r=>r.role==="system").map(r=>this.serializeSystemMessageContent(r.content)).filter(Boolean);return[e,...o].filter(r=>typeof r=="string"&&r.trim().length>0).join(`
4
+
5
+ `)}async convertMessages(e,n){let o=[],r=this.getEffectiveStrictThinkingSignature(n);for(let s of e.filter(a=>a.role!=="system")){let a=s.role==="user"?"user":"assistant";if(typeof s.content=="string"){o.push({role:a,content:s.content});continue}let c=[],d=[];for(let l of s.content)l.type==="thinking"?!r||typeof l.signature=="string"&&l.signature.length>0?c.push({type:"thinking",thinking:l.thinking,signature:l.signature??""}):l.thinking&&d.push(l.thinking):l.type==="redacted_thinking"&&(r||c.push({type:"redacted_thinking",data:l.data}));d.length>0&&s.role==="assistant"&&c.push({type:"text",text:`<prior_reasoning>
6
+ ${d.join(`
7
+
8
+ `)}
9
+ </prior_reasoning>`});for(let l of s.content)if(l.type==="tool_result"&&s.role==="user"){let u;if(typeof l.content=="string")u=l.content;else{let y=[];for(let g of l.content)g.type==="text"?y.push({type:"text",text:g.text}):g.type==="image"&&y.push({type:"image",source:{type:"base64",media_type:Re(g.path,g.mediaType),data:await we(g.path)}});u=y}c.push({type:"tool_result",tool_use_id:l.tool_use_id,content:u,...l.is_error===!0?{is_error:!0}:{}})}for(let l of s.content)l.type==="tool_use"&&s.role==="assistant"&&c.push({type:"tool_use",id:l.id,name:l.name,input:l.input});for(let l of s.content)l.type==="text"?c.push({type:"text",text:l.text}):l.type==="image"&&s.role==="user"&&c.push({type:"image",source:{type:"base64",media_type:Re(l.path,l.mediaType),data:await we(l.path)}});if(a==="assistant"&&this.config.supportsThinking&&!r){let l=c.some(y=>y.type==="tool_use"),u=c.some(y=>y.type==="thinking"||y.type==="redacted_thinking");l&&!u&&c.unshift({type:"thinking",thinking:"...",signature:""})}let p=c.length===0||a==="assistant"&&c.every(l=>{let u=l;return u.type==="thinking"&&!u.thinking||u.type==="text"&&!u.text});o.push({role:s.role,content:p?[{type:"text",text:"..."}]:c})}return o}};import Jn from"openai";var Yn="KodaX";function qn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Yn}}i(qn,"getOpenAICompatDefaultHeaders");function qt(t){if(!t)return;let e=typeof t.prompt_tokens=="number"?t.prompt_tokens:0,n=typeof t.completion_tokens=="number"?t.completion_tokens:0,o=typeof t.total_tokens=="number"?t.total_tokens:e+n;if([e,n,o].some(s=>!Number.isFinite(s)||s<0)||o<e||o<n)return;let r=typeof t.prompt_tokens_details?.cached_tokens=="number"&&t.prompt_tokens_details.cached_tokens>=0?t.prompt_tokens_details.cached_tokens:typeof t.prompt_cache_hit_tokens=="number"&&t.prompt_cache_hit_tokens>=0?t.prompt_cache_hit_tokens:void 0;return{inputTokens:e,outputTokens:n,totalTokens:o,...r!==void 0?{cachedReadTokens:r}:{}}}i(qt,"normalizeOpenAIUsage");function Qn(t){return t?t.type==="function"&&"function"in t:!1}i(Qn,"isOpenAIFunctionToolCall");function Zn(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return"";let n=Reflect.get(e,"text");if(typeof n=="string")return n;if(n&&typeof n=="object"){let o=Reflect.get(n,"value");return typeof o=="string"?o:""}return""}).filter(Boolean).join(""):""}i(Zn,"extractOpenAIMessageText");function eo(t){if(!t||typeof t!="object")return"";let e=Reflect.get(t,"reasoning_content");return typeof e=="string"?e:Array.isArray(e)?e.map(n=>typeof n=="string"?n:n&&typeof n=="object"&&"text"in n&&typeof n.text=="string"?n.text:"").join(""):""}i(eo,"extractOpenAIMessageReasoning");var N=class extends z{static{i(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;client;initClient(){let e=qn(this.config);this.client=new Jn({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=he(n.content);return o.length===n.content.length?n:{...n,content:o}})}normalizeSystemForWire(e,n){let o=[];e&&e.trim().length>0&&o.push(e);let r=[];for(let s of n){if(s.role!=="system"){r.push(s);continue}let a=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.filter(c=>typeof c=="object"&&c!==null&&c.type==="text"&&typeof c.text=="string").map(c=>c.text).join(`
10
+ `):"";a.trim().length>0&&o.push(a)}return{system:o.join(`
11
+
12
+ `),rest:r}}appendExtraBody(e,n){let o=typeof e.extra_body=="object"&&e.extra_body!==null?e.extra_body:{};e.extra_body={...o,...n}}resetReasoningCapabilityParams(e){delete e.reasoning_effort,delete e.thinking;let n=typeof e.extra_body=="object"&&e.extra_body!==null?{...e.extra_body}:void 0;if(n){if(delete n.enable_thinking,delete n.thinking_budget,delete n.thinking,Object.keys(n).length===0){delete e.extra_body;return}e.extra_body=n}}applyReasoningCapability(e,n,o){let r=e,s=this.getEffectiveMaxOutputTokens(e.model),a=ee(Z(this.config,o.depth,o.taskType),s);switch(n){case"native-effort":{let c=ot(o.depth);c&&(r.reasoning_effort=c);break}case"native-budget":{this.name==="qwen"?this.appendExtraBody(r,{enable_thinking:!0,thinking_budget:a}):this.name==="zhipu"&&(r.thinking={type:"enabled",budget_tokens:a});break}case"native-toggle":{this.name==="qwen"?this.appendExtraBody(r,{enable_thinking:!0}):this.name==="zhipu"&&(r.thinking={type:"enabled"});break}default:break}}getFallbackTerms(e){switch(e){case"native-budget":return["thinking_budget","budget_tokens","thinking"];case"native-effort":return["reasoning_effort"];case"native-toggle":return["enable_thinking","thinking"];default:return[]}}async stream(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:d,rest:p}=this.normalizeSystemForWire(o,c),l=s?.modelOverride??this.config.model,u=[{role:"system",content:d},...await this.convertMessages(p,l)],y=n.map(T=>({type:"function",function:{name:T.name,description:T.description,parameters:T.input_schema}}));if(a?.aborted)throw new DOMException("Request aborted","AbortError");let g=new Map,v="",f="",_,k=!0,C=null,m=Date.now(),h=this.normalizeReasoning(r),M=Q(h)?this.getReasoningCapability(l):"none",R=Q(h)?this.getReasoningFallbackChain(M).filter(T=>T==="native-budget"||T==="native-effort"||T==="native-toggle"||T==="none"):["none"],j={model:l,messages:u,tools:y,max_completion_tokens:this.getEffectiveMaxOutputTokens(l),stream:!0},D,X;for(let T of R){for(;!D;){let I={...j};k&&(I.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(I),this.applyReasoningCapability(I,T,h);try{D=await this.client.chat.completions.create(I,a?{signal:a}:{}),T!==M&&this.persistReasoningCapabilityOverride(T,l)}catch(B){if(X=B,k&&this.shouldFallbackForSpecificReasoningError(B,"stream_options","include_usage")){k=!1;continue}if(!this.shouldFallbackForReasoningError(B,...this.getFallbackTerms(T)))throw B;break}}if(D)break}if(!D)throw X??new w("All reasoning capability attempts failed without a captured error",this.name);let E=Date.now(),W=0,A=0,_e=3e4;for await(let T of D){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let I=Date.now(),B=I-E;B>_e&&(W++,A+=B,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(B/1e3)}s gap`,{stallCount:W,totalStallMs:A})),E=I,s?.onHeartbeat?.(),_=qt(T.usage)??_;let x=T.choices[0],P=x?.delta;if(x?.finish_reason&&(C=x.finish_reason,process.env.KODAX_DEBUG_STREAM)){let b=Date.now()-m;this.logStreamDiagnostic(`[Stream] finish_reason: ${C} after ${b}ms`)}P?.content&&(v+=P.content,s?.onTextDelta?.(P.content));let S=this.extractReasoningDelta(P);if(S&&(f+=S,s?.onThinkingDelta?.(S)),P?.tool_calls)for(let b of P.tool_calls){let J=g.get(b.index)??{id:"",name:"",arguments:""};b.id&&(J.id=b.id),b.function?.name&&(J.name=b.function.name),b.function?.arguments&&(J.arguments+=b.function.arguments,s?.onToolInputDelta?.(J.name,b.function.arguments,J.id?{toolId:J.id}:void 0)),g.set(b.index,J)}}if(!C){let T=Date.now()-m;if(a?.aborted){let B=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before finish_reason:",{duration:T,reason:B,textContentLength:v.length,toolCallsCount:g.size}),new DOMException(B,"AbortError")}let I=new Error(`Stream incomplete: finish_reason not received. Duration: ${T}ms. This may indicate a network disconnection or API timeout.`);throw I.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:T,textContentLength:v.length,toolCallsCount:g.size}),I}let de=v?[{type:"text",text:v}]:[],pe=[],fe=[];f&&(fe.push({type:"thinking",thinking:f}),s?.onThinkingEnd?.(f));for(let[,T]of g)T.id&&T.name&&pe.push({type:"tool_use",id:T.id,name:T.name,input:ne(T.arguments)});return{textBlocks:de,toolBlocks:pe,thinkingBlocks:fe,usage:_,stopReason:C??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:d,rest:p}=this.normalizeSystemForWire(o,c),l=s?.modelOverride??this.config.model,u=[{role:"system",content:d},...await this.convertMessages(p,l)],y=n.map(E=>({type:"function",function:{name:E.name,description:E.description,parameters:E.input_schema}})),g=this.normalizeReasoning(r),v=Q(g)?this.getReasoningCapability(l):"none",f=Q(g)?this.getReasoningFallbackChain(v).filter(E=>E==="native-budget"||E==="native-effort"||E==="native-toggle"||E==="none"):["none"],_={model:l,messages:u,tools:y,max_completion_tokens:this.getEffectiveMaxOutputTokens(l)},k,C;for(let E of f){let W={..._};this.resetReasoningCapabilityParams(W),this.applyReasoningCapability(W,E,g);try{k=await this.client.chat.completions.create(W,a?{signal:a}:{}),E!==v&&this.persistReasoningCapabilityOverride(E,l);break}catch(A){if(C=A,!this.shouldFallbackForReasoningError(A,...this.getFallbackTerms(E)))throw A}}if(!k)throw C??new w("All reasoning capability attempts failed without a captured error",this.name);let m=k.choices[0],h=m?.message,M=Zn(h?.content),R=eo(h),j=(h?.tool_calls??[]).filter(Qn).map(E=>({type:"tool_use",id:E.id,name:E.function.name,input:ne(E.function.arguments)}));M&&s?.onTextDelta?.(M);let D=M?[{type:"text",text:M}]:[],X=[];return R&&(X.push({type:"thinking",thinking:R}),s?.onThinkingDelta?.(R),s?.onThinkingEnd?.(R)),{textBlocks:D,toolBlocks:j,thinkingBlocks:X,usage:qt(k.usage),stopReason:m?.finish_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}extractReasoningDelta(e){let n=e?.reasoning_content;return typeof n=="string"?n:Array.isArray(n)?n.map(o=>typeof o=="string"?o:typeof o=="object"&&o!==null&&"text"in o&&typeof o.text=="string"?o.text:"").join(""):""}serializeAssistantMessage(e,n){let o=e.filter(p=>p.type==="text").map(p=>p.text).join(`
13
+ `),r=e.filter(p=>p.type==="tool_use").map(p=>({id:p.id,type:"function",function:{name:p.name,arguments:JSON.stringify(p.input??{})}})),s=e.filter(p=>p.type==="thinking"||p.type==="redacted_thinking").map(p=>p.type==="thinking"?p.thinking:"").filter(Boolean).join(`
14
+
15
+ `),a=e.some(p=>p.type==="thinking"||p.type==="redacted_thinking");if(!o&&r.length===0&&!a)return[];let c;o?c=o:r.length>0?c=null:c="...";let d={role:"assistant",content:c};return r.length>0&&(d.tool_calls=r),this.getEffectiveReplayReasoningContent(n)&&(d.reasoning_content=s||""),[d]}async serializeUserMessage(e){let n=[],o=e.filter(a=>a.type==="text").map(a=>a.text).join(`
16
+ `),r=e.filter(a=>a.type==="image");for(let a of e)if(a.type==="tool_result"){let c;typeof a.content=="string"?c=a.content:c=a.content.map(d=>d.type==="text"?d.text:`[Image at ${d.path}${d.mediaType?` (${d.mediaType})`:""}] (provider does not support image content in tool_result; if the image was previously visible to you in the conversation, refer to it directly via native vision)`).join(`
17
+ `),n.push({role:"tool",tool_call_id:a.tool_use_id,content:c})}if(r.length===0)return o&&n.push({role:"user",content:o}),n;let s=[];o&&s.push({type:"text",text:o});for(let a of r)s.push({type:"image_url",image_url:{url:await Yt(a.path,a.mediaType)}});return n.push({role:"user",content:s}),n}serializeSystemMessage(e){if(typeof e=="string")return[{role:"system",content:e}];let n=e.filter(o=>o.type==="text").map(o=>o.text).join(`
18
+ `);return n?[{role:"system",content:n}]:[]}async convertMessages(e,n){let o=[];for(let r of e){if(r.role==="system"){o.push(...this.serializeSystemMessage(r.content));continue}if(typeof r.content=="string"){o.push({role:r.role,content:r.content});continue}if(r.role==="assistant"){o.push(...this.serializeAssistantMessage(r.content,n));continue}o.push(...await this.serializeUserMessage(r.content))}return o}};import{spawn as to}from"node:child_process";import{Readable as no,Writable as oo}from"node:stream";import mt from"node:process";import{ClientSideConnection as io,PROTOCOL_VERSION as ro,ndJsonStream as so}from"@agentclientprotocol/sdk";var Ae=class{static{i(this,"AcpClient")}client=null;agentProcess=null;options;constructor(e){this.options=e}async connect(){let e,n;if(this.options.inputStream&&this.options.outputStream)e=this.options.inputStream,n=this.options.outputStream;else if(this.options.command){let s=mt.platform==="win32"&&!this.options.command.endsWith(".cmd")?`${this.options.command}.cmd`:this.options.command;if(this.agentProcess=to(s,this.options.args??[],{cwd:this.options.cwd??mt.cwd(),stdio:["pipe","pipe","inherit"]}),!this.agentProcess.stdin||!this.agentProcess.stdout)throw new Error("Failed to create ACP stdio pipes");n=oo.toWeb(this.agentProcess.stdin),e=no.toWeb(this.agentProcess.stdout)}else throw new Error("AcpClient requires either a command or I/O streams");let o=so(n,e);this.client=new io(()=>({sessionUpdate:i(async r=>{this.options.onSessionUpdate?.(r)},"sessionUpdate"),requestPermission:i(async r=>{let s=r.options??[],a=s.find(c=>c.kind==="allow_once"||c.kind==="allow_always")??s[0];return a?{outcome:{outcome:"selected",optionId:a.optionId}}:{outcome:{outcome:"cancelled"}}},"requestPermission")}),o),await this.client.initialize({protocolVersion:ro,clientCapabilities:{},clientInfo:{name:"kodax-ai-acp-client",version:"1.0.0"}})}async createNewSession(){if(!this.client)throw new Error("Client not connected");return(await this.client.newSession({cwd:this.options.cwd??mt.cwd(),mcpServers:[]})).sessionId}async prompt(e,n,o,r){if(!this.client)throw new Error("Client not connected");let s={sessionId:n,prompt:[{type:"text",text:e}]};r?.model&&(s.model=r.model);let a=this.client.prompt(s);if(o){let c=i(()=>{this.client?.cancel({sessionId:n}).catch(()=>{})},"onAbort");o.addEventListener("abort",c),a=a.finally(()=>{o.removeEventListener("abort",c)})}return await a}disconnect(){this.agentProcess?.kill(),this.options.abort?.();try{this.client?.close?.()}catch{}this.client=null}};function ao(t){if(!t||typeof t!="object")return;let e=t,n=typeof e.inputTokens=="number"?e.inputTokens:0,o=typeof e.outputTokens=="number"?e.outputTokens:0,r=typeof e.totalTokens=="number"?e.totalTokens:n+o;if(![n,o,r].some(s=>!Number.isFinite(s)||s<0)&&!(r<n||r<o))return{inputTokens:n,outputTokens:o,totalTokens:r,cachedReadTokens:typeof e.cachedReadTokens=="number"?e.cachedReadTokens:void 0,cachedWriteTokens:typeof e.cachedWriteTokens=="number"?e.cachedWriteTokens:void 0,thoughtTokens:typeof e.thoughtTokens=="number"?e.thoughtTokens:void 0}}i(ao,"normalizeAcpUsage");var ie=class extends z{static{i(this,"KodaXAcpProvider")}_client=null;_sessionMap=new Map;_activeStreams=new Map;isConfigured(){return!0}getCapabilityProfile(){return $(ge)}serializeImageBlockToPromptToken(e){return null}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=he(n.content);return o.length===n.content.length?n:{...n,content:o}})}async stream(e,n,o,r,s,a){if(e=this.stripCacheBoundariesFromMessages(e),this.acpClientOptions.executor&&typeof this.acpClientOptions.executor.isInstalled=="function"&&!await this.acpClientOptions.executor.isInstalled())throw new Error(`${this.name} requires a local CLI environment, but the CLI was not found or is not configured correctly.`);let c=[],d=[],p=e[e.length-1],l="";if(p&&typeof p.content=="string")l=p.content;else if(p&&Array.isArray(p.content)){let _=[];for(let k of p.content)if(k.type==="text")_.push(k.text);else if(k.type==="image"){let C=this.serializeImageBlockToPromptToken(k);C&&_.push(C)}l=_.join(`
19
+ `)}let u={...this.acpClientOptions,onSessionUpdate:i(_=>{let k=_.update,C=_.sessionId;if(!("sessionUpdate"in k))return;let m=C?this._activeStreams.get(C):void 0;if(m)switch(k.sessionUpdate){case"agent_message_chunk":if(k.content?.type==="text"){let h=k.content.text;m.output.text+=h,m.streamOptions?.onTextDelta?.(h)}break;case"tool_call":{let h="{}",M=k.arguments??k.parameters;M&&(h=typeof M=="string"?M:JSON.stringify(M)),m.streamOptions?.onToolInputDelta?.(k.title,h);let R=`
20
+ > [Tool Use] ${k.title}: ${h}
21
+ `;m.output.text+=R,m.streamOptions?.onTextDelta?.(R);break}case"tool_call_update":if(k.status){let h=`> [Tool Result] ${k.status}
22
+
23
+ `;m.output.text+=h,m.streamOptions?.onTextDelta?.(h)}break}},"onSessionUpdate")},y=s?.sessionId??"default";this._client||(this._client=new Ae(u),await this._client.connect());let g=this._sessionMap.get(y);g||(g=await this._client.createNewSession(),this._sessionMap.set(y,g));let v={text:""};this._activeStreams.set(g,{streamOptions:s,output:v});let f;try{f=await this._client.prompt(l,g,a,{model:s?.modelOverride})}catch(_){if(!(_ instanceof Error&&_.name==="AbortError"))throw _}finally{this._activeStreams.delete(g)}return v.text&&c.push({type:"text",text:v.text}),{textBlocks:c,toolBlocks:d,thinkingBlocks:[],usage:ao(f?.usage)}}disconnect(){this._client&&(this._client.disconnect(),this._client=null),this._activeStreams.clear(),this._sessionMap.clear()}};import{spawn as co}from"node:child_process";import gt from"node:process";var re=class{static{i(this,"CLIExecutor")}config;_installedCache=null;constructor(e){this.config=e}async isInstalled(){return this._installedCache!==null?this._installedCache:(this._installedCache=await this.checkInstalled(),this._installedCache)}async*execute(e){let n=this.buildArgs(e),o={...gt.env,...this.config.env},s=gt.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=co(s,n,{cwd:this.config.cwd??gt.cwd(),env:o,stdio:["ignore","pipe","pipe"]}),c="";a.stderr?.on("data",l=>{c+=l.toString()});let d=!1,p=i(()=>{d||a.kill("SIGTERM")},"abortHandler");e.signal?.addEventListener("abort",p),a.on("exit",()=>{d=!0});try{yield*this.parseOutputStream(a.stdout,e.signal),c.trim()&&console.error(`[CLIExecutor] stderr: ${c.trim()}`)}finally{e.signal?.removeEventListener("abort",p),d||a.kill()}}async*parseOutputStream(e,n){let o="";for await(let r of e){if(n?.aborted)break;o+=r.toString();let s=o.split(`
24
+ `);o=s.pop()??"";for(let a of s){if(!a.trim())continue;let c=this.parseLine(a.trim());c&&(yield c)}}if(o.trim()&&!n?.aborted){let r=this.parseLine(o.trim());r&&(yield r)}}};import{spawn as lo}from"node:child_process";import uo from"node:process";async function Se(t){try{let e=uo.platform==="win32",n=lo(e?`${t}.cmd`:t,["--version"]);return await new Promise(o=>{n.on("close",r=>o(r===0)),n.on("error",()=>o(!1))})}catch{return!1}}i(Se,"checkCliCommandInstalled");var Oe=class extends re{static{i(this,"GeminiCLIExecutor")}model;constructor(e){super({command:"gemini",baseArgs:["--output-format","stream-json","--approval-mode","yolo"],timeout:3e5,...e}),this.model=e?.model??"gemini-2.5-pro"}async checkInstalled(){return Se("gemini")}buildArgs(e){let n=["-m",e.model??this.model];return e.sessionId?(n.push("-r",e.sessionId),n.push(e.prompt)):n.push("-p",e.prompt),[...n,...this.config.baseArgs]}parseLine(e){if(!e.startsWith("{"))return null;try{let n=JSON.parse(e);return this.convertEvent(n)}catch{return null}}convertEvent(e){let n=e.timestamp?Date.parse(e.timestamp):Date.now();switch(e.type){case"init":return{type:"session_start",timestamp:n,sessionId:e.session_id??"",model:e.model??this.model,raw:e};case"message":return{type:"message",timestamp:n,role:e.role,content:e.content??"",delta:e.delta,raw:e};case"tool_use":return{type:"tool_use",timestamp:n,toolId:e.tool_id??"",toolName:e.tool_name??"",parameters:e.parameters??{},raw:e};case"tool_result":return{type:"tool_result",timestamp:n,toolId:e.tool_id??"",status:e.status==="success"?"success":"error",output:e.output??"",raw:e};case"error":return{type:"error",timestamp:n,errorType:"error",message:e.message??"Unknown error",raw:e};case"result":return{type:"complete",timestamp:n,status:e.status==="success"?"success":"failed",usage:e.stats?{inputTokens:e.stats.input_tokens??0,outputTokens:e.stats.output_tokens??0,totalTokens:e.stats.total_tokens??0}:void 0,raw:e};default:return null}}};import{TransformStream as Qt}from"node:stream/web";import{randomUUID as ht}from"node:crypto";function De(t){let e=new Qt,n=new Qt,o=e.readable.getReader(),r=n.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,c="",d=ht(),p=new AbortController,l=new Map;(async()=>{try{for(;;){let{done:f,value:_}=await o.read();if(f)break;c+=s.decode(_,{stream:!0});let k=c.split(`
25
+ `);c=k.pop()??"";for(let C of k)if(C.trim())try{let m=JSON.parse(C);y(m).catch(h=>{console.error("[PseudoAcpServer] Failed to handle request:",h)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",C)}}}catch(f){console.error("[PseudoAcpServer] Stream read error:",f)}})();let u=i(async f=>{let _=JSON.stringify(f)+`
26
+ `;await r.write(a.encode(_))},"sendMsg");async function y(f){if(f.method==="initialize")await u({jsonrpc:"2.0",id:f.id,result:{protocolVersion:f.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(f.method==="session/new"||f.method==="sessions/new")d=f.params?.sessionId??ht(),await u({jsonrpc:"2.0",id:f.id,result:{sessionId:d}});else if(f.method==="session/prompt"||f.method==="chat/prompt"){let _=new AbortController,k=f.params.sessionId;l.set(k,_);let C=i(()=>_.abort(),"onGlobalAbort");p.signal.addEventListener("abort",C);let h=await g(k,f.params.prompt,typeof f.params.model=="string"?f.params.model:void 0,_.signal).finally(()=>{l.delete(k),p.signal.removeEventListener("abort",C)});await u({jsonrpc:"2.0",id:f.id,result:h.usage?{stopReason:h.stopReason,usage:h.usage}:{stopReason:h.stopReason}})}else if(f.method==="session/cancel"||f.method==="chat/cancel"){let _=l.get(f.params.sessionId);_&&_.abort(),f.id!==void 0&&await u({jsonrpc:"2.0",id:f.id,result:{}})}else f.id!==void 0&&await u({jsonrpc:"2.0",id:f.id,result:{}})}i(y,"handleRequest");let g=i(async(f,_,k,C)=>{let m=_.find(h=>h.type==="text")?.text??"";try{let h=t.execute({prompt:m,model:k,sessionId:f==="default"?void 0:f,signal:C});for await(let M of h){let R=v(M);if(R&&await u({jsonrpc:"2.0",method:"session/update",params:{sessionId:f,update:R}}),M.type==="complete")return{stopReason:C.aborted?"cancelled":"end_turn",usage:M.usage}}return{stopReason:C.aborted?"cancelled":"end_turn"}}catch(h){return C.aborted||h instanceof Error&&h.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",h),await u({jsonrpc:"2.0",method:"session/update",params:{sessionId:f,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
27
+ [Fatal Error: ${h}]
28
+ `}}}}),{stopReason:"end_turn"})}},"executePrompt"),v=i(f=>{switch(f.type){case"message":if(f.role==="assistant"&&f.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:f.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:f.toolName,arguments:f.parameters,status:"running",toolCallId:f.toolId||ht()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:f.toolId,status:f.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
29
+ [Error: ${f.message}]
30
+ `}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:n.readable,outputStream:e.writable,abort:i(()=>{p.abort(),e.readable.cancel().catch(()=>{}),n.writable.abort().catch(()=>{})},"abort"),executor:t}}i(De,"createPseudoAcpServer");import Zt from"node:fs";import en from"node:os";import tn from"node:path";var po="gpt-5.4",fo="auto-gemini-3",mo=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],go=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function nn(t){let e=new Set,n=[];for(let o of t){let r=o.trim();if(!r)continue;let s=r.toLowerCase();e.has(s)||(e.add(s),n.push(r))}return n}i(nn,"dedupePreserveOrder");function ho(){let t=tn.join(en.homedir(),".codex","config.toml");try{return Zt.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}i(ho,"readCodexConfiguredModel");function yo(){let t=tn.join(en.homedir(),".gemini","settings.json");try{let e=JSON.parse(Zt.readFileSync(t,"utf8")),n=typeof e.model=="string"?e.model.trim():"";return n||(typeof e.general?.model=="string"?e.general.model.trim():"")||null}catch{return null}}i(yo,"readGeminiConfiguredModel");function se(){return ho()||po}i(se,"getCodexCliDefaultModel");function ae(){return yo()||fo}i(ae,"getGeminiCliDefaultModel");function ye(){return nn([se(),...mo])}i(ye,"getCodexCliKnownModels");function be(){return nn([ae(),...go])}i(be,"getGeminiCliKnownModels");var yt=ae(),bo=be(),ko={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},Ie=class extends ie{static{i(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:yt,models:bo.filter(e=>e!==yt).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new Oe({model:yt});this.acpClientOptions=De(e)}getCapabilityProfile(){return $(ko)}serializeImageBlockToPromptToken(e){return/\s/.test(e.path)?(console.warn(`[gemini-cli] Image path contains whitespace and cannot be safely passed via @<path> syntax \u2014 dropping image block. Path: ${JSON.stringify(e.path)}`),null):`@${e.path}`}};var Be=class extends re{static{i(this,"CodexCLIExecutor")}model;constructor(e){super({command:"codex",baseArgs:["exec","--json","--full-auto"],timeout:3e5,...e}),this.model=e?.model??"gpt-5.4"}async checkInstalled(){return Se("codex")}buildArgs(e){this.model=e.model??this.model;let n=e.model?["-m",e.model]:[];return e.sessionId?["exec","resume",e.sessionId,...n,e.prompt,...this.config.baseArgs.filter(o=>o!=="exec")]:[...this.config.baseArgs,...n,e.prompt]}parseLine(e){if(!e.startsWith("{"))return null;try{let n=JSON.parse(e);return this.convertEvent(n)}catch{return null}}convertEvent(e){let n=Date.now();switch(e.type){case"thread.started":return{type:"session_start",timestamp:n,sessionId:e.thread_id??"",model:this.model,raw:e};case"item.completed":return e.item?.type==="agent_message"?{type:"message",timestamp:n,role:"assistant",content:e.item.text??"",raw:e}:e.item?.type==="command_execution"?{type:"tool_use",timestamp:n,toolId:e.item.id,toolName:"Bash",parameters:{command:e.item.command},raw:e}:null;case"turn.completed":return{type:"complete",timestamp:n,status:"success",usage:e.usage?{inputTokens:e.usage.input_tokens,outputTokens:e.usage.output_tokens,totalTokens:e.usage.input_tokens+e.usage.output_tokens}:void 0,raw:e};case"error":case"turn.failed":return{type:"error",timestamp:n,errorType:e.type,message:e.message??"Unknown error",raw:e};default:return null}}};var bt=se(),vo=ye(),Le=class extends ie{static{i(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:bt,models:vo.filter(e=>e!==bt).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Be({model:bt});this.acpClientOptions=De(e)}};import{existsSync as Mo,readFileSync as Eo}from"node:fs";import ce from"node:path";import{fileURLToPath as Po}from"node:url";var on=["none","prompt-only","native-effort","native-budget","native-toggle","unknown"],rn=["native","image-input-native","cli-bridge","image-input-cli-bridge"];function ke(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}i(ke,"isPlainObject");function Ne(t,e){if(typeof t!="string"||t.length===0)throw new Error(`provider-capabilities.json: ${e} must be a non-empty string`);return t}i(Ne,"requireString");function sn(t,e){if(t!==void 0)return Ne(t,e)}i(sn,"optionalString");function q(t,e){if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new Error(`provider-capabilities.json: ${e} must be a non-negative finite number`);return t}}i(q,"optionalNumber");function Ke(t,e){if(t!==void 0){if(typeof t!="boolean")throw new Error(`provider-capabilities.json: ${e} must be a boolean`);return t}}i(Ke,"optionalBoolean");function kt(t,e){if(typeof t!="string"||!on.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${on.join(", ")}, got ${JSON.stringify(t)}`);return t}i(kt,"requireReasoningCapability");function _o(t,e){if(typeof t!="string"||!rn.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${rn.join(", ")}, got ${JSON.stringify(t)}`);return t}i(_o,"requireProfileName");function Co(t,e){if(!ke(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n=Ne(t.id,`${e}.id`),o=sn(t.displayName,`${e}.displayName`),r=q(t.contextWindow,`${e}.contextWindow`),s=q(t.maxOutputTokens,`${e}.maxOutputTokens`),a=q(t.thinkingBudgetCap,`${e}.thinkingBudgetCap`),c=Ke(t.replayReasoningContent,`${e}.replayReasoningContent`),d=Ke(t.strictThinkingSignature,`${e}.strictThinkingSignature`),p=q(t.streamMaxDurationMs,`${e}.streamMaxDurationMs`),l=t.reasoningCapability===void 0?void 0:kt(t.reasoningCapability,`${e}.reasoningCapability`),u={id:n};return o!==void 0&&(u.displayName=o),r!==void 0&&(u.contextWindow=r),s!==void 0&&(u.maxOutputTokens=s),a!==void 0&&(u.thinkingBudgetCap=a),l!==void 0&&(u.reasoningCapability=l),c!==void 0&&(u.replayReasoningContent=c),d!==void 0&&(u.strictThinkingSignature=d),p!==void 0&&(u.streamMaxDurationMs=p),u}i(Co,"validateModelDescriptor");function xo(t,e){if(t===void 0)return;if(!ke(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n={};for(let[o,r]of Object.entries(t))n[o]=kt(r,`${e}.${o}`);return n}i(xo,"validateModelReasoningCapabilities");function To(t,e){if(!ke(t))throw new Error(`provider-capabilities.json: providers.${e} must be an object`);let n=Ke(t.cliBridge,`providers.${e}.cliBridge`),o=Ne(t.apiKeyEnv,`providers.${e}.apiKeyEnv`),r=kt(t.reasoningCapability,`providers.${e}.reasoningCapability`),s=_o(t.capabilityProfile,`providers.${e}.capabilityProfile`),a=q(t.contextWindow,`providers.${e}.contextWindow`),c=q(t.maxOutputTokens,`providers.${e}.maxOutputTokens`),d=q(t.thinkingBudgetCap,`providers.${e}.thinkingBudgetCap`),p=Ke(t.supportsThinking,`providers.${e}.supportsThinking`),l=xo(t.modelReasoningCapabilities,`providers.${e}.modelReasoningCapabilities`),u=sn(t.model,`providers.${e}.model`);if(n&&(u!==void 0||t.models!==void 0))throw new Error(`provider-capabilities.json: providers.${e} is a cliBridge entry but defines model/models \u2014 must be omitted (filled at load time)`);if(!n&&u===void 0)throw new Error(`provider-capabilities.json: providers.${e}.model is required (only cliBridge entries may omit)`);let y;if(t.models!==void 0){if(!Array.isArray(t.models))throw new Error(`provider-capabilities.json: providers.${e}.models must be an array`);y=t.models.map((v,f)=>Co(v,`providers.${e}.models[${f}]`))}let g={apiKeyEnv:o,reasoningCapability:r,capabilityProfile:s};return u!==void 0&&(g.model=u),y!==void 0&&(g.models=y),a!==void 0&&(g.contextWindow=a),c!==void 0&&(g.maxOutputTokens=c),d!==void 0&&(g.thinkingBudgetCap=d),p!==void 0&&(g.supportsThinking=p),l!==void 0&&(g.modelReasoningCapabilities=l),n&&(g.cliBridge=!0),g}i(To,"validateProviderEntry");function an(t){if(!ke(t))throw new Error("provider-capabilities.json: root must be an object");if(t.version!==1)throw new Error(`provider-capabilities.json: version must be 1, got ${JSON.stringify(t.version)}`);let e=Ne(t.updatedAt,"updatedAt");if(!ke(t.providers))throw new Error("provider-capabilities.json: providers must be an object");let n={};for(let[o,r]of Object.entries(t.providers))n[o]=To(r,o);return{version:1,updatedAt:e,providers:n}}i(an,"validateProviderCapabilitiesJson");var Ro=Object.freeze({native:Y,"image-input-native":Ht,"cli-bridge":ge,"image-input-cli-bridge":Jt}),Fe=null;function wo(){if(process.env.KODAX_BUNDLED==="true")return ce.join(ce.dirname(process.execPath),"provider-capabilities.json");let t=ce.dirname(Po(import.meta.url)),e=[ce.join(t,"provider-capabilities.json"),ce.join(ce.dirname(t),"provider-capabilities.json")];for(let n of e)if(Mo(n))return n;return e[0]}i(wo,"resolveJsonPath");function Ao(t){if(t.models){for(let e of t.models)Object.freeze(e);Object.freeze(t.models)}return t.modelReasoningCapabilities&&Object.freeze(t.modelReasoningCapabilities),Object.freeze(t)}i(Ao,"deepFreezeSnapshot");function So(t){if(t==="gemini-cli"){let e=ae();return{model:e,models:be().filter(n=>n!==e).map(n=>({id:n}))}}if(t==="codex-cli"){let e=se();return{model:e,models:ye().filter(n=>n!==e).map(n=>({id:n}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${t}'`)}i(So,"resolveCliBridgeModels");function Oo(t,e){let n=Ro[e.capabilityProfile];if(!n)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${e.capabilityProfile}' for provider '${t}'`);if(e.cliBridge){let r=So(t),s={model:r.model,models:r.models,apiKeyEnv:e.apiKeyEnv,reasoningCapability:e.reasoningCapability,capabilityProfile:n};return e.supportsThinking!==void 0&&(s.supportsThinking=e.supportsThinking),s}let o={model:e.model,apiKeyEnv:e.apiKeyEnv,reasoningCapability:e.reasoningCapability,capabilityProfile:n};return e.models!==void 0&&(o.models=e.models),e.modelReasoningCapabilities!==void 0&&(o.modelReasoningCapabilities=e.modelReasoningCapabilities),e.contextWindow!==void 0&&(o.contextWindow=e.contextWindow),e.maxOutputTokens!==void 0&&(o.maxOutputTokens=e.maxOutputTokens),e.thinkingBudgetCap!==void 0&&(o.thinkingBudgetCap=e.thinkingBudgetCap),e.supportsThinking!==void 0&&(o.supportsThinking=e.supportsThinking),o}i(Oo,"buildSnapshot");function cn(){if(Fe)return Fe;let t=wo(),e;try{let r=Eo(t,"utf8");e=JSON.parse(r)}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`provider-capabilities loader: failed to read ${t}: ${s}`)}let n=an(e),o={};for(let[r,s]of Object.entries(n.providers))o[r]=Ao(Oo(r,s));return Fe=Object.freeze(o),Fe}i(cn,"getProviderSnapshots");import Do from"@anthropic-ai/sdk";var K=cn();function U(t,e={}){let n=K[t];return{apiKeyEnv:n.apiKeyEnv,model:n.model,reasoningCapability:n.reasoningCapability,models:n.models,contextWindow:n.contextWindow,maxOutputTokens:n.maxOutputTokens,thinkingBudgetCap:n.thinkingBudgetCap,supportsThinking:n.supportsThinking??!1,...e}}i(U,"buildProviderConfig");var vt=class extends L{static{i(this,"AnthropicProvider")}name="anthropic";config=U("anthropic",{strictThinkingSignature:!0});constructor(){super(),this.client=new Do({apiKey:this.getApiKey()})}},_t=class extends L{static{i(this,"ZhipuCodingProvider")}name="zhipu-coding";config=U("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",streamMaxDurationMs:3e5});constructor(){super(),this.initClient()}},Ct=class extends L{static{i(this,"KimiCodeProvider")}name="kimi-code";config=U("kimi-code",{baseUrl:"https://api.kimi.com/coding/"});constructor(){super(),this.initClient()}},xt=class extends L{static{i(this,"MiniMaxCodingProvider")}name="minimax-coding";config=U("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic"});constructor(){super(),this.initClient()}},Tt=class extends L{static{i(this,"MimoCodingProvider")}name="mimo-coding";config=U("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic"});constructor(){super(),this.initClient()}},Mt=class extends L{static{i(this,"ArkCodingProvider")}name="ark-coding";config=U("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding"});constructor(){super(),this.initClient()}},Et=class extends N{static{i(this,"OpenAIProvider")}name="openai";config=U("openai");constructor(){super(),this.initClient()}},Pt=class extends N{static{i(this,"DeepSeekProvider")}name="deepseek";config=U("deepseek",{baseUrl:"https://api.deepseek.com",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Rt=class extends N{static{i(this,"KimiProvider")}name="kimi";config=U("kimi",{baseUrl:"https://api.moonshot.cn/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},wt=class extends N{static{i(this,"QwenProvider")}name="qwen";config=U("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},At=class extends N{static{i(this,"ZhipuProvider")}name="zhipu";config=U("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",replayReasoningContent:!0});constructor(){super(),this.initClient()}},F={anthropic:i(()=>new vt,"anthropic"),openai:i(()=>new Et,"openai"),deepseek:i(()=>new Pt,"deepseek"),kimi:i(()=>new Rt,"kimi"),"kimi-code":i(()=>new Ct,"kimi-code"),qwen:i(()=>new wt,"qwen"),zhipu:i(()=>new At,"zhipu"),"zhipu-coding":i(()=>new _t,"zhipu-coding"),"minimax-coding":i(()=>new xt,"minimax-coding"),"mimo-coding":i(()=>new Tt,"mimo-coding"),"ark-coding":i(()=>new Mt,"ark-coding"),"gemini-cli":i(()=>new Ie,"gemini-cli"),"codex-cli":i(()=>new Le,"codex-cli")},St=process.env.KODAX_PROVIDER??"zhipu-coding",ln=new Map;function Io(t){if(O(t))return K[t].apiKeyEnv}i(Io,"resolveApiKeyEnvForProvider");function un(t){let e=t??St,n=F[e];if(!n)throw new w(`Unknown provider: ${e}. Available: ${Object.keys(F).join(", ")}`,e);let o=Io(e),r=o?process.env[o]:void 0,s=ln.get(e);if(s&&s.apiKey===r)return s.instance;let a=n();return ln.set(e,{apiKey:r,instance:a}),a}i(un,"getProvider");function dn(t){return O(t)?!!process.env[K[t].apiKeyEnv]:!1}i(dn,"isProviderConfigured");function pn(t){return O(t)?K[t].model:null}i(pn,"getProviderModel");function fn(t,e){if(!O(t))return"unknown";let n=K[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}i(fn,"getProviderConfiguredReasoningCapability");function mn(t){return O(t)?$(K[t].capabilityProfile):null}i(mn,"getProviderConfiguredCapabilityProfile");function gn(){let t=[];for(let e of Object.keys(F)){let n=K[e];t.push({name:e,model:n.model,models:n.models?[n.model,...n.models.map(o=>o.id)]:[n.model],configured:!!process.env[n.apiKeyEnv],reasoningCapability:n.reasoningCapability,capabilityProfile:$(n.capabilityProfile)})}return t}i(gn,"getProviderList");function hn(t){let e=K[t];return e?e.models?[e.model,...e.models.map(n=>n.id)]:[e.model]:[]}i(hn,"getProviderModels");function O(t){return t in F}i(O,"isProviderName");function Ot(t){return{id:t.model}}i(Ot,"makeDefaultDescriptor");function $e(t,e,n){let o=n.id===e.model;return{provider:t,model:n.id,displayName:n.displayName??n.id,supportsThinking:e.supportsThinking??!1,reasoningCapability:n.reasoningCapability??e.reasoningCapability,contextWindow:n.contextWindow??e.contextWindow,maxOutputTokens:n.maxOutputTokens??e.maxOutputTokens,thinkingBudgetCap:n.thinkingBudgetCap??e.thinkingBudgetCap,isDefault:o}}i($e,"effectiveCapabilities");function Ue(t){let e=K[t];return e?[Ot(e),...e.models??[]]:[]}i(Ue,"getProviderModelDescriptors");function je(t,e){let n=K[t];if(!n)return;if(e===n.model)return $e(t,n,Ot(n));let o=n.models?.find(r=>r.id===e);if(o)return $e(t,n,o)}i(je,"getModelCapabilities");function Xe(){let t=[];for(let e of Object.keys(F)){let n=K[e];t.push($e(e,n,Ot(n)));for(let o of n.models??[])t.push($e(e,n,o))}return t}i(Xe,"listBuiltinModelCapabilities");var Bo=new Set(["compat","sdk"]);function ve(t){if(!t.name||!t.baseUrl||!t.apiKeyEnv||!t.model)throw new Error(`Custom provider requires name, baseUrl, apiKeyEnv, and model. Got: ${JSON.stringify({name:t.name,baseUrl:t.baseUrl,apiKeyEnv:t.apiKeyEnv,model:t.model})}`);if(t.protocol!=="anthropic"&&t.protocol!=="openai")throw new Error(`Unknown protocol "${t.protocol}" for custom provider "${t.name}". Must be "anthropic" or "openai".`);if(t.userAgentMode!==void 0&&!Bo.has(t.userAgentMode))throw new Error(`Unknown userAgentMode "${t.userAgentMode}" for custom provider "${t.name}". Must be "compat" or "sdk".`)}i(ve,"validateCustomProviderConfig");function Lo(t){let e=t.models?.length?t.models.map(n=>typeof n=="string"?{id:n}:n):void 0;return{apiKeyEnv:t.apiKeyEnv,model:t.model,baseUrl:t.baseUrl,models:e,userAgentMode:t.userAgentMode,supportsThinking:t.supportsThinking??!1,reasoningCapability:t.reasoningCapability??"none",capabilityProfile:t.capabilityProfile,contextWindow:t.contextWindow,maxOutputTokens:t.maxOutputTokens,thinkingBudgetCap:t.thinkingBudgetCap,replayReasoningContent:t.replayReasoningContent??!1,strictThinkingSignature:t.strictThinkingSignature??!1,streamMaxDurationMs:t.streamMaxDurationMs}}i(Lo,"buildProviderConfig");function We(t){ve(t);let e=Lo(t);return t.protocol==="anthropic"?new Dt(t.name,e):new It(t.name,e)}i(We,"createCustomProvider");var Dt=class extends L{static{i(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}},It=class extends N{static{i(this,"DynamicOpenAIProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}};var V=new Map,Bt=new Map;function yn(t){let e=new Set,n=new Map,o=new Map;for(let r of t){if(ve(r),e.has(r.name))throw new Error(`Duplicate custom provider name: "${r.name}". Each custom provider must have a unique name.`);r.name in F&&console.warn(`[kodax] Custom provider "${r.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(r.name),n.set(r.name,r),o.set(r.name,()=>We(r))}V.clear(),Bt.clear();for(let[r,s]of n)V.set(r,s);for(let[r,s]of o)Bt.set(r,s)}i(yn,"registerCustomProviders");function ze(t){let e=Bt.get(t);return e?e():void 0}i(ze,"getCustomProvider");function ue(t){return V.has(t)}i(ue,"isCustomProviderName");function Ge(){return[...V.keys()]}i(Ge,"getCustomProviderNames");function bn(){let t=[];for(let[e,n]of V){let o=!!process.env[n.apiKeyEnv],r=(n.models??[]).map(a=>typeof a=="string"?a:a.id),s=n.model&&r.length?[...new Set([n.model,...r])]:[n.model];t.push({name:e,model:n.model,models:s,configured:o,reasoningCapability:n.reasoningCapability??"none",capabilityProfile:$(n.capabilityProfile??Y),custom:!0})}return t}i(bn,"getCustomProviderList");function kn(t){let e=V.get(t);if(!e)return;let n=(e.models??[]).map(o=>typeof o=="string"?o:o.id);return e.model&&n.length?[...new Set([e.model,...n])]:[e.model]}i(kn,"getCustomProviderModels");function vn(t){return typeof t=="string"?{id:t}:t}i(vn,"customDescriptorToFull");function Ve(t){let e=V.get(t);if(!e)return;let n={id:e.model},o=(e.models??[]).map(vn).filter(r=>r.id!==e.model);return[n,...o]}i(Ve,"getCustomProviderModelDescriptors");function le(t,e){let n=V.get(t);if(!n)return;let o=e===n.model,r=o?{id:n.model}:(n.models??[]).map(vn).find(s=>s.id===e);if(r)return{provider:t,model:r.id,displayName:r.displayName??r.id,supportsThinking:n.supportsThinking??!1,reasoningCapability:r.reasoningCapability??n.reasoningCapability??"none",contextWindow:r.contextWindow??n.contextWindow,maxOutputTokens:r.maxOutputTokens??n.maxOutputTokens,thinkingBudgetCap:r.thinkingBudgetCap??n.thinkingBudgetCap,isDefault:o}}i(le,"getCustomModelCapabilities");function He(){let t=[];for(let[e,n]of V){let o=le(e,n.model);o&&t.push(o);for(let r of n.models??[]){let s=typeof r=="string"?r:r.id;if(s===n.model)continue;let a=le(e,s);a&&t.push(a)}}return t}i(He,"listCustomProviderModelCapabilities");var H=new Map,Ko=0;function Lt(t){let e=H.get(t);if(!(!e||e.length===0))return e[e.length-1]}i(Lt,"getActiveRuntimeProviderRegistration");function No(t){for(let[e,n]of H){let o=n.filter(r=>r.id!==t);if(o.length!==n.length){o.length===0?H.delete(e):H.set(e,o);return}}}i(No,"removeRuntimeProviderRegistration");function _n(t,e){let n=t.trim();if(!n)throw new Error("Model provider name cannot be empty.");if(O(n))throw new Error(`Runtime model provider "${n}" conflicts with a built-in provider.`);if(ue(n))throw new Error(`Runtime model provider "${n}" conflicts with an existing config-defined custom provider.`);let o={id:`runtime-provider:${++Ko}`,name:n,factory:e},r=H.get(n)??[];return H.set(n,[...r,o]),()=>{No(o.id)}}i(_n,"registerModelProvider");function Je(t){let e=Lt(t);return e?e.factory():void 0}i(Je,"getRuntimeModelProvider");function Ye(t){return Lt(t)!==void 0}i(Ye,"isRuntimeModelProviderName");function qe(){return Array.from(H.keys()).filter(t=>Lt(t)!==void 0)}i(qe,"getRuntimeModelProviderNames");function Cn(){H.clear()}i(Cn,"clearRuntimeModelProviders");function xn(t){if(O(t))return F[t]();let e=Je(t);if(e)return e;let n=ze(t);if(n)return n;let o=Kt();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}i(xn,"resolveProvider");function Tn(t){return O(t)||Ye(t)||ue(t)}i(Tn,"isKnownProvider");function Kt(){let t=Object.keys(F),e=qe(),n=Ge();return[...new Set([...t,...e,...n])]}i(Kt,"getAvailableProviderNames");function Mn(t){return O(t)?Ue(t):Ve(t)??[]}i(Mn,"resolveProviderModelDescriptors");function En(t,e){return O(t)?je(t,e):le(t,e)}i(En,"resolveModelCapabilities");function Pn(){return[...Xe(),...He()]}i(Pn,"listAllModelCapabilities");var Rn={anthropic:{"claude-opus-4-6":{inputPer1M:15,outputPer1M:75,cachePer1M:1.875},"claude-sonnet-4-6":{inputPer1M:3,outputPer1M:15,cachePer1M:.375},"claude-haiku-4-5":{inputPer1M:.8,outputPer1M:4,cachePer1M:.08}},openai:{"gpt-5.4":{inputPer1M:30,outputPer1M:120},"gpt-5.3-codex-spark":{inputPer1M:10,outputPer1M:40}},deepseek:{"deepseek-v4-flash":{inputPer1M:.14,outputPer1M:.28,cachePer1M:.028},"deepseek-v4-pro":{inputPer1M:1.68,outputPer1M:3.36,cachePer1M:.14}},kimi:{"k2.5":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.6":{inputPer1M:.005,outputPer1M:.015}},"kimi-code":{"kimi-for-coding":{inputPer1M:.005,outputPer1M:.015}},qwen:{"qwen3.5-plus":{inputPer1M:.003,outputPer1M:.006}},zhipu:{"glm-5":{inputPer1M:.05,outputPer1M:.1},"glm-5.1":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03}},"zhipu-coding":{"glm-5":{inputPer1M:.05,outputPer1M:.1},"glm-5.1":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03}},"minimax-coding":{"MiniMax-M2.7":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.7-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.5":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.5-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.1":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.1-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2":{inputPer1M:.01,outputPer1M:.03}},"mimo-coding":{"mimo-v2.5-pro":{inputPer1M:.01,outputPer1M:.03},"mimo-v2.5":{inputPer1M:.01,outputPer1M:.03}},"ark-coding":{"glm-5.1":{inputPer1M:.005,outputPer1M:.015},"glm-4.7":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.6":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.5":{inputPer1M:.005,outputPer1M:.015},"minimax-latest":{inputPer1M:.005,outputPer1M:.015},"deepseek-v3.2":{inputPer1M:.005,outputPer1M:.015},"deepseek-v4-pro":{inputPer1M:.005,outputPer1M:.015},"deepseek-v4-flash":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-code":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-pro":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-lite":{inputPer1M:.005,outputPer1M:.015}},"gemini-cli":{},"codex-cli":{}};function Nt(t,e,n){let o=n?.[t]?.[e];return o||Rn[t]?.[e]}i(Nt,"getCostRate");function Ft(t,e,n,o=0){let r=e/1e6*t.inputPer1M,s=n/1e6*t.outputPer1M,a=t.cachePer1M?o/1e6*t.cachePer1M:0;return r+s+a}i(Ft,"calculateCost");function Fo(){return{records:[],retries:[]}}i(Fo,"createCostTracker");function $o(t,e){let n={timestamp:Date.now(),provider:e.provider,waitMs:e.waitMs,reason:e.reason,source:e.source};return{records:t.records,retries:[...t.retries,n]}}i($o,"recordRetry");function $t(t,e,n){let o=Nt(e.provider,e.model,n),r=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?Ft(o,e.inputTokens,e.outputTokens,r):0,a={timestamp:Date.now(),provider:e.provider,model:e.model,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,cost:s,role:e.role};return{records:[...t.records,a],retries:t.retries}}i($t,"recordUsage");function Uo(t){let e=0,n=0,o=0,r=0,s=0,a=0,c={},d={};for(let u of t.records){e+=u.cost,n+=u.inputTokens,o+=u.outputTokens,r+=u.cacheReadTokens+u.cacheWriteTokens,s+=u.cacheReadTokens,a+=u.cacheWriteTokens;let y=c[u.provider];c[u.provider]={cost:(y?.cost??0)+u.cost,calls:(y?.calls??0)+1,inputTokens:(y?.inputTokens??0)+u.inputTokens,outputTokens:(y?.outputTokens??0)+u.outputTokens};let g=u.role??"default",v=d[g];d[g]={cost:(v?.cost??0)+u.cost,calls:(v?.calls??0)+1,inputTokens:(v?.inputTokens??0)+u.inputTokens,outputTokens:(v?.outputTokens??0)+u.outputTokens}}let p=0;for(let u of t.retries)p+=u.waitMs;let l=r>0?s/r:0;return{totalCost:e,totalInputTokens:n,totalOutputTokens:o,totalCacheTokens:r,totalCacheReadTokens:s,totalCacheWriteTokens:a,cacheHitRate:l,callCount:t.records.length,retryCount:t.retries.length,retryWaitMs:p,byProvider:c,byRole:d}}i(Uo,"getSummary");function Qe(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}i(Qe,"formatCost");function jo(t){let e=[];if(e.push(`Session Cost: ${Qe(t.totalCost)} (${t.callCount} calls)`),e.push(`Tokens: ${t.totalInputTokens.toLocaleString()} in / ${t.totalOutputTokens.toLocaleString()} out`),t.totalCacheTokens>0){let r=(t.cacheHitRate*100).toFixed(0);e.push(`Cache: ${t.totalCacheTokens.toLocaleString()} tokens (${t.totalCacheReadTokens.toLocaleString()} read / ${t.totalCacheWriteTokens.toLocaleString()} write, ${r}% hit rate)`)}if(t.retryCount>0){let r=(t.retryWaitMs/1e3).toFixed(1);e.push(`Retries: ${t.retryCount} (${r}s total wait)`)}e.push("");let n=Object.entries(t.byProvider).sort((r,s)=>s[1].cost-r[1].cost);if(n.length>0){e.push("By Provider:");for(let[r,s]of n)e.push(` ${r}: ${Qe(s.cost)} (${s.calls} calls, ${s.inputTokens.toLocaleString()} in / ${s.outputTokens.toLocaleString()} out)`);e.push("")}let o=Object.entries(t.byRole).sort((r,s)=>s[1].cost-r[1].cost);if(o.length>1){e.push("By Role:");for(let[r,s]of o)e.push(` ${r}: ${Qe(s.cost)} (${s.calls} calls)`)}return e.join(`
31
+ `)}i(jo,"formatCostReport");var wn={inputTokens:0,outputTokens:0,totalTokens:0},Xo=3e4;async function Wo(t){let e=new AbortController,n=t.timeoutMs??Xo,o,r=i(c=>{o||(o=c),e.abort()},"recordAbort"),s=setTimeout(()=>r("timeout"),n),a=i(()=>r("parent"),"onParentAbort");t.abortSignal&&(t.abortSignal.aborted?r("parent"):t.abortSignal.addEventListener("abort",a,{once:!0}));try{let c=await t.provider.stream([...t.messages],[],t.system,t.reasoning??{mode:"off"},{modelOverride:t.model},e.signal),d=c.usage??wn,p=c.textBlocks??[],l=c.toolBlocks??[],u=p.map(g=>g.text).join("");if(l.length>0)return{text:u,usage:d,costTracker:t.costTracker,stopReason:"error",error:new Error(`sideQuery: provider returned ${l.length} tool_use block(s); sideQuery expects text-only output`)};let y=t.costTracker;return y&&(y=$t(y,{provider:t.provider.name,model:t.model,inputTokens:d.inputTokens,outputTokens:d.outputTokens,cacheReadTokens:d.cachedReadTokens,cacheWriteTokens:d.cachedWriteTokens,role:t.querySource})),{text:u,usage:d,costTracker:y,stopReason:zo(c.stopReason)}}catch(c){let d=c instanceof Error?c:new Error(String(c)),p="error";return e.signal.aborted&&(p=o==="timeout"?"timeout":"aborted"),{text:"",usage:wn,costTracker:t.costTracker,stopReason:p,error:d}}finally{clearTimeout(s),t.abortSignal&&t.abortSignal.removeEventListener("abort",a)}}i(Wo,"sideQuery");function zo(t){return t==="max_tokens"?"max_tokens":"end_turn"}i(zo,"mapStopReason");export{G as a,w as b,me as c,Ze as d,et as e,tt as f,An as g,Sn as h,On as i,Dn as j,Ut as k,jt as l,nt as m,Q as n,Ce as o,Xt as p,Z as q,ee as r,ot as s,at as t,ct as u,te as v,Te as w,ut as x,Fn as y,Me as z,Ee as A,Pe as B,z as C,ne as D,dt as E,oe as F,pt as G,he as H,L as I,N as J,se as K,ae as L,ye as M,be as N,K as O,F as P,St as Q,un as R,dn as S,pn as T,fn as U,mn as V,gn as W,hn as X,O as Y,Ue as Z,je as _,Xe as $,ve as aa,We as ba,yn as ca,ze as da,ue as ea,Ge as fa,bn as ga,kn as ha,Ve as ia,le as ja,He as ka,_n as la,Je as ma,Ye as na,qe as oa,Cn as pa,xn as qa,Tn as ra,Kt as sa,Mn as ta,En as ua,Pn as va,Rn as wa,Nt as xa,Ft as ya,Fo as za,$o as Aa,$t as Ba,Uo as Ca,Qe as Da,jo as Ea,Wo as Fa};