@kodax-ai/kodax 0.7.42 → 0.7.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -6
- package/README.md +87 -56
- package/README_CN.md +46 -25
- package/dist/chunks/chunk-7G5PSL6C.js +830 -0
- package/dist/chunks/{chunk-IYJ5EPRV.js → chunk-IYSK7LUK.js} +1 -1
- package/dist/chunks/chunk-K75O2CAE.js +31 -0
- package/dist/chunks/chunk-UG4262JI.js +502 -0
- package/dist/chunks/chunk-VHKAJDQD.js +425 -0
- package/dist/chunks/chunk-YMRZBS4G.js +2 -0
- package/dist/chunks/compaction-config-3E57ABCT.js +2 -0
- package/dist/chunks/{construction-bootstrap-J2WOCYEK.js → construction-bootstrap-JR63KI5N.js} +4 -4
- package/dist/chunks/dist-KWHUKXEL.js +2 -0
- package/dist/chunks/dist-XANXEVTU.js +2 -0
- package/dist/chunks/utils-HQ2QCKJA.js +2 -0
- package/dist/index.d.ts +10 -10
- package/dist/index.js +2 -2
- package/dist/kodax_cli.js +1124 -1102
- package/dist/sdk-agent.d.ts +850 -48
- package/dist/sdk-agent.js +1 -1
- package/dist/sdk-coding.d.ts +701 -815
- package/dist/sdk-coding.js +1 -1
- package/dist/sdk-llm.d.ts +5 -3
- package/dist/sdk-llm.js +1 -1
- package/dist/sdk-mcp.d.ts +1 -1
- package/dist/sdk-mcp.js +1 -1
- package/dist/sdk-repl.d.ts +9 -8
- package/dist/sdk-repl.js +1 -1
- package/dist/sdk-session.d.ts +22 -10
- package/dist/sdk-session.js +1 -1
- package/dist/sdk-skills.js +1 -1
- package/dist/types-chunks/{cost-tracker.d-B6vMoLLF.d.ts → base.d-FUJahC0i.d.ts} +2 -110
- package/dist/types-chunks/{bash-prefix-extractor.d-CkhaqKkg.d.ts → bash-prefix-extractor.d-DMrGImMl.d.ts} +35 -136
- package/dist/types-chunks/cost-tracker.d-wRtyEW9d.d.ts +110 -0
- package/dist/types-chunks/{history-cleanup.d-DznrzEiU.d.ts → file-tracker.d-zaLZeNBK.d.ts} +314 -6
- package/dist/types-chunks/manager.d-87belpiS.d.ts +370 -0
- package/dist/types-chunks/{resolver.d-DX9au4NJ.d.ts → resolver.d-CA68_NeH.d.ts} +149 -5
- package/dist/types-chunks/{session-storage.d-Cci897iM.d.ts → storage.d-DPAEX7zS.d.ts} +49 -2
- package/dist/types-chunks/{instance-discovery.d-BsKnIwpg.d.ts → types.d-CKJtjo-6.d.ts} +139 -2
- package/dist/types-chunks/{storage.d-Bc5DoAwp.d.ts → utils.d-DkLZD_wa.d.ts} +24 -46
- package/package.json +7 -6
- package/dist/chunks/chunk-3RKBXWZS.js +0 -2
- package/dist/chunks/chunk-7JLYVWAF.js +0 -1033
- package/dist/chunks/chunk-CD3R5YBH.js +0 -16
- package/dist/chunks/chunk-DKXUY5F2.js +0 -209
- package/dist/chunks/chunk-HMYEQJGT.js +0 -31
- package/dist/chunks/chunk-KUX5LRPP.js +0 -2
- package/dist/chunks/chunk-OWSKU55I.js +0 -13
- package/dist/chunks/chunk-ZZ4KRK2B.js +0 -465
- package/dist/chunks/compaction-config-FIFFP4FT.js +0 -2
- package/dist/chunks/dist-2ZHWDXMQ.js +0 -2
- package/dist/chunks/dist-W4CJWLIH.js +0 -2
- package/dist/chunks/utils-A5MWDTWZ.js +0 -2
- package/dist/types-chunks/transport.d-DuyjG30t.d.ts +0 -180
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
-
import{
|
|
2
|
+
import{wa as e}from"./chunk-VHKAJDQD.js";import{a as n}from"./chunk-V4WSBIXB.js";import{readFile as i}from"fs/promises";var c={enabled:!0,triggerPercent:75};async function g(o){let t=e("config.json");try{let r=await a(t);if(r?.compaction)return{...c,...r.compaction}}catch{}return c}n(g,"loadCompactionConfig");async function a(o){try{let t=await i(o,"utf-8");return JSON.parse(t)}catch{return null}}n(a,"readConfigFile");export{g as a};
|
|
@@ -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 V=class extends Error{static{i(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},R=class extends V{static{i(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},me=class extends V{static{i(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},Ye=class extends V{static{i(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},Je=class extends V{static{i(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var Qe=32768,Q=32e3,qe=64e3,bn=.5;var Cn=["off","auto","quick","balanced","deep"],Nt={low:6e3,medium:1e4,high:2e4},Bt=4096;function Ze(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}i(Ze,"getReasoningCapability");function q(t){return ve(t).enabled}i(q,"isReasoningEnabled");function ve(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??Ft(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(ve,"normalizeReasoningRequest");function Ft(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}i(Ft,"getDefaultThinkingDepthForMode");function Z(t,e,n="unknown"){if(e==="off")return 0;let o={...Nt,...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=Bt){let o=Math.max(1024,e-n);return Math.max(1024,Math.min(t,o))}i(ee,"clampThinkingBudget");function et(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}i(et,"mapDepthToOpenAIReasoningEffort");import be from"fs";import Mn from"os";import ot from"path";var tt=null;function Tn(t){return t==="budget"||t==="effort"||t==="toggle"||t==="none"}i(Tn,"isReasoningOverride");function En(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(Tn)}i(En,"isStoredConfig");function Pn(){return process.env.KODAX_HOME??ot.join(Mn.homedir(),".kodax")}i(Pn,"getKodaxDir");function Ut(){return process.env.KODAX_CONFIG_FILE??ot.join(Pn(),"config.json")}i(Ut,"getConfigFilePath");function nt(t,e){return tt={filePath:t,config:e},e}i(nt,"updateStoredConfigCache");function wn(t){let e=JSON.parse(be.readFileSync(t,"utf-8"));return En(e)?e:{}}i(wn,"readStoredConfigFromDisk");function it(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(it,"reasoningCapabilityToOverride");function rt(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}i(rt,"reasoningOverrideToCapability");function te(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}i(te,"buildReasoningOverrideKey");function st(){let t=Ut();if(tt?.filePath===t)return tt.config;try{if(be.existsSync(t))return nt(t,wn(t))}catch{}return nt(t,{})}i(st,"loadStoredConfig");function Xt(t){let e=Ut();try{be.mkdirSync(ot.dirname(e),{recursive:!0}),be.writeFileSync(e,JSON.stringify(t,null,2)),nt(e,t)}catch(n){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",n)}}i(Xt,"saveStoredConfig");function Ce(t,e,n){let o=st(),r=te(t,e,n);return o.providerReasoningOverrides?.[r]}i(Ce,"loadReasoningOverride");function at(t,e,n,o){let r=st(),s=te(t,e,o);r.providerReasoningOverrides={...r.providerReasoningOverrides??{},[s]:n},Xt(r)}i(at,"saveReasoningOverride");function Rn(t,e,n){let o=st(),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,Xt(o)}i(Rn,"clearReasoningOverride");function Wt(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(Wt,"readHeader");function $t(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($t,"parsePositiveNumber");function An(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(An,"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=$t(Wt(t,"retry-after-ms"));if(a!==void 0){let k=Math.min(a,r);return{type:"header",waitMs:Math.round(k),source:"retry-after-ms",cappedFromHeader:k!==a}}let c=Wt(t,"retry-after");if(c!==void 0&&c.trim().length>0){let k=$t(c);if(k!==void 0){let b=k*1e3,p=Math.min(b,r);return{type:"header",waitMs:Math.round(p),source:"retry-after-seconds",cappedFromHeader:p!==b}}let _=An(c,s);if(_!==void 0){let b=Math.min(_,r);return{type:"header",waitMs:Math.round(b),source:"retry-after-date",cappedFromHeader:b!==_}}}let u=n*Math.pow(2,Math.max(0,e.attempt)),d=Math.min(u,o),m=e.withJitter!==!1?Math.random()*.25*d:0;return{type:"backoff",waitMs:Math.round(d+m),source:"exponential-backoff",attempt:e.attempt}}i(Me,"parseRetryAfter");function Te(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}i(Te,"extractHeadersFromError");var fe={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},B={...fe,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 Ee(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(Ee,"normalizeCapabilityProfile");function X(t){return{...Ee(t)}}i(X,"cloneCapabilityProfile");function Sn(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}i(Sn,"parseEnvInt");var G=class{static{i(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let n=Sn(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 R(`${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 X(this.config.capabilityProfile??fe)}getConfiguredReasoningCapability(e){let n=this.getModelDescriptor(e);return n?.reasoningCapability?n.reasoningCapability:Ze(this.config)}getReasoningCapability(e){let n=Ce(this.name,this.config,e);return n?rt(n):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return Ce(this.name,this.config,e)}getReasoningOverrideKey(e){return te(this.name,this.config,e)}persistReasoningCapabilityOverride(e,n){let o=it(e);o&&at(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 ve(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=Te(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,"")),u=Math.min(a,c),d=Math.max(a,c);return Math.max(3e3,d-u-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 u=this.parseContextOverflow(c);if(u){this.maxOutputTokensOverride=u,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 u=Te(c)??{},d=Me(u,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),l=d.waitMs,m=this.classifyRateLimitReason(c);if(s?.({provider:this.name,waitMs:l,reason:m,source:d.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(k=>setTimeout(k,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 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 V("Unexpected end of withRateLimit")}};import Ln from"@anthropic-ai/sdk";import{parse as On}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=On(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 ct(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(ct,"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 lt(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(lt,"lowerCacheBoundaries");function he(t){return t.filter(e=>!oe(e))}i(he,"stripCacheBoundaries");import{readFile as Dn}from"node:fs/promises";import In from"node:path";var Kn={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function Pe(t,e){return e??Kn[In.extname(t).toLowerCase()]??"image/png"}i(Pe,"resolveImageMediaType");async function we(t){return(await Dn(t)).toString("base64")}i(we,"readImageFileAsBase64");async function zt(t,e){let n=Pe(t,e),o=await we(t);return`data:${n};base64,${o}`}i(zt,"buildImageDataUrl");var Nn="KodaX";function Bn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Nn}}i(Bn,"getAnthropicCompatDefaultHeaders");function ut(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(u=>!Number.isFinite(u)||u<0))return{inputTokens:c,outputTokens:a,totalTokens:c+a,cachedReadTokens:s||void 0,cachedWriteTokens:r||void 0}}i(ut,"normalizeAnthropicUsage");var L=class extends G{static{i(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;client;initClient(){let e=Bn(this.config);this.client=new Ln({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=ct([{type:"text",text:e}],"system");return lt(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),u=s?.modelOverride??this.config.model,d=this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),m=c.enabled?this.getReasoningCapability(u):"none",k=c.enabled?this.getReasoningFallbackChain(m).filter(C=>C==="native-budget"||C==="native-toggle"||C==="none"):["none"],_=i(C=>{let P={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n),stream:!0};if(C==="native-budget"){let S=Z(this.config,c.depth,c.taskType);P.thinking={type:"enabled",budget_tokens:ee(S,d)}}else C==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let b=[],p=[],x=[],y,v=null,f="",g="",T="",w="",$="",D="",j="",E=!1,z,A=Date.now(),xe=Date.now(),ue,pe;for(let C of k)try{ue=await this.client.messages.create(_(C),a?{signal:a}:{}),C!==m&&this.persistReasoningCapabilityOverride(C,u);break}catch(P){pe=P;let S=C==="native-budget"?["budget_tokens","thinking"]:C==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...S))throw P}if(!ue)throw pe??new R("All reasoning capability attempts failed without a captured error",this.name);let de=Date.now(),M=0,I=0,K=3e4;for await(let C of ue){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let P=Date.now(),S=P-de;if(S>K&&(M++,I+=S,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(S/1e3)}s gap before ${C.type}`,{stallCount:M,totalStallMs:I,eventType:C.type})),de=P,C.type==="content_block_start"||C.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),C.type==="content_block_start"){A=Date.now();let h=C.content_block;v=h.type,process.env.KODAX_DEBUG_TOOL_STREAM&&h.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:h.type,id:h.id,name:h.name}),h.type==="thinking"?(g="",T=h.signature??""):h.type==="redacted_thinking"?(v="redacted_thinking",w=h.data??""):h.type==="text"?f="":h.type==="tool_use"&&($=h.id,D=h.name,j="")}else if(C.type==="content_block_delta"){A=Date.now();let h=C.delta;h.type==="thinking_delta"?(g+=h.thinking??"",s?.onThinkingDelta?.(h.thinking??"")):h.type==="text_delta"?(f+=h.text??"",s?.onTextDelta?.(h.text??"")):h.type==="input_json_delta"&&(j+=h.partial_json??"",s?.onToolInputDelta?.(D,h.partial_json??"",$?{toolId:$}:void 0))}else if(C.type==="content_block_stop")A=Date.now(),v==="thinking"?g&&(x.push({type:"thinking",thinking:g,signature:T}),s?.onThinkingEnd?.(g)):v==="redacted_thinking"?(w&&x.push({type:"redacted_thinking",data:w}),w=""):v==="text"?f&&b.push({type:"text",text:f}):v==="tool_use"&&(!$||!D?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify($),name:JSON.stringify(D),input:j.slice(0,100)}):p.push({type:"tool_use",id:$,name:D,input:ne(j)})),v=null;else if(C.type==="message_stop"){if(E=!0,A=Date.now(),process.env.KODAX_DEBUG_STREAM){let h=Date.now()-xe;this.logStreamDiagnostic(`[Stream] message_stop received after ${h}ms`)}}else if(C.type==="message_delta"){A=Date.now(),y=ut(C.usage,y);let h=C.delta;h?.stop_reason&&(z=h.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${z}`))}else C.type==="message_start"&&(A=Date.now(),y=ut(C.message?.usage,y),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!E){let C=Date.now()-xe,P=Date.now()-A;if(a?.aborted){let h=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:C,lastEventAge:P,reason:h,textBlocks:b.length,toolBlocks:p.length,thinkingBlocks:x.length}),new DOMException(h,"AbortError")}let S=new Error(`Stream incomplete: message_stop event not received. Duration: ${C}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:C,lastEventAge:P,textBlocks:b.length,toolBlocks:p.length,thinkingBlocks:x.length}),S}return{textBlocks:b,toolBlocks:p,thinkingBlocks:x,usage:y,stopReason:z}},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),u=s?.modelOverride??this.config.model,d=this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),m=c.enabled?this.getReasoningCapability(u):"none",k=c.enabled?this.getReasoningFallbackChain(m).filter(f=>f==="native-budget"||f==="native-toggle"||f==="none"):["none"],_=i(f=>{let g={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n)};if(f==="native-budget"){let T=Z(this.config,c.depth,c.taskType);g.thinking={type:"enabled",budget_tokens:ee(T,d)}}else f==="native-toggle"&&(g.thinking={type:"enabled"});return g},"buildRequest"),b,p;for(let f of k)try{b=await this.client.messages.create(_(f),a?{signal:a}:{}),f!==m&&this.persistReasoningCapabilityOverride(f,u);break}catch(g){p=g;let T=f==="native-budget"?["budget_tokens","thinking"]:f==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(g,...T))throw g}if(!b)throw p??new R("All reasoning capability attempts failed without a captured error",this.name);let x=[],y=[],v=[];for(let f of b.content)f.type==="text"?(x.push({type:"text",text:f.text}),s?.onTextDelta?.(f.text)):f.type==="thinking"?(v.push({type:"thinking",thinking:f.thinking,signature:f.signature??""}),s?.onThinkingDelta?.(f.thinking),s?.onThinkingEnd?.(f.thinking)):f.type==="redacted_thinking"?v.push({type:"redacted_thinking",data:f.data}):f.type==="tool_use"&&y.push({type:"tool_use",id:f.id,name:f.name,input:typeof f.input=="object"&&f.input!==null?f.input:{}});return{textBlocks:x,toolBlocks:y,thinkingBlocks:v,usage:ut(b.usage),stopReason:b.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 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(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=[],u=[];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&&u.push(l.thinking):l.type==="redacted_thinking"&&(r||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 m;if(typeof l.content=="string")m=l.content;else{let k=[];for(let _ of l.content)_.type==="text"?k.push({type:"text",text:_.text}):_.type==="image"&&k.push({type:"image",source:{type:"base64",media_type:Pe(_.path,_.mediaType),data:await we(_.path)}});m=k}c.push({type:"tool_result",tool_use_id:l.tool_use_id,content:m,...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:Pe(l.path,l.mediaType),data:await we(l.path)}});if(a==="assistant"&&this.config.supportsThinking&&!r){let l=c.some(k=>k.type==="tool_use"),m=c.some(k=>k.type==="thinking"||k.type==="redacted_thinking");l&&!m&&c.unshift({type:"thinking",thinking:"...",signature:""})}let d=c.length===0||a==="assistant"&&c.every(l=>{let m=l;return m.type==="thinking"&&!m.thinking||m.type==="text"&&!m.text});o.push({role:s.role,content:d?[{type:"text",text:"..."}]:c})}return o}};import Fn from"openai";var Un="KodaX";function Xn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Un}}i(Xn,"getOpenAICompatDefaultHeaders");function Gt(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(Gt,"normalizeOpenAIUsage");function Wn(t){return t?t.type==="function"&&"function"in t:!1}i(Wn,"isOpenAIFunctionToolCall");function $n(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($n,"extractOpenAIMessageText");function jn(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(jn,"extractOpenAIMessageReasoning");var F=class extends G{static{i(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;client;initClient(){let e=Xn(this.config);this.client=new Fn({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=et(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:u,rest:d}=this.normalizeSystemForWire(o,c),l=s?.modelOverride??this.config.model,m=[{role:"system",content:u},...await this.convertMessages(d,l)],k=n.map(M=>({type:"function",function:{name:M.name,description:M.description,parameters:M.input_schema}}));if(a?.aborted)throw new DOMException("Request aborted","AbortError");let _=new Map,b="",p="",x,y=!0,v=null,f=Date.now(),g=this.normalizeReasoning(r),T=q(g)?this.getReasoningCapability(l):"none",w=q(g)?this.getReasoningFallbackChain(T).filter(M=>M==="native-budget"||M==="native-effort"||M==="native-toggle"||M==="none"):["none"],$={model:l,messages:m,tools:k,max_completion_tokens:this.getEffectiveMaxOutputTokens(l),stream:!0},D,j;for(let M of w){for(;!D;){let I={...$};y&&(I.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(I),this.applyReasoningCapability(I,M,g);try{D=await this.client.chat.completions.create(I,a?{signal:a}:{}),M!==T&&this.persistReasoningCapabilityOverride(M,l)}catch(K){if(j=K,y&&this.shouldFallbackForSpecificReasoningError(K,"stream_options","include_usage")){y=!1;continue}if(!this.shouldFallbackForReasoningError(K,...this.getFallbackTerms(M)))throw K;break}}if(D)break}if(!D)throw j??new R("All reasoning capability attempts failed without a captured error",this.name);let E=Date.now(),z=0,A=0,xe=3e4;for await(let M of D){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let I=Date.now(),K=I-E;K>xe&&(z++,A+=K,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(K/1e3)}s gap`,{stallCount:z,totalStallMs:A})),E=I,s?.onHeartbeat?.(),x=Gt(M.usage)??x;let C=M.choices[0],P=C?.delta;if(C?.finish_reason&&(v=C.finish_reason,process.env.KODAX_DEBUG_STREAM)){let h=Date.now()-f;this.logStreamDiagnostic(`[Stream] finish_reason: ${v} after ${h}ms`)}P?.content&&(b+=P.content,s?.onTextDelta?.(P.content));let S=this.extractReasoningDelta(P);if(S&&(p+=S,s?.onThinkingDelta?.(S)),P?.tool_calls)for(let h of P.tool_calls){let J=_.get(h.index)??{id:"",name:"",arguments:""};h.id&&(J.id=h.id),h.function?.name&&(J.name=h.function.name),h.function?.arguments&&(J.arguments+=h.function.arguments,s?.onToolInputDelta?.(J.name,h.function.arguments,J.id?{toolId:J.id}:void 0)),_.set(h.index,J)}}if(!v){let M=Date.now()-f;if(a?.aborted){let K=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:M,reason:K,textContentLength:b.length,toolCallsCount:_.size}),new DOMException(K,"AbortError")}let I=new Error(`Stream incomplete: finish_reason not received. Duration: ${M}ms. This may indicate a network disconnection or API timeout.`);throw I.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:M,textContentLength:b.length,toolCallsCount:_.size}),I}let ue=b?[{type:"text",text:b}]:[],pe=[],de=[];p&&(de.push({type:"thinking",thinking:p}),s?.onThinkingEnd?.(p));for(let[,M]of _)M.id&&M.name&&pe.push({type:"tool_use",id:M.id,name:M.name,input:ne(M.arguments)});return{textBlocks:ue,toolBlocks:pe,thinkingBlocks:de,usage:x,stopReason:v??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:u,rest:d}=this.normalizeSystemForWire(o,c),l=s?.modelOverride??this.config.model,m=[{role:"system",content:u},...await this.convertMessages(d,l)],k=n.map(E=>({type:"function",function:{name:E.name,description:E.description,parameters:E.input_schema}})),_=this.normalizeReasoning(r),b=q(_)?this.getReasoningCapability(l):"none",p=q(_)?this.getReasoningFallbackChain(b).filter(E=>E==="native-budget"||E==="native-effort"||E==="native-toggle"||E==="none"):["none"],x={model:l,messages:m,tools:k,max_completion_tokens:this.getEffectiveMaxOutputTokens(l)},y,v;for(let E of p){let z={...x};this.resetReasoningCapabilityParams(z),this.applyReasoningCapability(z,E,_);try{y=await this.client.chat.completions.create(z,a?{signal:a}:{}),E!==b&&this.persistReasoningCapabilityOverride(E,l);break}catch(A){if(v=A,!this.shouldFallbackForReasoningError(A,...this.getFallbackTerms(E)))throw A}}if(!y)throw v??new R("All reasoning capability attempts failed without a captured error",this.name);let f=y.choices[0],g=f?.message,T=$n(g?.content),w=jn(g),$=(g?.tool_calls??[]).filter(Wn).map(E=>({type:"tool_use",id:E.id,name:E.function.name,input:ne(E.function.arguments)}));T&&s?.onTextDelta?.(T);let D=T?[{type:"text",text:T}]:[],j=[];return w&&(j.push({type:"thinking",thinking:w}),s?.onThinkingDelta?.(w),s?.onThinkingEnd?.(w)),{textBlocks:D,toolBlocks:$,thinkingBlocks:j,usage:Gt(y.usage),stopReason:f?.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(d=>d.type==="text").map(d=>d.text).join(`
|
|
13
|
+
`),r=e.filter(d=>d.type==="tool_use").map(d=>({id:d.id,type:"function",function:{name:d.name,arguments:JSON.stringify(d.input??{})}})),s=e.filter(d=>d.type==="thinking"||d.type==="redacted_thinking").map(d=>d.type==="thinking"?d.thinking:"").filter(Boolean).join(`
|
|
14
|
+
|
|
15
|
+
`),a=e.some(d=>d.type==="thinking"||d.type==="redacted_thinking");if(!o&&r.length===0&&!a)return[];let c;o?c=o:r.length>0?c=null:c="...";let u={role:"assistant",content:c};return r.length>0&&(u.tool_calls=r),this.getEffectiveReplayReasoningContent(n)&&(u.reasoning_content=s||""),[u]}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(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
|
+
`),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 zt(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 zn}from"node:child_process";import{Readable as Gn,Writable as Vn}from"node:stream";import pt from"node:process";import{ClientSideConnection as Hn,PROTOCOL_VERSION as Yn,ndJsonStream as Jn}from"@agentclientprotocol/sdk";var Re=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=pt.platform==="win32"&&!this.options.command.endsWith(".cmd")?`${this.options.command}.cmd`:this.options.command;if(this.agentProcess=zn(s,this.options.args??[],{cwd:this.options.cwd??pt.cwd(),stdio:["pipe","pipe","inherit"]}),!this.agentProcess.stdin||!this.agentProcess.stdout)throw new Error("Failed to create ACP stdio pipes");n=Vn.toWeb(this.agentProcess.stdin),e=Gn.toWeb(this.agentProcess.stdout)}else throw new Error("AcpClient requires either a command or I/O streams");let o=Jn(n,e);this.client=new Hn(()=>({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:Yn,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??pt.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 Qn(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(Qn,"normalizeAcpUsage");var ie=class extends G{static{i(this,"KodaXAcpProvider")}_client=null;_sessionMap=new Map;_activeStreams=new Map;isConfigured(){return!0}getCapabilityProfile(){return X(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=[],u=[],d=e[e.length-1],l="";if(d&&typeof d.content=="string")l=d.content;else if(d&&Array.isArray(d.content)){let x=[];for(let y of d.content)if(y.type==="text")x.push(y.text);else if(y.type==="image"){let v=this.serializeImageBlockToPromptToken(y);v&&x.push(v)}l=x.join(`
|
|
19
|
+
`)}let m={...this.acpClientOptions,onSessionUpdate:i(x=>{let y=x.update,v=x.sessionId;if(!("sessionUpdate"in y))return;let f=v?this._activeStreams.get(v):void 0;if(f)switch(y.sessionUpdate){case"agent_message_chunk":if(y.content?.type==="text"){let g=y.content.text;f.output.text+=g,f.streamOptions?.onTextDelta?.(g)}break;case"tool_call":{let g="{}",T=y.arguments??y.parameters;T&&(g=typeof T=="string"?T:JSON.stringify(T)),f.streamOptions?.onToolInputDelta?.(y.title,g);let w=`
|
|
20
|
+
> [Tool Use] ${y.title}: ${g}
|
|
21
|
+
`;f.output.text+=w,f.streamOptions?.onTextDelta?.(w);break}case"tool_call_update":if(y.status){let g=`> [Tool Result] ${y.status}
|
|
22
|
+
|
|
23
|
+
`;f.output.text+=g,f.streamOptions?.onTextDelta?.(g)}break}},"onSessionUpdate")},k=s?.sessionId??"default";this._client||(this._client=new Re(m),await this._client.connect());let _=this._sessionMap.get(k);_||(_=await this._client.createNewSession(),this._sessionMap.set(k,_));let b={text:""};this._activeStreams.set(_,{streamOptions:s,output:b});let p;try{p=await this._client.prompt(l,_,a,{model:s?.modelOverride})}catch(x){if(!(x instanceof Error&&x.name==="AbortError"))throw x}finally{this._activeStreams.delete(_)}return b.text&&c.push({type:"text",text:b.text}),{textBlocks:c,toolBlocks:u,thinkingBlocks:[],usage:Qn(p?.usage)}}disconnect(){this._client&&(this._client.disconnect(),this._client=null),this._activeStreams.clear(),this._sessionMap.clear()}};import{spawn as qn}from"node:child_process";import dt 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={...dt.env,...this.config.env},s=dt.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=qn(s,n,{cwd:this.config.cwd??dt.cwd(),env:o,stdio:["ignore","pipe","pipe"]}),c="";a.stderr?.on("data",l=>{c+=l.toString()});let u=!1,d=i(()=>{u||a.kill("SIGTERM")},"abortHandler");e.signal?.addEventListener("abort",d),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",d),u||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 Zn}from"node:child_process";import eo from"node:process";async function Ae(t){try{let e=eo.platform==="win32",n=Zn(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(Ae,"checkCliCommandInstalled");var Se=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 Ae("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 Vt}from"node:stream/web";import{randomUUID as mt}from"node:crypto";function Oe(t){let e=new Vt,n=new Vt,o=e.readable.getReader(),r=n.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,c="",u=mt(),d=new AbortController,l=new Map;(async()=>{try{for(;;){let{done:p,value:x}=await o.read();if(p)break;c+=s.decode(x,{stream:!0});let y=c.split(`
|
|
25
|
+
`);c=y.pop()??"";for(let v of y)if(v.trim())try{let f=JSON.parse(v);k(f).catch(g=>{console.error("[PseudoAcpServer] Failed to handle request:",g)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",v)}}}catch(p){console.error("[PseudoAcpServer] Stream read error:",p)}})();let m=i(async p=>{let x=JSON.stringify(p)+`
|
|
26
|
+
`;await r.write(a.encode(x))},"sendMsg");async function k(p){if(p.method==="initialize")await m({jsonrpc:"2.0",id:p.id,result:{protocolVersion:p.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(p.method==="session/new"||p.method==="sessions/new")u=p.params?.sessionId??mt(),await m({jsonrpc:"2.0",id:p.id,result:{sessionId:u}});else if(p.method==="session/prompt"||p.method==="chat/prompt"){let x=new AbortController,y=p.params.sessionId;l.set(y,x);let v=i(()=>x.abort(),"onGlobalAbort");d.signal.addEventListener("abort",v);let g=await _(y,p.params.prompt,typeof p.params.model=="string"?p.params.model:void 0,x.signal).finally(()=>{l.delete(y),d.signal.removeEventListener("abort",v)});await m({jsonrpc:"2.0",id:p.id,result:g.usage?{stopReason:g.stopReason,usage:g.usage}:{stopReason:g.stopReason}})}else if(p.method==="session/cancel"||p.method==="chat/cancel"){let x=l.get(p.params.sessionId);x&&x.abort(),p.id!==void 0&&await m({jsonrpc:"2.0",id:p.id,result:{}})}else p.id!==void 0&&await m({jsonrpc:"2.0",id:p.id,result:{}})}i(k,"handleRequest");let _=i(async(p,x,y,v)=>{let f=x.find(g=>g.type==="text")?.text??"";try{let g=t.execute({prompt:f,model:y,sessionId:p==="default"?void 0:p,signal:v});for await(let T of g){let w=b(T);if(w&&await m({jsonrpc:"2.0",method:"session/update",params:{sessionId:p,update:w}}),T.type==="complete")return{stopReason:v.aborted?"cancelled":"end_turn",usage:T.usage}}return{stopReason:v.aborted?"cancelled":"end_turn"}}catch(g){return v.aborted||g instanceof Error&&g.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",g),await m({jsonrpc:"2.0",method:"session/update",params:{sessionId:p,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
27
|
+
[Fatal Error: ${g}]
|
|
28
|
+
`}}}}),{stopReason:"end_turn"})}},"executePrompt"),b=i(p=>{switch(p.type){case"message":if(p.role==="assistant"&&p.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:p.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:p.toolName,arguments:p.parameters,status:"running",toolCallId:p.toolId||mt()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:p.toolId,status:p.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
29
|
+
[Error: ${p.message}]
|
|
30
|
+
`}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:n.readable,outputStream:e.writable,abort:i(()=>{d.abort(),e.readable.cancel().catch(()=>{}),n.writable.abort().catch(()=>{})},"abort"),executor:t}}i(Oe,"createPseudoAcpServer");import Ht from"node:fs";import Yt from"node:os";import Jt from"node:path";var to="gpt-5.4",no="auto-gemini-3",oo=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],io=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function Qt(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(Qt,"dedupePreserveOrder");function ro(){let t=Jt.join(Yt.homedir(),".codex","config.toml");try{return Ht.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}i(ro,"readCodexConfiguredModel");function so(){let t=Jt.join(Yt.homedir(),".gemini","settings.json");try{let e=JSON.parse(Ht.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(so,"readGeminiConfiguredModel");function se(){return ro()||to}i(se,"getCodexCliDefaultModel");function ae(){return so()||no}i(ae,"getGeminiCliDefaultModel");function ye(){return Qt([se(),...oo])}i(ye,"getCodexCliKnownModels");function ke(){return Qt([ae(),...io])}i(ke,"getGeminiCliKnownModels");var ft=ae(),ao=ke(),co={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},De=class extends ie{static{i(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:ft,models:ao.filter(e=>e!==ft).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new Se({model:ft});this.acpClientOptions=Oe(e)}getCapabilityProfile(){return X(co)}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 Ie=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 Ae("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 gt=se(),lo=ye(),Ke=class extends ie{static{i(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:gt,models:lo.filter(e=>e!==gt).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Ie({model:gt});this.acpClientOptions=Oe(e)}};import uo from"@anthropic-ai/sdk";var qt=ae(),po=ke(),Zt=se(),mo=ye(),N={anthropic:{apiKeyEnv:"ANTHROPIC_API_KEY",model:"claude-sonnet-4-6",models:[{id:"claude-opus-4-6",displayName:"Opus 4.6",thinkingBudgetCap:28e3},{id:"claude-haiku-4-5",displayName:"Haiku 4.5",thinkingBudgetCap:1e4}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:2e5,maxOutputTokens:64e3,thinkingBudgetCap:28e3},openai:{apiKeyEnv:"OPENAI_API_KEY",model:"gpt-5.3-codex",models:[{id:"gpt-5.4",displayName:"GPT-5.4"},{id:"gpt-5.3-codex-spark",displayName:"GPT-5.3 Codex Spark"}],reasoningCapability:"native-effort",capabilityProfile:B,supportsThinking:!0,contextWindow:4e5,maxOutputTokens:32768},deepseek:{apiKeyEnv:"DEEPSEEK_API_KEY",model:"deepseek-v4-flash",models:[{id:"deepseek-v4-pro",displayName:"DeepSeek V4 Pro"}],reasoningCapability:"native-effort",capabilityProfile:B,supportsThinking:!0,contextWindow:1e6,maxOutputTokens:64e3},kimi:{apiKeyEnv:"KIMI_API_KEY",model:"kimi-k2.6",models:[{id:"k2.5",displayName:"K2.5"}],reasoningCapability:"native-effort",capabilityProfile:B,supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32768},"kimi-code":{apiKeyEnv:"KIMI_API_KEY",model:"kimi-for-coding",reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32e3},qwen:{apiKeyEnv:"QWEN_API_KEY",model:"qwen3.5-plus",reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32768},zhipu:{apiKeyEnv:"ZHIPU_API_KEY",model:"glm-5",models:[{id:"glm-5.1",displayName:"GLM-5.1"},{id:"glm-5-turbo",displayName:"GLM-5 Turbo"}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32768},"zhipu-coding":{apiKeyEnv:"ZHIPU_API_KEY",model:"glm-5",models:[{id:"glm-5.1",displayName:"GLM-5.1"},{id:"glm-5-turbo",displayName:"GLM-5 Turbo"}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:2e5,maxOutputTokens:16e3,thinkingBudgetCap:16e3},"minimax-coding":{apiKeyEnv:"MINIMAX_API_KEY",model:"MiniMax-M2.7",models:[{id:"MiniMax-M2.7-highspeed",displayName:"MiniMax M2.7 Highspeed (higher-tier plan)"},{id:"MiniMax-M2.5",displayName:"MiniMax M2.5"},{id:"MiniMax-M2.5-highspeed",displayName:"MiniMax M2.5 Highspeed (higher-tier plan)"},{id:"MiniMax-M2.1",displayName:"MiniMax M2.1"},{id:"MiniMax-M2.1-highspeed",displayName:"MiniMax M2.1 Highspeed (higher-tier plan)"},{id:"MiniMax-M2",displayName:"MiniMax M2"}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:204800,maxOutputTokens:32e3},"mimo-coding":{apiKeyEnv:"MIMO_API_KEY",model:"mimo-v2.5-pro",models:[{id:"mimo-v2.5",displayName:"MiMo V2.5"}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:1e6,maxOutputTokens:32e3,thinkingBudgetCap:16e3},"ark-coding":{apiKeyEnv:"ARK_API_KEY",model:"glm-5.1",models:[{id:"glm-4.7",displayName:"GLM-4.7"},{id:"kimi-k2.6",displayName:"Kimi K2.6",contextWindow:256e3},{id:"kimi-k2.5",displayName:"Kimi K2.5",contextWindow:256e3},{id:"minimax-latest",displayName:"MiniMax Latest",contextWindow:204800},{id:"deepseek-v3.2",displayName:"DeepSeek V3.2",contextWindow:128e3},{id:"deepseek-v4-pro",displayName:"DeepSeek V4 Pro",contextWindow:1e6},{id:"deepseek-v4-flash",displayName:"DeepSeek V4 Flash",contextWindow:1e6},{id:"doubao-seed-2.0-code",displayName:"Doubao Seed 2.0 Code",contextWindow:256e3},{id:"doubao-seed-2.0-pro",displayName:"Doubao Seed 2.0 Pro",contextWindow:256e3},{id:"doubao-seed-2.0-lite",displayName:"Doubao Seed 2.0 Lite",contextWindow:256e3}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32e3},"gemini-cli":{apiKeyEnv:"GEMINI_API_KEY",model:qt,models:po.filter(t=>t!==qt).map(t=>({id:t})),reasoningCapability:"prompt-only",capabilityProfile:jt,supportsThinking:!1},"codex-cli":{apiKeyEnv:"OPENAI_API_KEY",model:Zt,models:mo.filter(t=>t!==Zt).map(t=>({id:t})),reasoningCapability:"prompt-only",capabilityProfile:ge,supportsThinking:!1}};function W(t,e={}){let n=N[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(W,"buildProviderConfig");var ht=class extends L{static{i(this,"AnthropicProvider")}name="anthropic";config=W("anthropic",{strictThinkingSignature:!0});constructor(){super(),this.client=new uo({apiKey:this.getApiKey()})}},yt=class extends L{static{i(this,"ZhipuCodingProvider")}name="zhipu-coding";config=W("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",streamMaxDurationMs:3e5});constructor(){super(),this.initClient()}},kt=class extends L{static{i(this,"KimiCodeProvider")}name="kimi-code";config=W("kimi-code",{baseUrl:"https://api.kimi.com/coding/"});constructor(){super(),this.initClient()}},_t=class extends L{static{i(this,"MiniMaxCodingProvider")}name="minimax-coding";config=W("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic"});constructor(){super(),this.initClient()}},xt=class extends L{static{i(this,"MimoCodingProvider")}name="mimo-coding";config=W("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic"});constructor(){super(),this.initClient()}},vt=class extends L{static{i(this,"ArkCodingProvider")}name="ark-coding";config=W("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding"});constructor(){super(),this.initClient()}},bt=class extends F{static{i(this,"OpenAIProvider")}name="openai";config=W("openai");constructor(){super(),this.initClient()}},Ct=class extends F{static{i(this,"DeepSeekProvider")}name="deepseek";config=W("deepseek",{baseUrl:"https://api.deepseek.com",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Mt=class extends F{static{i(this,"KimiProvider")}name="kimi";config=W("kimi",{baseUrl:"https://api.moonshot.cn/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Tt=class extends F{static{i(this,"QwenProvider")}name="qwen";config=W("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Et=class extends F{static{i(this,"ZhipuProvider")}name="zhipu";config=W("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",replayReasoningContent:!0});constructor(){super(),this.initClient()}},U={anthropic:i(()=>new ht,"anthropic"),openai:i(()=>new bt,"openai"),deepseek:i(()=>new Ct,"deepseek"),kimi:i(()=>new Mt,"kimi"),"kimi-code":i(()=>new kt,"kimi-code"),qwen:i(()=>new Tt,"qwen"),zhipu:i(()=>new Et,"zhipu"),"zhipu-coding":i(()=>new yt,"zhipu-coding"),"minimax-coding":i(()=>new _t,"minimax-coding"),"mimo-coding":i(()=>new xt,"mimo-coding"),"ark-coding":i(()=>new vt,"ark-coding"),"gemini-cli":i(()=>new De,"gemini-cli"),"codex-cli":i(()=>new Ke,"codex-cli")},Pt=process.env.KODAX_PROVIDER??"zhipu-coding",en=new Map;function fo(t){if(O(t))return N[t].apiKeyEnv}i(fo,"resolveApiKeyEnvForProvider");function tn(t){let e=t??Pt,n=U[e];if(!n)throw new R(`Unknown provider: ${e}. Available: ${Object.keys(U).join(", ")}`,e);let o=fo(e),r=o?process.env[o]:void 0,s=en.get(e);if(s&&s.apiKey===r)return s.instance;let a=n();return en.set(e,{apiKey:r,instance:a}),a}i(tn,"getProvider");function nn(t){return O(t)?!!process.env[N[t].apiKeyEnv]:!1}i(nn,"isProviderConfigured");function on(t){return O(t)?N[t].model:null}i(on,"getProviderModel");function rn(t,e){if(!O(t))return"unknown";let n=N[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}i(rn,"getProviderConfiguredReasoningCapability");function sn(t){return O(t)?X(N[t].capabilityProfile):null}i(sn,"getProviderConfiguredCapabilityProfile");function an(){let t=[];for(let e of Object.keys(U)){let n=N[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:X(n.capabilityProfile)})}return t}i(an,"getProviderList");function cn(t){let e=N[t];return e?e.models?[e.model,...e.models.map(n=>n.id)]:[e.model]:[]}i(cn,"getProviderModels");function O(t){return t in U}i(O,"isProviderName");function wt(t){return{id:t.model}}i(wt,"makeDefaultDescriptor");function Le(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(Le,"effectiveCapabilities");function Ne(t){let e=N[t];return e?[wt(e),...e.models??[]]:[]}i(Ne,"getProviderModelDescriptors");function Be(t,e){let n=N[t];if(!n)return;if(e===n.model)return Le(t,n,wt(n));let o=n.models?.find(r=>r.id===e);if(o)return Le(t,n,o)}i(Be,"getModelCapabilities");function Fe(){let t=[];for(let e of Object.keys(U)){let n=N[e];t.push(Le(e,n,wt(n)));for(let o of n.models??[])t.push(Le(e,n,o))}return t}i(Fe,"listBuiltinModelCapabilities");var go=new Set(["compat","sdk"]);function _e(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&&!go.has(t.userAgentMode))throw new Error(`Unknown userAgentMode "${t.userAgentMode}" for custom provider "${t.name}". Must be "compat" or "sdk".`)}i(_e,"validateCustomProviderConfig");function ho(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(ho,"buildProviderConfig");function Ue(t){_e(t);let e=ho(t);return t.protocol==="anthropic"?new Rt(t.name,e):new At(t.name,e)}i(Ue,"createCustomProvider");var Rt=class extends L{static{i(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}},At=class extends F{static{i(this,"DynamicOpenAIProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}};var H=new Map,St=new Map;function ln(t){let e=new Set,n=new Map,o=new Map;for(let r of t){if(_e(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 U&&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,()=>Ue(r))}H.clear(),St.clear();for(let[r,s]of n)H.set(r,s);for(let[r,s]of o)St.set(r,s)}i(ln,"registerCustomProviders");function Xe(t){let e=St.get(t);return e?e():void 0}i(Xe,"getCustomProvider");function le(t){return H.has(t)}i(le,"isCustomProviderName");function We(){return[...H.keys()]}i(We,"getCustomProviderNames");function un(){let t=[];for(let[e,n]of H){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:X(n.capabilityProfile??fe),custom:!0})}return t}i(un,"getCustomProviderList");function pn(t){let e=H.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(pn,"getCustomProviderModels");function dn(t){return typeof t=="string"?{id:t}:t}i(dn,"customDescriptorToFull");function $e(t){let e=H.get(t);if(!e)return;let n={id:e.model},o=(e.models??[]).map(dn).filter(r=>r.id!==e.model);return[n,...o]}i($e,"getCustomProviderModelDescriptors");function ce(t,e){let n=H.get(t);if(!n)return;let o=e===n.model,r=o?{id:n.model}:(n.models??[]).map(dn).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(ce,"getCustomModelCapabilities");function je(){let t=[];for(let[e,n]of H){let o=ce(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=ce(e,s);a&&t.push(a)}}return t}i(je,"listCustomProviderModelCapabilities");var Y=new Map,yo=0;function Ot(t){let e=Y.get(t);if(!(!e||e.length===0))return e[e.length-1]}i(Ot,"getActiveRuntimeProviderRegistration");function ko(t){for(let[e,n]of Y){let o=n.filter(r=>r.id!==t);if(o.length!==n.length){o.length===0?Y.delete(e):Y.set(e,o);return}}}i(ko,"removeRuntimeProviderRegistration");function mn(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(le(n))throw new Error(`Runtime model provider "${n}" conflicts with an existing config-defined custom provider.`);let o={id:`runtime-provider:${++yo}`,name:n,factory:e},r=Y.get(n)??[];return Y.set(n,[...r,o]),()=>{ko(o.id)}}i(mn,"registerModelProvider");function ze(t){let e=Ot(t);return e?e.factory():void 0}i(ze,"getRuntimeModelProvider");function Ge(t){return Ot(t)!==void 0}i(Ge,"isRuntimeModelProviderName");function Ve(){return Array.from(Y.keys()).filter(t=>Ot(t)!==void 0)}i(Ve,"getRuntimeModelProviderNames");function fn(){Y.clear()}i(fn,"clearRuntimeModelProviders");function gn(t){if(O(t))return U[t]();let e=ze(t);if(e)return e;let n=Xe(t);if(n)return n;let o=Dt();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}i(gn,"resolveProvider");function hn(t){return O(t)||Ge(t)||le(t)}i(hn,"isKnownProvider");function Dt(){let t=Object.keys(U),e=Ve(),n=We();return[...new Set([...t,...e,...n])]}i(Dt,"getAvailableProviderNames");function yn(t){return O(t)?Ne(t):$e(t)??[]}i(yn,"resolveProviderModelDescriptors");function kn(t,e){return O(t)?Be(t,e):ce(t,e)}i(kn,"resolveModelCapabilities");function _n(){return[...Fe(),...je()]}i(_n,"listAllModelCapabilities");var xn={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 It(t,e,n){let o=n?.[t]?.[e];return o||xn[t]?.[e]}i(It,"getCostRate");function Kt(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(Kt,"calculateCost");function _o(){return{records:[],retries:[]}}i(_o,"createCostTracker");function xo(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(xo,"recordRetry");function Lt(t,e,n){let o=It(e.provider,e.model,n),r=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?Kt(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(Lt,"recordUsage");function vo(t){let e=0,n=0,o=0,r=0,s=0,a=0,c={},u={};for(let m of t.records){e+=m.cost,n+=m.inputTokens,o+=m.outputTokens,r+=m.cacheReadTokens+m.cacheWriteTokens,s+=m.cacheReadTokens,a+=m.cacheWriteTokens;let k=c[m.provider];c[m.provider]={cost:(k?.cost??0)+m.cost,calls:(k?.calls??0)+1,inputTokens:(k?.inputTokens??0)+m.inputTokens,outputTokens:(k?.outputTokens??0)+m.outputTokens};let _=m.role??"default",b=u[_];u[_]={cost:(b?.cost??0)+m.cost,calls:(b?.calls??0)+1,inputTokens:(b?.inputTokens??0)+m.inputTokens,outputTokens:(b?.outputTokens??0)+m.outputTokens}}let d=0;for(let m of t.retries)d+=m.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:d,byProvider:c,byRole:u}}i(vo,"getSummary");function He(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}i(He,"formatCost");function bo(t){let e=[];if(e.push(`Session Cost: ${He(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}: ${He(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}: ${He(s.cost)} (${s.calls} calls)`)}return e.join(`
|
|
31
|
+
`)}i(bo,"formatCostReport");var vn={inputTokens:0,outputTokens:0,totalTokens:0},Co=3e4;async function Mo(t){let e=new AbortController,n=t.timeoutMs??Co,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),u=c.usage??vn,d=c.textBlocks??[],l=c.toolBlocks??[],m=d.map(_=>_.text).join("");if(l.length>0)return{text:m,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 k=t.costTracker;return k&&(k=Lt(k,{provider:t.provider.name,model:t.model,inputTokens:u.inputTokens,outputTokens:u.outputTokens,cacheReadTokens:u.cachedReadTokens,cacheWriteTokens:u.cachedWriteTokens,role:t.querySource})),{text:m,usage:u,costTracker:k,stopReason:To(c.stopReason)}}catch(c){let u=c instanceof Error?c:new Error(String(c)),d="error";return e.signal.aborted&&(d=o==="timeout"?"timeout":"aborted"),{text:"",usage:vn,costTracker:t.costTracker,stopReason:d,error:u}}finally{clearTimeout(s),t.abortSignal&&t.abortSignal.removeEventListener("abort",a)}}i(Mo,"sideQuery");function To(t){return t==="max_tokens"?"max_tokens":"end_turn"}i(To,"mapStopReason");export{V as a,R as b,me as c,Ye as d,Je as e,Qe as f,Q as g,qe as h,bn as i,Cn as j,Nt as k,Bt as l,Ze as m,q as n,ve as o,Ft as p,Z as q,ee as r,et as s,it as t,rt as u,te as v,Ce as w,at as x,Rn as y,Me as z,Te as A,Ee as B,G as C,ne as D,ct as E,oe as F,lt as G,he as H,L as I,F as J,se as K,ae as L,ye as M,ke as N,N as O,U as P,Pt as Q,tn as R,nn as S,on as T,rn as U,sn as V,an as W,cn as X,O as Y,Ne as Z,Be as _,Fe as $,_e as aa,Ue as ba,ln as ca,Xe as da,le as ea,We as fa,un as ga,pn as ha,$e as ia,ce as ja,je as ka,mn as la,ze as ma,Ge as na,Ve as oa,fn as pa,gn as qa,hn as ra,Dt as sa,yn as ta,kn as ua,_n as va,xn as wa,It as xa,Kt as ya,_o as za,xo as Aa,Lt as Ba,vo as Ca,He as Da,bo as Ea,Mo as Fa};
|