@kodax-ai/kodax 0.7.46 → 0.7.47
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 +19 -1
- package/dist/chunks/{chunk-Z4UT32NN.js → chunk-2SMCCP44.js} +1 -1
- package/dist/chunks/{chunk-2GEKCIIW.js → chunk-66B6ZOU7.js} +13 -13
- package/dist/chunks/{chunk-JRT447X5.js → chunk-KRHAO2T3.js} +217 -215
- package/dist/chunks/{chunk-K4RBLNSY.js → chunk-QZFZIGPF.js} +1 -1
- package/dist/chunks/{chunk-XUEINS3X.js → chunk-VGRG2F6H.js} +301 -263
- package/dist/chunks/chunk-VX6HN3JP.js +415 -0
- package/dist/chunks/{compaction-config-PFTBIGQT.js → compaction-config-YU7SI6L6.js} +1 -1
- package/dist/chunks/{construction-bootstrap-2FKNOZZE.js → construction-bootstrap-6UN3OY7X.js} +1 -1
- package/dist/chunks/dist-DS2KIZQG.js +2 -0
- package/dist/chunks/{dist-QTV5M2JW.js → dist-IDNOAB4M.js} +1 -1
- package/dist/chunks/{utils-LY3LB65Z.js → utils-3ISOUEFC.js} +1 -1
- package/dist/index.d.ts +7 -4
- package/dist/index.js +5 -5
- package/dist/kodax_cli.js +736 -706
- package/dist/provider-capabilities.json +3 -8
- package/dist/sdk-agent.d.ts +34 -3
- package/dist/sdk-agent.js +1 -1
- package/dist/sdk-coding.d.ts +65 -5
- package/dist/sdk-coding.js +1 -1
- 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 +4 -3
- package/dist/sdk-repl.js +1 -1
- package/dist/sdk-session.js +1 -1
- package/dist/sdk-skills.js +1 -1
- package/dist/types-chunks/{bash-prefix-extractor.d-BICYx8pt.d.ts → bash-prefix-extractor.d-D6hL0Cuv.d.ts} +280 -2
- package/dist/types-chunks/{manager.d-87belpiS.d.ts → manager.d-U3UEwY1P.d.ts} +15 -0
- package/dist/types-chunks/{utils.d-pzHPkrb8.d.ts → utils.d-umRKgMAu.d.ts} +1 -1
- package/package.json +2 -1
- package/dist/chunks/chunk-VBIVZOSD.js +0 -425
- package/dist/chunks/dist-JLMKDPEL.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
> Full history for versions prior to v0.7.0: [CHANGELOG_ARCHIVE.md](docs/CHANGELOG_ARCHIVE.md)
|
|
6
6
|
|
|
7
|
+
## [0.7.47] - 2026-06-10
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **FEATURE_132 — Native LSP integration: edit-time diagnostics reflux (TS/JS, Python, Go, Rust, Java).** After the `write` / `edit` / `multi_edit` tools change a file, KodaX now opens it through a language server and refluxes any type ERRORs straight back into the tool result, so the agent fixes them the same turn instead of waiting for the next build (saving ≥1 LLM round-trip). Servers are discovered on `PATH` / project `node_modules` (typescript-language-server, pyright, gopls, rust-analyzer, jdtls); when none is installed the feature is **silent** (no nagging), and a one-shot blacklist + spawn-dedup keep it cheap. It is **default-on but self-limiting**: only ERROR severity, ≤20 per file, a 5s per-file wait that runs OUTSIDE the file-mutation lock, and `KODAX_LSP=0` disables it entirely. Auto-installing a missing server is **opt-in** (`KODAX_LSP_DOWNLOAD=1`; `KODAX_LSP_NO_DOWNLOAD=1` hard-off) — KodaX never runs `go install` / `npm i` unprompted. The LSP TypeScript server runs as its own subprocess, isolated from the in-process repo-intelligence TS engine. It also adds four read-only navigation tools — `lsp_definition` / `lsp_hover` / `lsp_references` / `lsp_document_symbols` — for precise, position-anchored, real-time questions about the current code (complementing the repo-scope repo-intelligence symbol tools; the tool descriptions teach the boundary). Implemented under `packages/coding/src/lsp/`; new exports from `@kodax-ai/coding`: `LspService`, `getDefaultLspService`, `shutdownDefaultLspService`, `languageIdForPath`. See [docs/features/v0.7.47.md FEATURE_132](docs/features/v0.7.47.md).
|
|
12
|
+
- **FEATURE_221 — Injectable self-manual for SDK consumers (`selfManual`).** Products built on the KodaX SDK (e.g. KodaX-Space) can now inject their **own** product manual so the built-in `kodax_manual` tool answers *their* users' "how do I use / configure …?" questions on-brand, instead of returning KodaX's internal manual. `runKodaX({ selfManual: { productName, topics } })` re-brands the ≤250-token routing rule + scope anchors to `productName` and **extend-merges** your `KodaXManualTopicInput[]` over KodaX's base topics (same `id` overrides, new `id` appends), so users can still ask about the underlying provider / config / SDK topics. **Opt-in and backward-compatible** — omit `selfManual` and the system prompt is byte-identical to before. Topics stay **tool-on-demand and 4 KB-capped**: nothing large is injected into the prompt, only the short routing rule. New exports from `@kodax-ai/coding`: `KodaXManualTopicInput`, `KodaXSelfManualConfig`, `ResolveKodaXManualOptions`, `buildSelfKnowledgeRoutingRule`. See [SDK Embedder Guide §11](docs/SDK_EMBEDDER_GUIDE.md) + [docs/features/v0.7.47.md FEATURE_221](docs/features/v0.7.47.md).
|
|
13
|
+
- **FEATURE_218 — KodaX self-knowledge manual + `kodax_manual` help tool.** KodaX now ships a version-bound, structured product manual (17 topics: overview / install / providers / custom-providers / config / permissions / commands / tools / agents / skills / mcp / repo-intelligence / sessions / doctor / sdk / troubleshooting) behind a read-only `kodax_manual` tool, plus a ≤250-token routing rule that tells the model to look up KodaX usage/config questions instead of guessing or mixing in Claude Code / Codex CLI knowledge. The provider list is sourced from the single-source-of-truth capability snapshots (drift-proof, not hand-copied) and each answer is anchored to KodaX scope. REPL `/help <topic>` reuses the same registry. Lookup is deterministic (exact id → alias, incl. Chinese → query token-overlap → index) and never fabricates; single-topic output ≤4 KB, index ≤2 KB. No RAG, no vector DB, no background index, no prompt bloat. See [docs/features/v0.7.47.md FEATURE_218](docs/features/v0.7.47.md).
|
|
14
|
+
- **MCP client — protocol `2025-11-25` compatibility (P0+P1).** KodaX's self-built MCP client now speaks the `2025-11-25` revision. **P0 (protocol compliance):** answers a server `ping` with an empty result instead of `-32601`; emits `notifications/cancelled` when a request times out (the `initialize` request is exempt); and resumes a dropped Streamable-HTTP notification stream via SSE `id`/`retry` + `Last-Event-ID`, with a reconnect cap so an empty-EOF stream can't reconnect-loop forever. **P1 (version + data surface):** advertises protocol `2025-11-25` with negotiation validation + the `MCP-Protocol-Version` header; carries tool/resource/prompt `icons` into descriptors (filtering unsafe URI schemes); and surfaces `execution.taskSupport`, failing fast on task-required tools. Unwired `elicitation` dead code removed. (Reverse / server-side capabilities are planned as FEATURE_222 for v0.7.48.)
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- **FEATURE_220 — Continuous thinking + tool-call block rendering.** Consecutive `thinking` blocks now render collapsed to a single line by default (`Ctrl+O` / show-all still expands the full content; `KODAX_THINKING_COLLAPSE=0` opts out), and a run of consecutive thinking / tool-call items reads as one continuous "working block" with the inter-item blank lines suppressed (`KODAX_TRANSCRIPT_TIGHT=0` opts out), instead of a stack of separately-titled cards. Pure transcript-rendering change — no LLM-facing prompt is touched. (The originally-planned read-only tool grouping was implemented then reverted after review, because the synthetic group key broke scroll / selection / search and churned the inline scrollback ledger.) See [docs/features/v0.7.47.md FEATURE_220](docs/features/v0.7.47.md).
|
|
19
|
+
- **Coding-plan provider model lineups refreshed (2026-06 gateway catch-up).** `ark-coding` drops the no-longer-routed `kimi-k2.5` and the retired `minimax-latest` floating alias, adding the two explicit MiniMax revisions the gateway now exposes — `MiniMax-M3` (Frontier Coding, native multimodal, 1M context) and `MiniMax-M2.7` (204K) — keeping its routed-model count at 11. `minimax-coding` trims the retired `M2.5` / `M2.1` / `M2` family (7 → 2 alternates), keeping `MiniMax-M2.7` (default) + `MiniMax-M3` + `MiniMax-M2.7-highspeed`, so `/model` completion and the default-model APIs only surface ids the gateway still routes (the removed ids were upstream-404 traps). Subscription placeholder cost rates updated to match.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **Spawned subprocesses are now torn down as a tree, not just the direct child.** Every subprocess KodaX spawns — language servers (FEATURE_132), the `bash` tool, MCP stdio transports, the ACP server, and CLI-event children — is tracked as a managed child-process tree and killed whole on shutdown / timeout / abort (POSIX process groups, with exited groups reaped), so a terminated parent no longer orphans its grandchildren (a shell's sub-processes, a language server's workers, etc.). Centralized in `@kodax-ai/agent` (`managed-child-processes` + `process-tree`) and wired into every spawn site.
|
|
24
|
+
|
|
7
25
|
## [0.7.46] - 2026-06-07
|
|
8
26
|
|
|
9
27
|
### Added
|
|
@@ -745,7 +763,7 @@ Two features close out v0.7.32 and the Plan B roadmap. **FEATURE_090** is the ro
|
|
|
745
763
|
### Documentation
|
|
746
764
|
|
|
747
765
|
- **EVAL_GUIDELINES rewrite** — `benchmark/EVAL_GUIDELINES.md` now documents the **single-turn probe methodology** as the official KodaX eval pattern and removes end-to-end loop comparisons from the recommended set. Loops conflate prompt quality with tool-availability artefacts (model tries to verify with `read`/`grep`/`bash`, harness can't provide tools, benchmark scores the format-fail). Single-turn probes test the prompt-only contract.
|
|
748
|
-
- **FEATURE_108 design** (`docs/features/v0.7.47.md`) — Session-Driven Reflective Prompt Patcher spec landed for v0.7.47 design preview.
|
|
766
|
+
- **FEATURE_108 design** (`docs/features/v0.7.47.md`) — Session-Driven Reflective Prompt Patcher spec landed for v0.7.47 design preview.(注:2026-06-05 版本重排后 FEATURE_108 迁至 [`docs/features/v0.7.54.md`](docs/features/v0.7.54.md);`v0.7.47.md` 现为 FEATURE_218 + FEATURE_132)
|
|
749
767
|
- **FEATURE_109 design** (`docs/features/v0.7.48.md`) — Harness Observability Substrate (long-term memory + prediction contract + cross-family prose guard) spec landed for v0.7.48 design preview.
|
|
750
768
|
- **`docs/features/v0.7.29.md` 1496-line expansion** — folds back the historical capability-inventory artifact (`v0.7.29-capability-inventory.md` deleted) and adds deeper FEATURE_103/104/107-related context to the v0.7.29 retrospective.
|
|
751
769
|
- **`docs/CODING_AGENT_PROMPTS.md`** — cross-project prompt-system reference (4 open-source coding agents) for KodaX prompt design comparison. Research artefact, not a project doc.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
-
import{wa as e}from"./chunk-
|
|
2
|
+
import{wa as e}from"./chunk-VX6HN3JP.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};
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
-
import{a as i}from"./chunk-V4WSBIXB.js";var G=class extends Error{static{i(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},R=class extends G{static{i(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},ge=class extends G{static{i(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},nt=class extends G{static{i(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},ot=class extends G{static{i(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var it=32768,Nn=32e3,Kn=64e3,Fn=.5;var $n=["off","auto","quick","balanced","deep"],Gt={low:6e3,medium:1e4,high:2e4},Ht=4096;function rt(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}i(rt,"getReasoningCapability");function Q(t){return Te(t).enabled}i(Q,"isReasoningEnabled");function Te(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??Jt(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(Te,"normalizeReasoningRequest");function Jt(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}i(Jt,"getDefaultThinkingDepthForMode");function Z(t,e,n="unknown"){if(e==="off")return 0;let o={...Gt,...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=Ht){let o=Math.max(1024,e-n);return Math.max(1024,Math.min(t,o))}i(ee,"clampThinkingBudget");function st(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}i(st,"mapDepthToOpenAIReasoningEffort");import Me from"fs";import Un from"os";import lt from"path";var at=null;function jn(t){return t==="budget"||t==="effort"||t==="toggle"||t==="none"}i(jn,"isReasoningOverride");function Xn(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(jn)}i(Xn,"isStoredConfig");function Wn(){return process.env.KODAX_HOME??lt.join(Un.homedir(),".kodax")}i(Wn,"getKodaxDir");function Yt(){return process.env.KODAX_CONFIG_FILE??lt.join(Wn(),"config.json")}i(Yt,"getConfigFilePath");function ct(t,e){return at={filePath:t,config:e},e}i(ct,"updateStoredConfigCache");function zn(t){let e=JSON.parse(Me.readFileSync(t,"utf-8"));return Xn(e)?e:{}}i(zn,"readStoredConfigFromDisk");function ut(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(ut,"reasoningCapabilityToOverride");function dt(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}i(dt,"reasoningOverrideToCapability");function te(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}i(te,"buildReasoningOverrideKey");function pt(){let t=Yt();if(at?.filePath===t)return at.config;try{if(Me.existsSync(t))return ct(t,zn(t))}catch{}return ct(t,{})}i(pt,"loadStoredConfig");function qt(t){let e=Yt();try{Me.mkdirSync(lt.dirname(e),{recursive:!0}),Me.writeFileSync(e,JSON.stringify(t,null,2)),ct(e,t)}catch(n){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",n)}}i(qt,"saveStoredConfig");function Ee(t,e,n){let o=pt(),r=te(t,e,n);return o.providerReasoningOverrides?.[r]}i(Ee,"loadReasoningOverride");function ft(t,e,n,o){let r=pt(),s=te(t,e,o);r.providerReasoningOverrides={...r.providerReasoningOverrides??{},[s]:n},qt(r)}i(ft,"saveReasoningOverride");function Vn(t,e,n){let o=pt(),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,qt(o)}i(Vn,"clearReasoningOverride");function Qt(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(Qt,"readHeader");function Zt(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(Zt,"parsePositiveNumber");function Gn(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(Gn,"parseHttpDate");function Pe(t,e){let n=e.baseBackoffMs??1e3,o=e.maxBackoffMs??3e4,r=e.maxHeaderWaitMs??12e4,s=e.now?e.now():Date.now(),a=Zt(Qt(t,"retry-after-ms"));if(a!==void 0){let y=Math.min(a,r);return{type:"header",waitMs:Math.round(y),source:"retry-after-ms",cappedFromHeader:y!==a}}let c=Qt(t,"retry-after");if(c!==void 0&&c.trim().length>0){let y=Zt(c);if(y!==void 0){let h=y*1e3,f=Math.min(h,r);return{type:"header",waitMs:Math.round(f),source:"retry-after-seconds",cappedFromHeader:f!==h}}let k=Gn(c,s);if(k!==void 0){let h=Math.min(k,r);return{type:"header",waitMs:Math.round(h),source:"retry-after-date",cappedFromHeader:h!==k}}}let u=n*Math.pow(2,Math.max(0,e.attempt)),d=Math.min(u,o),p=e.withJitter!==!1?Math.random()*.25*d:0;return{type:"backoff",waitMs:Math.round(d+p),source:"exponential-backoff",attempt:e.attempt}}i(Pe,"parseRetryAfter");function Se(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}i(Se,"extractHeadersFromError");var Y={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},en={...Y,multimodalSupport:"image-input"},he={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},tn={...he,multimodalSupport:"image-input"};function Re(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(Re,"normalizeCapabilityProfile");function U(t){return{...Re(t)}}i(U,"cloneCapabilityProfile");function Hn(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}i(Hn,"parseEnvInt");var z=class{static{i(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let n=Hn(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]}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){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 U(this.config.capabilityProfile??Y)}getConfiguredReasoningCapability(e){let n=this.getModelDescriptor(e);return n?.reasoningCapability?n.reasoningCapability:rt(this.config)}getReasoningCapability(e){let n=Ee(this.name,this.config,e);return n?dt(n):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return Ee(this.name,this.config,e)}getReasoningOverrideKey(e){return te(this.name,this.config,e)}persistReasoningCapabilityOverride(e,n){let o=ut(e);o&&ft(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 Te(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=Se(e);if(!n)return;let o=Pe(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 ge(`API rate limit exceeded after ${o} retries. Please wait and try again later.`,6e4);let u=Se(c)??{},d=Pe(u,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),l=d.waitMs,p=this.classifyRateLimitReason(c);if(s?.({provider:this.name,waitMs:l,reason:p,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(y=>setTimeout(y,l)),n?.aborted)throw new DOMException("Request aborted","AbortError");continue}if(c instanceof Error){if((c.name==="AbortError"||c.name==="APIUserAbortError")&&n?.aborted)throw c.name==="AbortError"?c:new DOMException(c.message||"Request aborted","AbortError");let 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 G("Unexpected end of withRateLimit")}};import eo from"@anthropic-ai/sdk";import{parse as Jn}from"partial-json";function ne(t){if(!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{}try{let e=Jn(t);return process.env.KODAX_DEBUG_TOOL_STREAM&&console.warn("[Tool Block Salvaged] partial JSON recovered, rawLength=",t.length),e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}i(ne,"parseToolInputWithSalvage");async function oe(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(d=>d.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 n=new AbortController,o=t.timeoutMs??8e3,r,s=i(d=>{r||(r=d),n.abort()},"recordAbort"),a=setTimeout(()=>s("timeout"),o),c=i(()=>s("parent"),"onParentAbort");t.signal&&t.signal.addEventListener("abort",c,{once:!0});let u=Date.now();try{return await e.run(n.signal),{ok:!0,strategy:t.strategy,durationMs:Date.now()-u,approxTokensSpent:e.approxTokensSpent}}catch(d){return mt(d,{strategy:t.strategy,durationMs:Date.now()-u,approxTokensSpent:0,abortCause:r,providerName:t.providerName})}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",c)}}i(oe,"runVerifyCredential");function Yn(t){return t.replace(/\bsk-[A-Za-z0-9_-]{6,}/g,"sk-***")}i(Yn,"redactKeyMaterial");function mt(t,e){let n=t,o=n.status??n.statusCode??n.response?.status,r=Yn(String(n.message??t)).slice(0,240),s=n.cause?.code??n.code,a=n.constructor?.name??"",c;return e.abortCause==="timeout"?c="timeout":e.abortCause==="parent"?c="unknown":a==="AuthenticationError"||a==="PermissionDeniedError"||o===401||o===403?c="unauthorized":o===429?c="rate_limited":o===400&&e.strategy==="count-tokens"&&e.providerName==="kimi-code"?c="unauthorized":o!==void 0&&o>=500&&o<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(r)?c="timeout":c="unknown",{ok:!1,error:c,status:o,message:r,durationMs:e.durationMs,approxTokensSpent:e.approxTokensSpent,strategy:e.strategy}}i(mt,"classifyVerifyError");function gt(t,e){let n=t[t.length-1];if(n&&ie(n)&&n.hint===e)return t;let o=e?{type:"cache-boundary",hint:e}:{type:"cache-boundary"};return[...t,o]}i(gt,"insertCacheBoundary");function ie(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(ie,"isCacheBoundary");function ht(t,e){let n=[];for(let o of t){if(ie(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(ht,"lowerCacheBoundaries");function ye(t){return t.filter(e=>!ie(e))}i(ye,"stripCacheBoundaries");import{readFile as qn}from"node:fs/promises";import Qn from"node:path";var Zn={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function we(t,e){return e??Zn[Qn.extname(t).toLowerCase()]??"image/png"}i(we,"resolveImageMediaType");async function Ae(t){return(await qn(t)).toString("base64")}i(Ae,"readImageFileAsBase64");async function nn(t,e){let n=we(t,e),o=await Ae(t);return`data:${n};base64,${o}`}i(nn,"buildImageDataUrl");var to="KodaX";function no(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":to}}i(no,"getAnthropicCompatDefaultHeaders");function yt(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(yt,"normalizeAnthropicUsage");var I=class extends z{static{i(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;client;initClient(){let e=no(this.config);this.client=new eo({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}async verifyCredential(e){let n=this.config.model,o=this.client,r=[{strategy:"count-tokens",approxTokensSpent:0,run:i(async s=>{await o.messages.countTokens({model:n,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")},{strategy:"models-list",approxTokensSpent:0,run:i(async s=>{await o.models.list({},{signal:s})},"run")},{strategy:"minimal-message",approxTokensSpent:7,run:i(async s=>{await o.messages.create({model:n,max_tokens:1,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")}];return oe({strategy:this.config.verifyStrategy??"count-tokens",runners:r,timeoutMs:e?.timeoutMs,signal:e?.signal,providerName:this.name})}applyCacheControlToSystem(e){if(!e.trim()||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=gt([{type:"text",text:e}],"system");return ht(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),p=c.enabled?this.getReasoningCapability(u):"none",y=c.enabled?this.getReasoningFallbackChain(p).filter(x=>x==="native-budget"||x==="native-toggle"||x==="none"):["none"],k=i(x=>{let P={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n),stream:!0};if(x==="native-budget"){let D=Z(this.config,c.depth,c.taskType);P.thinking={type:"enabled",budget_tokens:ee(D,d)}}else x==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let h=[],f=[],C=[],b,_=null,m="",g="",M="",S="",j="",B="",X="",E=!1,W,O=Date.now(),xe=Date.now(),pe,fe;for(let x of y)try{pe=await this.client.messages.create(k(x),a?{signal:a}:{}),x!==p&&this.persistReasoningCapabilityOverride(x,u);break}catch(P){fe=P;let D=x==="native-budget"?["budget_tokens","thinking"]:x==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...D))throw P}if(!pe)throw fe??new R("All reasoning capability attempts failed without a captured error",this.name);let me=Date.now(),T=0,L=0,N=3e4;for await(let x of pe){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let P=Date.now(),D=P-me;if(D>N&&(T++,L+=D,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(D/1e3)}s gap before ${x.type}`,{stallCount:T,totalStallMs:L,eventType:x.type})),me=P,x.type==="content_block_start"||x.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),x.type==="content_block_start"){O=Date.now();let v=x.content_block;_=v.type,process.env.KODAX_DEBUG_TOOL_STREAM&&v.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:v.type,id:v.id,name:v.name}),v.type==="thinking"?(g="",M=v.signature??""):v.type==="redacted_thinking"?(_="redacted_thinking",S=v.data??""):v.type==="text"?m="":v.type==="tool_use"&&(j=v.id,B=v.name,X="")}else if(x.type==="content_block_delta"){O=Date.now();let v=x.delta;v.type==="thinking_delta"?(g+=v.thinking??"",s?.onThinkingDelta?.(v.thinking??"")):v.type==="text_delta"?(m+=v.text??"",s?.onTextDelta?.(v.text??"")):v.type==="input_json_delta"&&(X+=v.partial_json??"",s?.onToolInputDelta?.(B,v.partial_json??"",j?{toolId:j}:void 0))}else if(x.type==="content_block_stop")O=Date.now(),_==="thinking"?g&&(C.push({type:"thinking",thinking:g,signature:M}),s?.onThinkingEnd?.(g)):_==="redacted_thinking"?(S&&C.push({type:"redacted_thinking",data:S}),S=""):_==="text"?m&&h.push({type:"text",text:m}):_==="tool_use"&&(!j||!B?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify(j),name:JSON.stringify(B),input:X.slice(0,100)}):f.push({type:"tool_use",id:j,name:B,input:ne(X)})),_=null;else if(x.type==="message_stop"){if(E=!0,O=Date.now(),process.env.KODAX_DEBUG_STREAM){let v=Date.now()-xe;this.logStreamDiagnostic(`[Stream] message_stop received after ${v}ms`)}}else if(x.type==="message_delta"){O=Date.now(),b=yt(x.usage,b);let v=x.delta;v?.stop_reason&&(W=v.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${W}`))}else x.type==="message_start"&&(O=Date.now(),b=yt(x.message?.usage,b),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!E){let x=Date.now()-xe,P=Date.now()-O;if(a?.aborted){let v=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before message_stop:",{duration:x,lastEventAge:P,reason:v,textBlocks:h.length,toolBlocks:f.length,thinkingBlocks:C.length}),new DOMException(v,"AbortError")}let D=new Error(`Stream incomplete: message_stop event not received. Duration: ${x}ms, Last event: ${P}ms ago. This may indicate a network disconnection or API timeout.`);throw D.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:x,lastEventAge:P,textBlocks:h.length,toolBlocks:f.length,thinkingBlocks:C.length}),D}return{textBlocks:h,toolBlocks:f,thinkingBlocks:C,usage:b,stopReason:W}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(r),u=s?.modelOverride??this.config.model,d=this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),p=c.enabled?this.getReasoningCapability(u):"none",y=c.enabled?this.getReasoningFallbackChain(p).filter(m=>m==="native-budget"||m==="native-toggle"||m==="none"):["none"],k=i(m=>{let g={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n)};if(m==="native-budget"){let M=Z(this.config,c.depth,c.taskType);g.thinking={type:"enabled",budget_tokens:ee(M,d)}}else m==="native-toggle"&&(g.thinking={type:"enabled"});return g},"buildRequest"),h,f;for(let m of y)try{h=await this.client.messages.create(k(m),a?{signal:a}:{}),m!==p&&this.persistReasoningCapabilityOverride(m,u);break}catch(g){f=g;let M=m==="native-budget"?["budget_tokens","thinking"]:m==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(g,...M))throw g}if(!h)throw f??new R("All reasoning capability attempts failed without a captured error",this.name);let C=[],b=[],_=[];for(let m of h.content)m.type==="text"?(C.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"&&b.push({type:"tool_use",id:m.id,name:m.name,input:typeof m.input=="object"&&m.input!==null?m.input:{}});return{textBlocks:C,toolBlocks:b,thinkingBlocks:_,usage:yt(h.usage),stopReason:h.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(ie(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(`
|
|
2
|
+
import{a as i}from"./chunk-V4WSBIXB.js";var G=class extends Error{static{i(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},S=class extends G{static{i(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},ge=class extends G{static{i(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},st=class extends G{static{i(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},at=class extends G{static{i(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var ct=32768,zn=32e3,Vn=64e3,Gn=.5;var Hn=["off","auto","quick","balanced","deep"],qt={low:6e3,medium:1e4,high:2e4},Qt=4096;function lt(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}i(lt,"getReasoningCapability");function Q(t){return Me(t).enabled}i(Q,"isReasoningEnabled");function Me(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??Zt(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(Me,"normalizeReasoningRequest");function Zt(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}i(Zt,"getDefaultThinkingDepthForMode");function Z(t,e,n="unknown"){if(e==="off")return 0;let o={...qt,...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=Qt){let o=Math.max(1024,e-n);return Math.max(1024,Math.min(t,o))}i(ee,"clampThinkingBudget");function ut(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}i(ut,"mapDepthToOpenAIReasoningEffort");import Pe from"fs";import Jn from"os";import ft from"path";var dt=null;function Yn(t){return t==="budget"||t==="effort"||t==="toggle"||t==="none"}i(Yn,"isReasoningOverride");function qn(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(Yn)}i(qn,"isStoredConfig");function Qn(){return process.env.KODAX_HOME??ft.join(Jn.homedir(),".kodax")}i(Qn,"getKodaxDir");function en(){return process.env.KODAX_CONFIG_FILE??ft.join(Qn(),"config.json")}i(en,"getConfigFilePath");function pt(t,e){return dt={filePath:t,config:e},e}i(pt,"updateStoredConfigCache");function Zn(t){let e=JSON.parse(Pe.readFileSync(t,"utf-8"));return qn(e)?e:{}}i(Zn,"readStoredConfigFromDisk");function mt(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(mt,"reasoningCapabilityToOverride");function gt(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}i(gt,"reasoningOverrideToCapability");function te(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}i(te,"buildReasoningOverrideKey");function ht(){let t=en();if(dt?.filePath===t)return dt.config;try{if(Pe.existsSync(t))return pt(t,Zn(t))}catch{}return pt(t,{})}i(ht,"loadStoredConfig");function tn(t){let e=en();try{Pe.mkdirSync(ft.dirname(e),{recursive:!0}),Pe.writeFileSync(e,JSON.stringify(t,null,2)),pt(e,t)}catch(n){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",n)}}i(tn,"saveStoredConfig");function we(t,e,n){let o=ht(),r=te(t,e,n);return o.providerReasoningOverrides?.[r]}i(we,"loadReasoningOverride");function yt(t,e,n,o){let r=ht(),s=te(t,e,o);r.providerReasoningOverrides={...r.providerReasoningOverrides??{},[s]:n},tn(r)}i(yt,"saveReasoningOverride");function eo(t,e,n){let o=ht(),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,tn(o)}i(eo,"clearReasoningOverride");function nn(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(nn,"readHeader");function on(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(on,"parsePositiveNumber");function to(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(to,"parseHttpDate");function Se(t,e){let n=e.baseBackoffMs??1e3,o=e.maxBackoffMs??3e4,r=e.maxHeaderWaitMs??12e4,s=e.now?e.now():Date.now(),a=on(nn(t,"retry-after-ms"));if(a!==void 0){let y=Math.min(a,r);return{type:"header",waitMs:Math.round(y),source:"retry-after-ms",cappedFromHeader:y!==a}}let c=nn(t,"retry-after");if(c!==void 0&&c.trim().length>0){let y=on(c);if(y!==void 0){let h=y*1e3,f=Math.min(h,r);return{type:"header",waitMs:Math.round(f),source:"retry-after-seconds",cappedFromHeader:f!==h}}let k=to(c,s);if(k!==void 0){let h=Math.min(k,r);return{type:"header",waitMs:Math.round(h),source:"retry-after-date",cappedFromHeader:h!==k}}}let u=n*Math.pow(2,Math.max(0,e.attempt)),d=Math.min(u,o),p=e.withJitter!==!1?Math.random()*.25*d:0;return{type:"backoff",waitMs:Math.round(d+p),source:"exponential-backoff",attempt:e.attempt}}i(Se,"parseRetryAfter");function Re(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}i(Re,"extractHeadersFromError");var Y={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},rn={...Y,multimodalSupport:"image-input"},he={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},sn={...he,multimodalSupport:"image-input"};function Ae(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(Ae,"normalizeCapabilityProfile");function U(t){return{...Ae(t)}}i(U,"cloneCapabilityProfile");function no(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}i(no,"parseEnvInt");var z=class{static{i(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let n=no(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 S(`${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){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 U(this.config.capabilityProfile??Y)}getConfiguredReasoningCapability(e){let n=this.getModelDescriptor(e);return n?.reasoningCapability?n.reasoningCapability:lt(this.config)}getReasoningCapability(e){let n=we(this.name,this.config,e);return n?gt(n):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return we(this.name,this.config,e)}getReasoningOverrideKey(e){return te(this.name,this.config,e)}persistReasoningCapabilityOverride(e,n){let o=mt(e);o&&yt(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 Me(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=Re(e);if(!n)return;let o=Se(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 ge(`API rate limit exceeded after ${o} retries. Please wait and try again later.`,6e4);let u=Re(c)??{},d=Se(u,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),l=d.waitMs,p=this.classifyRateLimitReason(c);if(s?.({provider:this.name,waitMs:l,reason:p,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(y=>setTimeout(y,l)),n?.aborted)throw new DOMException("Request aborted","AbortError");continue}if(c instanceof Error){if((c.name==="AbortError"||c.name==="APIUserAbortError")&&n?.aborted)throw c.name==="AbortError"?c:new DOMException(c.message||"Request aborted","AbortError");let u=c?.cause?.code??c?.code??"";throw(u==="ECONNRESET"||u==="EPIPE")&&this.onStaleConnection(),new S(`${this.name} API error: ${c.message}`,this.name)}throw c}throw new G("Unexpected end of withRateLimit")}};import co from"@anthropic-ai/sdk";import{parse as oo}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=oo(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");async function oe(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(d=>d.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 n=new AbortController,o=t.timeoutMs??8e3,r,s=i(d=>{r||(r=d),n.abort()},"recordAbort"),a=setTimeout(()=>s("timeout"),o),c=i(()=>s("parent"),"onParentAbort");t.signal&&t.signal.addEventListener("abort",c,{once:!0});let u=Date.now();try{return await e.run(n.signal),{ok:!0,strategy:t.strategy,durationMs:Date.now()-u,approxTokensSpent:e.approxTokensSpent}}catch(d){return vt(d,{strategy:t.strategy,durationMs:Date.now()-u,approxTokensSpent:0,abortCause:r,providerName:t.providerName})}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",c)}}i(oe,"runVerifyCredential");function io(t){return t.replace(/\bsk-[A-Za-z0-9_-]{6,}/g,"sk-***")}i(io,"redactKeyMaterial");function vt(t,e){let n=t,o=n.status??n.statusCode??n.response?.status,r=io(String(n.message??t)).slice(0,240),s=n.cause?.code??n.code,a=n.constructor?.name??"",c;return e.abortCause==="timeout"?c="timeout":e.abortCause==="parent"?c="unknown":a==="AuthenticationError"||a==="PermissionDeniedError"||o===401||o===403?c="unauthorized":o===429?c="rate_limited":o===400&&e.strategy==="count-tokens"&&e.providerName==="kimi-code"?c="unauthorized":o!==void 0&&o>=500&&o<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(r)?c="timeout":c="unknown",{ok:!1,error:c,status:o,message:r,durationMs:e.durationMs,approxTokensSpent:e.approxTokensSpent,strategy:e.strategy}}i(vt,"classifyVerifyError");function kt(t,e){let n=t[t.length-1];if(n&&ie(n)&&n.hint===e)return t;let o=e?{type:"cache-boundary",hint:e}:{type:"cache-boundary"};return[...t,o]}i(kt,"insertCacheBoundary");function ie(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(ie,"isCacheBoundary");function bt(t,e){let n=[];for(let o of t){if(ie(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(bt,"lowerCacheBoundaries");function ye(t){return t.filter(e=>!ie(e))}i(ye,"stripCacheBoundaries");import{readFile as ro}from"node:fs/promises";import so from"node:path";var ao={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function Oe(t,e){return e??ao[so.extname(t).toLowerCase()]??"image/png"}i(Oe,"resolveImageMediaType");async function De(t){return(await ro(t)).toString("base64")}i(De,"readImageFileAsBase64");async function an(t,e){let n=Oe(t,e),o=await De(t);return`data:${n};base64,${o}`}i(an,"buildImageDataUrl");var lo="KodaX";function uo(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":lo}}i(uo,"getAnthropicCompatDefaultHeaders");function Ct(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(Ct,"normalizeAnthropicUsage");var I=class extends z{static{i(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;client;initClient(){let e=uo(this.config);this.client=new co({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}async verifyCredential(e){let n=this.config.model,o=this.client,r=[{strategy:"count-tokens",approxTokensSpent:0,run:i(async s=>{await o.messages.countTokens({model:n,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")},{strategy:"models-list",approxTokensSpent:0,run:i(async s=>{await o.models.list({},{signal:s})},"run")},{strategy:"minimal-message",approxTokensSpent:7,run:i(async s=>{await o.messages.create({model:n,max_tokens:1,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")}];return oe({strategy:this.config.verifyStrategy??"count-tokens",runners:r,timeoutMs:e?.timeoutMs,signal:e?.signal,providerName:this.name})}applyCacheControlToSystem(e){if(!e.trim()||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=kt([{type:"text",text:e}],"system");return bt(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),p=c.enabled?this.getReasoningCapability(u):"none",y=c.enabled?this.getReasoningFallbackChain(p).filter(x=>x==="native-budget"||x==="native-toggle"||x==="none"):["none"],k=i(x=>{let P={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n),stream:!0};if(x==="native-budget"){let D=Z(this.config,c.depth,c.taskType);P.thinking={type:"enabled",budget_tokens:ee(D,d)}}else x==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let h=[],f=[],C=[],b,_=null,m="",g="",E="",w="",j="",L="",X="",M=!1,W,O=Date.now(),Ee=Date.now(),pe,fe;for(let x of y)try{pe=await this.client.messages.create(k(x),a?{signal:a}:{}),x!==p&&this.persistReasoningCapabilityOverride(x,u);break}catch(P){fe=P;let D=x==="native-budget"?["budget_tokens","thinking"]:x==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...D))throw P}if(!pe)throw fe??new S("All reasoning capability attempts failed without a captured error",this.name);let me=Date.now(),T=0,B=0,N=3e4;for await(let x of pe){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let P=Date.now(),D=P-me;if(D>N&&(T++,B+=D,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(D/1e3)}s gap before ${x.type}`,{stallCount:T,totalStallMs:B,eventType:x.type})),me=P,x.type==="content_block_start"||x.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),x.type==="content_block_start"){O=Date.now();let v=x.content_block;_=v.type,process.env.KODAX_DEBUG_TOOL_STREAM&&v.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:v.type,id:v.id,name:v.name}),v.type==="thinking"?(g="",E=v.signature??""):v.type==="redacted_thinking"?(_="redacted_thinking",w=v.data??""):v.type==="text"?m="":v.type==="tool_use"&&(j=v.id,L=v.name,X="")}else if(x.type==="content_block_delta"){O=Date.now();let v=x.delta;v.type==="thinking_delta"?(g+=v.thinking??"",s?.onThinkingDelta?.(v.thinking??"")):v.type==="text_delta"?(m+=v.text??"",s?.onTextDelta?.(v.text??"")):v.type==="input_json_delta"&&(X+=v.partial_json??"",s?.onToolInputDelta?.(L,v.partial_json??"",j?{toolId:j}:void 0))}else if(x.type==="content_block_stop")O=Date.now(),_==="thinking"?g&&(C.push({type:"thinking",thinking:g,signature:E}),s?.onThinkingEnd?.(g)):_==="redacted_thinking"?(w&&C.push({type:"redacted_thinking",data:w}),w=""):_==="text"?m&&h.push({type:"text",text:m}):_==="tool_use"&&(!j||!L?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify(j),name:JSON.stringify(L),input:X.slice(0,100)}):f.push({type:"tool_use",id:j,name:L,input:ne(X)})),_=null;else if(x.type==="message_stop"){if(M=!0,O=Date.now(),process.env.KODAX_DEBUG_STREAM){let v=Date.now()-Ee;this.logStreamDiagnostic(`[Stream] message_stop received after ${v}ms`)}}else if(x.type==="message_delta"){O=Date.now(),b=Ct(x.usage,b);let v=x.delta;v?.stop_reason&&(W=v.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${W}`))}else x.type==="message_start"&&(O=Date.now(),b=Ct(x.message?.usage,b),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!M){let x=Date.now()-Ee,P=Date.now()-O;if(a?.aborted){let v=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before message_stop:",{duration:x,lastEventAge:P,reason:v,textBlocks:h.length,toolBlocks:f.length,thinkingBlocks:C.length}),new DOMException(v,"AbortError")}let D=new Error(`Stream incomplete: message_stop event not received. Duration: ${x}ms, Last event: ${P}ms ago. This may indicate a network disconnection or API timeout.`);throw D.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:x,lastEventAge:P,textBlocks:h.length,toolBlocks:f.length,thinkingBlocks:C.length}),D}return{textBlocks:h,toolBlocks:f,thinkingBlocks:C,usage:b,stopReason:W}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(r),u=s?.modelOverride??this.config.model,d=this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),p=c.enabled?this.getReasoningCapability(u):"none",y=c.enabled?this.getReasoningFallbackChain(p).filter(m=>m==="native-budget"||m==="native-toggle"||m==="none"):["none"],k=i(m=>{let g={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n)};if(m==="native-budget"){let E=Z(this.config,c.depth,c.taskType);g.thinking={type:"enabled",budget_tokens:ee(E,d)}}else m==="native-toggle"&&(g.thinking={type:"enabled"});return g},"buildRequest"),h,f;for(let m of y)try{h=await this.client.messages.create(k(m),a?{signal:a}:{}),m!==p&&this.persistReasoningCapabilityOverride(m,u);break}catch(g){f=g;let E=m==="native-budget"?["budget_tokens","thinking"]:m==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(g,...E))throw g}if(!h)throw f??new S("All reasoning capability attempts failed without a captured error",this.name);let C=[],b=[],_=[];for(let m of h.content)m.type==="text"?(C.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"&&b.push({type:"tool_use",id:m.id,name:m.name,input:typeof m.input=="object"&&m.input!==null?m.input:{}});return{textBlocks:C,toolBlocks:b,thinkingBlocks:_,usage:Ct(h.usage),stopReason:h.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(ie(n))throw new S("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
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
4
|
|
|
5
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
6
|
${u.join(`
|
|
7
7
|
|
|
8
8
|
`)}
|
|
9
|
-
</prior_reasoning>`});for(let l of s.content)if(l.type==="tool_result"&&s.role==="user"){let p;if(typeof l.content=="string")p=l.content;else{let y=[];for(let k of l.content)k.type==="text"?y.push({type:"text",text:k.text}):k.type==="image"&&y.push({type:"image",source:{type:"base64",media_type:
|
|
9
|
+
</prior_reasoning>`});for(let l of s.content)if(l.type==="tool_result"&&s.role==="user"){let p;if(typeof l.content=="string")p=l.content;else{let y=[];for(let k of l.content)k.type==="text"?y.push({type:"text",text:k.text}):k.type==="image"&&y.push({type:"image",source:{type:"base64",media_type:Oe(k.path,k.mediaType),data:await De(k.path)}});p=y}c.push({type:"tool_result",tool_use_id:l.tool_use_id,content:p,...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:Oe(l.path,l.mediaType),data:await De(l.path)}});if(a==="assistant"&&this.config.supportsThinking&&!r){let l=c.some(y=>y.type==="tool_use"),p=c.some(y=>y.type==="thinking"||y.type==="redacted_thinking");l&&!p&&c.unshift({type:"thinking",thinking:"...",signature:""})}let d=c.length===0||a==="assistant"&&c.every(l=>{let p=l;return p.type==="thinking"&&!p.thinking||p.type==="text"&&!p.text});o.push({role:s.role,content:d?[{type:"text",text:"..."}]:c})}return o}};import po from"openai";var fo="KodaX";function mo(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":fo}}i(mo,"getOpenAICompatDefaultHeaders");function cn(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(cn,"normalizeOpenAIUsage");function go(t){return t?t.type==="function"&&"function"in t:!1}i(go,"isOpenAIFunctionToolCall");function ho(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(ho,"extractOpenAIMessageText");function yo(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(yo,"extractOpenAIMessageReasoning");var K=class extends z{static{i(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;client;initClient(){let e=mo(this.config);this.client=new po({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}async verifyCredential(e){let n=this.config.model,o=this.client,r=[{strategy:"models-list",approxTokensSpent:0,run:i(async s=>{await o.models.list({signal:s})},"run")},{strategy:"minimal-message",approxTokensSpent:6,run:i(async s=>{await o.chat.completions.create({model:n,max_tokens:1,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")}];return oe({strategy:this.config.verifyStrategy??"models-list",runners:r,timeoutMs:e?.timeoutMs,signal:e?.signal,providerName:this.name})}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=ye(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
10
|
`):"";a.trim().length>0&&o.push(a)}return{system:o.join(`
|
|
11
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=
|
|
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=ut(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,p=[{role:"system",content:u},...await this.convertMessages(d,l)],y=n.map(T=>({type:"function",function:{name:T.name,description:T.description,parameters:T.input_schema}}));if(a?.aborted)throw new DOMException("Request aborted","AbortError");let k=new Map,h="",f="",C,b=!0,_=null,m=Date.now(),g=this.normalizeReasoning(r),E=Q(g)?this.getReasoningCapability(l):"none",w=Q(g)?this.getReasoningFallbackChain(E).filter(T=>T==="native-budget"||T==="native-effort"||T==="native-toggle"||T==="none"):["none"],j={model:l,messages:p,tools:y,max_completion_tokens:this.getEffectiveMaxOutputTokens(l),stream:!0},L,X;for(let T of w){for(;!L;){let B={...j};b&&(B.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(B),this.applyReasoningCapability(B,T,g);try{L=await this.client.chat.completions.create(B,a?{signal:a}:{}),T!==E&&this.persistReasoningCapabilityOverride(T,l)}catch(N){if(X=N,b&&this.shouldFallbackForSpecificReasoningError(N,"stream_options","include_usage")){b=!1;continue}if(!this.shouldFallbackForReasoningError(N,...this.getFallbackTerms(T)))throw N;break}}if(L)break}if(!L)throw X??new S("All reasoning capability attempts failed without a captured error",this.name);let M=Date.now(),W=0,O=0,Ee=3e4;for await(let T of L){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let B=Date.now(),N=B-M;N>Ee&&(W++,O+=N,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(N/1e3)}s gap`,{stallCount:W,totalStallMs:O})),M=B,s?.onHeartbeat?.(),C=cn(T.usage)??C;let x=T.choices[0],P=x?.delta;if(x?.finish_reason&&(_=x.finish_reason,process.env.KODAX_DEBUG_STREAM)){let v=Date.now()-m;this.logStreamDiagnostic(`[Stream] finish_reason: ${_} after ${v}ms`)}P?.content&&(h+=P.content,s?.onTextDelta?.(P.content));let D=this.extractReasoningDelta(P);if(D&&(f+=D,s?.onThinkingDelta?.(D)),P?.tool_calls)for(let v of P.tool_calls){let J=k.get(v.index)??{id:"",name:"",arguments:""};v.id&&(J.id=v.id),v.function?.name&&(J.name=v.function.name),v.function?.arguments&&(J.arguments+=v.function.arguments,s?.onToolInputDelta?.(J.name,v.function.arguments,J.id?{toolId:J.id}:void 0)),k.set(v.index,J)}}if(!_){let T=Date.now()-m;if(a?.aborted){let N=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before finish_reason:",{duration:T,reason:N,textContentLength:h.length,toolCallsCount:k.size}),new DOMException(N,"AbortError")}let B=new Error(`Stream incomplete: finish_reason not received. Duration: ${T}ms. This may indicate a network disconnection or API timeout.`);throw B.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:T,textContentLength:h.length,toolCallsCount:k.size}),B}let pe=h?[{type:"text",text:h}]:[],fe=[],me=[];f&&(me.push({type:"thinking",thinking:f}),s?.onThinkingEnd?.(f));for(let[,T]of k)T.id&&T.name&&fe.push({type:"tool_use",id:T.id,name:T.name,input:ne(T.arguments)});return{textBlocks:pe,toolBlocks:fe,thinkingBlocks:me,usage:C,stopReason:_??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,p=[{role:"system",content:u},...await this.convertMessages(d,l)],y=n.map(M=>({type:"function",function:{name:M.name,description:M.description,parameters:M.input_schema}})),k=this.normalizeReasoning(r),h=Q(k)?this.getReasoningCapability(l):"none",f=Q(k)?this.getReasoningFallbackChain(h).filter(M=>M==="native-budget"||M==="native-effort"||M==="native-toggle"||M==="none"):["none"],C={model:l,messages:p,tools:y,max_completion_tokens:this.getEffectiveMaxOutputTokens(l)},b,_;for(let M of f){let W={...C};this.resetReasoningCapabilityParams(W),this.applyReasoningCapability(W,M,k);try{b=await this.client.chat.completions.create(W,a?{signal:a}:{}),M!==h&&this.persistReasoningCapabilityOverride(M,l);break}catch(O){if(_=O,!this.shouldFallbackForReasoningError(O,...this.getFallbackTerms(M)))throw O}}if(!b)throw _??new S("All reasoning capability attempts failed without a captured error",this.name);let m=b.choices[0],g=m?.message,E=ho(g?.content),w=yo(g),j=(g?.tool_calls??[]).filter(go).map(M=>({type:"tool_use",id:M.id,name:M.function.name,input:ne(M.function.arguments)}));E&&s?.onTextDelta?.(E);let L=E?[{type:"text",text:E}]:[],X=[];return w&&(X.push({type:"thinking",thinking:w}),s?.onThinkingDelta?.(w),s?.onThinkingEnd?.(w)),{textBlocks:L,toolBlocks:j,thinkingBlocks:X,usage:cn(b.usage),stopReason:m?.finish_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}extractReasoningDelta(e){let n=e?.reasoning_content;return typeof n=="string"?n:Array.isArray(n)?n.map(o=>typeof o=="string"?o:typeof o=="object"&&o!==null&&"text"in o&&typeof o.text=="string"?o.text:"").join(""):""}serializeAssistantMessage(e,n){let o=e.filter(d=>d.type==="text").map(d=>d.text).join(`
|
|
13
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
14
|
|
|
15
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
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
|
|
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
|
|
19
|
-
`)}let p={...this.acpClientOptions,onSessionUpdate:i(C=>{let b=C.update,_=C.sessionId;if(!("sessionUpdate"in b))return;let m=_?this._activeStreams.get(_):void 0;if(m)switch(b.sessionUpdate){case"agent_message_chunk":if(b.content?.type==="text"){let g=b.content.text;m.output.text+=g,m.streamOptions?.onTextDelta?.(g)}break;case"tool_call":{let g="{}",
|
|
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 an(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 Co}from"node:child_process";import{Readable as _o,Writable as xo}from"node:stream";import Ie from"node:process";import{ClientSideConnection as To,PROTOCOL_VERSION as Eo,ndJsonStream as Mo}from"@agentclientprotocol/sdk";import{spawn as vo}from"node:child_process";var ko=2e3,ve=2e3;function xt(t){return t.exitCode!==null||t.signalCode!==null}i(xt,"isExited");function _t(t,e){return xt(t)?Promise.resolve(!0):new Promise(n=>{let o=!1,r=i(c=>{o||(o=!0,clearTimeout(a),t.off("exit",s),t.off("error",s),n(c))},"finish"),s=i(()=>r(!0),"onExit"),a=setTimeout(()=>r(!1),e);a.unref?.(),t.once("exit",s),t.once("error",s)})}i(_t,"waitForExit");function bo(t){return new Promise(e=>{let n=vo("taskkill",["/pid",String(t),"/t","/f"],{stdio:"ignore",windowsHide:!0}),o=!1,r=i(()=>{o||(o=!0,clearTimeout(s),e())},"finish"),s=setTimeout(()=>{try{n.kill()}catch{}r()},ko);s.unref?.(),n.once("exit",r),n.once("error",r)})}i(bo,"runTaskkill");function ln(t,e){let n=!1;try{process.kill(-t,e),n=!0}catch{}try{process.kill(t,e),n=!0}catch{}return n}i(ln,"signalPosixPidTree");function un(t){try{return process.kill(t,0),!0}catch(e){return e.code!=="ESRCH"}}i(un,"signalTargetExists");function dn(t){return un(-t)||un(t)}i(dn,"isPosixPidTreeAlive");async function pn(t,e){let n=Date.now()+e;for(;Date.now()<n;){if(!dn(t))return!0;await new Promise(o=>setTimeout(o,50))}return!dn(t)}i(pn,"waitForPosixPidTreeExit");async function ke(t){if(process.platform==="win32"&&t.pid!==void 0){if(xt(t))return;await bo(t.pid),await _t(t,ve);return}if(t.pid!==void 0&&process.platform!=="win32"){if(!ln(t.pid,"SIGTERM")||await pn(t.pid,ve))return;ln(t.pid,"SIGKILL"),await pn(t.pid,ve);return}if(!xt(t)){try{t.kill("SIGTERM")}catch{return}if(!await _t(t,ve)){try{t.kill("SIGKILL")}catch{}await _t(t,ve)}}}i(ke,"killChildProcessTree");var Le=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=Ie.platform==="win32"&&!this.options.command.endsWith(".cmd")?`${this.options.command}.cmd`:this.options.command;if(this.agentProcess=Co(s,this.options.args??[],{cwd:this.options.cwd??Ie.cwd(),stdio:["pipe","pipe","inherit"],detached:Ie.platform!=="win32"}),!this.agentProcess.stdin||!this.agentProcess.stdout)throw new Error("Failed to create ACP stdio pipes");n=xo.toWeb(this.agentProcess.stdin),e=_o.toWeb(this.agentProcess.stdout)}else throw new Error("AcpClient requires either a command or I/O streams");let o=Mo(n,e);this.client=new To(()=>({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:Eo,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??Ie.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&&ke(this.agentProcess),this.options.abort?.();try{this.client?.close?.()}catch{}this.client=null,this.agentProcess=null}};function Po(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(Po,"normalizeAcpUsage");var re=class extends z{static{i(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 U(he)}serializeImageBlockToPromptToken(e){return null}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=ye(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 C=[];for(let b of d.content)if(b.type==="text")C.push(b.text);else if(b.type==="image"){let _=this.serializeImageBlockToPromptToken(b);_&&C.push(_)}l=C.join(`
|
|
19
|
+
`)}let p={...this.acpClientOptions,onSessionUpdate:i(C=>{let b=C.update,_=C.sessionId;if(!("sessionUpdate"in b))return;let m=_?this._activeStreams.get(_):void 0;if(m)switch(b.sessionUpdate){case"agent_message_chunk":if(b.content?.type==="text"){let g=b.content.text;m.output.text+=g,m.streamOptions?.onTextDelta?.(g)}break;case"tool_call":{let g="{}",E=b.arguments??b.parameters;E&&(g=typeof E=="string"?E:JSON.stringify(E)),m.streamOptions?.onToolInputDelta?.(b.title,g);let w=`
|
|
20
20
|
> [Tool Use] ${b.title}: ${g}
|
|
21
|
-
`;m.output.text+=
|
|
21
|
+
`;m.output.text+=w,m.streamOptions?.onTextDelta?.(w);break}case"tool_call_update":if(b.status){let g=`> [Tool Result] ${b.status}
|
|
22
22
|
|
|
23
|
-
`;m.output.text+=g,m.streamOptions?.onTextDelta?.(g)}break}},"onSessionUpdate")},y=s?.sessionId??"default";this._client||(this._client=new
|
|
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
|
|
23
|
+
`;m.output.text+=g,m.streamOptions?.onTextDelta?.(g)}break}},"onSessionUpdate")},y=s?.sessionId??"default";this._client||(this._client=new Le(p),await this._client.connect());let k=this._sessionMap.get(y);k||(k=await this._client.createNewSession(),this._sessionMap.set(y,k));let h={text:""};this._activeStreams.set(k,{streamOptions:s,output:h});let f;try{f=await this._client.prompt(l,k,a,{model:s?.modelOverride})}catch(C){if(!(C instanceof Error&&C.name==="AbortError"))throw C}finally{this._activeStreams.delete(k)}return h.text&&c.push({type:"text",text:h.text}),{textBlocks:c,toolBlocks:u,thinkingBlocks:[],usage:Po(f?.usage)}}disconnect(){this._client&&(this._client.disconnect(),this._client=null),this._activeStreams.clear(),this._sessionMap.clear()}};import{spawn as wo}from"node:child_process";import Be from"node:process";var se=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={...Be.env,...this.config.env},s=Be.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=wo(s,n,{cwd:this.config.cwd??Be.cwd(),env:o,stdio:["ignore","pipe","pipe"],detached:Be.platform!=="win32"}),c="";a.stderr?.on("data",l=>{c+=l.toString()});let u=!1,d=i(()=>{u||ke(a)},"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||await ke(a)}}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 So}from"node:child_process";import Ro from"node:process";async function Ne(t){try{let e=Ro.platform==="win32",n=So(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(Ne,"checkCliCommandInstalled");var Ke=class extends se{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 Ne("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 fn}from"node:stream/web";import{randomUUID as Tt}from"node:crypto";function Fe(t){let e=new fn,n=new fn,o=e.readable.getReader(),r=n.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,c="",u=Tt(),d=new AbortController,l=new Map;(async()=>{try{for(;;){let{done:f,value:C}=await o.read();if(f)break;c+=s.decode(C,{stream:!0});let b=c.split(`
|
|
25
25
|
`);c=b.pop()??"";for(let _ of b)if(_.trim())try{let m=JSON.parse(_);y(m).catch(g=>{console.error("[PseudoAcpServer] Failed to handle request:",g)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",_)}}}catch(f){console.error("[PseudoAcpServer] Stream read error:",f)}})();let p=i(async f=>{let C=JSON.stringify(f)+`
|
|
26
|
-
`;await r.write(a.encode(C))},"sendMsg");async function y(f){if(f.method==="initialize")await p({jsonrpc:"2.0",id:f.id,result:{protocolVersion:f.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(f.method==="session/new"||f.method==="sessions/new")u=f.params?.sessionId??
|
|
26
|
+
`;await r.write(a.encode(C))},"sendMsg");async function y(f){if(f.method==="initialize")await p({jsonrpc:"2.0",id:f.id,result:{protocolVersion:f.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(f.method==="session/new"||f.method==="sessions/new")u=f.params?.sessionId??Tt(),await p({jsonrpc:"2.0",id:f.id,result:{sessionId:u}});else if(f.method==="session/prompt"||f.method==="chat/prompt"){let C=new AbortController,b=f.params.sessionId;l.set(b,C);let _=i(()=>C.abort(),"onGlobalAbort");d.signal.addEventListener("abort",_);let g=await k(b,f.params.prompt,typeof f.params.model=="string"?f.params.model:void 0,C.signal).finally(()=>{l.delete(b),d.signal.removeEventListener("abort",_)});await p({jsonrpc:"2.0",id:f.id,result:g.usage?{stopReason:g.stopReason,usage:g.usage}:{stopReason:g.stopReason}})}else if(f.method==="session/cancel"||f.method==="chat/cancel"){let C=l.get(f.params.sessionId);C&&C.abort(),f.id!==void 0&&await p({jsonrpc:"2.0",id:f.id,result:{}})}else f.id!==void 0&&await p({jsonrpc:"2.0",id:f.id,result:{}})}i(y,"handleRequest");let k=i(async(f,C,b,_)=>{let m=C.find(g=>g.type==="text")?.text??"";try{let g=t.execute({prompt:m,model:b,sessionId:f==="default"?void 0:f,signal:_});for await(let E of g){let w=h(E);if(w&&await p({jsonrpc:"2.0",method:"session/update",params:{sessionId:f,update:w}}),E.type==="complete")return{stopReason:_.aborted?"cancelled":"end_turn",usage:E.usage}}return{stopReason:_.aborted?"cancelled":"end_turn"}}catch(g){return _.aborted||g instanceof Error&&g.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",g),await p({jsonrpc:"2.0",method:"session/update",params:{sessionId:f,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
27
27
|
[Fatal Error: ${g}]
|
|
28
|
-
`}}}}),{stopReason:"end_turn"})}},"executePrompt"),h=i(f=>{switch(f.type){case"message":if(f.role==="assistant"&&f.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:f.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:f.toolName,arguments:f.parameters,status:"running",toolCallId:f.toolId||
|
|
28
|
+
`}}}}),{stopReason:"end_turn"})}},"executePrompt"),h=i(f=>{switch(f.type){case"message":if(f.role==="assistant"&&f.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:f.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:f.toolName,arguments:f.parameters,status:"running",toolCallId:f.toolId||Tt()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:f.toolId,status:f.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
29
29
|
[Error: ${f.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(Be,"createPseudoAcpServer");import sn from"node:fs";import an from"node:os";import cn from"node:path";var bo="gpt-5.4",Co="auto-gemini-3",_o=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],xo=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function ln(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(ln,"dedupePreserveOrder");function To(){let t=cn.join(an.homedir(),".codex","config.toml");try{return sn.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}i(To,"readCodexConfiguredModel");function Mo(){let t=cn.join(an.homedir(),".gemini","settings.json");try{let e=JSON.parse(sn.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(Mo,"readGeminiConfiguredModel");function ae(){return To()||bo}i(ae,"getCodexCliDefaultModel");function ce(){return Mo()||Co}i(ce,"getGeminiCliDefaultModel");function ve(){return ln([ae(),..._o])}i(ve,"getCodexCliKnownModels");function ke(){return ln([ce(),...xo])}i(ke,"getGeminiCliKnownModels");var Ct=ce(),Eo=ke(),Po={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},Le=class extends re{static{i(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:Ct,models:Eo.filter(e=>e!==Ct).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new Ie({model:Ct});this.acpClientOptions=Be(e)}getCapabilityProfile(){return U(Po)}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 Ne=class extends se{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 De("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 _t=ae(),So=ve(),Ke=class extends re{static{i(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:_t,models:So.filter(e=>e!==_t).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Ne({model:_t});this.acpClientOptions=Be(e)}};import{existsSync as Io,readFileSync as Bo}from"node:fs";import le from"node:path";import{fileURLToPath as Lo}from"node:url";var un=["none","prompt-only","native-effort","native-budget","native-toggle","unknown"],dn=["native","image-input-native","cli-bridge","image-input-cli-bridge"],pn=["count-tokens","models-list","minimal-message","unsupported"];function be(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}i(be,"isPlainObject");function $e(t,e){if(typeof t!="string"||t.length===0)throw new Error(`provider-capabilities.json: ${e} must be a non-empty string`);return t}i($e,"requireString");function fn(t,e){if(t!==void 0)return $e(t,e)}i(fn,"optionalString");function q(t,e){if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new Error(`provider-capabilities.json: ${e} must be a non-negative finite number`);return t}}i(q,"optionalNumber");function Fe(t,e){if(t!==void 0){if(typeof t!="boolean")throw new Error(`provider-capabilities.json: ${e} must be a boolean`);return t}}i(Fe,"optionalBoolean");function xt(t,e){if(typeof t!="string"||!un.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${un.join(", ")}, got ${JSON.stringify(t)}`);return t}i(xt,"requireReasoningCapability");function Ro(t,e){if(typeof t!="string"||!dn.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${dn.join(", ")}, got ${JSON.stringify(t)}`);return t}i(Ro,"requireProfileName");function wo(t,e){if(typeof t!="string"||!pn.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${pn.join(", ")}, got ${JSON.stringify(t)}`);return t}i(wo,"requireVerifyStrategy");function Ao(t,e){if(!be(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n=$e(t.id,`${e}.id`),o=fn(t.displayName,`${e}.displayName`),r=q(t.contextWindow,`${e}.contextWindow`),s=q(t.maxOutputTokens,`${e}.maxOutputTokens`),a=q(t.thinkingBudgetCap,`${e}.thinkingBudgetCap`),c=Fe(t.replayReasoningContent,`${e}.replayReasoningContent`),u=Fe(t.strictThinkingSignature,`${e}.strictThinkingSignature`),d=q(t.streamMaxDurationMs,`${e}.streamMaxDurationMs`),l=t.reasoningCapability===void 0?void 0:xt(t.reasoningCapability,`${e}.reasoningCapability`),p={id:n};return o!==void 0&&(p.displayName=o),r!==void 0&&(p.contextWindow=r),s!==void 0&&(p.maxOutputTokens=s),a!==void 0&&(p.thinkingBudgetCap=a),l!==void 0&&(p.reasoningCapability=l),c!==void 0&&(p.replayReasoningContent=c),u!==void 0&&(p.strictThinkingSignature=u),d!==void 0&&(p.streamMaxDurationMs=d),p}i(Ao,"validateModelDescriptor");function Oo(t,e){if(t===void 0)return;if(!be(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n={};for(let[o,r]of Object.entries(t))n[o]=xt(r,`${e}.${o}`);return n}i(Oo,"validateModelReasoningCapabilities");function Do(t,e){if(!be(t))throw new Error(`provider-capabilities.json: providers.${e} must be an object`);let n=Fe(t.cliBridge,`providers.${e}.cliBridge`),o=$e(t.apiKeyEnv,`providers.${e}.apiKeyEnv`),r=xt(t.reasoningCapability,`providers.${e}.reasoningCapability`),s=Ro(t.capabilityProfile,`providers.${e}.capabilityProfile`),a=wo(t.verifyStrategy,`providers.${e}.verifyStrategy`);if(n&&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=q(t.contextWindow,`providers.${e}.contextWindow`),u=q(t.maxOutputTokens,`providers.${e}.maxOutputTokens`),d=q(t.thinkingBudgetCap,`providers.${e}.thinkingBudgetCap`),l=Fe(t.supportsThinking,`providers.${e}.supportsThinking`),p=Oo(t.modelReasoningCapabilities,`providers.${e}.modelReasoningCapabilities`),y=fn(t.model,`providers.${e}.model`);if(n&&(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(!n&&y===void 0)throw new Error(`provider-capabilities.json: providers.${e}.model is required (only cliBridge entries may omit)`);let k;if(t.models!==void 0){if(!Array.isArray(t.models))throw new Error(`provider-capabilities.json: providers.${e}.models must be an array`);k=t.models.map((f,C)=>Ao(f,`providers.${e}.models[${C}]`))}let h={apiKeyEnv:o,reasoningCapability:r,capabilityProfile:s,verifyStrategy:a};return y!==void 0&&(h.model=y),k!==void 0&&(h.models=k),c!==void 0&&(h.contextWindow=c),u!==void 0&&(h.maxOutputTokens=u),d!==void 0&&(h.thinkingBudgetCap=d),l!==void 0&&(h.supportsThinking=l),p!==void 0&&(h.modelReasoningCapabilities=p),n&&(h.cliBridge=!0),h}i(Do,"validateProviderEntry");function mn(t){if(!be(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=$e(t.updatedAt,"updatedAt");if(!be(t.providers))throw new Error("provider-capabilities.json: providers must be an object");let n={};for(let[o,r]of Object.entries(t.providers))n[o]=Do(r,o);return{version:1,updatedAt:e,providers:n}}i(mn,"validateProviderCapabilitiesJson");var No=Object.freeze({native:Y,"image-input-native":en,"cli-bridge":he,"image-input-cli-bridge":tn}),Ue=null;function Ko(){if(process.env.KODAX_BUNDLED==="true")return le.join(le.dirname(process.execPath),"provider-capabilities.json");let t=le.dirname(Lo(import.meta.url)),e=[le.join(t,"provider-capabilities.json"),le.join(le.dirname(t),"provider-capabilities.json")];for(let n of e)if(Io(n))return n;return e[0]}i(Ko,"resolveJsonPath");function Fo(t){if(t.models){for(let e of t.models)Object.freeze(e);Object.freeze(t.models)}return t.modelReasoningCapabilities&&Object.freeze(t.modelReasoningCapabilities),Object.freeze(t)}i(Fo,"deepFreezeSnapshot");function $o(t){if(t==="gemini-cli"){let e=ce();return{model:e,models:ke().filter(n=>n!==e).map(n=>({id:n}))}}if(t==="codex-cli"){let e=ae();return{model:e,models:ve().filter(n=>n!==e).map(n=>({id:n}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${t}'`)}i($o,"resolveCliBridgeModels");function Uo(t,e){let n=No[e.capabilityProfile];if(!n)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${e.capabilityProfile}' for provider '${t}'`);if(e.cliBridge){let r=$o(t),s={model:r.model,models:r.models,apiKeyEnv:e.apiKeyEnv,reasoningCapability:e.reasoningCapability,capabilityProfile:n,verifyStrategy:e.verifyStrategy};return e.supportsThinking!==void 0&&(s.supportsThinking=e.supportsThinking),s}let o={model:e.model,apiKeyEnv:e.apiKeyEnv,reasoningCapability:e.reasoningCapability,capabilityProfile:n,verifyStrategy:e.verifyStrategy};return e.models!==void 0&&(o.models=e.models),e.modelReasoningCapabilities!==void 0&&(o.modelReasoningCapabilities=e.modelReasoningCapabilities),e.contextWindow!==void 0&&(o.contextWindow=e.contextWindow),e.maxOutputTokens!==void 0&&(o.maxOutputTokens=e.maxOutputTokens),e.thinkingBudgetCap!==void 0&&(o.thinkingBudgetCap=e.thinkingBudgetCap),e.supportsThinking!==void 0&&(o.supportsThinking=e.supportsThinking),o}i(Uo,"buildSnapshot");function gn(){if(Ue)return Ue;let t=Ko(),e;try{let r=Bo(t,"utf8");e=JSON.parse(r)}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`provider-capabilities loader: failed to read ${t}: ${s}`)}let n=mn(e),o={};for(let[r,s]of Object.entries(n.providers))o[r]=Fo(Uo(r,s));return Ue=Object.freeze(o),Ue}i(gn,"getProviderSnapshots");import jo from"@anthropic-ai/sdk";var w=gn();function $(t,e={}){let n=w[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,verifyStrategy:n.verifyStrategy,...e}}i($,"buildProviderConfig");var Tt=class extends I{static{i(this,"AnthropicProvider")}name="anthropic";config=$("anthropic",{strictThinkingSignature:!0});constructor(){super(),this.client=new jo({apiKey:this.getApiKey()})}},Mt=class extends I{static{i(this,"ZhipuCodingProvider")}name="zhipu-coding";config=$("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",streamMaxDurationMs:3e5});constructor(){super(),this.initClient()}},Et=class extends I{static{i(this,"KimiCodeProvider")}name="kimi-code";config=$("kimi-code",{baseUrl:"https://api.kimi.com/coding/"});constructor(){super(),this.initClient()}},Pt=class extends I{static{i(this,"MiniMaxCodingProvider")}name="minimax-coding";config=$("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic"});constructor(){super(),this.initClient()}},St=class extends I{static{i(this,"MimoCodingProvider")}name="mimo-coding";config=$("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic"});constructor(){super(),this.initClient()}},Rt=class extends I{static{i(this,"MimoProvider")}name="mimo";config=$("mimo",{baseUrl:"https://api.xiaomimimo.com/anthropic"});constructor(){super(),this.initClient()}},wt=class extends I{static{i(this,"ArkCodingProvider")}name="ark-coding";config=$("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding"});constructor(){super(),this.initClient()}},At=class extends K{static{i(this,"OpenAIProvider")}name="openai";config=$("openai");constructor(){super(),this.initClient()}},Ot=class extends K{static{i(this,"DeepSeekProvider")}name="deepseek";config=$("deepseek",{baseUrl:"https://api.deepseek.com",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Dt=class extends K{static{i(this,"KimiProvider")}name="kimi";config=$("kimi",{baseUrl:"https://api.moonshot.cn/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},It=class extends K{static{i(this,"QwenProvider")}name="qwen";config=$("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Bt=class extends K{static{i(this,"ZhipuProvider")}name="zhipu";config=$("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",replayReasoningContent:!0});constructor(){super(),this.initClient()}},F={anthropic:i(()=>new Tt,"anthropic"),openai:i(()=>new At,"openai"),deepseek:i(()=>new Ot,"deepseek"),kimi:i(()=>new Dt,"kimi"),"kimi-code":i(()=>new Et,"kimi-code"),qwen:i(()=>new It,"qwen"),zhipu:i(()=>new Bt,"zhipu"),"zhipu-coding":i(()=>new Mt,"zhipu-coding"),"minimax-coding":i(()=>new Pt,"minimax-coding"),"mimo-coding":i(()=>new St,"mimo-coding"),mimo:i(()=>new Rt,"mimo"),"ark-coding":i(()=>new wt,"ark-coding"),"gemini-cli":i(()=>new Le,"gemini-cli"),"codex-cli":i(()=>new Ke,"codex-cli")},Lt=process.env.KODAX_PROVIDER??"zhipu-coding",hn=new Map;function Xo(t){if(A(t))return w[t].apiKeyEnv}i(Xo,"resolveApiKeyEnvForProvider");function yn(t){let e=t??Lt,n=F[e];if(!n)throw new R(`Unknown provider: ${e}. Available: ${Object.keys(F).join(", ")}`,e);let o=Xo(e),r=o?process.env[o]:void 0,s=hn.get(e);if(s&&s.apiKey===r)return s.instance;let a=n();return hn.set(e,{apiKey:r,instance:a}),a}i(yn,"getProvider");function vn(t){return A(t)?!!process.env[w[t].apiKeyEnv]:!1}i(vn,"isProviderConfigured");function kn(t){return A(t)?w[t].model:null}i(kn,"getProviderModel");function bn(t,e){if(!A(t))return"unknown";let n=w[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}i(bn,"getProviderConfiguredReasoningCapability");function Cn(t){return A(t)?U(w[t].capabilityProfile):null}i(Cn,"getProviderConfiguredCapabilityProfile");function _n(){let t=[];for(let e of Object.keys(F)){let n=w[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:U(n.capabilityProfile)})}return t}i(_n,"getProviderList");function xn(t){let e=w[t];return e?e.models?[e.model,...e.models.map(n=>n.id)]:[e.model]:[]}i(xn,"getProviderModels");function A(t){return t in F}i(A,"isProviderName");function Nt(t){return{id:t.model}}i(Nt,"makeDefaultDescriptor");function je(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(je,"effectiveCapabilities");function Xe(t){let e=w[t];return e?[Nt(e),...e.models??[]]:[]}i(Xe,"getProviderModelDescriptors");function We(t,e){let n=w[t];if(!n)return;if(e===n.model)return je(t,n,Nt(n));let o=n.models?.find(r=>r.id===e);if(o)return je(t,n,o)}i(We,"getModelCapabilities");function ze(){let t=[];for(let e of Object.keys(F)){let n=w[e];t.push(je(e,n,Nt(n)));for(let o of n.models??[])t.push(je(e,n,o))}return t}i(ze,"listBuiltinModelCapabilities");var Wo=new Set(["compat","sdk"]),zo=new Set(["count-tokens","models-list","minimal-message","unsupported"]);function Vo(t){return t==="anthropic"?"count-tokens":"models-list"}i(Vo,"defaultVerifyStrategyForProtocol");function Ce(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&&!Wo.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(!zo.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.`)}}i(Ce,"validateCustomProviderConfig");function Go(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,verifyStrategy:t.verifyStrategy??Vo(t.protocol)}}i(Go,"buildProviderConfig");function Ve(t){Ce(t);let e=Go(t);return t.protocol==="anthropic"?new Kt(t.name,e):new Ft(t.name,e)}i(Ve,"createCustomProvider");var Kt=class extends I{static{i(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}},Ft=class extends K{static{i(this,"DynamicOpenAIProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}};var V=new Map,$t=new Map;function Tn(t){let e=new Set,n=new Map,o=new Map;for(let r of t){if(Ce(r),e.has(r.name))throw new Error(`Duplicate custom provider name: "${r.name}". Each custom provider must have a unique name.`);r.name in F&&console.warn(`[kodax] Custom provider "${r.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(r.name),n.set(r.name,r),o.set(r.name,()=>Ve(r))}V.clear(),$t.clear();for(let[r,s]of n)V.set(r,s);for(let[r,s]of o)$t.set(r,s)}i(Tn,"registerCustomProviders");function Ge(t){let e=$t.get(t);return e?e():void 0}i(Ge,"getCustomProvider");function de(t){return V.has(t)}i(de,"isCustomProviderName");function He(){return[...V.keys()]}i(He,"getCustomProviderNames");function Mn(){let t=[];for(let[e,n]of V){let o=!!process.env[n.apiKeyEnv],r=(n.models??[]).map(a=>typeof a=="string"?a:a.id),s=n.model&&r.length?[...new Set([n.model,...r])]:[n.model];t.push({name:e,model:n.model,models:s,configured:o,reasoningCapability:n.reasoningCapability??"none",capabilityProfile:U(n.capabilityProfile??Y),custom:!0})}return t}i(Mn,"getCustomProviderList");function En(t){let e=V.get(t);if(!e)return;let n=(e.models??[]).map(o=>typeof o=="string"?o:o.id);return e.model&&n.length?[...new Set([e.model,...n])]:[e.model]}i(En,"getCustomProviderModels");function Pn(t){return typeof t=="string"?{id:t}:t}i(Pn,"customDescriptorToFull");function Je(t){let e=V.get(t);if(!e)return;let n={id:e.model},o=(e.models??[]).map(Pn).filter(r=>r.id!==e.model);return[n,...o]}i(Je,"getCustomProviderModelDescriptors");function ue(t,e){let n=V.get(t);if(!n)return;let o=e===n.model,r=o?{id:n.model}:(n.models??[]).map(Pn).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(ue,"getCustomModelCapabilities");function Sn(t){let e=V.get(t);if(!e)return;let n=e.verifyStrategy??(e.protocol==="anthropic"?"count-tokens":"models-list");return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:n}}i(Sn,"getCustomProviderVerifyMetadata");function Ye(){let t=[];for(let[e,n]of V){let o=ue(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=ue(e,s);a&&t.push(a)}}return t}i(Ye,"listCustomProviderModelCapabilities");var H=new Map,Ho=0;function Ut(t){let e=H.get(t);if(!(!e||e.length===0))return e[e.length-1]}i(Ut,"getActiveRuntimeProviderRegistration");function Jo(t){for(let[e,n]of H){let o=n.filter(r=>r.id!==t);if(o.length!==n.length){o.length===0?H.delete(e):H.set(e,o);return}}}i(Jo,"removeRuntimeProviderRegistration");function Rn(t,e){let n=t.trim();if(!n)throw new Error("Model provider name cannot be empty.");if(A(n))throw new Error(`Runtime model provider "${n}" conflicts with a built-in provider.`);if(de(n))throw new Error(`Runtime model provider "${n}" conflicts with an existing config-defined custom provider.`);let o={id:`runtime-provider:${++Ho}`,name:n,factory:e},r=H.get(n)??[];return H.set(n,[...r,o]),()=>{Jo(o.id)}}i(Rn,"registerModelProvider");function qe(t){let e=Ut(t);return e?e.factory():void 0}i(qe,"getRuntimeModelProvider");function _e(t){return Ut(t)!==void 0}i(_e,"isRuntimeModelProviderName");function Qe(){return Array.from(H.keys()).filter(t=>Ut(t)!==void 0)}i(Qe,"getRuntimeModelProviderNames");function wn(){H.clear()}i(wn,"clearRuntimeModelProviders");function jt(t){if(A(t))return F[t]();let e=qe(t);if(e)return e;let n=Ge(t);if(n)return n;let o=et();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}i(jt,"resolveProvider");function Ze(t){return A(t)||_e(t)||de(t)}i(Ze,"isKnownProvider");function et(){let t=Object.keys(F),e=Qe(),n=He();return[...new Set([...t,...e,...n])]}i(et,"getAvailableProviderNames");function Xt(t){return A(t)?Xe(t):Je(t)??[]}i(Xt,"resolveProviderModelDescriptors");function An(t,e){return A(t)?We(t,e):ue(t,e)}i(An,"resolveModelCapabilities");function On(){return[...ze(),...Ye()]}i(On,"listAllModelCapabilities");function Yo(t){if(A(t)){let e=w[t];return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:e.verifyStrategy}}if(!_e(t))return Sn(t)}i(Yo,"getProviderVerifyMetadata");async function Dn(t,e){let n=Yo(t);if(!n&&!Ze(t))return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:`Unknown provider: "${t}". Available: ${et().join(", ")}`};if(n?.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(n&&!process.env[n.apiKeyEnv])return{ok:!1,error:"unconfigured",strategy:n.verifyStrategy,durationMs:0,approxTokensSpent:0,message:`Environment variable "${n.apiKeyEnv}" is not set for provider "${t}"`};let o;try{o=jt(t)}catch(r){return{ok:!1,error:"unconfigured",strategy:n?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(r?.message??r).slice(0,240)}}try{return await o.verifyCredential(e)}catch(r){return{ok:!1,error:"unknown",strategy:n?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(r?.message??r).slice(0,240)}}}i(Dn,"verifyProviderCredential");async function In(t,e){if(!Ze(t))return{ok:!1,source:"failed",error:`Unknown provider: "${t}"`,durationMs:0};let n=Xt(t);return n.length===0?{ok:!1,source:"failed",error:`Provider "${t}" has no static model list`,durationMs:0}:{ok:!0,source:"static",models:n.map(r=>r.id),durationMs:0}}i(In,"listProviderModels");var Bn={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},"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}},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},"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 Wt(t,e,n){let o=n?.[t]?.[e];return o||Bn[t]?.[e]}i(Wt,"getCostRate");function zt(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(zt,"calculateCost");function qo(){return{records:[],retries:[]}}i(qo,"createCostTracker");function Qo(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(Qo,"recordRetry");function Vt(t,e,n){let o=Wt(e.provider,e.model,n),r=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?zt(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(Vt,"recordUsage");function Zo(t){let e=0,n=0,o=0,r=0,s=0,a=0,c={},u={};for(let p of t.records){e+=p.cost,n+=p.inputTokens,o+=p.outputTokens,r+=p.cacheReadTokens+p.cacheWriteTokens,s+=p.cacheReadTokens,a+=p.cacheWriteTokens;let y=c[p.provider];c[p.provider]={cost:(y?.cost??0)+p.cost,calls:(y?.calls??0)+1,inputTokens:(y?.inputTokens??0)+p.inputTokens,outputTokens:(y?.outputTokens??0)+p.outputTokens};let k=p.role??"default",h=u[k];u[k]={cost:(h?.cost??0)+p.cost,calls:(h?.calls??0)+1,inputTokens:(h?.inputTokens??0)+p.inputTokens,outputTokens:(h?.outputTokens??0)+p.outputTokens}}let d=0;for(let p of t.retries)d+=p.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(Zo,"getSummary");function tt(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}i(tt,"formatCost");function ei(t){let e=[];if(e.push(`Session Cost: ${tt(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}: ${tt(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}: ${tt(s.cost)} (${s.calls} calls)`)}return e.join(`
|
|
31
|
-
`)}i(
|
|
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(Fe,"createPseudoAcpServer");import mn from"node:fs";import gn from"node:os";import hn from"node:path";var Ao="gpt-5.4",Oo="auto-gemini-3",Do=["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 yn(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(yn,"dedupePreserveOrder");function Lo(){let t=hn.join(gn.homedir(),".codex","config.toml");try{return mn.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}i(Lo,"readCodexConfiguredModel");function Bo(){let t=hn.join(gn.homedir(),".gemini","settings.json");try{let e=JSON.parse(mn.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(Bo,"readGeminiConfiguredModel");function ae(){return Lo()||Ao}i(ae,"getCodexCliDefaultModel");function ce(){return Bo()||Oo}i(ce,"getGeminiCliDefaultModel");function be(){return yn([ae(),...Do])}i(be,"getCodexCliKnownModels");function Ce(){return yn([ce(),...Io])}i(Ce,"getGeminiCliKnownModels");var Et=ce(),No=Ce(),Ko={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},$e=class extends re{static{i(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:Et,models:No.filter(e=>e!==Et).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new Ke({model:Et});this.acpClientOptions=Fe(e)}getCapabilityProfile(){return U(Ko)}serializeImageBlockToPromptToken(e){return/\s/.test(e.path)?(console.warn(`[gemini-cli] Image path contains whitespace and cannot be safely passed via @<path> syntax \u2014 dropping image block. Path: ${JSON.stringify(e.path)}`),null):`@${e.path}`}};var Ue=class extends se{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 Ne("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 Mt=ae(),Fo=be(),je=class extends re{static{i(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:Mt,models:Fo.filter(e=>e!==Mt).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Ue({model:Mt});this.acpClientOptions=Fe(e)}};import{existsSync as zo,readFileSync as Vo}from"node:fs";import le from"node:path";import{fileURLToPath as Go}from"node:url";var vn=["none","prompt-only","native-effort","native-budget","native-toggle","unknown"],kn=["native","image-input-native","cli-bridge","image-input-cli-bridge"],bn=["count-tokens","models-list","minimal-message","unsupported"];function _e(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}i(_e,"isPlainObject");function We(t,e){if(typeof t!="string"||t.length===0)throw new Error(`provider-capabilities.json: ${e} must be a non-empty string`);return t}i(We,"requireString");function Cn(t,e){if(t!==void 0)return We(t,e)}i(Cn,"optionalString");function q(t,e){if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new Error(`provider-capabilities.json: ${e} must be a non-negative finite number`);return t}}i(q,"optionalNumber");function Xe(t,e){if(t!==void 0){if(typeof t!="boolean")throw new Error(`provider-capabilities.json: ${e} must be a boolean`);return t}}i(Xe,"optionalBoolean");function Pt(t,e){if(typeof t!="string"||!vn.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${vn.join(", ")}, got ${JSON.stringify(t)}`);return t}i(Pt,"requireReasoningCapability");function $o(t,e){if(typeof t!="string"||!kn.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${kn.join(", ")}, got ${JSON.stringify(t)}`);return t}i($o,"requireProfileName");function Uo(t,e){if(typeof t!="string"||!bn.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${bn.join(", ")}, got ${JSON.stringify(t)}`);return t}i(Uo,"requireVerifyStrategy");function jo(t,e){if(!_e(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n=We(t.id,`${e}.id`),o=Cn(t.displayName,`${e}.displayName`),r=q(t.contextWindow,`${e}.contextWindow`),s=q(t.maxOutputTokens,`${e}.maxOutputTokens`),a=q(t.thinkingBudgetCap,`${e}.thinkingBudgetCap`),c=Xe(t.replayReasoningContent,`${e}.replayReasoningContent`),u=Xe(t.strictThinkingSignature,`${e}.strictThinkingSignature`),d=q(t.streamMaxDurationMs,`${e}.streamMaxDurationMs`),l=t.reasoningCapability===void 0?void 0:Pt(t.reasoningCapability,`${e}.reasoningCapability`),p={id:n};return o!==void 0&&(p.displayName=o),r!==void 0&&(p.contextWindow=r),s!==void 0&&(p.maxOutputTokens=s),a!==void 0&&(p.thinkingBudgetCap=a),l!==void 0&&(p.reasoningCapability=l),c!==void 0&&(p.replayReasoningContent=c),u!==void 0&&(p.strictThinkingSignature=u),d!==void 0&&(p.streamMaxDurationMs=d),p}i(jo,"validateModelDescriptor");function Xo(t,e){if(t===void 0)return;if(!_e(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n={};for(let[o,r]of Object.entries(t))n[o]=Pt(r,`${e}.${o}`);return n}i(Xo,"validateModelReasoningCapabilities");function Wo(t,e){if(!_e(t))throw new Error(`provider-capabilities.json: providers.${e} must be an object`);let n=Xe(t.cliBridge,`providers.${e}.cliBridge`),o=We(t.apiKeyEnv,`providers.${e}.apiKeyEnv`),r=Pt(t.reasoningCapability,`providers.${e}.reasoningCapability`),s=$o(t.capabilityProfile,`providers.${e}.capabilityProfile`),a=Uo(t.verifyStrategy,`providers.${e}.verifyStrategy`);if(n&&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=q(t.contextWindow,`providers.${e}.contextWindow`),u=q(t.maxOutputTokens,`providers.${e}.maxOutputTokens`),d=q(t.thinkingBudgetCap,`providers.${e}.thinkingBudgetCap`),l=Xe(t.supportsThinking,`providers.${e}.supportsThinking`),p=Xo(t.modelReasoningCapabilities,`providers.${e}.modelReasoningCapabilities`),y=Cn(t.model,`providers.${e}.model`);if(n&&(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(!n&&y===void 0)throw new Error(`provider-capabilities.json: providers.${e}.model is required (only cliBridge entries may omit)`);let k;if(t.models!==void 0){if(!Array.isArray(t.models))throw new Error(`provider-capabilities.json: providers.${e}.models must be an array`);k=t.models.map((f,C)=>jo(f,`providers.${e}.models[${C}]`))}let h={apiKeyEnv:o,reasoningCapability:r,capabilityProfile:s,verifyStrategy:a};return y!==void 0&&(h.model=y),k!==void 0&&(h.models=k),c!==void 0&&(h.contextWindow=c),u!==void 0&&(h.maxOutputTokens=u),d!==void 0&&(h.thinkingBudgetCap=d),l!==void 0&&(h.supportsThinking=l),p!==void 0&&(h.modelReasoningCapabilities=p),n&&(h.cliBridge=!0),h}i(Wo,"validateProviderEntry");function _n(t){if(!_e(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=We(t.updatedAt,"updatedAt");if(!_e(t.providers))throw new Error("provider-capabilities.json: providers must be an object");let n={};for(let[o,r]of Object.entries(t.providers))n[o]=Wo(r,o);return{version:1,updatedAt:e,providers:n}}i(_n,"validateProviderCapabilitiesJson");var Ho=Object.freeze({native:Y,"image-input-native":rn,"cli-bridge":he,"image-input-cli-bridge":sn}),ze=null;function Jo(){if(process.env.KODAX_BUNDLED==="true")return le.join(le.dirname(process.execPath),"provider-capabilities.json");let t=le.dirname(Go(import.meta.url)),e=[le.join(t,"provider-capabilities.json"),le.join(le.dirname(t),"provider-capabilities.json")];for(let n of e)if(zo(n))return n;return e[0]}i(Jo,"resolveJsonPath");function Yo(t){if(t.models){for(let e of t.models)Object.freeze(e);Object.freeze(t.models)}return t.modelReasoningCapabilities&&Object.freeze(t.modelReasoningCapabilities),Object.freeze(t)}i(Yo,"deepFreezeSnapshot");function qo(t){if(t==="gemini-cli"){let e=ce();return{model:e,models:Ce().filter(n=>n!==e).map(n=>({id:n}))}}if(t==="codex-cli"){let e=ae();return{model:e,models:be().filter(n=>n!==e).map(n=>({id:n}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${t}'`)}i(qo,"resolveCliBridgeModels");function Qo(t,e){let n=Ho[e.capabilityProfile];if(!n)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${e.capabilityProfile}' for provider '${t}'`);if(e.cliBridge){let r=qo(t),s={model:r.model,models:r.models,apiKeyEnv:e.apiKeyEnv,reasoningCapability:e.reasoningCapability,capabilityProfile:n,verifyStrategy:e.verifyStrategy};return e.supportsThinking!==void 0&&(s.supportsThinking=e.supportsThinking),s}let o={model:e.model,apiKeyEnv:e.apiKeyEnv,reasoningCapability:e.reasoningCapability,capabilityProfile:n,verifyStrategy:e.verifyStrategy};return e.models!==void 0&&(o.models=e.models),e.modelReasoningCapabilities!==void 0&&(o.modelReasoningCapabilities=e.modelReasoningCapabilities),e.contextWindow!==void 0&&(o.contextWindow=e.contextWindow),e.maxOutputTokens!==void 0&&(o.maxOutputTokens=e.maxOutputTokens),e.thinkingBudgetCap!==void 0&&(o.thinkingBudgetCap=e.thinkingBudgetCap),e.supportsThinking!==void 0&&(o.supportsThinking=e.supportsThinking),o}i(Qo,"buildSnapshot");function xn(){if(ze)return ze;let t=Jo(),e;try{let r=Vo(t,"utf8");e=JSON.parse(r)}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`provider-capabilities loader: failed to read ${t}: ${s}`)}let n=_n(e),o={};for(let[r,s]of Object.entries(n.providers))o[r]=Yo(Qo(r,s));return ze=Object.freeze(o),ze}i(xn,"getProviderSnapshots");import Zo from"@anthropic-ai/sdk";var R=xn();function $(t,e={}){let n=R[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,verifyStrategy:n.verifyStrategy,...e}}i($,"buildProviderConfig");var wt=class extends I{static{i(this,"AnthropicProvider")}name="anthropic";config=$("anthropic",{strictThinkingSignature:!0});constructor(){super(),this.client=new Zo({apiKey:this.getApiKey()})}},St=class extends I{static{i(this,"ZhipuCodingProvider")}name="zhipu-coding";config=$("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",streamMaxDurationMs:3e5});constructor(){super(),this.initClient()}},Rt=class extends I{static{i(this,"KimiCodeProvider")}name="kimi-code";config=$("kimi-code",{baseUrl:"https://api.kimi.com/coding/"});constructor(){super(),this.initClient()}},At=class extends I{static{i(this,"MiniMaxCodingProvider")}name="minimax-coding";config=$("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic"});constructor(){super(),this.initClient()}},Ot=class extends I{static{i(this,"MimoCodingProvider")}name="mimo-coding";config=$("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic"});constructor(){super(),this.initClient()}},Dt=class extends I{static{i(this,"MimoProvider")}name="mimo";config=$("mimo",{baseUrl:"https://api.xiaomimimo.com/anthropic"});constructor(){super(),this.initClient()}},It=class extends I{static{i(this,"ArkCodingProvider")}name="ark-coding";config=$("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding"});constructor(){super(),this.initClient()}},Lt=class extends K{static{i(this,"OpenAIProvider")}name="openai";config=$("openai");constructor(){super(),this.initClient()}},Bt=class extends K{static{i(this,"DeepSeekProvider")}name="deepseek";config=$("deepseek",{baseUrl:"https://api.deepseek.com",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Nt=class extends K{static{i(this,"KimiProvider")}name="kimi";config=$("kimi",{baseUrl:"https://api.moonshot.cn/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Kt=class extends K{static{i(this,"QwenProvider")}name="qwen";config=$("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Ft=class extends K{static{i(this,"ZhipuProvider")}name="zhipu";config=$("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",replayReasoningContent:!0});constructor(){super(),this.initClient()}},F={anthropic:i(()=>new wt,"anthropic"),openai:i(()=>new Lt,"openai"),deepseek:i(()=>new Bt,"deepseek"),kimi:i(()=>new Nt,"kimi"),"kimi-code":i(()=>new Rt,"kimi-code"),qwen:i(()=>new Kt,"qwen"),zhipu:i(()=>new Ft,"zhipu"),"zhipu-coding":i(()=>new St,"zhipu-coding"),"minimax-coding":i(()=>new At,"minimax-coding"),"mimo-coding":i(()=>new Ot,"mimo-coding"),mimo:i(()=>new Dt,"mimo"),"ark-coding":i(()=>new It,"ark-coding"),"gemini-cli":i(()=>new $e,"gemini-cli"),"codex-cli":i(()=>new je,"codex-cli")},$t=process.env.KODAX_PROVIDER??"zhipu-coding",Tn=new Map;function ei(t){if(A(t))return R[t].apiKeyEnv}i(ei,"resolveApiKeyEnvForProvider");function En(t){let e=t??$t,n=F[e];if(!n)throw new S(`Unknown provider: ${e}. Available: ${Object.keys(F).join(", ")}`,e);let o=ei(e),r=o?process.env[o]:void 0,s=Tn.get(e);if(s&&s.apiKey===r)return s.instance;let a=n();return Tn.set(e,{apiKey:r,instance:a}),a}i(En,"getProvider");function Mn(t){return A(t)?!!process.env[R[t].apiKeyEnv]:!1}i(Mn,"isProviderConfigured");function Pn(t){return A(t)?R[t].model:null}i(Pn,"getProviderModel");function wn(t,e){if(!A(t))return"unknown";let n=R[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}i(wn,"getProviderConfiguredReasoningCapability");function Sn(t){return A(t)?U(R[t].capabilityProfile):null}i(Sn,"getProviderConfiguredCapabilityProfile");function Rn(){let t=[];for(let e of Object.keys(F)){let n=R[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:U(n.capabilityProfile)})}return t}i(Rn,"getProviderList");function An(t){let e=R[t];return e?e.models?[e.model,...e.models.map(n=>n.id)]:[e.model]:[]}i(An,"getProviderModels");function A(t){return t in F}i(A,"isProviderName");function Ut(t){return{id:t.model}}i(Ut,"makeDefaultDescriptor");function Ve(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(Ve,"effectiveCapabilities");function Ge(t){let e=R[t];return e?[Ut(e),...e.models??[]]:[]}i(Ge,"getProviderModelDescriptors");function He(t,e){let n=R[t];if(!n)return;if(e===n.model)return Ve(t,n,Ut(n));let o=n.models?.find(r=>r.id===e);if(o)return Ve(t,n,o)}i(He,"getModelCapabilities");function Je(){let t=[];for(let e of Object.keys(F)){let n=R[e];t.push(Ve(e,n,Ut(n)));for(let o of n.models??[])t.push(Ve(e,n,o))}return t}i(Je,"listBuiltinModelCapabilities");var ti=new Set(["compat","sdk"]),ni=new Set(["count-tokens","models-list","minimal-message","unsupported"]);function oi(t){return t==="anthropic"?"count-tokens":"models-list"}i(oi,"defaultVerifyStrategyForProtocol");function xe(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&&!ti.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(!ni.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.`)}}i(xe,"validateCustomProviderConfig");function ii(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,verifyStrategy:t.verifyStrategy??oi(t.protocol)}}i(ii,"buildProviderConfig");function Ye(t){xe(t);let e=ii(t);return t.protocol==="anthropic"?new jt(t.name,e):new Xt(t.name,e)}i(Ye,"createCustomProvider");var jt=class extends I{static{i(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}},Xt=class extends K{static{i(this,"DynamicOpenAIProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}};var V=new Map,Wt=new Map;function On(t){let e=new Set,n=new Map,o=new Map;for(let r of t){if(xe(r),e.has(r.name))throw new Error(`Duplicate custom provider name: "${r.name}". Each custom provider must have a unique name.`);r.name in F&&console.warn(`[kodax] Custom provider "${r.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(r.name),n.set(r.name,r),o.set(r.name,()=>Ye(r))}V.clear(),Wt.clear();for(let[r,s]of n)V.set(r,s);for(let[r,s]of o)Wt.set(r,s)}i(On,"registerCustomProviders");function qe(t){let e=Wt.get(t);return e?e():void 0}i(qe,"getCustomProvider");function de(t){return V.has(t)}i(de,"isCustomProviderName");function Qe(){return[...V.keys()]}i(Qe,"getCustomProviderNames");function Dn(){let t=[];for(let[e,n]of V){let o=!!process.env[n.apiKeyEnv],r=(n.models??[]).map(a=>typeof a=="string"?a:a.id),s=n.model&&r.length?[...new Set([n.model,...r])]:[n.model];t.push({name:e,model:n.model,models:s,configured:o,reasoningCapability:n.reasoningCapability??"none",capabilityProfile:U(n.capabilityProfile??Y),custom:!0})}return t}i(Dn,"getCustomProviderList");function In(t){let e=V.get(t);if(!e)return;let n=(e.models??[]).map(o=>typeof o=="string"?o:o.id);return e.model&&n.length?[...new Set([e.model,...n])]:[e.model]}i(In,"getCustomProviderModels");function Ln(t){return typeof t=="string"?{id:t}:t}i(Ln,"customDescriptorToFull");function Ze(t){let e=V.get(t);if(!e)return;let n={id:e.model},o=(e.models??[]).map(Ln).filter(r=>r.id!==e.model);return[n,...o]}i(Ze,"getCustomProviderModelDescriptors");function ue(t,e){let n=V.get(t);if(!n)return;let o=e===n.model,r=o?{id:n.model}:(n.models??[]).map(Ln).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(ue,"getCustomModelCapabilities");function Bn(t){let e=V.get(t);if(!e)return;let n=e.verifyStrategy??(e.protocol==="anthropic"?"count-tokens":"models-list");return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:n}}i(Bn,"getCustomProviderVerifyMetadata");function et(){let t=[];for(let[e,n]of V){let o=ue(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=ue(e,s);a&&t.push(a)}}return t}i(et,"listCustomProviderModelCapabilities");var H=new Map,ri=0;function zt(t){let e=H.get(t);if(!(!e||e.length===0))return e[e.length-1]}i(zt,"getActiveRuntimeProviderRegistration");function si(t){for(let[e,n]of H){let o=n.filter(r=>r.id!==t);if(o.length!==n.length){o.length===0?H.delete(e):H.set(e,o);return}}}i(si,"removeRuntimeProviderRegistration");function Nn(t,e){let n=t.trim();if(!n)throw new Error("Model provider name cannot be empty.");if(A(n))throw new Error(`Runtime model provider "${n}" conflicts with a built-in provider.`);if(de(n))throw new Error(`Runtime model provider "${n}" conflicts with an existing config-defined custom provider.`);let o={id:`runtime-provider:${++ri}`,name:n,factory:e},r=H.get(n)??[];return H.set(n,[...r,o]),()=>{si(o.id)}}i(Nn,"registerModelProvider");function tt(t){let e=zt(t);return e?e.factory():void 0}i(tt,"getRuntimeModelProvider");function Te(t){return zt(t)!==void 0}i(Te,"isRuntimeModelProviderName");function nt(){return Array.from(H.keys()).filter(t=>zt(t)!==void 0)}i(nt,"getRuntimeModelProviderNames");function Kn(){H.clear()}i(Kn,"clearRuntimeModelProviders");function Vt(t){if(A(t))return F[t]();let e=tt(t);if(e)return e;let n=qe(t);if(n)return n;let o=it();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}i(Vt,"resolveProvider");function ot(t){return A(t)||Te(t)||de(t)}i(ot,"isKnownProvider");function it(){let t=Object.keys(F),e=nt(),n=Qe();return[...new Set([...t,...e,...n])]}i(it,"getAvailableProviderNames");function Gt(t){return A(t)?Ge(t):Ze(t)??[]}i(Gt,"resolveProviderModelDescriptors");function Fn(t,e){return A(t)?He(t,e):ue(t,e)}i(Fn,"resolveModelCapabilities");function $n(){return[...Je(),...et()]}i($n,"listAllModelCapabilities");function ai(t){if(A(t)){let e=R[t];return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:e.verifyStrategy}}if(!Te(t))return Bn(t)}i(ai,"getProviderVerifyMetadata");async function Un(t,e){let n=ai(t);if(!n&&!ot(t))return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:`Unknown provider: "${t}". Available: ${it().join(", ")}`};if(n?.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(n&&!process.env[n.apiKeyEnv])return{ok:!1,error:"unconfigured",strategy:n.verifyStrategy,durationMs:0,approxTokensSpent:0,message:`Environment variable "${n.apiKeyEnv}" is not set for provider "${t}"`};let o;try{o=Vt(t)}catch(r){return{ok:!1,error:"unconfigured",strategy:n?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(r?.message??r).slice(0,240)}}try{return await o.verifyCredential(e)}catch(r){return{ok:!1,error:"unknown",strategy:n?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(r?.message??r).slice(0,240)}}}i(Un,"verifyProviderCredential");async function jn(t,e){if(!ot(t))return{ok:!1,source:"failed",error:`Unknown provider: "${t}"`,durationMs:0};let n=Gt(t);return n.length===0?{ok:!1,source:"failed",error:`Provider "${t}" has no static model list`,durationMs:0}:{ok:!0,source:"static",models:n.map(r=>r.id),durationMs:0}}i(jn,"listProviderModels");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-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 Ht(t,e,n){let o=n?.[t]?.[e];return o||Xn[t]?.[e]}i(Ht,"getCostRate");function Jt(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(Jt,"calculateCost");function ci(){return{records:[],retries:[]}}i(ci,"createCostTracker");function li(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(li,"recordRetry");function Yt(t,e,n){let o=Ht(e.provider,e.model,n),r=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?Jt(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(Yt,"recordUsage");function ui(t){let e=0,n=0,o=0,r=0,s=0,a=0,c={},u={};for(let p of t.records){e+=p.cost,n+=p.inputTokens,o+=p.outputTokens,r+=p.cacheReadTokens+p.cacheWriteTokens,s+=p.cacheReadTokens,a+=p.cacheWriteTokens;let y=c[p.provider];c[p.provider]={cost:(y?.cost??0)+p.cost,calls:(y?.calls??0)+1,inputTokens:(y?.inputTokens??0)+p.inputTokens,outputTokens:(y?.outputTokens??0)+p.outputTokens};let k=p.role??"default",h=u[k];u[k]={cost:(h?.cost??0)+p.cost,calls:(h?.calls??0)+1,inputTokens:(h?.inputTokens??0)+p.inputTokens,outputTokens:(h?.outputTokens??0)+p.outputTokens}}let d=0;for(let p of t.retries)d+=p.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(ui,"getSummary");function rt(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}i(rt,"formatCost");function di(t){let e=[];if(e.push(`Session Cost: ${rt(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}: ${rt(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}: ${rt(s.cost)} (${s.calls} calls)`)}return e.join(`
|
|
31
|
+
`)}i(di,"formatCostReport");var Wn={inputTokens:0,outputTokens:0,totalTokens:0},pi=3e4;async function fi(t){let e=new AbortController,n=t.timeoutMs??pi,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??Wn,d=c.textBlocks??[],l=c.toolBlocks??[],p=d.map(k=>k.text).join("");if(l.length>0)return{text:p,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=Yt(y,{provider:t.provider.name,model:t.model,inputTokens:u.inputTokens,outputTokens:u.outputTokens,cacheReadTokens:u.cachedReadTokens,cacheWriteTokens:u.cachedWriteTokens,role:t.querySource})),{text:p,usage:u,costTracker:y,stopReason:mi(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:Wn,costTracker:t.costTracker,stopReason:d,error:u}}finally{clearTimeout(s),t.abortSignal&&t.abortSignal.removeEventListener("abort",a)}}i(fi,"sideQuery");function mi(t){return t==="max_tokens"?"max_tokens":"end_turn"}i(mi,"mapStopReason");export{G as a,S as b,ge as c,st as d,at as e,ct as f,zn as g,Vn as h,Gn as i,Hn as j,qt as k,Qt as l,lt as m,Q as n,Me as o,Zt as p,Z as q,ee as r,ut as s,mt as t,gt as u,te as v,we as w,yt as x,eo as y,Se as z,Re as A,Ae as B,z as C,ne as D,oe as E,vt as F,kt as G,ie as H,bt as I,ye as J,I as K,K as L,ae as M,ce as N,be as O,Ce as P,R as Q,F as R,$t as S,En as T,Mn as U,Pn as V,wn as W,Sn as X,Rn as Y,An as Z,A as _,Ge as $,He as aa,Je as ba,xe as ca,Ye as da,On as ea,qe as fa,de as ga,Qe as ha,Dn as ia,In as ja,Ze as ka,ue as la,et as ma,Nn as na,tt as oa,Te as pa,nt as qa,Kn as ra,Vt as sa,ot as ta,it as ua,Gt as va,Fn as wa,$n as xa,Un as ya,jn as za,Xn as Aa,Ht as Ba,Jt as Ca,ci as Da,li as Ea,Yt as Fa,ui as Ga,rt as Ha,di as Ia,fi as Ja};
|