@kodax-ai/kodax 0.7.49 → 0.7.50

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 (43) hide show
  1. package/CHANGELOG.md +35 -3
  2. package/README.md +11 -8
  3. package/README_CN.md +10 -8
  4. package/dist/chunks/argument-completer-3WX5B42G.js +2 -0
  5. package/dist/chunks/chunk-5UJQ2GKJ.js +574 -0
  6. package/dist/chunks/{chunk-TYZAH3YP.js → chunk-HR64F32V.js} +1 -1
  7. package/dist/chunks/{chunk-67SWUEEN.js → chunk-MFOMFMSK.js} +318 -297
  8. package/dist/chunks/{chunk-YW4RQV7U.js → chunk-SK4HOYT2.js} +1 -1
  9. package/dist/chunks/chunk-UB5IAZHF.js +476 -0
  10. package/dist/chunks/chunk-XZY4CIDV.js +31 -0
  11. package/dist/chunks/chunk-YJLRBIEW.js +301 -0
  12. package/dist/chunks/{compaction-config-BQBYOWX2.js → compaction-config-DDJSQ4OT.js} +1 -1
  13. package/dist/chunks/{construction-bootstrap-5TFGMSWQ.js → construction-bootstrap-4QNM2BVM.js} +1 -1
  14. package/dist/chunks/{dist-BL7IBQHD.js → dist-OJSNNI7P.js} +1 -1
  15. package/dist/chunks/dist-T256OSDI.js +2 -0
  16. package/dist/chunks/{utils-XWDT3W5X.js → utils-JHIEOX6Z.js} +1 -1
  17. package/dist/index.d.ts +6 -6
  18. package/dist/index.js +2 -2
  19. package/dist/kodax_cli.js +967 -886
  20. package/dist/sdk-agent.d.ts +14 -6
  21. package/dist/sdk-agent.js +1 -1
  22. package/dist/sdk-coding.d.ts +138 -28
  23. package/dist/sdk-coding.js +1 -1
  24. package/dist/sdk-llm.d.ts +1 -1
  25. package/dist/sdk-llm.js +1 -1
  26. package/dist/sdk-mcp.js +1 -1
  27. package/dist/sdk-repl.d.ts +29 -7
  28. package/dist/sdk-repl.js +2 -2
  29. package/dist/sdk-session.d.ts +27 -3
  30. package/dist/sdk-session.js +1 -1
  31. package/dist/sdk-skills.js +1 -1
  32. package/dist/types-chunks/{bash-prefix-extractor.d-CI_xcPhn.d.ts → bash-prefix-extractor.d-B0CIb0N3.d.ts} +72 -19
  33. package/dist/types-chunks/{capsule.d-DaPuhyyK.d.ts → capsule.d-CwBEm6M-.d.ts} +4 -1
  34. package/dist/types-chunks/{types.d-BR9oNWup.d.ts → process.d-BbiXD24v.d.ts} +142 -3
  35. package/dist/types-chunks/{resolver.d-B_wm409c.d.ts → resolver.d-CQfaJbht.d.ts} +22 -4
  36. package/dist/types-chunks/{utils.d-BJ_-y8gC.d.ts → utils.d-D_-jrRku.d.ts} +3 -1
  37. package/package.json +1 -1
  38. package/dist/chunks/argument-completer-GDG5OHN7.js +0 -2
  39. package/dist/chunks/chunk-C5PKZX5Z.js +0 -291
  40. package/dist/chunks/chunk-ISGHUKRY.js +0 -428
  41. package/dist/chunks/chunk-JTHMWRXM.js +0 -566
  42. package/dist/chunks/chunk-YACQ4OST.js +0 -31
  43. package/dist/chunks/dist-D7HOETCE.js +0 -2
