@kodax-ai/kodax 0.7.53 → 0.7.54
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 +18 -1
- package/dist/chunks/{agent-DZ37KWZI.js → agent-5FZH3VUN.js} +1 -1
- package/dist/chunks/argument-completer-VURFBB37.js +2 -0
- package/dist/chunks/{chunk-LE6STNVN.js → chunk-7C2QUBLE.js} +1 -1
- package/dist/chunks/chunk-AMFPS2WC.js +584 -0
- package/dist/chunks/chunk-EM4GOL3S.js +551 -0
- package/dist/chunks/{chunk-CLIRXPAJ.js → chunk-FV6KHPWT.js} +44 -44
- package/dist/chunks/{chunk-OQL4ISVD.js → chunk-JEQ62ZMK.js} +198 -195
- package/dist/chunks/chunk-KSBSEPV5.js +314 -0
- package/dist/chunks/{chunk-D4MGMUDL.js → chunk-QQX333VC.js} +1 -1
- package/dist/chunks/{chunk-5YQDGVDB.js → chunk-UHNSW2SR.js} +1 -1
- package/dist/chunks/{compaction-config-OF2T45MC.js → compaction-config-HY46N24Q.js} +1 -1
- package/dist/chunks/{construction-bootstrap-JIE7LYNN.js → construction-bootstrap-AVTILHEH.js} +1 -1
- package/dist/chunks/{dist-Z6U7TWKJ.js → dist-BNKIZRCP.js} +1 -1
- package/dist/chunks/dist-EV5MWJQ6.js +2 -0
- package/dist/chunks/{utils-AB4DNRZC.js → utils-ZUC3AIL5.js} +1 -1
- package/dist/index.d.ts +7 -4
- package/dist/index.js +6 -6
- package/dist/kodax_cli.js +1090 -1013
- package/dist/provider-capabilities.json +3 -3
- package/dist/sdk-agent.d.ts +395 -3
- package/dist/sdk-agent.js +1 -1
- package/dist/sdk-coding.d.ts +47 -27
- package/dist/sdk-coding.js +1 -1
- package/dist/sdk-llm.js +1 -1
- package/dist/sdk-mcp.js +1 -1
- package/dist/sdk-repl.d.ts +6 -6
- package/dist/sdk-repl.js +1 -1
- package/dist/sdk-session.d.ts +3 -3
- package/dist/sdk-session.js +1 -1
- package/dist/sdk-skills.d.ts +1 -1
- package/dist/sdk-skills.js +1 -1
- package/dist/types-chunks/{bash-prefix-extractor.d-BpNoRkSD.d.ts → bash-prefix-extractor.d-CBLoD2Jk.d.ts} +43 -14
- package/dist/types-chunks/{sdk-session-BkaGuIC6.d.ts → sdk-session-DrPxcDuO.d.ts} +2 -2
- package/dist/types-chunks/{storage.d-BUIiD4gq.d.ts → storage.d-DoA3NvdD.d.ts} +1 -1
- package/dist/types-chunks/{utils.d-B3fwJEMd.d.ts → utils.d-DSqmMq7l.d.ts} +4 -2
- package/package.json +1 -1
- package/dist/chunks/argument-completer-OFPM36IZ.js +0 -2
- package/dist/chunks/chunk-67HVIUEO.js +0 -307
- package/dist/chunks/chunk-RFE5EC7W.js +0 -492
- package/dist/chunks/chunk-XFCAXDSD.js +0 -574
- package/dist/chunks/dist-BOHLKKR5.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,23 @@ All notable changes to this project will be documented in this file.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.7.54] - 2026-06-23
|
|
10
|
+
|
|
11
|
+
> Scope note: a feature release headlined by **FEATURE_224** (procedural learning triage + SkillCurator v1), with several supporting capabilities folded into the same window — opt-in **session recovery** from a safe summary when a provider rejects the current history, filesystem **extension discovery** plus a reusable extension-runtime composition primitive and ACP capability multiplexing/logging, and a GLM provider-model refresh. The learning loop is user-driven through `/learn` and never auto-applies. Most of the batch is ADR-033 eval non-triggering infrastructure; the only prompt-surface touch is the `manual` self-knowledge tool gaining an `extensions` topic — the paired `self-knowledge-roundtrip` eval was not re-run in this window (additive enumeration, low cross-case risk).
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **FEATURE_224 - Procedural learning triage + SkillCurator v1.** Turn-level learning candidates flow through confidence-gated triage (floors tunable via `KODAX_LEARNING_DEFAULT_CONFIDENCE` / `KODAX_LEARNING_CONFIDENCE_FLOOR`) into a durable proposal store plus separate skill usage and trust ledgers, and are surfaced for review through the `/learn` command (`pending` / `diff` / `approve [--ack-impact]` / `reject`). Skill application is snapshot-safe and atomic: approval is idempotent (re-approving an already-applied proposal does not rewrite files) and refuses to overwrite a skill that changed after its snapshot; workflow-handoff proposals flagged with consumer impact require an explicit `--ack-impact`. The full approve-apply orchestration ships from `@kodax-ai/agent` as `approveStoredLearningProposal` (returns a discriminated `StoredLearningApprovalResult`) so non-REPL SDK consumers get the same correctness guards rather than re-implementing them.
|
|
16
|
+
- **Session recovery from a safe summary.** When a provider error looks like a rejected or oversized session history (and not an auth/config failure), KodaX offers `/recover [prompt]` to fork a fresh session seeded with a compact local memory — objective, recent user/assistant turns, prior compaction summaries, and files/tools touched — instead of replaying raw provider history. The seed builder `buildRecoverySeed` / `normalizeRecoveryPrompt` lives in `@kodax-ai/agent` (session-lineage) and the candidate-error classifier `isSessionRecoveryCandidateError` in `@kodax-ai/coding`, so the capability is reusable beyond the terminal.
|
|
17
|
+
- **Filesystem extension discovery + runtime composition (SDK).** `@kodax-ai/coding` gains `discoverDefaultExtensions` / `discoverExtensionsInDirectory` (deterministic ordering, symlink-aware, ENOENT-safe) with entrypoint-identity dedupe/exclude helpers, plus `combineExtensionRuntimes` / `CombinedExtensionRuntime` where both the base and combined runtime implement a shared `ExtensionRuntimeContract`. The CLI (`kodax_cli`) and ACP server now discover and load extensions through these shared primitives.
|
|
18
|
+
- **ACP capability surface + structured logging.** The ACP server gains capability multiplexing with primary/secondary fallback (`searchCapabilities` / `describeCapability` / `executeCapability` / `readCapability` / `hydrateSession`) and dedicated `acp_events` / `acp_logger` modules.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **GLM provider models refreshed.** GLM-5 / GLM-5.1 are retired upstream (auto-routed to GLM-5.2); cost rates and provider capabilities now serve GLM-5.2 / GLM-5 Turbo / GLM-4.7 (200K context).
|
|
23
|
+
- **`manual` self-knowledge tool now covers `extensions`.** The self-knowledge router gains an `extensions` topic and the `manual` tool description enumerates it alongside providers/config/agents/skills/MCP/repo intelligence. (ADR-033/FEATURE_104: the batch's only tool-`description` touch; see the scope note on the un-refreshed `self-knowledge-roundtrip` eval.)
|
|
24
|
+
- **Internal type-safety and error-handling hygiene.** A cleanup pass across session-lineage, agent-runtime, and extension modules removes residual `any` usages (introducing explicit type guards) and replaces bare `catch {}` blocks with documented `catch (error)` handlers. No behavior change.
|
|
25
|
+
|
|
9
26
|
## [0.7.53] - 2026-06-19
|
|
10
27
|
|
|
11
28
|
> Scope note: a maintenance release focused on session hygiene, interactive resume-state persistence, and a warn-only todo-drift nudge. Three features were authored in this still-open window — **FEATURE_174** (`kodax sessions dedupe`, from v0.7.69), **FEATURE_211** (durable extension/MCP session state across host-owned resume, from v0.7.72), and **FEATURE_237** (warn-only todo-drift reminder) — alongside host-readable Sidecar Verifier messages, CLI completion/liveness polish, and fixes for AMA iteration-cap reporting, child-executor progress seeding, and synthetic sidecar follow-up message identity. FEATURE_237 is the only LLM-facing prompt change and ships with a paired prompt eval (`tests/todo-drift-reminder.eval.ts`); all other changes are ADR-033 eval non-triggers.
|
|
@@ -71,7 +88,7 @@ All notable changes to this project will be documented in this file.
|
|
|
71
88
|
|
|
72
89
|
## [0.7.50] - 2026-06-16
|
|
73
90
|
|
|
74
|
-
> Scope note: v0.7.50 is a single-feature slot for **FEATURE_229**. It does **not** rewrite FEATURE_217 (v0.7.49) — the dynamic JS harness, capsule model, save/rerun, worktree isolation, and permission gates all stay. F229 lifts the v0.7.49 user-visible workflow process into a subscribable Agent-layer event/snapshot model and a Coding/SDK lifecycle surface. `FEATURE_224`
|
|
91
|
+
> Scope note: v0.7.50 is a single-feature slot for **FEATURE_229**. It does **not** rewrite FEATURE_217 (v0.7.49) — the dynamic JS harness, capsule model, save/rerun, worktree isolation, and permission gates all stay. F229 lifts the v0.7.49 user-visible workflow process into a subscribable Agent-layer event/snapshot model and a Coding/SDK lifecycle surface. `FEATURE_224` is tracked in [v0.7.54](docs/features/v0.7.54.md).
|
|
75
92
|
|
|
76
93
|
### Added
|
|
77
94
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
-
import{
|
|
2
|
+
import{Pb as c,Qb as d,Rb as e,Sb as f,jc as g,kc as h,od as i,td as j}from"./chunk-JEQ62ZMK.js";import"./chunk-7C2QUBLE.js";import{jb as a,kb as b}from"./chunk-AMFPS2WC.js";import"./chunk-V4WSBIXB.js";export{d as bucketProviderPayloadSize,g as buildAutoRepoIntelligenceContext,e as checkPromiseSignal,b as cleanupIncompleteToolCalls,h as describeTransientProviderRetry,f as emitResilienceDebug,c as estimateProviderPayloadBytes,j as runKodaX,i as saveSessionSnapshot,a as validateAndFixToolHistory};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
+
import{wa as a,xa as b}from"./chunk-EM4GOL3S.js";import"./chunk-QQX333VC.js";import"./chunk-UHNSW2SR.js";import"./chunk-FV6KHPWT.js";import"./chunk-JEQ62ZMK.js";import"./chunk-7C2QUBLE.js";import"./chunk-AMFPS2WC.js";import"./chunk-V4WSBIXB.js";export{a as ArgumentCompleter,b as createArgumentCompleter};
|
|
@@ -27,5 +27,5 @@ ${d.join(`
|
|
|
27
27
|
[Fatal Error: ${m}]
|
|
28
28
|
`}}}}),{stopReason:"end_turn"})}},"executePrompt"),b=r(p=>{switch(p.type){case"message":if(p.role==="assistant"&&p.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:p.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:p.toolName,arguments:p.parameters,status:"running",toolCallId:p.toolId||Dt()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:p.toolId,status:p.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
29
29
|
[Error: ${p.message}]
|
|
30
|
-
`}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:n.readable,outputStream:e.writable,abort:r(()=>{l.abort(),e.readable.cancel().catch(()=>{}),n.writable.abort().catch(()=>{})},"abort"),executor:t}}r(Ve,"createPseudoAcpServer");import Sn from"node:fs";import Rn from"node:os";import An from"node:path";var qo="gpt-5.4",Qo="auto-gemini-3",Zo=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],ei=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function On(t){let e=new Set,n=[];for(let o of t){let i=o.trim();if(!i)continue;let s=i.toLowerCase();e.has(s)||(e.add(s),n.push(i))}return n}r(On,"dedupePreserveOrder");function ti(){let t=An.join(Rn.homedir(),".codex","config.toml");try{return Sn.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}r(ti,"readCodexConfiguredModel");function ni(){let t=An.join(Rn.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}}r(ni,"readGeminiConfiguredModel");function pe(){return ti()||qo}r(pe,"getCodexCliDefaultModel");function fe(){return ni()||Qo}r(fe,"getGeminiCliDefaultModel");function Te(){return On([pe(),...Zo])}r(Te,"getCodexCliKnownModels");function Ee(){return On([fe(),...ei])}r(Ee,"getGeminiCliKnownModels");var It=fe(),oi=Ee(),ii={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},Ge=class extends ue{static{r(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:It,models:oi.filter(e=>e!==It).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new ze({model:It});this.acpClientOptions=Ve(e)}getCapabilityProfile(){return X(ii)}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 He=class extends de{static{r(this,"CodexCLIExecutor")}model;constructor(e){super({command:"codex",baseArgs:["exec","--json","--full-auto"],timeout:3e5,...e}),this.model=e?.model??"gpt-5.4"}async checkInstalled(){return Xe("codex")}buildArgs(e){this.model=e.model??this.model;let 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 Nt=pe(),ri=Te(),Je=class extends ue{static{r(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:Nt,models:ri.filter(e=>e!==Nt).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new He({model:Nt});this.acpClientOptions=Ve(e)}};import{existsSync as di,readFileSync as pi}from"node:fs";import me from"node:path";import{fileURLToPath as fi}from"node:url";var Dn=["none","prompt-only","native-effort","native-budget","native-toggle","native-adaptive","unknown"],In=["native","image-input-native","cli-bridge","image-input-cli-bridge"],Nn=["count-tokens","models-list","minimal-message","unsupported"];function we(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}r(we,"isPlainObject");function qe(t,e){if(typeof t!="string"||t.length===0)throw new Error(`provider-capabilities.json: ${e} must be a non-empty string`);return t}r(qe,"requireString");function Ln(t,e){if(t!==void 0)return qe(t,e)}r(Ln,"optionalString");function ne(t,e){if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new Error(`provider-capabilities.json: ${e} must be a non-negative finite number`);return t}}r(ne,"optionalNumber");function Ye(t,e){if(t!==void 0){if(typeof t!="boolean")throw new Error(`provider-capabilities.json: ${e} must be a boolean`);return t}}r(Ye,"optionalBoolean");function Lt(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}r(Lt,"requireReasoningCapability");function si(t,e){if(typeof t!="string"||!In.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${In.join(", ")}, got ${JSON.stringify(t)}`);return t}r(si,"requireProfileName");function ai(t,e){if(typeof t!="string"||!Nn.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${Nn.join(", ")}, got ${JSON.stringify(t)}`);return t}r(ai,"requireVerifyStrategy");function ci(t,e){if(!we(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n=qe(t.id,`${e}.id`),o=Ln(t.displayName,`${e}.displayName`),i=ne(t.contextWindow,`${e}.contextWindow`),s=ne(t.maxOutputTokens,`${e}.maxOutputTokens`),a=ne(t.thinkingBudgetCap,`${e}.thinkingBudgetCap`),c=Ye(t.replayReasoningContent,`${e}.replayReasoningContent`),d=Ye(t.strictThinkingSignature,`${e}.strictThinkingSignature`),l=ne(t.streamMaxDurationMs,`${e}.streamMaxDurationMs`),u=t.reasoningCapability===void 0?void 0:Lt(t.reasoningCapability,`${e}.reasoningCapability`),f={id:n};return o!==void 0&&(f.displayName=o),i!==void 0&&(f.contextWindow=i),s!==void 0&&(f.maxOutputTokens=s),a!==void 0&&(f.thinkingBudgetCap=a),u!==void 0&&(f.reasoningCapability=u),c!==void 0&&(f.replayReasoningContent=c),d!==void 0&&(f.strictThinkingSignature=d),l!==void 0&&(f.streamMaxDurationMs=l),f}r(ci,"validateModelDescriptor");function li(t,e){if(t===void 0)return;if(!we(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n={};for(let[o,i]of Object.entries(t))n[o]=Lt(i,`${e}.${o}`);return n}r(li,"validateModelReasoningCapabilities");function ui(t,e){if(!we(t))throw new Error(`provider-capabilities.json: providers.${e} must be an object`);let n=Ye(t.cliBridge,`providers.${e}.cliBridge`),o=qe(t.apiKeyEnv,`providers.${e}.apiKeyEnv`),i=Lt(t.reasoningCapability,`providers.${e}.reasoningCapability`),s=si(t.capabilityProfile,`providers.${e}.capabilityProfile`),a=ai(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=ne(t.contextWindow,`providers.${e}.contextWindow`),d=ne(t.maxOutputTokens,`providers.${e}.maxOutputTokens`),l=ne(t.thinkingBudgetCap,`providers.${e}.thinkingBudgetCap`),u=Ye(t.supportsThinking,`providers.${e}.supportsThinking`),f=li(t.modelReasoningCapabilities,`providers.${e}.modelReasoningCapabilities`),y=Ln(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 g;if(t.models!==void 0){if(!Array.isArray(t.models))throw new Error(`provider-capabilities.json: providers.${e}.models must be an array`);g=t.models.map((p,v)=>ci(p,`providers.${e}.models[${v}]`))}let b={apiKeyEnv:o,reasoningCapability:i,capabilityProfile:s,verifyStrategy:a};return y!==void 0&&(b.model=y),g!==void 0&&(b.models=g),c!==void 0&&(b.contextWindow=c),d!==void 0&&(b.maxOutputTokens=d),l!==void 0&&(b.thinkingBudgetCap=l),u!==void 0&&(b.supportsThinking=u),f!==void 0&&(b.modelReasoningCapabilities=f),n&&(b.cliBridge=!0),b}r(ui,"validateProviderEntry");function Bn(t){if(!we(t))throw new Error("provider-capabilities.json: root must be an object");if(t.version!==1)throw new Error(`provider-capabilities.json: version must be 1, got ${JSON.stringify(t.version)}`);let e=qe(t.updatedAt,"updatedAt");if(!we(t.providers))throw new Error("provider-capabilities.json: providers must be an object");let n={};for(let[o,i]of Object.entries(t.providers))n[o]=ui(i,o);return{version:1,updatedAt:e,providers:n}}r(Bn,"validateProviderCapabilitiesJson");var mi=Object.freeze({native:te,"image-input-native":gn,"cli-bridge":be,"image-input-cli-bridge":hn}),Qe=null;function gi(){if(process.env.KODAX_BUNDLED==="true")return me.join(me.dirname(process.execPath),"provider-capabilities.json");let t=me.dirname(fi(import.meta.url)),e=[me.join(t,"provider-capabilities.json"),me.join(me.dirname(t),"provider-capabilities.json")];for(let n of e)if(di(n))return n;return e[0]}r(gi,"resolveJsonPath");function hi(t){if(t.models){for(let e of t.models)Object.freeze(e);Object.freeze(t.models)}return t.modelReasoningCapabilities&&Object.freeze(t.modelReasoningCapabilities),Object.freeze(t)}r(hi,"deepFreezeSnapshot");function yi(t){if(t==="gemini-cli"){let e=fe();return{model:e,models:Ee().filter(n=>n!==e).map(n=>({id:n}))}}if(t==="codex-cli"){let e=pe();return{model:e,models:Te().filter(n=>n!==e).map(n=>({id:n}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${t}'`)}r(yi,"resolveCliBridgeModels");function vi(t,e){let n=mi[e.capabilityProfile];if(!n)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${e.capabilityProfile}' for provider '${t}'`);if(e.cliBridge){let i=yi(t),s={model:i.model,models:i.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}r(vi,"buildSnapshot");function Fn(){if(Qe)return Qe;let t=gi(),e;try{let i=pi(t,"utf8");e=JSON.parse(i)}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`provider-capabilities loader: failed to read ${t}: ${s}`)}let n=Bn(e),o={};for(let[i,s]of Object.entries(n.providers))o[i]=hi(vi(i,s));return Qe=Object.freeze(o),Qe}r(Fn,"getProviderSnapshots");import ki from"@anthropic-ai/sdk";var A=Fn();function U(t,e={}){let n=A[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}}r(U,"buildProviderConfig");var Bt=class extends I{static{r(this,"AnthropicProvider")}name="anthropic";config=U("anthropic",{strictThinkingSignature:!0});buildClient(){return new ki({apiKey:this.getApiKey()})}},Ft=class extends I{static{r(this,"ZhipuCodingProvider")}name="zhipu-coding";config=U("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",streamMaxDurationMs:3e5})},Kt=class extends I{static{r(this,"KimiCodeProvider")}name="kimi-code";config=U("kimi-code",{baseUrl:"https://api.kimi.com/coding/"})},$t=class extends I{static{r(this,"MiniMaxCodingProvider")}name="minimax-coding";config=U("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic"})},Ut=class extends I{static{r(this,"MimoCodingProvider")}name="mimo-coding";config=U("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic"})},jt=class extends I{static{r(this,"MimoProvider")}name="mimo";config=U("mimo",{baseUrl:"https://api.xiaomimimo.com/anthropic"})},Wt=class extends I{static{r(this,"ArkCodingProvider")}name="ark-coding";config=U("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding"})},Xt=class extends K{static{r(this,"OpenAIProvider")}name="openai";config=U("openai")},zt=class extends K{static{r(this,"DeepSeekProvider")}name="deepseek";config=U("deepseek",{baseUrl:"https://api.deepseek.com",replayReasoningContent:!0})},Vt=class extends K{static{r(this,"KimiProvider")}name="kimi";config=U("kimi",{baseUrl:"https://api.moonshot.cn/v1",replayReasoningContent:!0})},Gt=class extends K{static{r(this,"QwenProvider")}name="qwen";config=U("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",replayReasoningContent:!0})},Ht=class extends K{static{r(this,"ZhipuProvider")}name="zhipu";config=U("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",replayReasoningContent:!0})},$={anthropic:r(()=>new Bt,"anthropic"),openai:r(()=>new Xt,"openai"),deepseek:r(()=>new zt,"deepseek"),kimi:r(()=>new Vt,"kimi"),"kimi-code":r(()=>new Kt,"kimi-code"),qwen:r(()=>new Gt,"qwen"),zhipu:r(()=>new Ht,"zhipu"),"zhipu-coding":r(()=>new Ft,"zhipu-coding"),"minimax-coding":r(()=>new $t,"minimax-coding"),"mimo-coding":r(()=>new Ut,"mimo-coding"),mimo:r(()=>new jt,"mimo"),"ark-coding":r(()=>new Wt,"ark-coding"),"gemini-cli":r(()=>new Ge,"gemini-cli"),"codex-cli":r(()=>new Je,"codex-cli")},Jt=process.env.KODAX_PROVIDER??"zhipu-coding",Kn=new Map;function bi(t){if(O(t))return A[t].apiKeyEnv}r(bi,"resolveApiKeyEnvForProvider");function $n(t){let e=t??Jt,n=$[e];if(!n)throw new R(`Unknown provider: ${e}. Available: ${Object.keys($).join(", ")}`,e);let o=bi(e),i=o?process.env[o]:void 0,s=Kn.get(e);if(s&&s.apiKey===i)return s.instance;let a=n();return Kn.set(e,{apiKey:i,instance:a}),a}r($n,"getProvider");function Un(t){return O(t)?!!process.env[A[t].apiKeyEnv]:!1}r(Un,"isProviderConfigured");function jn(t){return O(t)?A[t].model:null}r(jn,"getProviderModel");function Wn(t,e){if(!O(t))return"unknown";let n=A[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}r(Wn,"getProviderConfiguredReasoningCapability");function Xn(t){return O(t)?X(A[t].capabilityProfile):null}r(Xn,"getProviderConfiguredCapabilityProfile");function zn(){let t=[];for(let e of Object.keys($)){let n=A[e];t.push({name:e,model:n.model,models:n.models?[n.model,...n.models.map(o=>o.id)]:[n.model],configured:!!process.env[n.apiKeyEnv],reasoningCapability:n.reasoningCapability,capabilityProfile:X(n.capabilityProfile)})}return t}r(zn,"getProviderList");function Vn(t){let e=A[t];return e?e.models?[e.model,...e.models.map(n=>n.id)]:[e.model]:[]}r(Vn,"getProviderModels");function O(t){return t in $}r(O,"isProviderName");function Yt(t){return{id:t.model}}r(Yt,"makeDefaultDescriptor");function Ze(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}}r(Ze,"effectiveCapabilities");function et(t){let e=A[t];return e?[Yt(e),...e.models??[]]:[]}r(et,"getProviderModelDescriptors");function tt(t,e){let n=A[t];if(!n)return;if(e===n.model)return Ze(t,n,Yt(n));let o=n.models?.find(i=>i.id===e);if(o)return Ze(t,n,o)}r(tt,"getModelCapabilities");function nt(){let t=[];for(let e of Object.keys($)){let n=A[e];t.push(Ze(e,n,Yt(n)));for(let o of n.models??[])t.push(Ze(e,n,o))}return t}r(nt,"listBuiltinModelCapabilities");var _i=new Set(["compat","sdk"]),Ci=new Set(["count-tokens","models-list","minimal-message","unsupported"]);function xi(t){return t==="anthropic"?"count-tokens":"models-list"}r(xi,"defaultVerifyStrategyForProtocol");function Me(t){if(!t.name||!t.baseUrl||!t.apiKeyEnv||!t.model)throw new Error(`Custom provider requires name, baseUrl, apiKeyEnv, and model. Got: ${JSON.stringify({name:t.name,baseUrl:t.baseUrl,apiKeyEnv:t.apiKeyEnv,model:t.model})}`);if(t.protocol!=="anthropic"&&t.protocol!=="openai")throw new Error(`Unknown protocol "${t.protocol}" for custom provider "${t.name}". Must be "anthropic" or "openai".`);if(t.userAgentMode!==void 0&&!_i.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(!Ci.has(t.verifyStrategy))throw new Error(`Unknown verifyStrategy "${t.verifyStrategy}" for custom provider "${t.name}". Must be one of "count-tokens" | "models-list" | "minimal-message" | "unsupported".`);if(t.protocol==="openai"&&t.verifyStrategy==="count-tokens")throw new Error(`Custom provider "${t.name}": verifyStrategy="count-tokens" requires Anthropic protocol; got protocol="openai". Use "models-list" or "minimal-message" for OpenAI-compat.`)}}r(Me,"validateCustomProviderConfig");function Ti(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??xi(t.protocol)}}r(Ti,"buildProviderConfig");function ot(t){Me(t);let e=Ti(t);return t.protocol==="anthropic"?new qt(t.name,e):new Qt(t.name,e)}r(ot,"createCustomProvider");var qt=class extends I{static{r(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n}},Qt=class extends K{static{r(this,"DynamicOpenAIProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n}};var J=new Map,Zt=new Map;function Gn(t){let e=new Set,n=new Map,o=new Map;for(let i of t){if(Me(i),e.has(i.name))throw new Error(`Duplicate custom provider name: "${i.name}". Each custom provider must have a unique name.`);i.name in $&&console.warn(`[kodax] Custom provider "${i.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(i.name),n.set(i.name,i),o.set(i.name,()=>ot(i))}J.clear(),Zt.clear();for(let[i,s]of n)J.set(i,s);for(let[i,s]of o)Zt.set(i,s)}r(Gn,"registerCustomProviders");function it(t){let e=Zt.get(t);return e?e():void 0}r(it,"getCustomProvider");function he(t){return J.has(t)}r(he,"isCustomProviderName");function rt(){return[...J.keys()]}r(rt,"getCustomProviderNames");function Hn(){let t=[];for(let[e,n]of J){let o=!!process.env[n.apiKeyEnv],i=(n.models??[]).map(a=>typeof a=="string"?a:a.id),s=n.model&&i.length?[...new Set([n.model,...i])]:[n.model];t.push({name:e,model:n.model,models:s,configured:o,reasoningCapability:n.reasoningCapability??"none",capabilityProfile:X(n.capabilityProfile??te),custom:!0})}return t}r(Hn,"getCustomProviderList");function Jn(t){let e=J.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]}r(Jn,"getCustomProviderModels");function Yn(t){return typeof t=="string"?{id:t}:t}r(Yn,"customDescriptorToFull");function st(t){let e=J.get(t);if(!e)return;let n={id:e.model},o=(e.models??[]).map(Yn).filter(i=>i.id!==e.model);return[n,...o]}r(st,"getCustomProviderModelDescriptors");function ge(t,e){let n=J.get(t);if(!n)return;let o=e===n.model,i=o?{id:n.model}:(n.models??[]).map(Yn).find(s=>s.id===e);if(i)return{provider:t,model:i.id,displayName:i.displayName??i.id,supportsThinking:n.supportsThinking??!1,reasoningCapability:i.reasoningCapability??n.reasoningCapability??"none",contextWindow:i.contextWindow??n.contextWindow,maxOutputTokens:i.maxOutputTokens??n.maxOutputTokens,thinkingBudgetCap:i.thinkingBudgetCap??n.thinkingBudgetCap,isDefault:o}}r(ge,"getCustomModelCapabilities");function qn(t){let e=J.get(t);if(!e)return;let n=e.verifyStrategy??(e.protocol==="anthropic"?"count-tokens":"models-list");return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:n}}r(qn,"getCustomProviderVerifyMetadata");function at(){let t=[];for(let[e,n]of J){let o=ge(e,n.model);o&&t.push(o);for(let i of n.models??[]){let s=typeof i=="string"?i:i.id;if(s===n.model)continue;let a=ge(e,s);a&&t.push(a)}}return t}r(at,"listCustomProviderModelCapabilities");var Q=new Map,Ei=0;function en(t){let e=Q.get(t);if(!(!e||e.length===0))return e[e.length-1]}r(en,"getActiveRuntimeProviderRegistration");function wi(t){for(let[e,n]of Q){let o=n.filter(i=>i.id!==t);if(o.length!==n.length){o.length===0?Q.delete(e):Q.set(e,o);return}}}r(wi,"removeRuntimeProviderRegistration");function Qn(t,e){let n=t.trim();if(!n)throw new Error("Model provider name cannot be empty.");if(O(n))throw new Error(`Runtime model provider "${n}" conflicts with a built-in provider.`);if(he(n))throw new Error(`Runtime model provider "${n}" conflicts with an existing config-defined custom provider.`);let o={id:`runtime-provider:${++Ei}`,name:n,factory:e},i=Q.get(n)??[];return Q.set(n,[...i,o]),()=>{wi(o.id)}}r(Qn,"registerModelProvider");function ct(t){let e=en(t);return e?e.factory():void 0}r(ct,"getRuntimeModelProvider");function Pe(t){return en(t)!==void 0}r(Pe,"isRuntimeModelProviderName");function lt(){return Array.from(Q.keys()).filter(t=>en(t)!==void 0)}r(lt,"getRuntimeModelProviderNames");function Zn(){Q.clear()}r(Zn,"clearRuntimeModelProviders");function tn(t){if(O(t))return $[t]();let e=ct(t);if(e)return e;let n=it(t);if(n)return n;let o=dt();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}r(tn,"resolveProvider");function ut(t){return O(t)||Pe(t)||he(t)}r(ut,"isKnownProvider");function dt(){let t=Object.keys($),e=lt(),n=rt();return[...new Set([...t,...e,...n])]}r(dt,"getAvailableProviderNames");function nn(t){return O(t)?et(t):st(t)??[]}r(nn,"resolveProviderModelDescriptors");function eo(t,e){return O(t)?tt(t,e):ge(t,e)}r(eo,"resolveModelCapabilities");function to(){return[...nt(),...at()]}r(to,"listAllModelCapabilities");function Mi(t){if(O(t)){let e=A[t];return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:e.verifyStrategy}}if(!Pe(t))return qn(t)}r(Mi,"getProviderVerifyMetadata");async function no(t,e){let n=Mi(t);if(!n&&!ut(t))return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:`Unknown provider: "${t}". Available: ${dt().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=tn(t)}catch(i){return{ok:!1,error:"unconfigured",strategy:n?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(i?.message??i).slice(0,240)}}try{return await o.verifyCredential(e)}catch(i){return{ok:!1,error:"unknown",strategy:n?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(i?.message??i).slice(0,240)}}}r(no,"verifyProviderCredential");async function oo(t,e){if(!ut(t))return{ok:!1,source:"failed",error:`Unknown provider: "${t}"`,durationMs:0};let n=nn(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(i=>i.id),durationMs:0}}r(oo,"listProviderModels");var io={anthropic:{"claude-opus-4-8":{inputPer1M:5,outputPer1M:25,cachePer1M:.5},"claude-opus-4-7":{inputPer1M:5,outputPer1M:25,cachePer1M:.5},"claude-opus-4-6":{inputPer1M:5,outputPer1M:25,cachePer1M:.5},"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 on(t,e,n){let o=n?.[t]?.[e];return o||io[t]?.[e]}r(on,"getCostRate");function rn(t,e,n,o=0){let i=e/1e6*t.inputPer1M,s=n/1e6*t.outputPer1M,a=t.cachePer1M?o/1e6*t.cachePer1M:0;return i+s+a}r(rn,"calculateCost");function Pi(){return{records:[],retries:[]}}r(Pi,"createCostTracker");function sn(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]}}r(sn,"recordRetry");function an(t,e,n){let o=on(e.provider,e.model,n),i=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?rn(o,e.inputTokens,e.outputTokens,i):0,a={timestamp:Date.now(),provider:e.provider,model:e.model,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,cost:s,role:e.role};return{records:[...t.records,a],retries:t.retries}}r(an,"recordUsage");function Si(t){let e=0,n=0,o=0,i=0,s=0,a=0,c={},d={};for(let f of t.records){e+=f.cost,n+=f.inputTokens,o+=f.outputTokens,i+=f.cacheReadTokens+f.cacheWriteTokens,s+=f.cacheReadTokens,a+=f.cacheWriteTokens;let y=c[f.provider];c[f.provider]={cost:(y?.cost??0)+f.cost,calls:(y?.calls??0)+1,inputTokens:(y?.inputTokens??0)+f.inputTokens,outputTokens:(y?.outputTokens??0)+f.outputTokens};let g=f.role??"default",b=d[g];d[g]={cost:(b?.cost??0)+f.cost,calls:(b?.calls??0)+1,inputTokens:(b?.inputTokens??0)+f.inputTokens,outputTokens:(b?.outputTokens??0)+f.outputTokens}}let l=0;for(let f of t.retries)l+=f.waitMs;let u=i>0?s/i:0;return{totalCost:e,totalInputTokens:n,totalOutputTokens:o,totalCacheTokens:i,totalCacheReadTokens:s,totalCacheWriteTokens:a,cacheHitRate:u,callCount:t.records.length,retryCount:t.retries.length,retryWaitMs:l,byProvider:c,byRole:d}}r(Si,"getSummary");function pt(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}r(pt,"formatCost");function Ri(t){let e=[];if(e.push(`Session Cost: ${pt(t.totalCost)} (${t.callCount} calls)`),e.push(`Tokens: ${t.totalInputTokens.toLocaleString()} in / ${t.totalOutputTokens.toLocaleString()} out`),t.totalCacheTokens>0){let i=(t.cacheHitRate*100).toFixed(0);e.push(`Cache: ${t.totalCacheTokens.toLocaleString()} tokens (${t.totalCacheReadTokens.toLocaleString()} read / ${t.totalCacheWriteTokens.toLocaleString()} write, ${i}% hit rate)`)}if(t.retryCount>0){let i=(t.retryWaitMs/1e3).toFixed(1);e.push(`Retries: ${t.retryCount} (${i}s total wait)`)}e.push("");let n=Object.entries(t.byProvider).sort((i,s)=>s[1].cost-i[1].cost);if(n.length>0){e.push("By Provider:");for(let[i,s]of n)e.push(` ${i}: ${pt(s.cost)} (${s.calls} calls, ${s.inputTokens.toLocaleString()} in / ${s.outputTokens.toLocaleString()} out)`);e.push("")}let o=Object.entries(t.byRole).sort((i,s)=>s[1].cost-i[1].cost);if(o.length>1){e.push("By Role:");for(let[i,s]of o)e.push(` ${i}: ${pt(s.cost)} (${s.calls} calls)`)}return e.join(`
|
|
30
|
+
`}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:n.readable,outputStream:e.writable,abort:r(()=>{l.abort(),e.readable.cancel().catch(()=>{}),n.writable.abort().catch(()=>{})},"abort"),executor:t}}r(Ve,"createPseudoAcpServer");import Sn from"node:fs";import Rn from"node:os";import An from"node:path";var qo="gpt-5.4",Qo="auto-gemini-3",Zo=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],ei=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function On(t){let e=new Set,n=[];for(let o of t){let i=o.trim();if(!i)continue;let s=i.toLowerCase();e.has(s)||(e.add(s),n.push(i))}return n}r(On,"dedupePreserveOrder");function ti(){let t=An.join(Rn.homedir(),".codex","config.toml");try{return Sn.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}r(ti,"readCodexConfiguredModel");function ni(){let t=An.join(Rn.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}}r(ni,"readGeminiConfiguredModel");function pe(){return ti()||qo}r(pe,"getCodexCliDefaultModel");function fe(){return ni()||Qo}r(fe,"getGeminiCliDefaultModel");function Te(){return On([pe(),...Zo])}r(Te,"getCodexCliKnownModels");function Ee(){return On([fe(),...ei])}r(Ee,"getGeminiCliKnownModels");var It=fe(),oi=Ee(),ii={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},Ge=class extends ue{static{r(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:It,models:oi.filter(e=>e!==It).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new ze({model:It});this.acpClientOptions=Ve(e)}getCapabilityProfile(){return X(ii)}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 He=class extends de{static{r(this,"CodexCLIExecutor")}model;constructor(e){super({command:"codex",baseArgs:["exec","--json","--full-auto"],timeout:3e5,...e}),this.model=e?.model??"gpt-5.4"}async checkInstalled(){return Xe("codex")}buildArgs(e){this.model=e.model??this.model;let 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 Nt=pe(),ri=Te(),Je=class extends ue{static{r(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:Nt,models:ri.filter(e=>e!==Nt).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new He({model:Nt});this.acpClientOptions=Ve(e)}};import{existsSync as di,readFileSync as pi}from"node:fs";import me from"node:path";import{fileURLToPath as fi}from"node:url";var Dn=["none","prompt-only","native-effort","native-budget","native-toggle","native-adaptive","unknown"],In=["native","image-input-native","cli-bridge","image-input-cli-bridge"],Nn=["count-tokens","models-list","minimal-message","unsupported"];function we(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}r(we,"isPlainObject");function qe(t,e){if(typeof t!="string"||t.length===0)throw new Error(`provider-capabilities.json: ${e} must be a non-empty string`);return t}r(qe,"requireString");function Ln(t,e){if(t!==void 0)return qe(t,e)}r(Ln,"optionalString");function ne(t,e){if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new Error(`provider-capabilities.json: ${e} must be a non-negative finite number`);return t}}r(ne,"optionalNumber");function Ye(t,e){if(t!==void 0){if(typeof t!="boolean")throw new Error(`provider-capabilities.json: ${e} must be a boolean`);return t}}r(Ye,"optionalBoolean");function Lt(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}r(Lt,"requireReasoningCapability");function si(t,e){if(typeof t!="string"||!In.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${In.join(", ")}, got ${JSON.stringify(t)}`);return t}r(si,"requireProfileName");function ai(t,e){if(typeof t!="string"||!Nn.includes(t))throw new Error(`provider-capabilities.json: ${e} must be one of ${Nn.join(", ")}, got ${JSON.stringify(t)}`);return t}r(ai,"requireVerifyStrategy");function ci(t,e){if(!we(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n=qe(t.id,`${e}.id`),o=Ln(t.displayName,`${e}.displayName`),i=ne(t.contextWindow,`${e}.contextWindow`),s=ne(t.maxOutputTokens,`${e}.maxOutputTokens`),a=ne(t.thinkingBudgetCap,`${e}.thinkingBudgetCap`),c=Ye(t.replayReasoningContent,`${e}.replayReasoningContent`),d=Ye(t.strictThinkingSignature,`${e}.strictThinkingSignature`),l=ne(t.streamMaxDurationMs,`${e}.streamMaxDurationMs`),u=t.reasoningCapability===void 0?void 0:Lt(t.reasoningCapability,`${e}.reasoningCapability`),f={id:n};return o!==void 0&&(f.displayName=o),i!==void 0&&(f.contextWindow=i),s!==void 0&&(f.maxOutputTokens=s),a!==void 0&&(f.thinkingBudgetCap=a),u!==void 0&&(f.reasoningCapability=u),c!==void 0&&(f.replayReasoningContent=c),d!==void 0&&(f.strictThinkingSignature=d),l!==void 0&&(f.streamMaxDurationMs=l),f}r(ci,"validateModelDescriptor");function li(t,e){if(t===void 0)return;if(!we(t))throw new Error(`provider-capabilities.json: ${e} must be an object`);let n={};for(let[o,i]of Object.entries(t))n[o]=Lt(i,`${e}.${o}`);return n}r(li,"validateModelReasoningCapabilities");function ui(t,e){if(!we(t))throw new Error(`provider-capabilities.json: providers.${e} must be an object`);let n=Ye(t.cliBridge,`providers.${e}.cliBridge`),o=qe(t.apiKeyEnv,`providers.${e}.apiKeyEnv`),i=Lt(t.reasoningCapability,`providers.${e}.reasoningCapability`),s=si(t.capabilityProfile,`providers.${e}.capabilityProfile`),a=ai(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=ne(t.contextWindow,`providers.${e}.contextWindow`),d=ne(t.maxOutputTokens,`providers.${e}.maxOutputTokens`),l=ne(t.thinkingBudgetCap,`providers.${e}.thinkingBudgetCap`),u=Ye(t.supportsThinking,`providers.${e}.supportsThinking`),f=li(t.modelReasoningCapabilities,`providers.${e}.modelReasoningCapabilities`),y=Ln(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 g;if(t.models!==void 0){if(!Array.isArray(t.models))throw new Error(`provider-capabilities.json: providers.${e}.models must be an array`);g=t.models.map((p,v)=>ci(p,`providers.${e}.models[${v}]`))}let b={apiKeyEnv:o,reasoningCapability:i,capabilityProfile:s,verifyStrategy:a};return y!==void 0&&(b.model=y),g!==void 0&&(b.models=g),c!==void 0&&(b.contextWindow=c),d!==void 0&&(b.maxOutputTokens=d),l!==void 0&&(b.thinkingBudgetCap=l),u!==void 0&&(b.supportsThinking=u),f!==void 0&&(b.modelReasoningCapabilities=f),n&&(b.cliBridge=!0),b}r(ui,"validateProviderEntry");function Bn(t){if(!we(t))throw new Error("provider-capabilities.json: root must be an object");if(t.version!==1)throw new Error(`provider-capabilities.json: version must be 1, got ${JSON.stringify(t.version)}`);let e=qe(t.updatedAt,"updatedAt");if(!we(t.providers))throw new Error("provider-capabilities.json: providers must be an object");let n={};for(let[o,i]of Object.entries(t.providers))n[o]=ui(i,o);return{version:1,updatedAt:e,providers:n}}r(Bn,"validateProviderCapabilitiesJson");var mi=Object.freeze({native:te,"image-input-native":gn,"cli-bridge":be,"image-input-cli-bridge":hn}),Qe=null;function gi(){if(process.env.KODAX_BUNDLED==="true")return me.join(me.dirname(process.execPath),"provider-capabilities.json");let t=me.dirname(fi(import.meta.url)),e=[me.join(t,"provider-capabilities.json"),me.join(me.dirname(t),"provider-capabilities.json")];for(let n of e)if(di(n))return n;return e[0]}r(gi,"resolveJsonPath");function hi(t){if(t.models){for(let e of t.models)Object.freeze(e);Object.freeze(t.models)}return t.modelReasoningCapabilities&&Object.freeze(t.modelReasoningCapabilities),Object.freeze(t)}r(hi,"deepFreezeSnapshot");function yi(t){if(t==="gemini-cli"){let e=fe();return{model:e,models:Ee().filter(n=>n!==e).map(n=>({id:n}))}}if(t==="codex-cli"){let e=pe();return{model:e,models:Te().filter(n=>n!==e).map(n=>({id:n}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${t}'`)}r(yi,"resolveCliBridgeModels");function vi(t,e){let n=mi[e.capabilityProfile];if(!n)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${e.capabilityProfile}' for provider '${t}'`);if(e.cliBridge){let i=yi(t),s={model:i.model,models:i.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}r(vi,"buildSnapshot");function Fn(){if(Qe)return Qe;let t=gi(),e;try{let i=pi(t,"utf8");e=JSON.parse(i)}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`provider-capabilities loader: failed to read ${t}: ${s}`)}let n=Bn(e),o={};for(let[i,s]of Object.entries(n.providers))o[i]=hi(vi(i,s));return Qe=Object.freeze(o),Qe}r(Fn,"getProviderSnapshots");import ki from"@anthropic-ai/sdk";var A=Fn();function U(t,e={}){let n=A[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}}r(U,"buildProviderConfig");var Bt=class extends I{static{r(this,"AnthropicProvider")}name="anthropic";config=U("anthropic",{strictThinkingSignature:!0});buildClient(){return new ki({apiKey:this.getApiKey()})}},Ft=class extends I{static{r(this,"ZhipuCodingProvider")}name="zhipu-coding";config=U("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",streamMaxDurationMs:3e5})},Kt=class extends I{static{r(this,"KimiCodeProvider")}name="kimi-code";config=U("kimi-code",{baseUrl:"https://api.kimi.com/coding/"})},$t=class extends I{static{r(this,"MiniMaxCodingProvider")}name="minimax-coding";config=U("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic"})},Ut=class extends I{static{r(this,"MimoCodingProvider")}name="mimo-coding";config=U("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic"})},jt=class extends I{static{r(this,"MimoProvider")}name="mimo";config=U("mimo",{baseUrl:"https://api.xiaomimimo.com/anthropic"})},Wt=class extends I{static{r(this,"ArkCodingProvider")}name="ark-coding";config=U("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding"})},Xt=class extends K{static{r(this,"OpenAIProvider")}name="openai";config=U("openai")},zt=class extends K{static{r(this,"DeepSeekProvider")}name="deepseek";config=U("deepseek",{baseUrl:"https://api.deepseek.com",replayReasoningContent:!0})},Vt=class extends K{static{r(this,"KimiProvider")}name="kimi";config=U("kimi",{baseUrl:"https://api.moonshot.cn/v1",replayReasoningContent:!0})},Gt=class extends K{static{r(this,"QwenProvider")}name="qwen";config=U("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",replayReasoningContent:!0})},Ht=class extends K{static{r(this,"ZhipuProvider")}name="zhipu";config=U("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",replayReasoningContent:!0})},$={anthropic:r(()=>new Bt,"anthropic"),openai:r(()=>new Xt,"openai"),deepseek:r(()=>new zt,"deepseek"),kimi:r(()=>new Vt,"kimi"),"kimi-code":r(()=>new Kt,"kimi-code"),qwen:r(()=>new Gt,"qwen"),zhipu:r(()=>new Ht,"zhipu"),"zhipu-coding":r(()=>new Ft,"zhipu-coding"),"minimax-coding":r(()=>new $t,"minimax-coding"),"mimo-coding":r(()=>new Ut,"mimo-coding"),mimo:r(()=>new jt,"mimo"),"ark-coding":r(()=>new Wt,"ark-coding"),"gemini-cli":r(()=>new Ge,"gemini-cli"),"codex-cli":r(()=>new Je,"codex-cli")},Jt=process.env.KODAX_PROVIDER??"zhipu-coding",Kn=new Map;function bi(t){if(O(t))return A[t].apiKeyEnv}r(bi,"resolveApiKeyEnvForProvider");function $n(t){let e=t??Jt,n=$[e];if(!n)throw new R(`Unknown provider: ${e}. Available: ${Object.keys($).join(", ")}`,e);let o=bi(e),i=o?process.env[o]:void 0,s=Kn.get(e);if(s&&s.apiKey===i)return s.instance;let a=n();return Kn.set(e,{apiKey:i,instance:a}),a}r($n,"getProvider");function Un(t){return O(t)?!!process.env[A[t].apiKeyEnv]:!1}r(Un,"isProviderConfigured");function jn(t){return O(t)?A[t].model:null}r(jn,"getProviderModel");function Wn(t,e){if(!O(t))return"unknown";let n=A[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}r(Wn,"getProviderConfiguredReasoningCapability");function Xn(t){return O(t)?X(A[t].capabilityProfile):null}r(Xn,"getProviderConfiguredCapabilityProfile");function zn(){let t=[];for(let e of Object.keys($)){let n=A[e];t.push({name:e,model:n.model,models:n.models?[n.model,...n.models.map(o=>o.id)]:[n.model],configured:!!process.env[n.apiKeyEnv],reasoningCapability:n.reasoningCapability,capabilityProfile:X(n.capabilityProfile)})}return t}r(zn,"getProviderList");function Vn(t){let e=A[t];return e?e.models?[e.model,...e.models.map(n=>n.id)]:[e.model]:[]}r(Vn,"getProviderModels");function O(t){return t in $}r(O,"isProviderName");function Yt(t){return{id:t.model}}r(Yt,"makeDefaultDescriptor");function Ze(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}}r(Ze,"effectiveCapabilities");function et(t){let e=A[t];return e?[Yt(e),...e.models??[]]:[]}r(et,"getProviderModelDescriptors");function tt(t,e){let n=A[t];if(!n)return;if(e===n.model)return Ze(t,n,Yt(n));let o=n.models?.find(i=>i.id===e);if(o)return Ze(t,n,o)}r(tt,"getModelCapabilities");function nt(){let t=[];for(let e of Object.keys($)){let n=A[e];t.push(Ze(e,n,Yt(n)));for(let o of n.models??[])t.push(Ze(e,n,o))}return t}r(nt,"listBuiltinModelCapabilities");var _i=new Set(["compat","sdk"]),Ci=new Set(["count-tokens","models-list","minimal-message","unsupported"]);function xi(t){return t==="anthropic"?"count-tokens":"models-list"}r(xi,"defaultVerifyStrategyForProtocol");function Me(t){if(!t.name||!t.baseUrl||!t.apiKeyEnv||!t.model)throw new Error(`Custom provider requires name, baseUrl, apiKeyEnv, and model. Got: ${JSON.stringify({name:t.name,baseUrl:t.baseUrl,apiKeyEnv:t.apiKeyEnv,model:t.model})}`);if(t.protocol!=="anthropic"&&t.protocol!=="openai")throw new Error(`Unknown protocol "${t.protocol}" for custom provider "${t.name}". Must be "anthropic" or "openai".`);if(t.userAgentMode!==void 0&&!_i.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(!Ci.has(t.verifyStrategy))throw new Error(`Unknown verifyStrategy "${t.verifyStrategy}" for custom provider "${t.name}". Must be one of "count-tokens" | "models-list" | "minimal-message" | "unsupported".`);if(t.protocol==="openai"&&t.verifyStrategy==="count-tokens")throw new Error(`Custom provider "${t.name}": verifyStrategy="count-tokens" requires Anthropic protocol; got protocol="openai". Use "models-list" or "minimal-message" for OpenAI-compat.`)}}r(Me,"validateCustomProviderConfig");function Ti(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??xi(t.protocol)}}r(Ti,"buildProviderConfig");function ot(t){Me(t);let e=Ti(t);return t.protocol==="anthropic"?new qt(t.name,e):new Qt(t.name,e)}r(ot,"createCustomProvider");var qt=class extends I{static{r(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n}},Qt=class extends K{static{r(this,"DynamicOpenAIProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n}};var J=new Map,Zt=new Map;function Gn(t){let e=new Set,n=new Map,o=new Map;for(let i of t){if(Me(i),e.has(i.name))throw new Error(`Duplicate custom provider name: "${i.name}". Each custom provider must have a unique name.`);i.name in $&&console.warn(`[kodax] Custom provider "${i.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(i.name),n.set(i.name,i),o.set(i.name,()=>ot(i))}J.clear(),Zt.clear();for(let[i,s]of n)J.set(i,s);for(let[i,s]of o)Zt.set(i,s)}r(Gn,"registerCustomProviders");function it(t){let e=Zt.get(t);return e?e():void 0}r(it,"getCustomProvider");function he(t){return J.has(t)}r(he,"isCustomProviderName");function rt(){return[...J.keys()]}r(rt,"getCustomProviderNames");function Hn(){let t=[];for(let[e,n]of J){let o=!!process.env[n.apiKeyEnv],i=(n.models??[]).map(a=>typeof a=="string"?a:a.id),s=n.model&&i.length?[...new Set([n.model,...i])]:[n.model];t.push({name:e,model:n.model,models:s,configured:o,reasoningCapability:n.reasoningCapability??"none",capabilityProfile:X(n.capabilityProfile??te),custom:!0})}return t}r(Hn,"getCustomProviderList");function Jn(t){let e=J.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]}r(Jn,"getCustomProviderModels");function Yn(t){return typeof t=="string"?{id:t}:t}r(Yn,"customDescriptorToFull");function st(t){let e=J.get(t);if(!e)return;let n={id:e.model},o=(e.models??[]).map(Yn).filter(i=>i.id!==e.model);return[n,...o]}r(st,"getCustomProviderModelDescriptors");function ge(t,e){let n=J.get(t);if(!n)return;let o=e===n.model,i=o?{id:n.model}:(n.models??[]).map(Yn).find(s=>s.id===e);if(i)return{provider:t,model:i.id,displayName:i.displayName??i.id,supportsThinking:n.supportsThinking??!1,reasoningCapability:i.reasoningCapability??n.reasoningCapability??"none",contextWindow:i.contextWindow??n.contextWindow,maxOutputTokens:i.maxOutputTokens??n.maxOutputTokens,thinkingBudgetCap:i.thinkingBudgetCap??n.thinkingBudgetCap,isDefault:o}}r(ge,"getCustomModelCapabilities");function qn(t){let e=J.get(t);if(!e)return;let n=e.verifyStrategy??(e.protocol==="anthropic"?"count-tokens":"models-list");return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:n}}r(qn,"getCustomProviderVerifyMetadata");function at(){let t=[];for(let[e,n]of J){let o=ge(e,n.model);o&&t.push(o);for(let i of n.models??[]){let s=typeof i=="string"?i:i.id;if(s===n.model)continue;let a=ge(e,s);a&&t.push(a)}}return t}r(at,"listCustomProviderModelCapabilities");var Q=new Map,Ei=0;function en(t){let e=Q.get(t);if(!(!e||e.length===0))return e[e.length-1]}r(en,"getActiveRuntimeProviderRegistration");function wi(t){for(let[e,n]of Q){let o=n.filter(i=>i.id!==t);if(o.length!==n.length){o.length===0?Q.delete(e):Q.set(e,o);return}}}r(wi,"removeRuntimeProviderRegistration");function Qn(t,e){let n=t.trim();if(!n)throw new Error("Model provider name cannot be empty.");if(O(n))throw new Error(`Runtime model provider "${n}" conflicts with a built-in provider.`);if(he(n))throw new Error(`Runtime model provider "${n}" conflicts with an existing config-defined custom provider.`);let o={id:`runtime-provider:${++Ei}`,name:n,factory:e},i=Q.get(n)??[];return Q.set(n,[...i,o]),()=>{wi(o.id)}}r(Qn,"registerModelProvider");function ct(t){let e=en(t);return e?e.factory():void 0}r(ct,"getRuntimeModelProvider");function Pe(t){return en(t)!==void 0}r(Pe,"isRuntimeModelProviderName");function lt(){return Array.from(Q.keys()).filter(t=>en(t)!==void 0)}r(lt,"getRuntimeModelProviderNames");function Zn(){Q.clear()}r(Zn,"clearRuntimeModelProviders");function tn(t){if(O(t))return $[t]();let e=ct(t);if(e)return e;let n=it(t);if(n)return n;let o=dt();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}r(tn,"resolveProvider");function ut(t){return O(t)||Pe(t)||he(t)}r(ut,"isKnownProvider");function dt(){let t=Object.keys($),e=lt(),n=rt();return[...new Set([...t,...e,...n])]}r(dt,"getAvailableProviderNames");function nn(t){return O(t)?et(t):st(t)??[]}r(nn,"resolveProviderModelDescriptors");function eo(t,e){return O(t)?tt(t,e):ge(t,e)}r(eo,"resolveModelCapabilities");function to(){return[...nt(),...at()]}r(to,"listAllModelCapabilities");function Mi(t){if(O(t)){let e=A[t];return{apiKeyEnv:e.apiKeyEnv,verifyStrategy:e.verifyStrategy}}if(!Pe(t))return qn(t)}r(Mi,"getProviderVerifyMetadata");async function no(t,e){let n=Mi(t);if(!n&&!ut(t))return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:`Unknown provider: "${t}". Available: ${dt().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=tn(t)}catch(i){return{ok:!1,error:"unconfigured",strategy:n?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(i?.message??i).slice(0,240)}}try{return await o.verifyCredential(e)}catch(i){return{ok:!1,error:"unknown",strategy:n?.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:String(i?.message??i).slice(0,240)}}}r(no,"verifyProviderCredential");async function oo(t,e){if(!ut(t))return{ok:!1,source:"failed",error:`Unknown provider: "${t}"`,durationMs:0};let n=nn(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(i=>i.id),durationMs:0}}r(oo,"listProviderModels");var io={anthropic:{"claude-opus-4-8":{inputPer1M:5,outputPer1M:25,cachePer1M:.5},"claude-opus-4-7":{inputPer1M:5,outputPer1M:25,cachePer1M:.5},"claude-opus-4-6":{inputPer1M:5,outputPer1M:25,cachePer1M:.5},"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.2":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03},"glm-4.7":{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 on(t,e,n){let o=n?.[t]?.[e];return o||io[t]?.[e]}r(on,"getCostRate");function rn(t,e,n,o=0){let i=e/1e6*t.inputPer1M,s=n/1e6*t.outputPer1M,a=t.cachePer1M?o/1e6*t.cachePer1M:0;return i+s+a}r(rn,"calculateCost");function Pi(){return{records:[],retries:[]}}r(Pi,"createCostTracker");function sn(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]}}r(sn,"recordRetry");function an(t,e,n){let o=on(e.provider,e.model,n),i=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?rn(o,e.inputTokens,e.outputTokens,i):0,a={timestamp:Date.now(),provider:e.provider,model:e.model,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,cost:s,role:e.role};return{records:[...t.records,a],retries:t.retries}}r(an,"recordUsage");function Si(t){let e=0,n=0,o=0,i=0,s=0,a=0,c={},d={};for(let f of t.records){e+=f.cost,n+=f.inputTokens,o+=f.outputTokens,i+=f.cacheReadTokens+f.cacheWriteTokens,s+=f.cacheReadTokens,a+=f.cacheWriteTokens;let y=c[f.provider];c[f.provider]={cost:(y?.cost??0)+f.cost,calls:(y?.calls??0)+1,inputTokens:(y?.inputTokens??0)+f.inputTokens,outputTokens:(y?.outputTokens??0)+f.outputTokens};let g=f.role??"default",b=d[g];d[g]={cost:(b?.cost??0)+f.cost,calls:(b?.calls??0)+1,inputTokens:(b?.inputTokens??0)+f.inputTokens,outputTokens:(b?.outputTokens??0)+f.outputTokens}}let l=0;for(let f of t.retries)l+=f.waitMs;let u=i>0?s/i:0;return{totalCost:e,totalInputTokens:n,totalOutputTokens:o,totalCacheTokens:i,totalCacheReadTokens:s,totalCacheWriteTokens:a,cacheHitRate:u,callCount:t.records.length,retryCount:t.retries.length,retryWaitMs:l,byProvider:c,byRole:d}}r(Si,"getSummary");function pt(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}r(pt,"formatCost");function Ri(t){let e=[];if(e.push(`Session Cost: ${pt(t.totalCost)} (${t.callCount} calls)`),e.push(`Tokens: ${t.totalInputTokens.toLocaleString()} in / ${t.totalOutputTokens.toLocaleString()} out`),t.totalCacheTokens>0){let i=(t.cacheHitRate*100).toFixed(0);e.push(`Cache: ${t.totalCacheTokens.toLocaleString()} tokens (${t.totalCacheReadTokens.toLocaleString()} read / ${t.totalCacheWriteTokens.toLocaleString()} write, ${i}% hit rate)`)}if(t.retryCount>0){let i=(t.retryWaitMs/1e3).toFixed(1);e.push(`Retries: ${t.retryCount} (${i}s total wait)`)}e.push("");let n=Object.entries(t.byProvider).sort((i,s)=>s[1].cost-i[1].cost);if(n.length>0){e.push("By Provider:");for(let[i,s]of n)e.push(` ${i}: ${pt(s.cost)} (${s.calls} calls, ${s.inputTokens.toLocaleString()} in / ${s.outputTokens.toLocaleString()} out)`);e.push("")}let o=Object.entries(t.byRole).sort((i,s)=>s[1].cost-i[1].cost);if(o.length>1){e.push("By Role:");for(let[i,s]of o)e.push(` ${i}: ${pt(s.cost)} (${s.calls} calls)`)}return e.join(`
|
|
31
31
|
`)}r(Ri,"formatCostReport");var ro={inputTokens:0,outputTokens:0,totalTokens:0},Ai=3e4;async function Oi(t){let e=new AbortController,n=t.timeoutMs??Ai,o=t.costTracker,i,s=r(d=>{i||(i=d),e.abort()},"recordAbort"),a=setTimeout(()=>s("timeout"),n),c=r(()=>s("parent"),"onParentAbort");t.abortSignal&&(t.abortSignal.aborted?s("parent"):t.abortSignal.addEventListener("abort",c,{once:!0}));try{let d=await t.provider.stream([...t.messages],[],t.system,t.reasoning??{mode:"off"},{modelOverride:t.model,onRetryAfter:r(g=>{o&&(o=sn(o,{provider:g.provider,waitMs:g.waitMs,reason:g.reason,source:g.source}))},"onRetryAfter")},e.signal),l=d.usage??ro,u=d.textBlocks??[],f=d.toolBlocks??[],y=u.map(g=>g.text).join("");return f.length>0?{text:y,usage:l,costTracker:o,stopReason:"error",error:new Error(`sideQuery: provider returned ${f.length} tool_use block(s); sideQuery expects text-only output`)}:(o&&(o=an(o,{provider:t.provider.name,model:t.model,inputTokens:l.inputTokens,outputTokens:l.outputTokens,cacheReadTokens:l.cachedReadTokens,cacheWriteTokens:l.cachedWriteTokens,role:t.querySource})),{text:y,usage:l,costTracker:o,stopReason:Di(d.stopReason)})}catch(d){let l=d instanceof Error?d:new Error(String(d)),u="error";return e.signal.aborted&&(u=i==="timeout"?"timeout":"aborted"),{text:"",usage:ro,costTracker:o,stopReason:u,error:l}}finally{clearTimeout(a),t.abortSignal&&t.abortSignal.removeEventListener("abort",c)}}r(Oi,"sideQuery");function Di(t){return t==="max_tokens"?"max_tokens":"end_turn"}r(Di,"mapStopReason");export{Y as a,R as b,ke as c,ft as d,mt as e,gt as f,so as g,ao as h,co as i,lo as j,cn as k,ln as l,ht as m,oe as n,Re as o,un as p,ie as q,re as r,yt as s,_t as t,Ct as u,se as v,Oe as w,Tt as x,ho as y,De as z,Ie as A,Ne as B,G as C,ae as D,ce as E,wt as F,Mt as G,le as H,Pt as I,_e as J,I as K,K as L,pe as M,fe as N,Te as O,Ee as P,A as Q,$ as R,Jt as S,$n as T,Un as U,jn as V,Wn as W,Xn as X,zn as Y,Vn as Z,O as _,et as $,tt as aa,nt as ba,Me as ca,ot as da,Gn as ea,it as fa,he as ga,rt as ha,Hn as ia,Jn as ja,st as ka,ge as la,at as ma,Qn as na,ct as oa,Pe as pa,lt as qa,Zn as ra,tn as sa,ut as ta,dt as ua,nn as va,eo as wa,to as xa,no as ya,oo as za,io as Aa,on as Ba,rn as Ca,Pi as Da,sn as Ea,an as Fa,Si as Ga,pt as Ha,Ri as Ia,Oi as Ja};
|