@@ -0,0 +1,31 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{a as r}from"./chunk-V4WSBIXB.js";var Y=class extends Error{static{r(this,"KodaXError")}code;constructor(e,o="KODAX_ERROR"){super(e),this.code=o,this.name="KodaXError"}},R=class extends Y{static{r(this,"KodaXProviderError")}provider;constructor(e,o){super(e,"PROVIDER_ERROR"),this.provider=o,this.name="KodaXProviderError"}},ke=class extends Y{static{r(this,"KodaXRateLimitError")}retryAfter;constructor(e,o){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=o,this.name="KodaXRateLimitError"}},pt=class extends Y{static{r(this,"KodaXNetworkError")}isTimeout;constructor(e,o=!1){super(e,"NETWORK_ERROR"),this.isTimeout=o,this.name="KodaXNetworkError"}},ft=class extends Y{static{r(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var mt=32768,tn=32e3,on=64e3,nn=.5;var rn=["off","auto","quick","balanced","deep"],io={low:6e3,medium:1e4,high:2e4},ro=4096;function gt(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}r(gt,"getReasoningCapability");function ne(t){return Re(t).enabled}r(ne,"isReasoningEnabled");function Re(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",o=t?.depth??so(e),n=t?.enabled??(e!=="off"&&o!=="off");return{enabled:n&&e!=="off"&&o!=="off",mode:e,depth:n?o:"off",taskType:t?.taskType??"unknown",executionMode:t?.executionMode??"implementation"}}r(Re,"normalizeReasoningRequest");function so(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}r(so,"getDefaultThinkingDepthForMode");function ie(t,e,o="unknown"){if(e==="off")return 0;let n={...io,...t.defaultThinkingBudgets??{}},s=t.taskBudgetOverrides?.[o]?.[e]??n[e];return t.thinkingBudgetCap?Math.min(s,t.thinkingBudgetCap):s}r(ie,"resolveThinkingBudget");function re(t,e,o=ro){let n=Math.max(1024,e-o);return Math.max(1024,Math.min(t,n))}r(re,"clampThinkingBudget");function ht(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}r(ht,"mapDepthToOpenAIReasoningEffort");import Ae from"fs";import sn from"os";import kt from"path";var yt=null;function an(t){return t==="budget"||t==="effort"||t==="toggle"||t==="none"}r(an,"isReasoningOverride");function cn(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(an)}r(cn,"isStoredConfig");function ln(){return process.env.KODAX_HOME??kt.join(sn.homedir(),".kodax")}r(ln,"getKodaxDir");function ao(){return process.env.KODAX_CONFIG_FILE??kt.join(ln(),"config.json")}r(ao,"getConfigFilePath");function vt(t,e){return yt={filePath:t,config:e},e}r(vt,"updateStoredConfigCache");function un(t){let e=JSON.parse(Ae.readFileSync(t,"utf-8"));return cn(e)?e:{}}r(un,"readStoredConfigFromDisk");function bt(t){switch(t){case"native-budget":return"budget";case"native-effort":return"effort";case"native-toggle":return"toggle";case"none":return"none";default:return}}r(bt,"reasoningCapabilityToOverride");function _t(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}r(_t,"reasoningOverrideToCapability");function se(t,e,o){return[t,e.baseUrl??"",o??e.model].join("|")}r(se,"buildReasoningOverrideKey");function Ct(){let t=ao();if(yt?.filePath===t)return yt.config;try{if(Ae.existsSync(t))return vt(t,un(t))}catch{}return vt(t,{})}r(Ct,"loadStoredConfig");function co(t){let e=ao();try{Ae.mkdirSync(kt.dirname(e),{recursive:!0}),Ae.writeFileSync(e,JSON.stringify(t,null,2)),vt(e,t)}catch(o){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",o)}}r(co,"saveStoredConfig");function Oe(t,e,o){let n=Ct(),i=se(t,e,o);return n.providerReasoningOverrides?.[i]}r(Oe,"loadReasoningOverride");function xt(t,e,o,n){let i=Ct(),s=se(t,e,n);i.providerReasoningOverrides={...i.providerReasoningOverrides??{},[s]:o},co(i)}r(xt,"saveReasoningOverride");function dn(t,e,o){let n=Ct(),i=se(t,e,o);if(!n.providerReasoningOverrides?.[i])return;let s={...n.providerReasoningOverrides};delete s[i],n.providerReasoningOverrides=Object.keys(s).length>0?s:void 0,co(n)}r(dn,"clearReasoningOverride");function lo(t,e){if(!t)return;if(typeof t.get=="function")return t.get(e)??void 0;let o=t,n=e.toLowerCase(),i=o[e]??o[n]??o[n.replace(/\b\w/g,s=>s.toUpperCase())];if(i!==void 0)return Array.isArray(i)?i[0]:i}r(lo,"readHeader");function uo(t){if(!t)return;let e=t.trim();if(e.length===0)return;let o=Number(e);if(!(!Number.isFinite(o)||o<=0))return o}r(uo,"parsePositiveNumber");function pn(t,e){if(!t)return;let o=t.trim();if(o.length===0)return;let n=Date.parse(o);if(!Number.isFinite(n))return;let i=n-e;return i>0?i:void 0}r(pn,"parseHttpDate");function De(t,e){let o=e.baseBackoffMs??1e3,n=e.maxBackoffMs??3e4,i=e.maxHeaderWaitMs??12e4,s=e.now?e.now():Date.now(),a=uo(lo(t,"retry-after-ms"));if(a!==void 0){let y=Math.min(a,i);return{type:"header",waitMs:Math.round(y),source:"retry-after-ms",cappedFromHeader:y!==a}}let c=lo(t,"retry-after");if(c!==void 0&&c.trim().length>0){let y=uo(c);if(y!==void 0){let b=y*1e3,d=Math.min(b,i);return{type:"header",waitMs:Math.round(d),source:"retry-after-seconds",cappedFromHeader:d!==b}}let h=pn(c,s);if(h!==void 0){let b=Math.min(h,i);return{type:"header",waitMs:Math.round(b),source:"retry-after-date",cappedFromHeader:b!==h}}}let u=o*Math.pow(2,Math.max(0,e.attempt)),p=Math.min(u,n),f=e.withJitter!==!1?Math.random()*.25*p:0;return{type:"backoff",waitMs:Math.round(p+f),source:"exponential-backoff",attempt:e.attempt}}r(De,"parseRetryAfter");function Ie(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}r(Ie,"extractHeadersFromError");var te={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},po={...te,multimodalSupport:"image-input"},be={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},fo={...be,multimodalSupport:"image-input"};function Le(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"}}r(Le,"normalizeCapabilityProfile");function W(t){return{...Le(t)}}r(W,"cloneCapabilityProfile");function fn(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}r(fn,"parseEnvInt");function Ne(){return new DOMException("Request aborted","AbortError")}r(Ne,"abortError");function mn(t,e){return t<=0?Promise.resolve():e?.aborted?Promise.reject(Ne()):new Promise((o,n)=>{let i,s=r(()=>{e&&e.removeEventListener("abort",a)},"cleanup"),a=r(()=>{i&&clearTimeout(i),s(),n(Ne())},"onAbort");e&&e.addEventListener("abort",a,{once:!0}),i=setTimeout(()=>{s(),o()},t)})}r(mn,"waitForRetryDelay");var G=class{static{r(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let o=fn(process.env.KODAX_MAX_OUTPUT_TOKENS);if(o!==void 0)return o;let n=this.getModelDescriptor(e)?.maxOutputTokens;return n!==void 0?n:this.config.maxOutputTokens??32768}getStreamMaxDurationMs(e){let o=this.getModelDescriptor(e)?.streamMaxDurationMs;return o!==void 0?o:this.config.streamMaxDurationMs}getEffectiveReplayReasoningContent(e){let o=this.getModelDescriptor(e)?.replayReasoningContent;return o!==void 0?o:this.config.replayReasoningContent??!1}getEffectiveStrictThinkingSignature(e){let o=this.getModelDescriptor(e)?.strictThinkingSignature;return o!==void 0?o:this.config.strictThinkingSignature??!1}supportsNonStreamingFallback(){return!1}async complete(e,o,n,i,s,a){throw new R(`${this.name} does not support non-streaming fallback`)}isConfigured(){return!!process.env[this.config.apiKeyEnv]}async verifyCredential(e){return{ok:!1,error:"unsupported",strategy:this.config.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:`Provider class "${this.name}" does not implement verifyCredential()`}}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){let o=e??this.config.model,n=this.config.models?.find(i=>i.id===o);if(n)return n;if(o===this.config.model)return{id:this.config.model}}getBaseUrl(){return this.config.baseUrl}getApiKeyEnv(){return this.config.apiKeyEnv}getCapabilityProfile(){return W(this.config.capabilityProfile??te)}getConfiguredReasoningCapability(e){let o=this.getModelDescriptor(e);return o?.reasoningCapability?o.reasoningCapability:gt(this.config)}getReasoningCapability(e){let o=Oe(this.name,this.config,e);return o?_t(o):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return Oe(this.name,this.config,e)}getReasoningOverrideKey(e){return se(this.name,this.config,e)}persistReasoningCapabilityOverride(e,o){let n=bt(e);n&&xt(this.name,this.config,n,o)}shouldFallbackForReasoningError(e,...o){let n=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase(),s=o.map(c=>c.toLowerCase()).some(c=>n.includes(c)),a=n.includes("parameter")||s;return n.includes("unknown parameter")||n.includes("invalid parameter")||n.includes("unsupported")&&a}shouldFallbackForSpecificReasoningError(e,...o){let n=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return o.map(a=>a.toLowerCase()).some(a=>n.includes(a))?n.includes("unknown parameter")||n.includes("invalid parameter")||n.includes("unsupported"):!1}shouldFallbackForForcedToolChoiceError(e){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return o.includes("tool_choice")||o.includes("tool choice")||o.includes("toolchoice")?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 o=this.getModelDescriptor(e)?.contextWindow;return o!==void 0?o: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 Re(e)}onStaleConnection(){}isRateLimitError(e){if(!(e instanceof Error))return!1;let o=e.message.toLowerCase();return["rate","limit","\u901F\u7387","\u9891\u7387","1302","429","too many","overload","overwhelmed","503","529","busy"].some(n=>o.includes(n))}classifyRateLimitReason(e){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return o.includes("overload")||o.includes("overwhelmed")||o.includes("503")||o.includes("529")||o.includes("busy")?"overloaded":"rate-limit"}extractRetryAfterMs(e){let o=Ie(e);if(!o)return;let n=De(o,{attempt:0,withJitter:!1});return n.type==="header"?n.waitMs:void 0}parseContextOverflow(e){let o=String(e?.message??""),n=[/(\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 i of n){let s=o.match(i);if(s){let a=Number(s[1].replace(/,/g,"")),c=Number(s[2].replace(/,/g,"")),u=Math.min(a,c),p=Math.max(a,c);return Math.max(3e3,p-u-1e3)}}}isContextOverflowError(e){let o=String(e?.message??"").toLowerCase();return o.includes("prompt is too long")||o.includes("prompt too long")||o.includes("context length")||o.includes("context_length_exceeded")||o.includes("context window")||o.includes("\u4E0A\u4E0B\u6587\u957F\u5EA6")}async withRateLimit(e,o,n=3,i,s){for(let a=0;a<n;a++)try{let c=await e();return this.maxOutputTokensOverride=void 0,c}catch(c){if(this.isContextOverflowError(c)&&!this.maxOutputTokensOverride){let u=this.parseContextOverflow(c);if(u){this.maxOutputTokensOverride=u,i?.(a+1,n,0);continue}}if(this.isRateLimitError(c)){if(a===n-1)throw new ke(`API rate limit exceeded after ${n} retries. Please wait and try again later.`,6e4);let u=Ie(c)??{},p=De(u,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),l=p.waitMs,f=this.classifyRateLimitReason(c);if(s?.({provider:this.name,waitMs:l,reason:f,source:p.source,attempt:a+1,maxAttempts:n}),i?i(a+1,n,l):s||console.log(`[Rate Limit] Retrying in ${l/1e3}s (${a+1}/${n})...`),o?.aborted||(await mn(l,o),o?.aborted))throw Ne();continue}if(c instanceof Error){if((c.name==="AbortError"||c.name==="APIUserAbortError")&&o?.aborted)throw c.name==="AbortError"?c:new DOMException(c.message||"Request aborted","AbortError");let u=c?.cause?.code??c?.code??"";throw(u==="ECONNRESET"||u==="EPIPE")&&this.onStaleConnection(),new R(`${this.name} API error: ${c.message}`,this.name)}throw c}throw new Y("Unexpected end of withRateLimit")}};import bn from"@anthropic-ai/sdk";import{parse as gn}from"partial-json";function ae(t){if(!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{}try{let e=gn(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{}}}r(ae,"parseToolInputWithSalvage");async function ce(t){if(t.strategy==="unsupported")return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:"Provider does not support credential verification"};let e=t.runners.find(p=>p.strategy===t.strategy);if(!e)return{ok:!1,error:"unsupported",strategy:t.strategy,durationMs:0,approxTokensSpent:0,message:`verifyStrategy="${t.strategy}" is not implemented for this provider's base class`};if(t.signal?.aborted)return{ok:!1,error:"unknown",strategy:t.strategy,durationMs:0,approxTokensSpent:0,message:"caller aborted before verifyCredential started"};let o=new AbortController,n=t.timeoutMs??8e3,i,s=r(p=>{i||(i=p),o.abort()},"recordAbort"),a=setTimeout(()=>s("timeout"),n),c=r(()=>s("parent"),"onParentAbort");t.signal&&t.signal.addEventListener("abort",c,{once:!0});let u=Date.now();try{return await e.run(o.signal),{ok:!0,strategy:t.strategy,durationMs:Date.now()-u,approxTokensSpent:e.approxTokensSpent}}catch(p){return Tt(p,{strategy:t.strategy,durationMs:Date.now()-u,approxTokensSpent:0,abortCause:i,providerName:t.providerName})}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",c)}}r(ce,"runVerifyCredential");function hn(t){return t.replace(/\bsk-[A-Za-z0-9_-]{6,}/g,"sk-***")}r(hn,"redactKeyMaterial");function Tt(t,e){let o=t,n=o.status??o.statusCode??o.response?.status,i=hn(String(o.message??t)).slice(0,240),s=o.cause?.code??o.code,a=o.constructor?.name??"",c;return e.abortCause==="timeout"?c="timeout":e.abortCause==="parent"?c="unknown":a==="AuthenticationError"||a==="PermissionDeniedError"||n===401||n===403?c="unauthorized":n===429?c="rate_limited":n===400&&e.strategy==="count-tokens"&&e.providerName==="kimi-code"?c="unauthorized":n!==void 0&&n>=500&&n<600?c="server_error":s!==void 0&&/ENOTFOUND|ECONNREFUSED|ECONNRESET|EAI_AGAIN|EPIPE|ETIMEDOUT|ENETUNREACH|ENETDOWN|EHOSTUNREACH/i.test(s)?c="network":/timeout/i.test(i)?c="timeout":c="unknown",{ok:!1,error:c,status:n,message:i,durationMs:e.durationMs,approxTokensSpent:e.approxTokensSpent,strategy:e.strategy}}r(Tt,"classifyVerifyError");function Et(t,e){let o=t[t.length-1];if(o&&le(o)&&o.hint===e)return t;let n=e?{type:"cache-boundary",hint:e}:{type:"cache-boundary"};return[...t,n]}r(Et,"insertCacheBoundary");function le(t){if(typeof t!="object"||t===null||t.type!=="cache-boundary")return!1;let e=Object.keys(t);return e.length<=2&&e.every(o=>o==="type"||o==="hint")}r(le,"isCacheBoundary");function wt(t,e){let o=[];for(let n of t){if(le(n)){if(e==="attach"&&o.length>0){let i=o[o.length-1];o[o.length-1]={...i,cache_control:{type:"ephemeral"}}}continue}o.push(n)}return o}r(wt,"lowerCacheBoundaries");function _e(t){return t.filter(e=>!le(e))}r(_e,"stripCacheBoundaries");import{readFile as yn}from"node:fs/promises";import vn from"node:path";var kn={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function Be(t,e){return e??kn[vn.extname(t).toLowerCase()]??"image/png"}r(Be,"resolveImageMediaType");async function Fe(t){return(await yn(t)).toString("base64")}r(Fe,"readImageFileAsBase64");async function mo(t,e){let o=Be(t,e),n=await Fe(t);return`data:${o};base64,${n}`}r(mo,"buildImageDataUrl");var _n="KodaX";function Cn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":_n}}r(Cn,"getAnthropicCompatDefaultHeaders");function Mt(t,e){if(!t)return e;let o=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,n=typeof t.input_tokens=="number"?t.input_tokens:o?0:e?.inputTokens??0,i=typeof t.cache_creation_input_tokens=="number"?t.cache_creation_input_tokens:o?0:e?.cachedWriteTokens??0,s=typeof t.cache_read_input_tokens=="number"?t.cache_read_input_tokens:o?0:e?.cachedReadTokens??0,a=typeof t.output_tokens=="number"?t.output_tokens:e?.outputTokens??0,c=o?n+i+s:e?.inputTokens??0;if(![c,a].some(u=>!Number.isFinite(u)||u<0))return{inputTokens:c,outputTokens:a,totalTokens:c+a,cachedReadTokens:s||void 0,cachedWriteTokens:i||void 0}}r(Mt,"normalizeAnthropicUsage");var I=class extends G{static{r(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;_client;get client(){return this._client??=this.buildClient()}set client(e){this._client=e}buildClient(){let e=Cn(this.config);return new bn({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this._client=void 0}async verifyCredential(e){let o=this.config.model,n=this.client,i=[{strategy:"count-tokens",approxTokensSpent:0,run:r(async s=>{await n.messages.countTokens({model:o,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")},{strategy:"models-list",approxTokensSpent:0,run:r(async s=>{await n.models.list({},{signal:s})},"run")},{strategy:"minimal-message",approxTokensSpent:7,run:r(async s=>{await n.messages.create({model:o,max_tokens:1,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")}];return ce({strategy:this.config.verifyStrategy??"count-tokens",runners:i,timeoutMs:e?.timeoutMs,signal:e?.signal,providerName:this.name})}applyCacheControlToSystem(e){if(!e.trim()||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let o=Et([{type:"text",text:e}],"system");return wt(o,"attach")}applyCacheControlToTools(e){if(e.length===0||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let o=e.slice(),n=o[o.length-1];return o[o.length-1]={...n,cache_control:{type:"ephemeral"}},o}async stream(e,o,n,i,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(i),u=s?.modelOverride??this.config.model,p=s?.maxOutputTokensOverride??this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),f=c.enabled?this.getReasoningCapability(u):"none",y=c.enabled?this.getReasoningFallbackChain(f).filter(g=>g==="native-budget"||g==="native-toggle"||g==="none"):["none"],h=!!s?.forcedToolName,b=r(g=>{let P={model:u,max_tokens:p,system:this.applyCacheControlToSystem(this.buildSystemPrompt(n,e)),messages:l,tools:this.applyCacheControlToTools(o),stream:!0};if(s?.forcedToolName&&h&&(P.tool_choice={type:"tool",name:s.forcedToolName}),g==="native-budget"){let S=ie(this.config,c.depth,c.taskType);P.thinking={type:"enabled",budget_tokens:re(S,p)}}else g==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let d=[],v=[],k=[],x,_=null,m="",T="",M="",N="",L="",j="",B="",q=!1,w,D=Date.now(),V=Date.now(),Z,Se;for(let g of y){for(;!Z;)try{Z=await this.client.messages.create(b(g),a?{signal:a}:{}),g!==f&&this.persistReasoningCapabilityOverride(g,u)}catch(P){if(Se=P,h&&this.shouldFallbackForForcedToolChoiceError(P)){h=!1,this.logStreamDiagnostic(`[${this.name}] upstream rejected forced tool_choice; retrying without forced tool choice`);continue}let S=g==="native-budget"?["budget_tokens","thinking"]:g==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...S))throw P;break}if(Z)break}if(!Z)throw Se??new R("All reasoning capability attempts failed without a captured error",this.name);let ye=Date.now(),ve=0,E=0,F=3e4;for await(let g of Z){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let P=Date.now(),S=P-ye;if(S>F&&(ve++,E+=S,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(S/1e3)}s gap before ${g.type}`,{stallCount:ve,totalStallMs:E,eventType:g.type})),ye=P,g.type==="content_block_start"||g.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),g.type==="content_block_start"){D=Date.now();let C=g.content_block;_=C.type,process.env.KODAX_DEBUG_TOOL_STREAM&&C.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:C.type,id:C.id,name:C.name}),C.type==="thinking"?(T="",M=C.signature??""):C.type==="redacted_thinking"?(_="redacted_thinking",N=C.data??""):C.type==="text"?m="":C.type==="tool_use"&&(L=C.id,j=C.name,B="")}else if(g.type==="content_block_delta"){D=Date.now();let C=g.delta;C.type==="thinking_delta"?(T+=C.thinking??"",s?.onThinkingDelta?.(C.thinking??"")):C.type==="text_delta"?(m+=C.text??"",s?.onTextDelta?.(C.text??"")):C.type==="input_json_delta"&&(B+=C.partial_json??"",s?.onToolInputDelta?.(j,C.partial_json??"",L?{toolId:L}:void 0))}else if(g.type==="content_block_stop")D=Date.now(),_==="thinking"?T&&(k.push({type:"thinking",thinking:T,signature:M}),s?.onThinkingEnd?.(T)):_==="redacted_thinking"?(N&&k.push({type:"redacted_thinking",data:N}),N=""):_==="text"?m&&d.push({type:"text",text:m}):_==="tool_use"&&(!L||!j?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify(L),name:JSON.stringify(j),input:B.slice(0,100)}):v.push({type:"tool_use",id:L,name:j,input:ae(B)})),_=null;else if(g.type==="message_stop"){if(q=!0,D=Date.now(),process.env.KODAX_DEBUG_STREAM){let C=Date.now()-V;this.logStreamDiagnostic(`[Stream] message_stop received after ${C}ms`)}}else if(g.type==="message_delta"){D=Date.now(),x=Mt(g.usage,x);let C=g.delta;C?.stop_reason&&(w=C.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${w}`))}else g.type==="message_start"&&(D=Date.now(),x=Mt(g.message?.usage,x),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!q){let g=Date.now()-V,P=Date.now()-D;if(a?.aborted){let C=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:g,lastEventAge:P,reason:C,textBlocks:d.length,toolBlocks:v.length,thinkingBlocks:k.length}),new DOMException(C,"AbortError")}let S=new Error(`Stream incomplete: message_stop event not received. Duration: ${g}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:g,lastEventAge:P,textBlocks:d.length,toolBlocks:v.length,thinkingBlocks:k.length}),S}return{textBlocks:d,toolBlocks:v,thinkingBlocks:k,usage:x,stopReason:w}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,o,n,i,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(i),u=s?.modelOverride??this.config.model,p=s?.maxOutputTokensOverride??this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),f=c.enabled?this.getReasoningCapability(u):"none",y=c.enabled?this.getReasoningFallbackChain(f).filter(m=>m==="native-budget"||m==="native-toggle"||m==="none"):["none"],h=!!s?.forcedToolName,b=r(m=>{let T={model:u,max_tokens:p,system:this.applyCacheControlToSystem(this.buildSystemPrompt(n,e)),messages:l,tools:this.applyCacheControlToTools(o)};if(s?.forcedToolName&&h&&(T.tool_choice={type:"tool",name:s.forcedToolName}),m==="native-budget"){let M=ie(this.config,c.depth,c.taskType);T.thinking={type:"enabled",budget_tokens:re(M,p)}}else m==="native-toggle"&&(T.thinking={type:"enabled"});return T},"buildRequest"),d,v;for(let m of y){for(;!d;)try{d=await this.client.messages.create(b(m),a?{signal:a}:{}),m!==f&&this.persistReasoningCapabilityOverride(m,u)}catch(T){if(v=T,h&&this.shouldFallbackForForcedToolChoiceError(T)){h=!1,this.logStreamDiagnostic(`[${this.name}] upstream rejected forced tool_choice; retrying without forced tool choice`);continue}let M=m==="native-budget"?["budget_tokens","thinking"]:m==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(T,...M))throw T;break}if(d)break}if(!d)throw v??new R("All reasoning capability attempts failed without a captured error",this.name);let k=[],x=[],_=[];for(let m of d.content)m.type==="text"?(k.push({type:"text",text:m.text}),s?.onTextDelta?.(m.text)):m.type==="thinking"?(_.push({type:"thinking",thinking:m.thinking,signature:m.signature??""}),s?.onThinkingDelta?.(m.thinking),s?.onThinkingEnd?.(m.thinking)):m.type==="redacted_thinking"?_.push({type:"redacted_thinking",data:m.data}):m.type==="tool_use"&&x.push({type:"tool_use",id:m.id,name:m.name,input:typeof m.input=="object"&&m.input!==null?m.input:{}});return{textBlocks:k,toolBlocks:x,thinkingBlocks:_,usage:Mt(d.usage),stopReason:d.stop_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}serializeSystemMessageContent(e){if(typeof e=="string")return e.trim();for(let o of e)if(le(o))throw new R("cache-boundary marker reached system message serialization unlowered. Provider base class lowering must run before any wire-level serialization.",this.name);return e.filter(o=>o.type==="text").map(o=>o.text.trim()).filter(Boolean).join(`
3
+ `)}buildSystemPrompt(e,o){let n=o.filter(i=>i.role==="system").map(i=>this.serializeSystemMessageContent(i.content)).filter(Boolean);return[e,...n].filter(i=>typeof i=="string"&&i.trim().length>0).join(`
4
+
5
+ `)}async convertMessages(e,o){let n=[],i=this.getEffectiveStrictThinkingSignature(o);for(let s of e.filter(a=>a.role!=="system")){let a=s.role==="user"?"user":"assistant";if(typeof s.content=="string"){n.push({role:a,content:s.content});continue}let c=[],u=[];for(let l of s.content)l.type==="thinking"?!i||typeof l.signature=="string"&&l.signature.length>0?c.push({type:"thinking",thinking:l.thinking,signature:l.signature??""}):l.thinking&&u.push(l.thinking):l.type==="redacted_thinking"&&(i||c.push({type:"redacted_thinking",data:l.data}));u.length>0&&s.role==="assistant"&&c.push({type:"text",text:`<prior_reasoning>
6
+ ${u.join(`
7
+
8
+ `)}
9
+ </prior_reasoning>`});for(let l of s.content)if(l.type==="tool_result"&&s.role==="user"){let f;if(typeof l.content=="string")f=l.content;else{let y=[];for(let h of l.content)h.type==="text"?y.push({type:"text",text:h.text}):h.type==="image"&&y.push({type:"image",source:{type:"base64",media_type:Be(h.path,h.mediaType),data:await Fe(h.path)}});f=y}c.push({type:"tool_result",tool_use_id:l.tool_use_id,content:f,...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:Be(l.path,l.mediaType),data:await Fe(l.path)}});if(a==="assistant"&&this.config.supportsThinking&&!i){let l=c.some(y=>y.type==="tool_use"),f=c.some(y=>y.type==="thinking"||y.type==="redacted_thinking");l&&!f&&c.unshift({type:"thinking",thinking:"...",signature:""})}let p=c.length===0||a==="assistant"&&c.every(l=>{let f=l;return f.type==="thinking"&&!f.thinking||f.type==="text"&&!f.text});n.push({role:s.role,content:p?[{type:"text",text:"..."}]:c})}return n}};import xn from"openai";var Tn="KodaX";function En(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Tn}}r(En,"getOpenAICompatDefaultHeaders");function go(t){if(!t)return;let e=typeof t.prompt_tokens=="number"?t.prompt_tokens:0,o=typeof t.completion_tokens=="number"?t.completion_tokens:0,n=typeof t.total_tokens=="number"?t.total_tokens:e+o;if([e,o,n].some(s=>!Number.isFinite(s)||s<0)||n<e||n<o)return;let i=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:o,totalTokens:n,...i!==void 0?{cachedReadTokens:i}:{}}}r(go,"normalizeOpenAIUsage");function wn(t){return t?t.type==="function"&&"function"in t:!1}r(wn,"isOpenAIFunctionToolCall");function Mn(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return"";let o=Reflect.get(e,"text");if(typeof o=="string")return o;if(o&&typeof o=="object"){let n=Reflect.get(o,"value");return typeof n=="string"?n:""}return""}).filter(Boolean).join(""):""}r(Mn,"extractOpenAIMessageText");function Pn(t){if(!t||typeof t!="object")return"";let e=Reflect.get(t,"reasoning_content");return typeof e=="string"?e:Array.isArray(e)?e.map(o=>typeof o=="string"?o:o&&typeof o=="object"&&"text"in o&&typeof o.text=="string"?o.text:"").join(""):""}r(Pn,"extractOpenAIMessageReasoning");var K=class extends G{static{r(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;_client;get client(){return this._client??=this.buildClient()}set client(e){this._client=e}buildClient(){let e=En(this.config);return new xn({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this._client=void 0}async verifyCredential(e){let o=this.config.model,n=this.client,i=[{strategy:"models-list",approxTokensSpent:0,run:r(async s=>{await n.models.list({signal:s})},"run")},{strategy:"minimal-message",approxTokensSpent:6,run:r(async s=>{await n.chat.completions.create({model:o,max_tokens:1,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")}];return ce({strategy:this.config.verifyStrategy??"models-list",runners:i,timeoutMs:e?.timeoutMs,signal:e?.signal,providerName:this.name})}stripCacheBoundariesFromMessages(e){return e.map(o=>{if(typeof o.content=="string")return o;let n=_e(o.content);return n.length===o.content.length?o:{...o,content:n}})}normalizeSystemForWire(e,o){let n=[];e&&e.trim().length>0&&n.push(e);let i=[];for(let s of o){if(s.role!=="system"){i.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&&n.push(a)}return{system:n.join(`
11
+
12
+ `),rest:i}}appendExtraBody(e,o){let n=typeof e.extra_body=="object"&&e.extra_body!==null?e.extra_body:{};e.extra_body={...n,...o}}resetReasoningCapabilityParams(e){delete e.reasoning_effort,delete e.thinking;let o=typeof e.extra_body=="object"&&e.extra_body!==null?{...e.extra_body}:void 0;if(o){if(delete o.enable_thinking,delete o.thinking_budget,delete o.thinking,Object.keys(o).length===0){delete e.extra_body;return}e.extra_body=o}}applyReasoningCapability(e,o,n){let i=e,s=this.getEffectiveMaxOutputTokens(e.model),a=re(ie(this.config,n.depth,n.taskType),s);switch(o){case"native-effort":{let c=ht(n.depth);c&&(i.reasoning_effort=c);break}case"native-budget":{this.name==="qwen"?this.appendExtraBody(i,{enable_thinking:!0,thinking_budget:a}):this.name==="zhipu"&&(i.thinking={type:"enabled",budget_tokens:a});break}case"native-toggle":{this.name==="qwen"?this.appendExtraBody(i,{enable_thinking:!0}):this.name==="zhipu"&&(i.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,o,n,i,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:u,rest:p}=this.normalizeSystemForWire(n,c),l=s?.modelOverride??this.config.model,f=[{role:"system",content:u},...await this.convertMessages(p,l)],y=o.map(E=>({type:"function",function:{name:E.name,description:E.description,parameters:E.input_schema}})),h=s?.forcedToolName,b=!!h;if(a?.aborted)throw new DOMException("Request aborted","AbortError");let d=new Map,v="",k="",x,_=!0,m=null,T=Date.now(),M=this.normalizeReasoning(i),N=ne(M)?this.getReasoningCapability(l):"none",L=ne(M)?this.getReasoningFallbackChain(N).filter(E=>E==="native-budget"||E==="native-effort"||E==="native-toggle"||E==="none"):["none"],j={model:l,messages:f,tools:y,max_completion_tokens:s?.maxOutputTokensOverride??this.getEffectiveMaxOutputTokens(l),stream:!0};h&&b&&(j.tool_choice={type:"function",function:{name:h}});let B,q;for(let E of L){for(;!B;){let F={...j};_&&(F.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(F),this.applyReasoningCapability(F,E,M);try{B=await this.client.chat.completions.create(F,a?{signal:a}:{}),E!==N&&this.persistReasoningCapabilityOverride(E,l)}catch(g){if(q=g,b&&this.shouldFallbackForForcedToolChoiceError(g)){b=!1,delete j.tool_choice,this.logStreamDiagnostic(`[${this.name}] upstream rejected forced tool_choice; retrying without forced tool choice`);continue}if(_&&this.shouldFallbackForSpecificReasoningError(g,"stream_options","include_usage")){_=!1;continue}if(!this.shouldFallbackForReasoningError(g,...this.getFallbackTerms(E)))throw g;break}}if(B)break}if(!B)throw q??new R("All reasoning capability attempts failed without a captured error",this.name);let w=Date.now(),D=0,V=0,Z=3e4;for await(let E of B){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let F=Date.now(),g=F-w;g>Z&&(D++,V+=g,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(g/1e3)}s gap`,{stallCount:D,totalStallMs:V})),w=F,s?.onHeartbeat?.(),x=go(E.usage)??x;let P=E.choices[0],S=P?.delta;if(P?.finish_reason&&(m=P.finish_reason,process.env.KODAX_DEBUG_STREAM)){let X=Date.now()-T;this.logStreamDiagnostic(`[Stream] finish_reason: ${m} after ${X}ms`)}S?.content&&(v+=S.content,s?.onTextDelta?.(S.content));let C=this.extractReasoningDelta(S);if(C&&(k+=C,s?.onThinkingDelta?.(C)),S?.tool_calls)for(let X of S.tool_calls){let ee=d.get(X.index)??{id:"",name:"",arguments:""};X.id&&(ee.id=X.id),X.function?.name&&(ee.name=X.function.name),X.function?.arguments&&(ee.arguments+=X.function.arguments,s?.onToolInputDelta?.(ee.name,X.function.arguments,ee.id?{toolId:ee.id}:void 0)),d.set(X.index,ee)}}if(!m){let E=Date.now()-T;if(a?.aborted){let g=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:E,reason:g,textContentLength:v.length,toolCallsCount:d.size}),new DOMException(g,"AbortError")}let F=new Error(`Stream incomplete: finish_reason not received. Duration: ${E}ms. This may indicate a network disconnection or API timeout.`);throw F.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:E,textContentLength:v.length,toolCallsCount:d.size}),F}let Se=v?[{type:"text",text:v}]:[],ye=[],ve=[];k&&(ve.push({type:"thinking",thinking:k}),s?.onThinkingEnd?.(k));for(let[,E]of d)E.id&&E.name&&ye.push({type:"tool_use",id:E.id,name:E.name,input:ae(E.arguments)});return{textBlocks:Se,toolBlocks:ye,thinkingBlocks:ve,usage:x,stopReason:m??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,o,n,i,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:u,rest:p}=this.normalizeSystemForWire(n,c),l=s?.modelOverride??this.config.model,f=[{role:"system",content:u},...await this.convertMessages(p,l)],y=o.map(w=>({type:"function",function:{name:w.name,description:w.description,parameters:w.input_schema}})),h=s?.forcedToolName,b=!!h,d=this.normalizeReasoning(i),v=ne(d)?this.getReasoningCapability(l):"none",k=ne(d)?this.getReasoningFallbackChain(v).filter(w=>w==="native-budget"||w==="native-effort"||w==="native-toggle"||w==="none"):["none"],x={model:l,messages:f,tools:y,max_completion_tokens:s?.maxOutputTokensOverride??this.getEffectiveMaxOutputTokens(l)};h&&b&&(x.tool_choice={type:"function",function:{name:h}});let _,m;for(let w of k){for(;!_;){let D={...x};this.resetReasoningCapabilityParams(D),this.applyReasoningCapability(D,w,d);try{_=await this.client.chat.completions.create(D,a?{signal:a}:{}),w!==v&&this.persistReasoningCapabilityOverride(w,l)}catch(V){if(m=V,b&&this.shouldFallbackForForcedToolChoiceError(V)){b=!1,delete x.tool_choice,this.logStreamDiagnostic(`[${this.name}] upstream rejected forced tool_choice; retrying without forced tool choice`);continue}if(!this.shouldFallbackForReasoningError(V,...this.getFallbackTerms(w)))throw V;break}}if(_)break}if(!_)throw m??new R("All reasoning capability attempts failed without a captured error",this.name);let T=_.choices[0],M=T?.message,N=Mn(M?.content),L=Pn(M),j=(M?.tool_calls??[]).filter(wn).map(w=>({type:"tool_use",id:w.id,name:w.function.name,input:ae(w.function.arguments)}));N&&s?.onTextDelta?.(N);let B=N?[{type:"text",text:N}]:[],q=[];return L&&(q.push({type:"thinking",thinking:L}),s?.onThinkingDelta?.(L),s?.onThinkingEnd?.(L)),{textBlocks:B,toolBlocks:j,thinkingBlocks:q,usage:go(_.usage),stopReason:T?.finish_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}extractReasoningDelta(e){let o=e?.reasoning_content;return typeof o=="string"?o:Array.isArray(o)?o.map(n=>typeof n=="string"?n:typeof n=="object"&&n!==null&&"text"in n&&typeof n.text=="string"?n.text:"").join(""):""}serializeAssistantMessage(e,o){let n=e.filter(p=>p.type==="text").map(p=>p.text).join(`
13
+ `),i=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(!n&&i.length===0&&!a)return[];let c;n?c=n:i.length>0?c=null:c="...";let u={role:"assistant",content:c};return i.length>0&&(u.tool_calls=i),this.getEffectiveReplayReasoningContent(o)&&(u.reasoning_content=s||""),[u]}async serializeUserMessage(e){let o=[],n=e.filter(a=>a.type==="text").map(a=>a.text).join(`
16
+ `),i=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(u=>u.type==="text"?u.text:`[Image at ${u.path}${u.mediaType?` (${u.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
+ `),o.push({role:"tool",tool_call_id:a.tool_use_id,content:c})}if(i.length===0)return n&&o.push({role:"user",content:n}),o;let s=[];n&&s.push({type:"text",text:n});for(let a of i)s.push({type:"image_url",image_url:{url:await mo(a.path,a.mediaType)}});return o.push({role:"user",content:s}),o}serializeSystemMessage(e){if(typeof e=="string")return[{role:"system",content:e}];let o=e.filter(n=>n.type==="text").map(n=>n.text).join(`
18
+ `);return o?[{role:"system",content:o}]:[]}async convertMessages(e,o){let n=[];for(let i of e){if(i.role==="system"){n.push(...this.serializeSystemMessage(i.content));continue}if(typeof i.content=="string"){n.push({role:i.role,content:i.content});continue}if(i.role==="assistant"){n.push(...this.serializeAssistantMessage(i.content,o));continue}n.push(...await this.serializeUserMessage(i.content))}return n}};import{spawn as Dn}from"node:child_process";import{Readable as In,Writable as Ln}from"node:stream";import $e from"node:process";import{ClientSideConnection as Nn,PROTOCOL_VERSION as Bn,ndJsonStream as Fn}from"@agentclientprotocol/sdk";import{spawn as Sn,spawnSync as _o}from"node:child_process";var Rt=2e3,z=2e3;function St(t){return t.exitCode!==null||t.signalCode!==null}r(St,"isExited");function Ce(t,e){return St(t)?Promise.resolve(!0):new Promise(o=>{let n=!1,i=r(c=>{n||(n=!0,clearTimeout(a),t.off("exit",s),t.off("error",s),o(c))},"finish"),s=r(()=>i(!0),"onExit"),a=setTimeout(()=>i(!1),e);a.unref?.(),t.once("exit",s),t.once("error",s)})}r(Ce,"waitForExit");function ho(t){return new Promise(e=>{let o=Sn("taskkill",["/pid",String(t),"/t","/f"],{stdio:"ignore",windowsHide:!0}),n=!1,i=r(()=>{n||(n=!0,clearTimeout(s),e())},"finish"),s=setTimeout(()=>{try{o.kill()}catch{}i()},Rt);s.unref?.(),o.once("exit",i),o.once("error",i)})}r(ho,"runTaskkill");function yo(t,e){let o=!1;try{process.kill(-t,e),o=!0}catch{}try{process.kill(t,e),o=!0}catch{}return o}r(yo,"signalPosixPidTree");function H(t){try{return process.kill(t,0),!0}catch(e){return e.code!=="ESRCH"}}r(H,"signalTargetExists");function vo(t){return H(-t)||H(t)}r(vo,"isPosixPidTreeAlive");async function ko(t,e){let o=Date.now()+e;for(;Date.now()<o;){if(!vo(t))return!0;await new Promise(n=>setTimeout(n,50))}return!vo(t)}r(ko,"waitForPosixPidTreeExit");async function Rn(t,e){let o=Date.now()+e;for(;Date.now()<o;){if(!H(t))return!0;await new Promise(n=>setTimeout(n,50))}return!H(t)}r(Rn,"waitForWindowsPidExit");async function Pt(t,e){let o=[...new Set(t.filter(i=>Number.isFinite(i)&&i>0))];if(o.length===0)return!0;let n=Date.now()+e;for(;Date.now()<n;){if(o.every(i=>!H(i)))return!0;await new Promise(i=>setTimeout(i,50))}return o.every(i=>!H(i))}r(Pt,"waitForWindowsPidsExit");function bo(t){let e=t.trim();if(!e)return[];try{let o=JSON.parse(e);return(Array.isArray(o)?o:[o]).map(i=>Number(i)).filter(i=>Number.isFinite(i)&&i>0)}catch{return[]}}r(bo,"readWindowsPidListJson");function An(t){let e=_o("wmic",["process","where",`ParentProcessId=${t}`,"get","ProcessId","/format:list"],{encoding:"utf8",timeout:Rt,windowsHide:!0});if(e.error||e.status!==0)return[];let o=[],n=/ProcessId=(\d+)/g,i;for(;(i=n.exec(e.stdout))!==null;){let s=Number(i[1]);Number.isFinite(s)&&s>0&&s!==t&&o.push(s)}return o}r(An,"getWindowsChildPidsViaWmic");function On(t){let e=[`$children = Get-CimInstance Win32_Process -Filter "ParentProcessId = ${t}"`,"if ($null -eq $children) { exit 0 }","$children | Select-Object -ExpandProperty ProcessId | ConvertTo-Json -Compress"].join("; "),o=_o("powershell.exe",["-NoProfile","-NonInteractive","-Command",e],{encoding:"utf8",timeout:Rt,windowsHide:!0});if(!o.error&&o.status===0){let i=bo(o.stdout);if(i.length>0)return i}let n=bo(o.stdout);return n.length>0?n:An(t)}r(On,"getWindowsChildPids");function Co(t,e=new Set){let o=[];for(let n of On(t))e.has(n)||(e.add(n),o.push(n),o.push(...Co(n,e)));return o}r(Co,"collectWindowsDescendantPids");async function Ke(t,e){try{process.kill(t,e)}catch{return!H(t)}return Rn(t,z)}r(Ke,"killWindowsPid");async function xe(t){if(process.platform==="win32"&&t.pid!==void 0){let e=Co(t.pid),o=[...e].reverse(),n=[t.pid,...e];St(t)||await ho(t.pid);for(let i of o)H(i)&&await ho(i);if(await Pt(n,z)){await Ce(t,z);return}for(let i of o)H(i)&&await Ke(i,"SIGTERM");if(await Ke(t.pid,"SIGTERM"),await Pt(n,z)){await Ce(t,z);return}for(let i of o)H(i)&&await Ke(i,"SIGKILL");await Ke(t.pid,"SIGKILL"),await Pt(n,z),await Ce(t,z);return}if(t.pid!==void 0&&process.platform!=="win32"){if(!yo(t.pid,"SIGTERM")||await ko(t.pid,z))return;yo(t.pid,"SIGKILL"),await ko(t.pid,z);return}if(!St(t)){try{t.kill("SIGTERM")}catch{return}if(!await Ce(t,z)){try{t.kill("SIGKILL")}catch{}await Ce(t,z)}}}r(xe,"killChildProcessTree");var Ue=class{static{r(this,"AcpClient")}client=null;agentProcess=null;options;constructor(e){this.options=e}async connect(){let e,o;if(this.options.inputStream&&this.options.outputStream)e=this.options.inputStream,o=this.options.outputStream;else if(this.options.command){let s=$e.platform==="win32"&&!this.options.command.endsWith(".cmd")?`${this.options.command}.cmd`:this.options.command;if(this.agentProcess=Dn(s,this.options.args??[],{cwd:this.options.cwd??$e.cwd(),stdio:["pipe","pipe","inherit"],detached:$e.platform!=="win32"}),!this.agentProcess.stdin||!this.agentProcess.stdout)throw new Error("Failed to create ACP stdio pipes");o=Ln.toWeb(this.agentProcess.stdin),e=In.toWeb(this.agentProcess.stdout)}else throw new Error("AcpClient requires either a command or I/O streams");let n=Fn(o,e);this.client=new Nn(()=>({sessionUpdate:r(async i=>{this.options.onSessionUpdate?.(i)},"sessionUpdate"),requestPermission:r(async i=>{let s=i.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")}),n),await this.client.initialize({protocolVersion:Bn,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??$e.cwd(),mcpServers:[]})).sessionId}async prompt(e,o,n,i){if(!this.client)throw new Error("Client not connected");let s={sessionId:o,prompt:[{type:"text",text:e}]};i?.model&&(s.model=i.model);let a=this.client.prompt(s);if(n){let c=r(()=>{this.client?.cancel({sessionId:o}).catch(()=>{})},"onAbort");n.addEventListener("abort",c),a=a.finally(()=>{n.removeEventListener("abort",c)})}return await a}disconnect(){this.agentProcess&&xe(this.agentProcess),this.options.abort?.();try{this.client?.close?.()}catch{}this.client=null,this.agentProcess=null}};function Kn(t){if(!t||typeof t!="object")return;let e=t,o=typeof e.inputTokens=="number"?e.inputTokens:0,n=typeof e.outputTokens=="number"?e.outputTokens:0,i=typeof e.totalTokens=="number"?e.totalTokens:o+n;if(![o,n,i].some(s=>!Number.isFinite(s)||s<0)&&!(i<o||i<n))return{inputTokens:o,outputTokens:n,totalTokens:i,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}}r(Kn,"normalizeAcpUsage");var ue=class extends G{static{r(this,"KodaXAcpProvider")}_client=null;_sessionMap=new Map;_activeStreams=new Map;isConfigured(){return!0}async verifyCredential(){return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:`CLI-bridge provider "${this.name}" manages credentials in its CLI binary's token store; not verifiable from the KodaX SDK`}}getCapabilityProfile(){return W(be)}serializeImageBlockToPromptToken(e){return null}stripCacheBoundariesFromMessages(e){return e.map(o=>{if(typeof o.content=="string")return o;let n=_e(o.content);return n.length===o.content.length?o:{...o,content:n}})}async stream(e,o,n,i,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=[],u=[],p=e[e.length-1],l="";if(p&&typeof p.content=="string")l=p.content;else if(p&&Array.isArray(p.content)){let v=[];for(let k of p.content)if(k.type==="text")v.push(k.text);else if(k.type==="image"){let x=this.serializeImageBlockToPromptToken(k);x&&v.push(x)}l=v.join(`
19
+ `)}let f={...this.acpClientOptions,onSessionUpdate:r(v=>{let k=v.update,x=v.sessionId;if(!("sessionUpdate"in k))return;let _=x?this._activeStreams.get(x):void 0;if(_)switch(k.sessionUpdate){case"agent_message_chunk":if(k.content?.type==="text"){let m=k.content.text;_.output.text+=m,_.streamOptions?.onTextDelta?.(m)}break;case"tool_call":{let m="{}",T=k.arguments??k.parameters;T&&(m=typeof T=="string"?T:JSON.stringify(T)),_.streamOptions?.onToolInputDelta?.(k.title,m);let M=`
20
+ > [Tool Use] ${k.title}: ${m}
21
+ `;_.output.text+=M,_.streamOptions?.onTextDelta?.(M);break}case"tool_call_update":if(k.status){let m=`> [Tool Result] ${k.status}
22
+
23
+ `;_.output.text+=m,_.streamOptions?.onTextDelta?.(m)}break}},"onSessionUpdate")},y=s?.sessionId??"default";this._client||(this._client=new Ue(f),await this._client.connect());let h=this._sessionMap.get(y);h||(h=await this._client.createNewSession(),this._sessionMap.set(y,h));let b={text:""};this._activeStreams.set(h,{streamOptions:s,output:b});let d;try{d=await this._client.prompt(l,h,a,{model:s?.modelOverride})}catch(v){if(!(v instanceof Error&&v.name==="AbortError"))throw v}finally{this._activeStreams.delete(h)}return b.text&&c.push({type:"text",text:b.text}),{textBlocks:c,toolBlocks:u,thinkingBlocks:[],usage:Kn(d?.usage)}}disconnect(){this._client&&(this._client.disconnect(),this._client=null),this._activeStreams.clear(),this._sessionMap.clear()}};import{spawn as $n}from"node:child_process";import je from"node:process";var de=class{static{r(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 o=this.buildArgs(e),n={...je.env,...this.config.env},s=je.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=$n(s,o,{cwd:this.config.cwd??je.cwd(),env:n,stdio:["ignore","pipe","pipe"],detached:je.platform!=="win32"}),c="";a.stderr?.on("data",l=>{c+=l.toString()});let u=!1,p=r(()=>{u||xe(a)},"abortHandler");e.signal?.addEventListener("abort",p),a.on("exit",()=>{u=!0});try{yield*this.parseOutputStream(a.stdout,e.signal),c.trim()&&console.error(`[CLIExecutor] stderr: ${c.trim()}`)}finally{e.signal?.removeEventListener("abort",p),u||await xe(a)}}async*parseOutputStream(e,o){let n="";for await(let i of e){if(o?.aborted)break;n+=i.toString();let s=n.split(`
24
+ `);n=s.pop()??"";for(let a of s){if(!a.trim())continue;let c=this.parseLine(a.trim());c&&(yield c)}}if(n.trim()&&!o?.aborted){let i=this.parseLine(n.trim());i&&(yield i)}}};import{spawn as Un}from"node:child_process";import jn from"node:process";async function Xe(t){try{let e=jn.platform==="win32",o=Un(e?`${t}.cmd`:t,["--version"]);return await new Promise(n=>{o.on("close",i=>n(i===0)),o.on("error",()=>n(!1))})}catch{return!1}}r(Xe,"checkCliCommandInstalled");var We=class extends de{static{r(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 Xe("gemini")}buildArgs(e){let o=["-m",e.model??this.model];return e.sessionId?(o.push("-r",e.sessionId),o.push(e.prompt)):o.push("-p",e.prompt),[...o,...this.config.baseArgs]}parseLine(e){if(!e.startsWith("{"))return null;try{let o=JSON.parse(e);return this.convertEvent(o)}catch{return null}}convertEvent(e){let o=e.timestamp?Date.parse(e.timestamp):Date.now();switch(e.type){case"init":return{type:"session_start",timestamp:o,sessionId:e.session_id??"",model:e.model??this.model,raw:e};case"message":return{type:"message",timestamp:o,role:e.role,content:e.content??"",delta:e.delta,raw:e};case"tool_use":return{type:"tool_use",timestamp:o,toolId:e.tool_id??"",toolName:e.tool_name??"",parameters:e.parameters??{},raw:e};case"tool_result":return{type:"tool_result",timestamp:o,toolId:e.tool_id??"",status:e.status==="success"?"success":"error",output:e.output??"",raw:e};case"error":return{type:"error",timestamp:o,errorType:"error",message:e.message??"Unknown error",raw:e};case"result":return{type:"complete",timestamp:o,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 xo}from"node:stream/web";import{randomUUID as At}from"node:crypto";function ze(t){let e=new xo,o=new xo,n=e.readable.getReader(),i=o.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,c="",u=At(),p=new AbortController,l=new Map;(async()=>{try{for(;;){let{done:d,value:v}=await n.read();if(d)break;c+=s.decode(v,{stream:!0});let k=c.split(`
25
+ `);c=k.pop()??"";for(let x of k)if(x.trim())try{let _=JSON.parse(x);y(_).catch(m=>{console.error("[PseudoAcpServer] Failed to handle request:",m)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",x)}}}catch(d){console.error("[PseudoAcpServer] Stream read error:",d)}})();let f=r(async d=>{let v=JSON.stringify(d)+`
26
+ `;await i.write(a.encode(v))},"sendMsg");async function y(d){if(d.method==="initialize")await f({jsonrpc:"2.0",id:d.id,result:{protocolVersion:d.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(d.method==="session/new"||d.method==="sessions/new")u=d.params?.sessionId??At(),await f({jsonrpc:"2.0",id:d.id,result:{sessionId:u}});else if(d.method==="session/prompt"||d.method==="chat/prompt"){let v=new AbortController,k=d.params.sessionId;l.set(k,v);let x=r(()=>v.abort(),"onGlobalAbort");p.signal.addEventListener("abort",x);let m=await h(k,d.params.prompt,typeof d.params.model=="string"?d.params.model:void 0,v.signal).finally(()=>{l.delete(k),p.signal.removeEventListener("abort",x)});await f({jsonrpc:"2.0",id:d.id,result:m.usage?{stopReason:m.stopReason,usage:m.usage}:{stopReason:m.stopReason}})}else if(d.method==="session/cancel"||d.method==="chat/cancel"){let v=l.get(d.params.sessionId);v&&v.abort(),d.id!==void 0&&await f({jsonrpc:"2.0",id:d.id,result:{}})}else d.id!==void 0&&await f({jsonrpc:"2.0",id:d.id,result:{}})}r(y,"handleRequest");let h=r(async(d,v,k,x)=>{let _=v.find(m=>m.type==="text")?.text??"";try{let m=t.execute({prompt:_,model:k,sessionId:d==="default"?void 0:d,signal:x});for await(let T of m){let M=b(T);if(M&&await f({jsonrpc:"2.0",method:"session/update",params:{sessionId:d,update:M}}),T.type==="complete")return{stopReason:x.aborted?"cancelled":"end_turn",usage:T.usage}}return{stopReason:x.aborted?"cancelled":"end_turn"}}catch(m){return x.aborted||m instanceof Error&&m.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",m),await f({jsonrpc:"2.0",method:"session/update",params:{sessionId:d,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
27
+ [Fatal Error: ${m}]
28
+ `}}}}),{stopReason:"end_turn"})}},"executePrompt"),b=r(d=>{switch(d.type){case"message":if(d.role==="assistant"&&d.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:d.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:d.toolName,arguments:d.parameters,status:"running",toolCallId:d.toolId||At()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:d.toolId,status:d.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
29
+ [Error: ${d.message}]
30
+ `}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:o.readable,outputStream:e.writable,abort:r(()=>{p.abort(),e.readable.cancel().catch(()=>{}),o.writable.abort().catch(()=>{})},"abort"),executor:t}}r(ze,"createPseudoAcpServer");import To from"node:fs";import Eo from"node:os";import wo from"node:path";var Xn="gpt-5.4",Wn="auto-gemini-3",zn=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],Vn=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function Mo(t){let e=new Set,o=[];for(let n of t){let i=n.trim();if(!i)continue;let s=i.toLowerCase();e.has(s)||(e.add(s),o.push(i))}return o}r(Mo,"dedupePreserveOrder");function Gn(){let t=wo.join(Eo.homedir(),".codex","config.toml");try{return To.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}r(Gn,"readCodexConfiguredModel");function Hn(){let t=wo.join(Eo.homedir(),".gemini","settings.json");try{let e=JSON.parse(To.readFileSync(t,"utf8")),o=typeof e.model=="string"?e.model.trim():"";return o||(typeof e.general?.model=="string"?e.general.model.trim():"")||null}catch{return null}}r(Hn,"readGeminiConfiguredModel");function pe(){return Gn()||Xn}r(pe,"getCodexCliDefaultModel");function fe(){return Hn()||Wn}r(fe,"getGeminiCliDefaultModel");function Te(){return Mo([pe(),...zn])}r(Te,"getCodexCliKnownModels");function Ee(){return Mo([fe(),...Vn])}r(Ee,"getGeminiCliKnownModels");var Ot=fe(),Jn=Ee(),Yn={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},Ve=class extends ue{static{r(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:Ot,models:Jn.filter(e=>e!==Ot).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new We({model:Ot});this.acpClientOptions=ze(e)}getCapabilityProfile(){return W(Yn)}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 Ge=class extends de{static{r(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 Xe("codex")}buildArgs(e){this.model=e.model??this.model;let o=e.model?["-m",e.model]:[];return e.sessionId?["exec","resume",e.sessionId,...o,e.prompt,...this.config.baseArgs.filter(n=>n!=="exec")]:[...this.config.baseArgs,...o,e.prompt]}parseLine(e){if(!e.startsWith("{"))return null;try{let o=JSON.parse(e);return this.convertEvent(o)}catch{return null}}convertEvent(e){let o=Date.now();switch(e.type){case"thread.started":return{type:"session_start",timestamp:o,sessionId:e.thread_id??"",model:this.model,raw:e};case"item.completed":return e.item?.type==="agent_message"?{type:"message",timestamp:o,role:"assistant",content:e.item.text??"",raw:e}:e.item?.type==="command_execution"?{type:"tool_use",timestamp:o,toolId:e.item.id,toolName:"Bash",parameters:{command:e.item.command},raw:e}:null;case"turn.completed":return{type:"complete",timestamp:o,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:o,errorType:e.type,message:e.message??"Unknown error",raw:e};default:return null}}};var Dt=pe(),qn=Te(),He=class extends ue{static{r(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:Dt,models:qn.filter(e=>e!==Dt).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Ge({model:Dt});this.acpClientOptions=ze(e)}};import{existsSync as ni,readFileSync as ii}from"node:fs";import me from"node:path";import{fileURLToPath as ri}from"node:url";var Po=["none","prompt-only","native-effort","native-budget","native-toggle","unknown"],So=["native","image-input-native","cli-bridge","image-input-cli-bridge"],Ro=["count-tokens","models-list","minimal-message","unsupported"];function we(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}r(we,"isPlainObject");function Ye(t,e){if(typeof t!="string"||t.length===0)throw new Error(`provider-capabilities.json: ${e} must be a non-empty string`);return t}r(Ye,"requireString");function Ao(t,e){if(t!==void 0)return Ye(t,e)}r(Ao,"optionalString");function oe(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}}r(oe,"optionalNumber");function Je(t,e){if(t!==void 0){if(typeof t!="boolean")throw new Error(`provider-capabilities.json: ${e} must be a boolean`);return t}}r(Je,"optionalBoolean");function It(t,e){if(typeof t!="string"||!Po.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${Po.join(", ")}, got ${JSON.stringify(t)}`);return t}r(It,"requireReasoningCapability");function Qn(t,e){if(typeof t!="string"||!So.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${So.join(", ")}, got ${JSON.stringify(t)}`);return t}r(Qn,"requireProfileName");function Zn(t,e){if(typeof t!="string"||!Ro.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${Ro.join(", ")}, got ${JSON.stringify(t)}`);return t}r(Zn,"requireVerifyStrategy");function ei(t,e){if(!we(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let o=Ye(t.id,`${e}.id`),n=Ao(t.displayName,`${e}.displayName`),i=oe(t.contextWindow,`${e}.contextWindow`),s=oe(t.maxOutputTokens,`${e}.maxOutputTokens`),a=oe(t.thinkingBudgetCap,`${e}.thinkingBudgetCap`),c=Je(t.replayReasoningContent,`${e}.replayReasoningContent`),u=Je(t.strictThinkingSignature,`${e}.strictThinkingSignature`),p=oe(t.streamMaxDurationMs,`${e}.streamMaxDurationMs`),l=t.reasoningCapability===void 0?void 0:It(t.reasoningCapability,`${e}.reasoningCapability`),f={id:o};return n!==void 0&&(f.displayName=n),i!==void 0&&(f.contextWindow=i),s!==void 0&&(f.maxOutputTokens=s),a!==void 0&&(f.thinkingBudgetCap=a),l!==void 0&&(f.reasoningCapability=l),c!==void 0&&(f.replayReasoningContent=c),u!==void 0&&(f.strictThinkingSignature=u),p!==void 0&&(f.streamMaxDurationMs=p),f}r(ei,"validateModelDescriptor");function ti(t,e){if(t===void 0)return;if(!we(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let o={};for(let[n,i]of Object.entries(t))o[n]=It(i,`${e}.${n}`);return o}r(ti,"validateModelReasoningCapabilities");function oi(t,e){if(!we(t))throw new Error(`provider-capabilities.json: providers.${e} must be an object`);let o=Je(t.cliBridge,`providers.${e}.cliBridge`),n=Ye(t.apiKeyEnv,`providers.${e}.apiKeyEnv`),i=It(t.reasoningCapability,`providers.${e}.reasoningCapability`),s=Qn(t.capabilityProfile,`providers.${e}.capabilityProfile`),a=Zn(t.verifyStrategy,`providers.${e}.verifyStrategy`);if(o&&a!=="unsupported")throw new Error(`provider-capabilities.json: providers.${e} is a cliBridge entry but verifyStrategy="${a}" \u2014 must be "unsupported" (CLI binary owns credentials)`);let c=oe(t.contextWindow,`providers.${e}.contextWindow`),u=oe(t.maxOutputTokens,`providers.${e}.maxOutputTokens`),p=oe(t.thinkingBudgetCap,`providers.${e}.thinkingBudgetCap`),l=Je(t.supportsThinking,`providers.${e}.supportsThinking`),f=ti(t.modelReasoningCapabilities,`providers.${e}.modelReasoningCapabilities`),y=Ao(t.model,`providers.${e}.model`);if(o&&(y!==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(!o&&y===void 0)throw new Error(`provider-capabilities.json: providers.${e}.model is required (only cliBridge entries may omit)`);let h;if(t.models!==void 0){if(!Array.isArray(t.models))throw new Error(`provider-capabilities.json: providers.${e}.models must be an array`);h=t.models.map((d,v)=>ei(d,`providers.${e}.models[${v}]`))}let b={apiKeyEnv:n,reasoningCapability:i,capabilityProfile:s,verifyStrategy:a};return y!==void 0&&(b.model=y),h!==void 0&&(b.models=h),c!==void 0&&(b.contextWindow=c),u!==void 0&&(b.maxOutputTokens=u),p!==void 0&&(b.thinkingBudgetCap=p),l!==void 0&&(b.supportsThinking=l),f!==void 0&&(b.modelReasoningCapabilities=f),o&&(b.cliBridge=!0),b}r(oi,"validateProviderEntry");function Oo(t){if(!we(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=Ye(t.updatedAt,"updatedAt");if(!we(t.providers))throw new Error("provider-capabilities.json: providers must be an object");let o={};for(let[n,i]of Object.entries(t.providers))o[n]=oi(i,n);return{version:1,updatedAt:e,providers:o}}r(Oo,"validateProviderCapabilitiesJson");var si=Object.freeze({native:te,"image-input-native":po,"cli-bridge":be,"image-input-cli-bridge":fo}),qe=null;function ai(){if(process.env.KODAX_BUNDLED==="true")return me.join(me.dirname(process.execPath),"provider-capabilities.json");let t=me.dirname(ri(import.meta.url)),e=[me.join(t,"provider-capabilities.json"),me.join(me.dirname(t),"provider-capabilities.json")];for(let o of e)if(ni(o))return o;return e[0]}r(ai,"resolveJsonPath");function ci(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)}r(ci,"deepFreezeSnapshot");function li(t){if(t==="gemini-cli"){let e=fe();return{model:e,models:Ee().filter(o=>o!==e).map(o=>({id:o}))}}if(t==="codex-cli"){let e=pe();return{model:e,models:Te().filter(o=>o!==e).map(o=>({id:o}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${t}'`)}r(li,"resolveCliBridgeModels");function ui(t,e){let o=si[e.capabilityProfile];if(!o)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${e.capabilityProfile}' for provider '${t}'`);if(e.cliBridge){let i=li(t),s={model:i.model,models:i.models,apiKeyEnv:e.apiKeyEnv,reasoningCapability:e.reasoningCapability,capabilityProfile:o,verifyStrategy:e.verifyStrategy};return e.supportsThinking!==void 0&&(s.supportsThinking=e.supportsThinking),s}let n={model:e.model,apiKeyEnv:e.apiKeyEnv,reasoningCapability:e.reasoningCapability,capabilityProfile:o,verifyStrategy:e.verifyStrategy};return e.models!==void 0&&(n.models=e.models),e.modelReasoningCapabilities!==void 0&&(n.modelReasoningCapabilities=e.modelReasoningCapabilities),e.contextWindow!==void 0&&(n.contextWindow=e.contextWindow),e.maxOutputTokens!==void 0&&(n.maxOutputTokens=e.maxOutputTokens),e.thinkingBudgetCap!==void 0&&(n.thinkingBudgetCap=e.thinkingBudgetCap),e.supportsThinking!==void 0&&(n.supportsThinking=e.supportsThinking),n}r(ui,"buildSnapshot");function Do(){if(qe)return qe;let t=ai(),e;try{let i=ii(t,"utf8");e=JSON.parse(i)}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`provider-capabilities loader: failed to read ${t}: ${s}`)}let o=Oo(e),n={};for(let[i,s]of Object.entries(o.providers))n[i]=ci(ui(i,s));return qe=Object.freeze(n),qe}r(Do,"getProviderSnapshots");import di from"@anthropic-ai/sdk";var A=Do();function U(t,e={}){let o=A[t];return{apiKeyEnv:o.apiKeyEnv,model:o.model,reasoningCapability:o.reasoningCapability,models:o.models,contextWindow:o.contextWindow,maxOutputTokens:o.maxOutputTokens,thinkingBudgetCap:o.thinkingBudgetCap,supportsThinking:o.supportsThinking??!1,verifyStrategy:o.verifyStrategy,...e}}r(U,"buildProviderConfig");var Lt=class extends I{static{r(this,"AnthropicProvider")}name="anthropic";config=U("anthropic",{strictThinkingSignature:!0});buildClient(){return new di({apiKey:this.getApiKey()})}},Nt=class extends I{static{r(this,"ZhipuCodingProvider")}name="zhipu-coding";config=U("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",streamMaxDurationMs:3e5})},Bt=class extends I{static{r(this,"KimiCodeProvider")}name="kimi-code";config=U("kimi-code",{baseUrl:"https://api.kimi.com/coding/"})},Ft=class extends I{static{r(this,"MiniMaxCodingProvider")}name="minimax-coding";config=U("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic"})},Kt=class extends I{static{r(this,"MimoCodingProvider")}name="mimo-coding";config=U("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic"})},$t=class extends I{static{r(this,"MimoProvider")}name="mimo";config=U("mimo",{baseUrl:"https://api.xiaomimimo.com/anthropic"})},Ut=class extends I{static{r(this,"ArkCodingProvider")}name="ark-coding";config=U("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding"})},jt=class extends K{static{r(this,"OpenAIProvider")}name="openai";config=U("openai")},Xt=class extends K{static{r(this,"DeepSeekProvider")}name="deepseek";config=U("deepseek",{baseUrl:"https://api.deepseek.com",replayReasoningContent:!0})},Wt=class extends K{static{r(this,"KimiProvider")}name="kimi";config=U("kimi",{baseUrl:"https://api.moonshot.cn/v1",replayReasoningContent:!0})},zt=class extends K{static{r(this,"QwenProvider")}name="qwen";config=U("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",replayReasoningContent:!0})},Vt=class extends K{static{r(this,"ZhipuProvider")}name="zhipu";config=U("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",replayReasoningContent:!0})},$={anthropic:r(()=>new Lt,"anthropic"),openai:r(()=>new jt,"openai"),deepseek:r(()=>new Xt,"deepseek"),kimi:r(()=>new Wt,"kimi"),"kimi-code":r(()=>new Bt,"kimi-code"),qwen:r(()=>new zt,"qwen"),zhipu:r(()=>new Vt,"zhipu"),"zhipu-coding":r(()=>new Nt,"zhipu-coding"),"minimax-coding":r(()=>new Ft,"minimax-coding"),"mimo-coding":r(()=>new Kt,"mimo-coding"),mimo:r(()=>new $t,"mimo"),"ark-coding":r(()=>new Ut,"ark-coding"),"gemini-cli":r(()=>new Ve,"gemini-cli"),"codex-cli":r(()=>new He,"codex-cli")},Gt=process.env.KODAX_PROVIDER??"zhipu-coding",Io=new Map;function pi(t){if(O(t))return A[t].apiKeyEnv}r(pi,"resolveApiKeyEnvForProvider");function Lo(t){let e=t??Gt,o=$[e];if(!o)throw new R(`Unknown provider: ${e}. Available: ${Object.keys($).join(", ")}`,e);let n=pi(e),i=n?process.env[n]:void 0,s=Io.get(e);if(s&&s.apiKey===i)return s.instance;let a=o();return Io.set(e,{apiKey:i,instance:a}),a}r(Lo,"getProvider");function No(t){return O(t)?!!process.env[A[t].apiKeyEnv]:!1}r(No,"isProviderConfigured");function Bo(t){return O(t)?A[t].model:null}r(Bo,"getProviderModel");function Fo(t,e){if(!O(t))return"unknown";let o=A[t],n=e??o.model;return o.modelReasoningCapabilities?.[n]??o.reasoningCapability}r(Fo,"getProviderConfiguredReasoningCapability");function Ko(t){return O(t)?W(A[t].capabilityProfile):null}r(Ko,"getProviderConfiguredCapabilityProfile");function $o(){let t=[];for(let e of Object.keys($)){let o=A[e];t.push({name:e,model:o.model,models:o.models?[o.model,...o.models.map(n=>n.id)]:[o.model],configured:!!process.env[o.apiKeyEnv],reasoningCapability:o.reasoningCapability,capabilityProfile:W(o.capabilityProfile)})}return t}r($o,"getProviderList");function Uo(t){let e=A[t];return e?e.models?[e.model,...e.models.map(o=>o.id)]:[e.model]:[]}r(Uo,"getProviderModels");function O(t){return t in $}r(O,"isProviderName");function Ht(t){return{id:t.model}}r(Ht,"makeDefaultDescriptor");function Qe(t,e,o){let n=o.id===e.model;return{provider:t,model:o.id,displayName:o.displayName??o.id,supportsThinking:e.supportsThinking??!1,reasoningCapability:o.reasoningCapability??e.reasoningCapability,contextWindow:o.contextWindow??e.contextWindow,maxOutputTokens:o.maxOutputTokens??e.maxOutputTokens,thinkingBudgetCap:o.thinkingBudgetCap??e.thinkingBudgetCap,isDefault:n}}r(Qe,"effectiveCapabilities");function Ze(t){let e=A[t];return e?[Ht(e),...e.models??[]]:[]}r(Ze,"getProviderModelDescriptors");function et(t,e){let o=A[t];if(!o)return;if(e===o.model)return Qe(t,o,Ht(o));let n=o.models?.find(i=>i.id===e);if(n)return Qe(t,o,n)}r(et,"getModelCapabilities");function tt(){let t=[];for(let e of Object.keys($)){let o=A[e];t.push(Qe(e,o,Ht(o)));for(let n of o.models??[])t.push(Qe(e,o,n))}return t}r(tt,"listBuiltinModelCapabilities");var fi=new Set(["compat","sdk"]),mi=new Set(["count-tokens","models-list","minimal-message","unsupported"]);function gi(t){return t==="anthropic"?"count-tokens":"models-list"}r(gi,"defaultVerifyStrategyForProtocol");function Me(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&&!fi.has(t.userAgentMode))throw new Error(`Unknown userAgentMode "${t.userAgentMode}" for custom provider "${t.name}". Must be "compat" or "sdk".`);if(t.verifyStrategy!==void 0){if(!mi.has(t.verifyStrategy))throw new Error(`Unknown verifyStrategy "${t.verifyStrategy}" for custom provider "${t.name}". Must be one of "count-tokens" | "models-list" | "minimal-message" | "unsupported".`);if(t.protocol==="openai"&&t.verifyStrategy==="count-tokens")throw new Error(`Custom provider "${t.name}": verifyStrategy="count-tokens" requires Anthropic protocol; got protocol="openai". Use "models-list" or "minimal-message" for OpenAI-compat.`)}}r(Me,"validateCustomProviderConfig");function hi(t){let e=t.models?.length?t.models.map(o=>typeof o=="string"?{id:o}:o):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,verifyStrategy:t.verifyStrategy??gi(t.protocol)}}r(hi,"buildProviderConfig");function ot(t){Me(t);let e=hi(t);return t.protocol==="anthropic"?new Jt(t.name,e):new Yt(t.name,e)}r(ot,"createCustomProvider");var Jt=class extends I{static{r(this,"DynamicAnthropicProvider")}name;config;constructor(e,o){super(),this.name=e,this.config=o}},Yt=class extends K{static{r(this,"DynamicOpenAIProvider")}name;config;constructor(e,o){super(),this.name=e,this.config=o}};var J=new Map,qt=new Map;function jo(t){let e=new Set,o=new Map,n=new Map;for(let i of t){if(Me(i),e.has(i.name))throw new Error(`Duplicate custom provider name: "${i.name}". Each custom provider must have a unique name.`);i.name in $&&console.warn(`[kodax] Custom provider "${i.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(i.name),o.set(i.name,i),n.set(i.name,()=>ot(i))}J.clear(),qt.clear();for(let[i,s]of o)J.set(i,s);for(let[i,s]of n)qt.set(i,s)}r(jo,"registerCustomProviders");function nt(t){let e=qt.get(t);return e?e():void 0}r(nt,"getCustomProvider");function he(t){return J.has(t)}r(he,"isCustomProviderName");function it(){return[...J.keys()]}r(it,"getCustomProviderNames");function Xo(){let t=[];for(let[e,o]of J){let n=!!process.env[o.apiKeyEnv],i=(o.models??[]).map(a=>typeof a=="string"?a:a.id),s=o.model&&i.length?[...new Set([o.model,...i])]:[o.model];t.push({name:e,model:o.model,models:s,configured:n,reasoningCapability:o.reasoningCapability??"none",capabilityProfile:W(o.capabilityProfile??te),custom:!0})}return t}r(Xo,"getCustomProviderList");function Wo(t){let e=J.get(t);if(!e)return;let o=(e.models??[]).map(n=>typeof n=="string"?n:n.id);return e.model&&o.length?[...new Set([e.model,...o])]:[e.model]}r(Wo,"getCustomProviderModels");function zo(t){return typeof t=="string"?{id:t}:t}r(zo,"customDescriptorToFull");function rt(t){let e=J.get(t);if(!e)return;let o={id:e.model},n=(e.models??[]).map(zo).filter(i=>i.id!==e.model);return[o,...n]}r(rt,"getCustomProviderModelDescriptors");function ge(t,e){let o=J.get(t);if(!o)return;let n=e===o.model,i=n?{id:o.model}:(o.models??[]).map(zo).find(s=>s.id===e);if(i)return{provider:t,model:i.id,displayName:i.displayName??i.id,supportsThinking:o.supportsThinking??!1,reasoningCapability:i.reasoningCapability??o.reasoningCapability??"none",contextWindow:i.contextWindow??o.contextWindow,maxOutputTokens:i.maxOutputTokens??o.maxOutputTokens,thinkingBudgetCap:i.thinkingBudgetCap??o.thinkingBudgetCap,isDefault:n}}r(ge,"getCustomModelCapabilities");function Vo(t){let e=J.get(t);if(!e)return;let o=e.verifyStrategy??(e.protocol==="anthropic"?"count-tokens":"models-list");return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:o}}r(Vo,"getCustomProviderVerifyMetadata");function st(){let t=[];for(let[e,o]of J){let n=ge(e,o.model);n&&t.push(n);for(let i of o.models??[]){let s=typeof i=="string"?i:i.id;if(s===o.model)continue;let a=ge(e,s);a&&t.push(a)}}return t}r(st,"listCustomProviderModelCapabilities");var Q=new Map,yi=0;function Qt(t){let e=Q.get(t);if(!(!e||e.length===0))return e[e.length-1]}r(Qt,"getActiveRuntimeProviderRegistration");function vi(t){for(let[e,o]of Q){let n=o.filter(i=>i.id!==t);if(n.length!==o.length){n.length===0?Q.delete(e):Q.set(e,n);return}}}r(vi,"removeRuntimeProviderRegistration");function Go(t,e){let o=t.trim();if(!o)throw new Error("Model provider name cannot be empty.");if(O(o))throw new Error(`Runtime model provider "${o}" conflicts with a built-in provider.`);if(he(o))throw new Error(`Runtime model provider "${o}" conflicts with an existing config-defined custom provider.`);let n={id:`runtime-provider:${++yi}`,name:o,factory:e},i=Q.get(o)??[];return Q.set(o,[...i,n]),()=>{vi(n.id)}}r(Go,"registerModelProvider");function at(t){let e=Qt(t);return e?e.factory():void 0}r(at,"getRuntimeModelProvider");function Pe(t){return Qt(t)!==void 0}r(Pe,"isRuntimeModelProviderName");function ct(){return Array.from(Q.keys()).filter(t=>Qt(t)!==void 0)}r(ct,"getRuntimeModelProviderNames");function Ho(){Q.clear()}r(Ho,"clearRuntimeModelProviders");function Zt(t){if(O(t))return $[t]();let e=at(t);if(e)return e;let o=nt(t);if(o)return o;let n=ut();throw new Error(`Unknown provider: ${t}. Available: ${n.join(", ")}`)}r(Zt,"resolveProvider");function lt(t){return O(t)||Pe(t)||he(t)}r(lt,"isKnownProvider");function ut(){let t=Object.keys($),e=ct(),o=it();return[...new Set([...t,...e,...o])]}r(ut,"getAvailableProviderNames");function eo(t){return O(t)?Ze(t):rt(t)??[]}r(eo,"resolveProviderModelDescriptors");function Jo(t,e){return O(t)?et(t,e):ge(t,e)}r(Jo,"resolveModelCapabilities");function Yo(){return[...tt(),...st()]}r(Yo,"listAllModelCapabilities");function ki(t){if(O(t)){let e=A[t];return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:e.verifyStrategy}}if(!Pe(t))return Vo(t)}r(ki,"getProviderVerifyMetadata");async function qo(t,e){let o=ki(t);if(!o&&!lt(t))return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:`Unknown provider: "${t}". Available: ${ut().join(", ")}`};if(o?.verifyStrategy==="unsupported")return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:`Provider "${t}" does not support credential verification (cli-bridge or strategy marked unsupported)`};if(o&&!process.env[o.apiKeyEnv])return{ok:!1,error:"unconfigured",strategy:o.verifyStrategy,durationMs:0,approxTokensSpent:0,message:`Environment variable "${o.apiKeyEnv}" is not set for provider "${t}"`};let n;try{n=Zt(t)}catch(i){return{ok:!1,error:"unconfigured",strategy:o?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(i?.message??i).slice(0,240)}}try{return await n.verifyCredential(e)}catch(i){return{ok:!1,error:"unknown",strategy:o?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(i?.message??i).slice(0,240)}}}r(qo,"verifyProviderCredential");async function Qo(t,e){if(!lt(t))return{ok:!1,source:"failed",error:`Unknown provider: "${t}"`,durationMs:0};let o=eo(t);return o.length===0?{ok:!1,source:"failed",error:`Provider "${t}" has no static model list`,durationMs:0}:{ok:!0,source:"static",models:o.map(i=>i.id),durationMs:0}}r(Qo,"listProviderModels");var Zo={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-M3":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.7":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.7-highspeed":{inputPer1M:.01,outputPer1M:.03}},"mimo-coding":{"mimo-v2.5-pro":{inputPer1M:.01,outputPer1M:.03},"mimo-v2.5":{inputPer1M:.01,outputPer1M:.03}},mimo:{"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},"MiniMax-M3":{inputPer1M:.005,outputPer1M:.015},"MiniMax-M2.7":{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 to(t,e,o){let n=o?.[t]?.[e];return n||Zo[t]?.[e]}r(to,"getCostRate");function oo(t,e,o,n=0){let i=e/1e6*t.inputPer1M,s=o/1e6*t.outputPer1M,a=t.cachePer1M?n/1e6*t.cachePer1M:0;return i+s+a}r(oo,"calculateCost");function bi(){return{records:[],retries:[]}}r(bi,"createCostTracker");function _i(t,e){let o={timestamp:Date.now(),provider:e.provider,waitMs:e.waitMs,reason:e.reason,source:e.source};return{records:t.records,retries:[...t.retries,o]}}r(_i,"recordRetry");function no(t,e,o){let n=to(e.provider,e.model,o),i=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=n?oo(n,e.inputTokens,e.outputTokens,i):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}}r(no,"recordUsage");function Ci(t){let e=0,o=0,n=0,i=0,s=0,a=0,c={},u={};for(let f of t.records){e+=f.cost,o+=f.inputTokens,n+=f.outputTokens,i+=f.cacheReadTokens+f.cacheWriteTokens,s+=f.cacheReadTokens,a+=f.cacheWriteTokens;let y=c[f.provider];c[f.provider]={cost:(y?.cost??0)+f.cost,calls:(y?.calls??0)+1,inputTokens:(y?.inputTokens??0)+f.inputTokens,outputTokens:(y?.outputTokens??0)+f.outputTokens};let h=f.role??"default",b=u[h];u[h]={cost:(b?.cost??0)+f.cost,calls:(b?.calls??0)+1,inputTokens:(b?.inputTokens??0)+f.inputTokens,outputTokens:(b?.outputTokens??0)+f.outputTokens}}let p=0;for(let f of t.retries)p+=f.waitMs;let l=i>0?s/i:0;return{totalCost:e,totalInputTokens:o,totalOutputTokens:n,totalCacheTokens:i,totalCacheReadTokens:s,totalCacheWriteTokens:a,cacheHitRate:l,callCount:t.records.length,retryCount:t.retries.length,retryWaitMs:p,byProvider:c,byRole:u}}r(Ci,"getSummary");function dt(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}r(dt,"formatCost");function xi(t){let e=[];if(e.push(`Session Cost: ${dt(t.totalCost)} (${t.callCount} calls)`),e.push(`Tokens: ${t.totalInputTokens.toLocaleString()} in / ${t.totalOutputTokens.toLocaleString()} out`),t.totalCacheTokens>0){let i=(t.cacheHitRate*100).toFixed(0);e.push(`Cache: ${t.totalCacheTokens.toLocaleString()} tokens (${t.totalCacheReadTokens.toLocaleString()} read / ${t.totalCacheWriteTokens.toLocaleString()} write, ${i}% hit rate)`)}if(t.retryCount>0){let i=(t.retryWaitMs/1e3).toFixed(1);e.push(`Retries: ${t.retryCount} (${i}s total wait)`)}e.push("");let o=Object.entries(t.byProvider).sort((i,s)=>s[1].cost-i[1].cost);if(o.length>0){e.push("By Provider:");for(let[i,s]of o)e.push(` ${i}: ${dt(s.cost)} (${s.calls} calls, ${s.inputTokens.toLocaleString()} in / ${s.outputTokens.toLocaleString()} out)`);e.push("")}let n=Object.entries(t.byRole).sort((i,s)=>s[1].cost-i[1].cost);if(n.length>1){e.push("By Role:");for(let[i,s]of n)e.push(` ${i}: ${dt(s.cost)} (${s.calls} calls)`)}return e.join(`
31
+ `)}r(xi,"formatCostReport");var en={inputTokens:0,outputTokens:0,totalTokens:0},Ti=3e4;async function Ei(t){let e=new AbortController,o=t.timeoutMs??Ti,n,i=r(c=>{n||(n=c),e.abort()},"recordAbort"),s=setTimeout(()=>i("timeout"),o),a=r(()=>i("parent"),"onParentAbort");t.abortSignal&&(t.abortSignal.aborted?i("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),u=c.usage??en,p=c.textBlocks??[],l=c.toolBlocks??[],f=p.map(h=>h.text).join("");if(l.length>0)return{text:f,usage:u,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=no(y,{provider:t.provider.name,model:t.model,inputTokens:u.inputTokens,outputTokens:u.outputTokens,cacheReadTokens:u.cachedReadTokens,cacheWriteTokens:u.cachedWriteTokens,role:t.querySource})),{text:f,usage:u,costTracker:y,stopReason:wi(c.stopReason)}}catch(c){let u=c instanceof Error?c:new Error(String(c)),p="error";return e.signal.aborted&&(p=n==="timeout"?"timeout":"aborted"),{text:"",usage:en,costTracker:t.costTracker,stopReason:p,error:u}}finally{clearTimeout(s),t.abortSignal&&t.abortSignal.removeEventListener("abort",a)}}r(Ei,"sideQuery");function wi(t){return t==="max_tokens"?"max_tokens":"end_turn"}r(wi,"mapStopReason");export{Y as a,R as b,ke as c,pt as d,ft as e,mt as f,tn as g,on as h,nn as i,rn as j,io as k,ro as l,gt as m,ne as n,Re as o,so as p,ie as q,re as r,ht as s,bt as t,_t as u,se as v,Oe as w,xt as x,dn as y,De as z,Ie as A,Le as B,G as C,ae as D,ce as E,Tt as F,Et as G,le as H,wt as I,_e as J,I as K,K as L,pe as M,fe as N,Te as O,Ee as P,A as Q,$ as R,Gt as S,Lo as T,No as U,Bo as V,Fo as W,Ko as X,$o as Y,Uo as Z,O as _,Ze as $,et as aa,tt as ba,Me as ca,ot as da,jo as ea,nt as fa,he as ga,it as ha,Xo as ia,Wo as ja,rt as ka,ge as la,st as ma,Go as na,at as oa,Pe as pa,ct as qa,Ho as ra,Zt as sa,lt as ta,ut as ua,eo as va,Jo as wa,Yo as xa,qo as ya,Qo as za,Zo as Aa,to as Ba,oo as Ca,bi as Da,_i as Ea,no as Fa,Ci as Ga,dt as Ha,xi as Ia,Ei as Ja};