@kodax-ai/kodax 0.7.43 → 0.7.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/dist/chunks/{chunk-YMRZBS4G.js → chunk-35BDEEC5.js} +1 -1
- package/dist/chunks/{chunk-7G5PSL6C.js → chunk-4YPL2UVZ.js} +253 -235
- package/dist/chunks/chunk-DI2G3YWL.js +31 -0
- package/dist/chunks/chunk-HHQ7YTGM.js +425 -0
- package/dist/chunks/chunk-QHILHQBB.js +519 -0
- package/dist/chunks/{chunk-IYSK7LUK.js → chunk-RUDYNAK7.js} +1 -1
- package/dist/chunks/{compaction-config-3E57ABCT.js → compaction-config-NAPRF7XR.js} +1 -1
- package/dist/chunks/{construction-bootstrap-JR63KI5N.js → construction-bootstrap-PHTGBRNU.js} +1 -1
- package/dist/chunks/dist-CCYBJJZY.js +2 -0
- package/dist/chunks/{dist-XANXEVTU.js → dist-RHIHZAYX.js} +1 -1
- package/dist/chunks/{utils-HQ2QCKJA.js → utils-TV3UYCHQ.js} +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.js +2 -2
- package/dist/kodax_cli.js +624 -589
- package/dist/provider-capabilities.json +167 -0
- package/dist/sdk-agent.d.ts +62 -7
- package/dist/sdk-agent.js +1 -1
- package/dist/sdk-coding.d.ts +367 -13
- package/dist/sdk-coding.js +1 -1
- package/dist/sdk-llm.d.ts +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 +2 -2
- package/dist/sdk-session.js +1 -1
- package/dist/sdk-skills.js +1 -1
- package/dist/types-chunks/{bash-prefix-extractor.d-DMrGImMl.d.ts → bash-prefix-extractor.d-DdoSeghD.d.ts} +417 -5
- package/dist/types-chunks/file-tracker.d-DOfaoCbJ.d.ts +633 -0
- package/dist/types-chunks/{resolver.d-CA68_NeH.d.ts → resolver.d-B7ZnVuuf.d.ts} +16 -13
- package/dist/types-chunks/{storage.d-DPAEX7zS.d.ts → storage.d-DFD9ln5c.d.ts} +1 -1
- package/dist/types-chunks/{file-tracker.d-zaLZeNBK.d.ts → types.d-DM8zEJgF.d.ts} +1029 -535
- package/dist/types-chunks/{types.d-mM8vqvhT.d.ts → types.d-HBbWT-iA.d.ts} +41 -3
- package/dist/types-chunks/{utils.d-DkLZD_wa.d.ts → utils.d-C5fzCE9W.d.ts} +3 -3
- package/package.json +2 -2
- package/dist/chunks/chunk-K75O2CAE.js +0 -31
- package/dist/chunks/chunk-UG4262JI.js +0 -502
- package/dist/chunks/chunk-VHKAJDQD.js +0 -425
- package/dist/chunks/dist-KWHUKXEL.js +0 -2
- package/dist/types-chunks/types.d-CKJtjo-6.d.ts +0 -1127
|
@@ -82,7 +82,45 @@ interface KodaXSessionArchiveMarkerEntry extends KodaXSessionEntryBase {
|
|
|
82
82
|
/** Brief summary of the archived content */
|
|
83
83
|
summary: string;
|
|
84
84
|
}
|
|
85
|
-
type
|
|
85
|
+
type KodaXGoalStatus = 'active' | 'paused' | 'budget_limited' | 'blocked' | 'complete';
|
|
86
|
+
/**
|
|
87
|
+
* Persistent user-set goal state. v0.7.44 FEATURE_192 — backs the
|
|
88
|
+
* `/goal` slash command and the get_goal / create_goal / update_goal
|
|
89
|
+
* tools.
|
|
90
|
+
*
|
|
91
|
+
* Persistence model: each lifecycle event (create / update / pause /
|
|
92
|
+
* resume / clear / budget_limited / blocked / complete) appends a
|
|
93
|
+
* `KodaXSessionGoalEntry` carrying a frozen `KodaXGoalState` snapshot
|
|
94
|
+
* to the session lineage. `readLatestGoalFromBranch` walks the active
|
|
95
|
+
* branch's message-entry IDs and returns the latest goal entry whose
|
|
96
|
+
* parentId belongs to that branch — so forks and rewinds naturally
|
|
97
|
+
* drop goals attached to abandoned message paths.
|
|
98
|
+
*/
|
|
99
|
+
interface KodaXGoalState {
|
|
100
|
+
readonly version: 1;
|
|
101
|
+
/** `${createdAt}-${rand}` — stable across updates of the same goal. */
|
|
102
|
+
readonly id: string;
|
|
103
|
+
readonly objective: string;
|
|
104
|
+
readonly status: KodaXGoalStatus;
|
|
105
|
+
/** Optional explicit token budget; null when the user did not set one. */
|
|
106
|
+
readonly tokenBudget: number | null;
|
|
107
|
+
readonly tokensUsed: number;
|
|
108
|
+
readonly timeUsedSeconds: number;
|
|
109
|
+
/** Consecutive turns the model has reported the same blocker. */
|
|
110
|
+
readonly blockerTurnCount: number;
|
|
111
|
+
/** The blocker_kind string the model last reported, or null. */
|
|
112
|
+
readonly lastBlockerKind: string | null;
|
|
113
|
+
readonly createdAt: number;
|
|
114
|
+
readonly updatedAt: number;
|
|
115
|
+
}
|
|
116
|
+
type KodaXGoalEventType = 'created' | 'updated' | 'paused' | 'resumed' | 'cleared' | 'budget_limited' | 'blocked' | 'complete';
|
|
117
|
+
interface KodaXSessionGoalEntry extends KodaXSessionEntryBase {
|
|
118
|
+
type: 'goal';
|
|
119
|
+
/** Snapshot at time of event; `null` only when `event === 'cleared'`. */
|
|
120
|
+
goal: KodaXGoalState | null;
|
|
121
|
+
event: KodaXGoalEventType;
|
|
122
|
+
}
|
|
123
|
+
type KodaXSessionEntry = KodaXSessionMessageEntry | KodaXSessionCompactionEntry | KodaXSessionBranchSummaryEntry | KodaXSessionLabelEntry | KodaXSessionArchiveMarkerEntry | KodaXSessionGoalEntry;
|
|
86
124
|
interface KodaXSessionArtifactLedgerEntry {
|
|
87
125
|
id: string;
|
|
88
126
|
kind: 'file_read' | 'file_modified' | 'file_created' | 'file_deleted' | 'path_scope' | 'search_scope' | 'command_scope' | 'check_result' | 'decision' | 'image_input' | 'tombstone';
|
|
@@ -119,7 +157,7 @@ interface KodaXSessionNavigationOptions {
|
|
|
119
157
|
summarizeCurrentBranch?: boolean;
|
|
120
158
|
}
|
|
121
159
|
interface KodaXSessionTreeNode {
|
|
122
|
-
entry: Exclude<KodaXSessionEntry, KodaXSessionLabelEntry>;
|
|
160
|
+
entry: Exclude<KodaXSessionEntry, KodaXSessionLabelEntry | KodaXSessionGoalEntry>;
|
|
123
161
|
children: KodaXSessionTreeNode[];
|
|
124
162
|
label?: string;
|
|
125
163
|
active: boolean;
|
|
@@ -251,4 +289,4 @@ interface KodaXSessionStorage {
|
|
|
251
289
|
deleteAll?(gitRoot?: string): Promise<void>;
|
|
252
290
|
}
|
|
253
291
|
|
|
254
|
-
export type { KodaXCompactMemoryProgress as K, SessionErrorMetadata as S, KodaXCompactMemorySeed as a, KodaXExtensionSessionRecord as b, KodaXExtensionSessionState as c, KodaXExtensionStore as d, KodaXExtensionStoreEntry as e,
|
|
292
|
+
export type { KodaXSessionUiHistoryItem as A, KodaXSessionUiHistoryItemType as B, KodaXSessionWorkspaceKind as C, KodaXCompactMemoryProgress as K, SessionErrorMetadata as S, KodaXCompactMemorySeed as a, KodaXExtensionSessionRecord as b, KodaXExtensionSessionState as c, KodaXExtensionStore as d, KodaXExtensionStoreEntry as e, KodaXGoalEventType as f, KodaXGoalState as g, KodaXGoalStatus as h, KodaXJsonValue as i, KodaXSessionArchiveMarkerEntry as j, KodaXSessionArtifactLedgerEntry as k, KodaXSessionBranchSummaryEntry as l, KodaXSessionCompactionEntry as m, KodaXSessionData as n, KodaXSessionEntry as o, KodaXSessionEntryBase as p, KodaXSessionGoalEntry as q, KodaXSessionLabelEntry as r, KodaXSessionLineage as s, KodaXSessionMessageEntry as t, KodaXSessionMeta as u, KodaXSessionNavigationOptions as v, KodaXSessionRuntimeInfo as w, KodaXSessionScope as x, KodaXSessionStorage as y, KodaXSessionTreeNode as z };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { l as BashPrefixExtractor,
|
|
2
|
-
import { a as SessionStorage$1 } from './storage.d-
|
|
3
|
-
import {
|
|
1
|
+
import { l as BashPrefixExtractor, a1 as KodaXOptions, L as KodaXContextTokenSnapshot, K as KodaXAgentMode, a6 as KodaXRepoIntelligenceMode, A as AgentsFile, i as AutoModeStats, ah as KodaXSkillInvocationContext, _ as KodaXMcpServersConfig } from './bash-prefix-extractor.d-DdoSeghD.js';
|
|
2
|
+
import { a as SessionStorage$1 } from './storage.d-DFD9ln5c.js';
|
|
3
|
+
import { y as KodaXSessionStorage, n as KodaXSessionData, A as KodaXSessionUiHistoryItem, s as KodaXSessionLineage, k as KodaXSessionArtifactLedgerEntry, w as KodaXSessionRuntimeInfo } from './types.d-HBbWT-iA.js';
|
|
4
4
|
import { m as KodaXMessage, D as KodaXReasoningMode, q as KodaXProviderCapabilityProfile, E as KodaXReasoningOverride, h as KodaXCustomProviderConfig } from './types.d-B1uGoVTE.js';
|
|
5
5
|
import * as readline from 'readline';
|
|
6
6
|
import { SpawnSyncReturns } from 'child_process';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kodax-ai/kodax",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.44",
|
|
4
4
|
"description": "极致轻量化 Coding Agent - TypeScript 实现,支持 12 个 LLM 提供商,可发布为免 Node 单文件二进制",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "npm run build:packages && npm run build:bundle && npm run build:dts",
|
|
55
55
|
"build:dts": "node scripts/build-dts.mjs",
|
|
56
|
-
"build:packages": "tsc -b tsconfig.build.json && npm run copy:builtin -w @kodax-ai/agent",
|
|
56
|
+
"build:packages": "tsc -b tsconfig.build.json && npm run copy:builtin -w @kodax-ai/agent && npm run copy:provider-caps -w @kodax-ai/llm",
|
|
57
57
|
"build:bundle": "node scripts/build-bundle.mjs",
|
|
58
58
|
"dev": "node --max-old-space-size=4096 --require ./scripts/production-env.cjs --import tsx src/kodax_cli.ts",
|
|
59
59
|
"dev:cli": "node --max-old-space-size=4096 --require ./scripts/production-env.cjs --import tsx src/kodax_cli.ts",
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
-
import{a as i}from"./chunk-V4WSBIXB.js";var V=class extends Error{static{i(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},R=class extends V{static{i(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},me=class extends V{static{i(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},Ye=class extends V{static{i(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},Je=class extends V{static{i(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var Qe=32768,Q=32e3,qe=64e3,bn=.5;var Cn=["off","auto","quick","balanced","deep"],Nt={low:6e3,medium:1e4,high:2e4},Bt=4096;function Ze(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}i(Ze,"getReasoningCapability");function q(t){return ve(t).enabled}i(q,"isReasoningEnabled");function ve(t){if(typeof t=="boolean")return{enabled:t,mode:t?"auto":"off",depth:t?"medium":"off",taskType:"unknown",executionMode:"implementation"};let e=t?.mode??"off",n=t?.depth??Ft(e),o=t?.enabled??(e!=="off"&&n!=="off");return{enabled:o&&e!=="off"&&n!=="off",mode:e,depth:o?n:"off",taskType:t?.taskType??"unknown",executionMode:t?.executionMode??"implementation"}}i(ve,"normalizeReasoningRequest");function Ft(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}i(Ft,"getDefaultThinkingDepthForMode");function Z(t,e,n="unknown"){if(e==="off")return 0;let o={...Nt,...t.defaultThinkingBudgets??{}},s=t.taskBudgetOverrides?.[n]?.[e]??o[e];return t.thinkingBudgetCap?Math.min(s,t.thinkingBudgetCap):s}i(Z,"resolveThinkingBudget");function ee(t,e,n=Bt){let o=Math.max(1024,e-n);return Math.max(1024,Math.min(t,o))}i(ee,"clampThinkingBudget");function et(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}i(et,"mapDepthToOpenAIReasoningEffort");import be from"fs";import Mn from"os";import ot from"path";var tt=null;function Tn(t){return t==="budget"||t==="effort"||t==="toggle"||t==="none"}i(Tn,"isReasoningOverride");function En(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t.providerReasoningOverrides;return e===void 0?!0:!e||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).every(Tn)}i(En,"isStoredConfig");function Pn(){return process.env.KODAX_HOME??ot.join(Mn.homedir(),".kodax")}i(Pn,"getKodaxDir");function Ut(){return process.env.KODAX_CONFIG_FILE??ot.join(Pn(),"config.json")}i(Ut,"getConfigFilePath");function nt(t,e){return tt={filePath:t,config:e},e}i(nt,"updateStoredConfigCache");function wn(t){let e=JSON.parse(be.readFileSync(t,"utf-8"));return En(e)?e:{}}i(wn,"readStoredConfigFromDisk");function it(t){switch(t){case"native-budget":return"budget";case"native-effort":return"effort";case"native-toggle":return"toggle";case"none":return"none";default:return}}i(it,"reasoningCapabilityToOverride");function rt(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}i(rt,"reasoningOverrideToCapability");function te(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}i(te,"buildReasoningOverrideKey");function st(){let t=Ut();if(tt?.filePath===t)return tt.config;try{if(be.existsSync(t))return nt(t,wn(t))}catch{}return nt(t,{})}i(st,"loadStoredConfig");function Xt(t){let e=Ut();try{be.mkdirSync(ot.dirname(e),{recursive:!0}),be.writeFileSync(e,JSON.stringify(t,null,2)),nt(e,t)}catch(n){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",n)}}i(Xt,"saveStoredConfig");function Ce(t,e,n){let o=st(),r=te(t,e,n);return o.providerReasoningOverrides?.[r]}i(Ce,"loadReasoningOverride");function at(t,e,n,o){let r=st(),s=te(t,e,o);r.providerReasoningOverrides={...r.providerReasoningOverrides??{},[s]:n},Xt(r)}i(at,"saveReasoningOverride");function Rn(t,e,n){let o=st(),r=te(t,e,n);if(!o.providerReasoningOverrides?.[r])return;let s={...o.providerReasoningOverrides};delete s[r],o.providerReasoningOverrides=Object.keys(s).length>0?s:void 0,Xt(o)}i(Rn,"clearReasoningOverride");function Wt(t,e){if(!t)return;if(typeof t.get=="function")return t.get(e)??void 0;let n=t,o=e.toLowerCase(),r=n[e]??n[o]??n[o.replace(/\b\w/g,s=>s.toUpperCase())];if(r!==void 0)return Array.isArray(r)?r[0]:r}i(Wt,"readHeader");function $t(t){if(!t)return;let e=t.trim();if(e.length===0)return;let n=Number(e);if(!(!Number.isFinite(n)||n<=0))return n}i($t,"parsePositiveNumber");function An(t,e){if(!t)return;let n=t.trim();if(n.length===0)return;let o=Date.parse(n);if(!Number.isFinite(o))return;let r=o-e;return r>0?r:void 0}i(An,"parseHttpDate");function Me(t,e){let n=e.baseBackoffMs??1e3,o=e.maxBackoffMs??3e4,r=e.maxHeaderWaitMs??12e4,s=e.now?e.now():Date.now(),a=$t(Wt(t,"retry-after-ms"));if(a!==void 0){let k=Math.min(a,r);return{type:"header",waitMs:Math.round(k),source:"retry-after-ms",cappedFromHeader:k!==a}}let c=Wt(t,"retry-after");if(c!==void 0&&c.trim().length>0){let k=$t(c);if(k!==void 0){let b=k*1e3,p=Math.min(b,r);return{type:"header",waitMs:Math.round(p),source:"retry-after-seconds",cappedFromHeader:p!==b}}let _=An(c,s);if(_!==void 0){let b=Math.min(_,r);return{type:"header",waitMs:Math.round(b),source:"retry-after-date",cappedFromHeader:b!==_}}}let u=n*Math.pow(2,Math.max(0,e.attempt)),d=Math.min(u,o),m=e.withJitter!==!1?Math.random()*.25*d:0;return{type:"backoff",waitMs:Math.round(d+m),source:"exponential-backoff",attempt:e.attempt}}i(Me,"parseRetryAfter");function Te(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}i(Te,"extractHeadersFromError");var fe={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},B={...fe,multimodalSupport:"image-input"},ge={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},jt={...ge,multimodalSupport:"image-input"};function Ee(t){return{transport:t.transport,conversationSemantics:t.conversationSemantics,mcpSupport:t.mcpSupport,contextFidelity:t.contextFidelity??"full",toolCallingFidelity:t.toolCallingFidelity??"full",sessionSupport:t.sessionSupport??"full",longRunningSupport:t.longRunningSupport??"full",multimodalSupport:t.multimodalSupport??"none",evidenceSupport:t.evidenceSupport??"full"}}i(Ee,"normalizeCapabilityProfile");function X(t){return{...Ee(t)}}i(X,"cloneCapabilityProfile");function Sn(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}i(Sn,"parseEnvInt");var G=class{static{i(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let n=Sn(process.env.KODAX_MAX_OUTPUT_TOKENS);if(n!==void 0)return n;let o=this.getModelDescriptor(e)?.maxOutputTokens;return o!==void 0?o:this.config.maxOutputTokens??32768}getStreamMaxDurationMs(e){let n=this.getModelDescriptor(e)?.streamMaxDurationMs;return n!==void 0?n:this.config.streamMaxDurationMs}getEffectiveReplayReasoningContent(e){let n=this.getModelDescriptor(e)?.replayReasoningContent;return n!==void 0?n:this.config.replayReasoningContent??!1}getEffectiveStrictThinkingSignature(e){let n=this.getModelDescriptor(e)?.strictThinkingSignature;return n!==void 0?n:this.config.strictThinkingSignature??!1}supportsNonStreamingFallback(){return!1}async complete(e,n,o,r,s,a){throw new R(`${this.name} does not support non-streaming fallback`)}isConfigured(){return!!process.env[this.config.apiKeyEnv]}getModel(){return this.config.model}getAvailableModels(){return this.config.models?.length?[...new Set([this.config.model,...this.config.models.map(e=>e.id)])]:[this.config.model]}getModelDescriptor(e){return!e||e===this.config.model?{id:this.config.model}:this.config.models?.find(n=>n.id===e)}getBaseUrl(){return this.config.baseUrl}getApiKeyEnv(){return this.config.apiKeyEnv}getCapabilityProfile(){return X(this.config.capabilityProfile??fe)}getConfiguredReasoningCapability(e){let n=this.getModelDescriptor(e);return n?.reasoningCapability?n.reasoningCapability:Ze(this.config)}getReasoningCapability(e){let n=Ce(this.name,this.config,e);return n?rt(n):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return Ce(this.name,this.config,e)}getReasoningOverrideKey(e){return te(this.name,this.config,e)}persistReasoningCapabilityOverride(e,n){let o=it(e);o&&at(this.name,this.config,o,n)}shouldFallbackForReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase(),s=n.map(c=>c.toLowerCase()).some(c=>o.includes(c)),a=o.includes("parameter")||s;return o.includes("unknown parameter")||o.includes("invalid parameter")||o.includes("unsupported")&&a}shouldFallbackForSpecificReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return n.map(a=>a.toLowerCase()).some(a=>o.includes(a))?o.includes("unknown parameter")||o.includes("invalid parameter")||o.includes("unsupported"):!1}getReasoningFallbackChain(e){switch(e){case"native-budget":return["native-budget","native-toggle","none"];case"native-effort":return["native-effort","none"];case"native-toggle":return["native-toggle","none"];default:return["none"]}}getContextWindow(){return this.getEffectiveContextWindow()}getEffectiveContextWindow(e){let n=this.getModelDescriptor(e)?.contextWindow;return n!==void 0?n:this.config.contextWindow??2e5}getApiKey(){let e=process.env[this.config.apiKeyEnv];if(!e)throw new Error(`${this.config.apiKeyEnv} not set`);return e}shouldLogStreamDiagnostics(){return!!process.env.KODAX_DEBUG_STREAM}logStreamDiagnostic(...e){this.shouldLogStreamDiagnostics()&&console.error(...e)}normalizeReasoning(e){return ve(e)}onStaleConnection(){}isRateLimitError(e){if(!(e instanceof Error))return!1;let n=e.message.toLowerCase();return["rate","limit","\u901F\u7387","\u9891\u7387","1302","429","too many","overload","overwhelmed","503","529","busy"].some(o=>n.includes(o))}classifyRateLimitReason(e){let n=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return n.includes("overload")||n.includes("overwhelmed")||n.includes("503")||n.includes("529")||n.includes("busy")?"overloaded":"rate-limit"}extractRetryAfterMs(e){let n=Te(e);if(!n)return;let o=Me(n,{attempt:0,withJitter:!1});return o.type==="header"?o.waitMs:void 0}parseContextOverflow(e){let n=String(e?.message??""),o=[/(\d[\d,]*)\s*tokens?.*?(\d[\d,]*)\s*(?:maximum|limit|context)/i,/maximum.*?(\d[\d,]*)\s*tokens?.*?requested.*?(\d[\d,]*)/i,/exceeds?\s+.*?(\d[\d,]*)\s*.*?(?:limit|max|上限).*?(\d[\d,]*)/i];for(let r of o){let s=n.match(r);if(s){let a=Number(s[1].replace(/,/g,"")),c=Number(s[2].replace(/,/g,"")),u=Math.min(a,c),d=Math.max(a,c);return Math.max(3e3,d-u-1e3)}}}isContextOverflowError(e){let n=String(e?.message??"").toLowerCase();return n.includes("prompt is too long")||n.includes("prompt too long")||n.includes("context length")||n.includes("context_length_exceeded")||n.includes("context window")||n.includes("\u4E0A\u4E0B\u6587\u957F\u5EA6")}async withRateLimit(e,n,o=3,r,s){for(let a=0;a<o;a++)try{let c=await e();return this.maxOutputTokensOverride=void 0,c}catch(c){if(this.isContextOverflowError(c)&&!this.maxOutputTokensOverride){let u=this.parseContextOverflow(c);if(u){this.maxOutputTokensOverride=u,r?.(a+1,o,0);continue}}if(this.isRateLimitError(c)){if(a===o-1)throw new me(`API rate limit exceeded after ${o} retries. Please wait and try again later.`,6e4);let u=Te(c)??{},d=Me(u,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),l=d.waitMs,m=this.classifyRateLimitReason(c);if(s?.({provider:this.name,waitMs:l,reason:m,source:d.source,attempt:a+1,maxAttempts:o}),r?r(a+1,o,l):s||console.log(`[Rate Limit] Retrying in ${l/1e3}s (${a+1}/${o})...`),n?.aborted)throw new DOMException("Request aborted","AbortError");if(await new Promise(k=>setTimeout(k,l)),n?.aborted)throw new DOMException("Request aborted","AbortError");continue}if(c instanceof Error){if((c.name==="AbortError"||c.name==="APIUserAbortError")&&n?.aborted)throw c.name==="AbortError"?c:new DOMException(c.message||"Request aborted","AbortError");let u=c?.cause?.code??c?.code??"";throw(u==="ECONNRESET"||u==="EPIPE")&&this.onStaleConnection(),new R(`${this.name} API error: ${c.message}`,this.name)}throw c}throw new V("Unexpected end of withRateLimit")}};import Ln from"@anthropic-ai/sdk";import{parse as On}from"partial-json";function ne(t){if(!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{}try{let e=On(t);return process.env.KODAX_DEBUG_TOOL_STREAM&&console.warn("[Tool Block Salvaged] partial JSON recovered, rawLength=",t.length),e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}i(ne,"parseToolInputWithSalvage");function ct(t,e){let n=t[t.length-1];if(n&&oe(n)&&n.hint===e)return t;let o=e?{type:"cache-boundary",hint:e}:{type:"cache-boundary"};return[...t,o]}i(ct,"insertCacheBoundary");function oe(t){if(typeof t!="object"||t===null||t.type!=="cache-boundary")return!1;let e=Object.keys(t);return e.length<=2&&e.every(n=>n==="type"||n==="hint")}i(oe,"isCacheBoundary");function lt(t,e){let n=[];for(let o of t){if(oe(o)){if(e==="attach"&&n.length>0){let r=n[n.length-1];n[n.length-1]={...r,cache_control:{type:"ephemeral"}}}continue}n.push(o)}return n}i(lt,"lowerCacheBoundaries");function he(t){return t.filter(e=>!oe(e))}i(he,"stripCacheBoundaries");import{readFile as Dn}from"node:fs/promises";import In from"node:path";var Kn={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function Pe(t,e){return e??Kn[In.extname(t).toLowerCase()]??"image/png"}i(Pe,"resolveImageMediaType");async function we(t){return(await Dn(t)).toString("base64")}i(we,"readImageFileAsBase64");async function zt(t,e){let n=Pe(t,e),o=await we(t);return`data:${n};base64,${o}`}i(zt,"buildImageDataUrl");var Nn="KodaX";function Bn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Nn}}i(Bn,"getAnthropicCompatDefaultHeaders");function ut(t,e){if(!t)return e;let n=t.input_tokens!==void 0&&t.input_tokens!==null||t.cache_creation_input_tokens!==void 0&&t.cache_creation_input_tokens!==null||t.cache_read_input_tokens!==void 0&&t.cache_read_input_tokens!==null,o=typeof t.input_tokens=="number"?t.input_tokens:n?0:e?.inputTokens??0,r=typeof t.cache_creation_input_tokens=="number"?t.cache_creation_input_tokens:n?0:e?.cachedWriteTokens??0,s=typeof t.cache_read_input_tokens=="number"?t.cache_read_input_tokens:n?0:e?.cachedReadTokens??0,a=typeof t.output_tokens=="number"?t.output_tokens:e?.outputTokens??0,c=n?o+r+s:e?.inputTokens??0;if(![c,a].some(u=>!Number.isFinite(u)||u<0))return{inputTokens:c,outputTokens:a,totalTokens:c+a,cachedReadTokens:s||void 0,cachedWriteTokens:r||void 0}}i(ut,"normalizeAnthropicUsage");var L=class extends G{static{i(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;client;initClient(){let e=Bn(this.config);this.client=new Ln({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}applyCacheControlToSystem(e){if(!e.trim()||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=ct([{type:"text",text:e}],"system");return lt(n,"attach")}applyCacheControlToTools(e){if(e.length===0||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=e.slice(),o=n[n.length-1];return n[n.length-1]={...o,cache_control:{type:"ephemeral"}},n}async stream(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(r),u=s?.modelOverride??this.config.model,d=this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),m=c.enabled?this.getReasoningCapability(u):"none",k=c.enabled?this.getReasoningFallbackChain(m).filter(C=>C==="native-budget"||C==="native-toggle"||C==="none"):["none"],_=i(C=>{let P={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n),stream:!0};if(C==="native-budget"){let S=Z(this.config,c.depth,c.taskType);P.thinking={type:"enabled",budget_tokens:ee(S,d)}}else C==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let b=[],p=[],x=[],y,v=null,f="",g="",T="",w="",$="",D="",j="",E=!1,z,A=Date.now(),xe=Date.now(),ue,pe;for(let C of k)try{ue=await this.client.messages.create(_(C),a?{signal:a}:{}),C!==m&&this.persistReasoningCapabilityOverride(C,u);break}catch(P){pe=P;let S=C==="native-budget"?["budget_tokens","thinking"]:C==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...S))throw P}if(!ue)throw pe??new R("All reasoning capability attempts failed without a captured error",this.name);let de=Date.now(),M=0,I=0,K=3e4;for await(let C of ue){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let P=Date.now(),S=P-de;if(S>K&&(M++,I+=S,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(S/1e3)}s gap before ${C.type}`,{stallCount:M,totalStallMs:I,eventType:C.type})),de=P,C.type==="content_block_start"||C.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),C.type==="content_block_start"){A=Date.now();let h=C.content_block;v=h.type,process.env.KODAX_DEBUG_TOOL_STREAM&&h.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:h.type,id:h.id,name:h.name}),h.type==="thinking"?(g="",T=h.signature??""):h.type==="redacted_thinking"?(v="redacted_thinking",w=h.data??""):h.type==="text"?f="":h.type==="tool_use"&&($=h.id,D=h.name,j="")}else if(C.type==="content_block_delta"){A=Date.now();let h=C.delta;h.type==="thinking_delta"?(g+=h.thinking??"",s?.onThinkingDelta?.(h.thinking??"")):h.type==="text_delta"?(f+=h.text??"",s?.onTextDelta?.(h.text??"")):h.type==="input_json_delta"&&(j+=h.partial_json??"",s?.onToolInputDelta?.(D,h.partial_json??"",$?{toolId:$}:void 0))}else if(C.type==="content_block_stop")A=Date.now(),v==="thinking"?g&&(x.push({type:"thinking",thinking:g,signature:T}),s?.onThinkingEnd?.(g)):v==="redacted_thinking"?(w&&x.push({type:"redacted_thinking",data:w}),w=""):v==="text"?f&&b.push({type:"text",text:f}):v==="tool_use"&&(!$||!D?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify($),name:JSON.stringify(D),input:j.slice(0,100)}):p.push({type:"tool_use",id:$,name:D,input:ne(j)})),v=null;else if(C.type==="message_stop"){if(E=!0,A=Date.now(),process.env.KODAX_DEBUG_STREAM){let h=Date.now()-xe;this.logStreamDiagnostic(`[Stream] message_stop received after ${h}ms`)}}else if(C.type==="message_delta"){A=Date.now(),y=ut(C.usage,y);let h=C.delta;h?.stop_reason&&(z=h.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${z}`))}else C.type==="message_start"&&(A=Date.now(),y=ut(C.message?.usage,y),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!E){let C=Date.now()-xe,P=Date.now()-A;if(a?.aborted){let h=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before message_stop:",{duration:C,lastEventAge:P,reason:h,textBlocks:b.length,toolBlocks:p.length,thinkingBlocks:x.length}),new DOMException(h,"AbortError")}let S=new Error(`Stream incomplete: message_stop event not received. Duration: ${C}ms, Last event: ${P}ms ago. This may indicate a network disconnection or API timeout.`);throw S.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:C,lastEventAge:P,textBlocks:b.length,toolBlocks:p.length,thinkingBlocks:x.length}),S}return{textBlocks:b,toolBlocks:p,thinkingBlocks:x,usage:y,stopReason:z}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(r),u=s?.modelOverride??this.config.model,d=this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),m=c.enabled?this.getReasoningCapability(u):"none",k=c.enabled?this.getReasoningFallbackChain(m).filter(f=>f==="native-budget"||f==="native-toggle"||f==="none"):["none"],_=i(f=>{let g={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n)};if(f==="native-budget"){let T=Z(this.config,c.depth,c.taskType);g.thinking={type:"enabled",budget_tokens:ee(T,d)}}else f==="native-toggle"&&(g.thinking={type:"enabled"});return g},"buildRequest"),b,p;for(let f of k)try{b=await this.client.messages.create(_(f),a?{signal:a}:{}),f!==m&&this.persistReasoningCapabilityOverride(f,u);break}catch(g){p=g;let T=f==="native-budget"?["budget_tokens","thinking"]:f==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(g,...T))throw g}if(!b)throw p??new R("All reasoning capability attempts failed without a captured error",this.name);let x=[],y=[],v=[];for(let f of b.content)f.type==="text"?(x.push({type:"text",text:f.text}),s?.onTextDelta?.(f.text)):f.type==="thinking"?(v.push({type:"thinking",thinking:f.thinking,signature:f.signature??""}),s?.onThinkingDelta?.(f.thinking),s?.onThinkingEnd?.(f.thinking)):f.type==="redacted_thinking"?v.push({type:"redacted_thinking",data:f.data}):f.type==="tool_use"&&y.push({type:"tool_use",id:f.id,name:f.name,input:typeof f.input=="object"&&f.input!==null?f.input:{}});return{textBlocks:x,toolBlocks:y,thinkingBlocks:v,usage:ut(b.usage),stopReason:b.stop_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}serializeSystemMessageContent(e){if(typeof e=="string")return e.trim();for(let n of e)if(oe(n))throw new R("cache-boundary marker reached system message serialization unlowered. Provider base class lowering must run before any wire-level serialization.",this.name);return e.filter(n=>n.type==="text").map(n=>n.text.trim()).filter(Boolean).join(`
|
|
3
|
-
`)}buildSystemPrompt(e,n){let o=n.filter(r=>r.role==="system").map(r=>this.serializeSystemMessageContent(r.content)).filter(Boolean);return[e,...o].filter(r=>typeof r=="string"&&r.trim().length>0).join(`
|
|
4
|
-
|
|
5
|
-
`)}async convertMessages(e,n){let o=[],r=this.getEffectiveStrictThinkingSignature(n);for(let s of e.filter(a=>a.role!=="system")){let a=s.role==="user"?"user":"assistant";if(typeof s.content=="string"){o.push({role:a,content:s.content});continue}let c=[],u=[];for(let l of s.content)l.type==="thinking"?!r||typeof l.signature=="string"&&l.signature.length>0?c.push({type:"thinking",thinking:l.thinking,signature:l.signature??""}):l.thinking&&u.push(l.thinking):l.type==="redacted_thinking"&&(r||c.push({type:"redacted_thinking",data:l.data}));u.length>0&&s.role==="assistant"&&c.push({type:"text",text:`<prior_reasoning>
|
|
6
|
-
${u.join(`
|
|
7
|
-
|
|
8
|
-
`)}
|
|
9
|
-
</prior_reasoning>`});for(let l of s.content)if(l.type==="tool_result"&&s.role==="user"){let m;if(typeof l.content=="string")m=l.content;else{let k=[];for(let _ of l.content)_.type==="text"?k.push({type:"text",text:_.text}):_.type==="image"&&k.push({type:"image",source:{type:"base64",media_type:Pe(_.path,_.mediaType),data:await we(_.path)}});m=k}c.push({type:"tool_result",tool_use_id:l.tool_use_id,content:m,...l.is_error===!0?{is_error:!0}:{}})}for(let l of s.content)l.type==="tool_use"&&s.role==="assistant"&&c.push({type:"tool_use",id:l.id,name:l.name,input:l.input});for(let l of s.content)l.type==="text"?c.push({type:"text",text:l.text}):l.type==="image"&&s.role==="user"&&c.push({type:"image",source:{type:"base64",media_type:Pe(l.path,l.mediaType),data:await we(l.path)}});if(a==="assistant"&&this.config.supportsThinking&&!r){let l=c.some(k=>k.type==="tool_use"),m=c.some(k=>k.type==="thinking"||k.type==="redacted_thinking");l&&!m&&c.unshift({type:"thinking",thinking:"...",signature:""})}let d=c.length===0||a==="assistant"&&c.every(l=>{let m=l;return m.type==="thinking"&&!m.thinking||m.type==="text"&&!m.text});o.push({role:s.role,content:d?[{type:"text",text:"..."}]:c})}return o}};import Fn from"openai";var Un="KodaX";function Xn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Un}}i(Xn,"getOpenAICompatDefaultHeaders");function Gt(t){if(!t)return;let e=typeof t.prompt_tokens=="number"?t.prompt_tokens:0,n=typeof t.completion_tokens=="number"?t.completion_tokens:0,o=typeof t.total_tokens=="number"?t.total_tokens:e+n;if([e,n,o].some(s=>!Number.isFinite(s)||s<0)||o<e||o<n)return;let r=typeof t.prompt_tokens_details?.cached_tokens=="number"&&t.prompt_tokens_details.cached_tokens>=0?t.prompt_tokens_details.cached_tokens:typeof t.prompt_cache_hit_tokens=="number"&&t.prompt_cache_hit_tokens>=0?t.prompt_cache_hit_tokens:void 0;return{inputTokens:e,outputTokens:n,totalTokens:o,...r!==void 0?{cachedReadTokens:r}:{}}}i(Gt,"normalizeOpenAIUsage");function Wn(t){return t?t.type==="function"&&"function"in t:!1}i(Wn,"isOpenAIFunctionToolCall");function $n(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return"";let n=Reflect.get(e,"text");if(typeof n=="string")return n;if(n&&typeof n=="object"){let o=Reflect.get(n,"value");return typeof o=="string"?o:""}return""}).filter(Boolean).join(""):""}i($n,"extractOpenAIMessageText");function jn(t){if(!t||typeof t!="object")return"";let e=Reflect.get(t,"reasoning_content");return typeof e=="string"?e:Array.isArray(e)?e.map(n=>typeof n=="string"?n:n&&typeof n=="object"&&"text"in n&&typeof n.text=="string"?n.text:"").join(""):""}i(jn,"extractOpenAIMessageReasoning");var F=class extends G{static{i(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;client;initClient(){let e=Xn(this.config);this.client=new Fn({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=he(n.content);return o.length===n.content.length?n:{...n,content:o}})}normalizeSystemForWire(e,n){let o=[];e&&e.trim().length>0&&o.push(e);let r=[];for(let s of n){if(s.role!=="system"){r.push(s);continue}let a=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.filter(c=>typeof c=="object"&&c!==null&&c.type==="text"&&typeof c.text=="string").map(c=>c.text).join(`
|
|
10
|
-
`):"";a.trim().length>0&&o.push(a)}return{system:o.join(`
|
|
11
|
-
|
|
12
|
-
`),rest:r}}appendExtraBody(e,n){let o=typeof e.extra_body=="object"&&e.extra_body!==null?e.extra_body:{};e.extra_body={...o,...n}}resetReasoningCapabilityParams(e){delete e.reasoning_effort,delete e.thinking;let n=typeof e.extra_body=="object"&&e.extra_body!==null?{...e.extra_body}:void 0;if(n){if(delete n.enable_thinking,delete n.thinking_budget,delete n.thinking,Object.keys(n).length===0){delete e.extra_body;return}e.extra_body=n}}applyReasoningCapability(e,n,o){let r=e,s=this.getEffectiveMaxOutputTokens(e.model),a=ee(Z(this.config,o.depth,o.taskType),s);switch(n){case"native-effort":{let c=et(o.depth);c&&(r.reasoning_effort=c);break}case"native-budget":{this.name==="qwen"?this.appendExtraBody(r,{enable_thinking:!0,thinking_budget:a}):this.name==="zhipu"&&(r.thinking={type:"enabled",budget_tokens:a});break}case"native-toggle":{this.name==="qwen"?this.appendExtraBody(r,{enable_thinking:!0}):this.name==="zhipu"&&(r.thinking={type:"enabled"});break}default:break}}getFallbackTerms(e){switch(e){case"native-budget":return["thinking_budget","budget_tokens","thinking"];case"native-effort":return["reasoning_effort"];case"native-toggle":return["enable_thinking","thinking"];default:return[]}}async stream(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:u,rest:d}=this.normalizeSystemForWire(o,c),l=s?.modelOverride??this.config.model,m=[{role:"system",content:u},...await this.convertMessages(d,l)],k=n.map(M=>({type:"function",function:{name:M.name,description:M.description,parameters:M.input_schema}}));if(a?.aborted)throw new DOMException("Request aborted","AbortError");let _=new Map,b="",p="",x,y=!0,v=null,f=Date.now(),g=this.normalizeReasoning(r),T=q(g)?this.getReasoningCapability(l):"none",w=q(g)?this.getReasoningFallbackChain(T).filter(M=>M==="native-budget"||M==="native-effort"||M==="native-toggle"||M==="none"):["none"],$={model:l,messages:m,tools:k,max_completion_tokens:this.getEffectiveMaxOutputTokens(l),stream:!0},D,j;for(let M of w){for(;!D;){let I={...$};y&&(I.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(I),this.applyReasoningCapability(I,M,g);try{D=await this.client.chat.completions.create(I,a?{signal:a}:{}),M!==T&&this.persistReasoningCapabilityOverride(M,l)}catch(K){if(j=K,y&&this.shouldFallbackForSpecificReasoningError(K,"stream_options","include_usage")){y=!1;continue}if(!this.shouldFallbackForReasoningError(K,...this.getFallbackTerms(M)))throw K;break}}if(D)break}if(!D)throw j??new R("All reasoning capability attempts failed without a captured error",this.name);let E=Date.now(),z=0,A=0,xe=3e4;for await(let M of D){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let I=Date.now(),K=I-E;K>xe&&(z++,A+=K,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(K/1e3)}s gap`,{stallCount:z,totalStallMs:A})),E=I,s?.onHeartbeat?.(),x=Gt(M.usage)??x;let C=M.choices[0],P=C?.delta;if(C?.finish_reason&&(v=C.finish_reason,process.env.KODAX_DEBUG_STREAM)){let h=Date.now()-f;this.logStreamDiagnostic(`[Stream] finish_reason: ${v} after ${h}ms`)}P?.content&&(b+=P.content,s?.onTextDelta?.(P.content));let S=this.extractReasoningDelta(P);if(S&&(p+=S,s?.onThinkingDelta?.(S)),P?.tool_calls)for(let h of P.tool_calls){let J=_.get(h.index)??{id:"",name:"",arguments:""};h.id&&(J.id=h.id),h.function?.name&&(J.name=h.function.name),h.function?.arguments&&(J.arguments+=h.function.arguments,s?.onToolInputDelta?.(J.name,h.function.arguments,J.id?{toolId:J.id}:void 0)),_.set(h.index,J)}}if(!v){let M=Date.now()-f;if(a?.aborted){let K=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before finish_reason:",{duration:M,reason:K,textContentLength:b.length,toolCallsCount:_.size}),new DOMException(K,"AbortError")}let I=new Error(`Stream incomplete: finish_reason not received. Duration: ${M}ms. This may indicate a network disconnection or API timeout.`);throw I.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:M,textContentLength:b.length,toolCallsCount:_.size}),I}let ue=b?[{type:"text",text:b}]:[],pe=[],de=[];p&&(de.push({type:"thinking",thinking:p}),s?.onThinkingEnd?.(p));for(let[,M]of _)M.id&&M.name&&pe.push({type:"tool_use",id:M.id,name:M.name,input:ne(M.arguments)});return{textBlocks:ue,toolBlocks:pe,thinkingBlocks:de,usage:x,stopReason:v??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:u,rest:d}=this.normalizeSystemForWire(o,c),l=s?.modelOverride??this.config.model,m=[{role:"system",content:u},...await this.convertMessages(d,l)],k=n.map(E=>({type:"function",function:{name:E.name,description:E.description,parameters:E.input_schema}})),_=this.normalizeReasoning(r),b=q(_)?this.getReasoningCapability(l):"none",p=q(_)?this.getReasoningFallbackChain(b).filter(E=>E==="native-budget"||E==="native-effort"||E==="native-toggle"||E==="none"):["none"],x={model:l,messages:m,tools:k,max_completion_tokens:this.getEffectiveMaxOutputTokens(l)},y,v;for(let E of p){let z={...x};this.resetReasoningCapabilityParams(z),this.applyReasoningCapability(z,E,_);try{y=await this.client.chat.completions.create(z,a?{signal:a}:{}),E!==b&&this.persistReasoningCapabilityOverride(E,l);break}catch(A){if(v=A,!this.shouldFallbackForReasoningError(A,...this.getFallbackTerms(E)))throw A}}if(!y)throw v??new R("All reasoning capability attempts failed without a captured error",this.name);let f=y.choices[0],g=f?.message,T=$n(g?.content),w=jn(g),$=(g?.tool_calls??[]).filter(Wn).map(E=>({type:"tool_use",id:E.id,name:E.function.name,input:ne(E.function.arguments)}));T&&s?.onTextDelta?.(T);let D=T?[{type:"text",text:T}]:[],j=[];return w&&(j.push({type:"thinking",thinking:w}),s?.onThinkingDelta?.(w),s?.onThinkingEnd?.(w)),{textBlocks:D,toolBlocks:$,thinkingBlocks:j,usage:Gt(y.usage),stopReason:f?.finish_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}extractReasoningDelta(e){let n=e?.reasoning_content;return typeof n=="string"?n:Array.isArray(n)?n.map(o=>typeof o=="string"?o:typeof o=="object"&&o!==null&&"text"in o&&typeof o.text=="string"?o.text:"").join(""):""}serializeAssistantMessage(e,n){let o=e.filter(d=>d.type==="text").map(d=>d.text).join(`
|
|
13
|
-
`),r=e.filter(d=>d.type==="tool_use").map(d=>({id:d.id,type:"function",function:{name:d.name,arguments:JSON.stringify(d.input??{})}})),s=e.filter(d=>d.type==="thinking"||d.type==="redacted_thinking").map(d=>d.type==="thinking"?d.thinking:"").filter(Boolean).join(`
|
|
14
|
-
|
|
15
|
-
`),a=e.some(d=>d.type==="thinking"||d.type==="redacted_thinking");if(!o&&r.length===0&&!a)return[];let c;o?c=o:r.length>0?c=null:c="...";let u={role:"assistant",content:c};return r.length>0&&(u.tool_calls=r),this.getEffectiveReplayReasoningContent(n)&&(u.reasoning_content=s||""),[u]}async serializeUserMessage(e){let n=[],o=e.filter(a=>a.type==="text").map(a=>a.text).join(`
|
|
16
|
-
`),r=e.filter(a=>a.type==="image");for(let a of e)if(a.type==="tool_result"){let c;typeof a.content=="string"?c=a.content:c=a.content.map(u=>u.type==="text"?u.text:`[Image at ${u.path}${u.mediaType?` (${u.mediaType})`:""}] (provider does not support image content in tool_result; if the image was previously visible to you in the conversation, refer to it directly via native vision)`).join(`
|
|
17
|
-
`),n.push({role:"tool",tool_call_id:a.tool_use_id,content:c})}if(r.length===0)return o&&n.push({role:"user",content:o}),n;let s=[];o&&s.push({type:"text",text:o});for(let a of r)s.push({type:"image_url",image_url:{url:await zt(a.path,a.mediaType)}});return n.push({role:"user",content:s}),n}serializeSystemMessage(e){if(typeof e=="string")return[{role:"system",content:e}];let n=e.filter(o=>o.type==="text").map(o=>o.text).join(`
|
|
18
|
-
`);return n?[{role:"system",content:n}]:[]}async convertMessages(e,n){let o=[];for(let r of e){if(r.role==="system"){o.push(...this.serializeSystemMessage(r.content));continue}if(typeof r.content=="string"){o.push({role:r.role,content:r.content});continue}if(r.role==="assistant"){o.push(...this.serializeAssistantMessage(r.content,n));continue}o.push(...await this.serializeUserMessage(r.content))}return o}};import{spawn as zn}from"node:child_process";import{Readable as Gn,Writable as Vn}from"node:stream";import pt from"node:process";import{ClientSideConnection as Hn,PROTOCOL_VERSION as Yn,ndJsonStream as Jn}from"@agentclientprotocol/sdk";var Re=class{static{i(this,"AcpClient")}client=null;agentProcess=null;options;constructor(e){this.options=e}async connect(){let e,n;if(this.options.inputStream&&this.options.outputStream)e=this.options.inputStream,n=this.options.outputStream;else if(this.options.command){let s=pt.platform==="win32"&&!this.options.command.endsWith(".cmd")?`${this.options.command}.cmd`:this.options.command;if(this.agentProcess=zn(s,this.options.args??[],{cwd:this.options.cwd??pt.cwd(),stdio:["pipe","pipe","inherit"]}),!this.agentProcess.stdin||!this.agentProcess.stdout)throw new Error("Failed to create ACP stdio pipes");n=Vn.toWeb(this.agentProcess.stdin),e=Gn.toWeb(this.agentProcess.stdout)}else throw new Error("AcpClient requires either a command or I/O streams");let o=Jn(n,e);this.client=new Hn(()=>({sessionUpdate:i(async r=>{this.options.onSessionUpdate?.(r)},"sessionUpdate"),requestPermission:i(async r=>{let s=r.options??[],a=s.find(c=>c.kind==="allow_once"||c.kind==="allow_always")??s[0];return a?{outcome:{outcome:"selected",optionId:a.optionId}}:{outcome:{outcome:"cancelled"}}},"requestPermission")}),o),await this.client.initialize({protocolVersion:Yn,clientCapabilities:{},clientInfo:{name:"kodax-ai-acp-client",version:"1.0.0"}})}async createNewSession(){if(!this.client)throw new Error("Client not connected");return(await this.client.newSession({cwd:this.options.cwd??pt.cwd(),mcpServers:[]})).sessionId}async prompt(e,n,o,r){if(!this.client)throw new Error("Client not connected");let s={sessionId:n,prompt:[{type:"text",text:e}]};r?.model&&(s.model=r.model);let a=this.client.prompt(s);if(o){let c=i(()=>{this.client?.cancel({sessionId:n}).catch(()=>{})},"onAbort");o.addEventListener("abort",c),a=a.finally(()=>{o.removeEventListener("abort",c)})}return await a}disconnect(){this.agentProcess?.kill(),this.options.abort?.();try{this.client?.close?.()}catch{}this.client=null}};function Qn(t){if(!t||typeof t!="object")return;let e=t,n=typeof e.inputTokens=="number"?e.inputTokens:0,o=typeof e.outputTokens=="number"?e.outputTokens:0,r=typeof e.totalTokens=="number"?e.totalTokens:n+o;if(![n,o,r].some(s=>!Number.isFinite(s)||s<0)&&!(r<n||r<o))return{inputTokens:n,outputTokens:o,totalTokens:r,cachedReadTokens:typeof e.cachedReadTokens=="number"?e.cachedReadTokens:void 0,cachedWriteTokens:typeof e.cachedWriteTokens=="number"?e.cachedWriteTokens:void 0,thoughtTokens:typeof e.thoughtTokens=="number"?e.thoughtTokens:void 0}}i(Qn,"normalizeAcpUsage");var ie=class extends G{static{i(this,"KodaXAcpProvider")}_client=null;_sessionMap=new Map;_activeStreams=new Map;isConfigured(){return!0}getCapabilityProfile(){return X(ge)}serializeImageBlockToPromptToken(e){return null}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=he(n.content);return o.length===n.content.length?n:{...n,content:o}})}async stream(e,n,o,r,s,a){if(e=this.stripCacheBoundariesFromMessages(e),this.acpClientOptions.executor&&typeof this.acpClientOptions.executor.isInstalled=="function"&&!await this.acpClientOptions.executor.isInstalled())throw new Error(`${this.name} requires a local CLI environment, but the CLI was not found or is not configured correctly.`);let c=[],u=[],d=e[e.length-1],l="";if(d&&typeof d.content=="string")l=d.content;else if(d&&Array.isArray(d.content)){let x=[];for(let y of d.content)if(y.type==="text")x.push(y.text);else if(y.type==="image"){let v=this.serializeImageBlockToPromptToken(y);v&&x.push(v)}l=x.join(`
|
|
19
|
-
`)}let m={...this.acpClientOptions,onSessionUpdate:i(x=>{let y=x.update,v=x.sessionId;if(!("sessionUpdate"in y))return;let f=v?this._activeStreams.get(v):void 0;if(f)switch(y.sessionUpdate){case"agent_message_chunk":if(y.content?.type==="text"){let g=y.content.text;f.output.text+=g,f.streamOptions?.onTextDelta?.(g)}break;case"tool_call":{let g="{}",T=y.arguments??y.parameters;T&&(g=typeof T=="string"?T:JSON.stringify(T)),f.streamOptions?.onToolInputDelta?.(y.title,g);let w=`
|
|
20
|
-
> [Tool Use] ${y.title}: ${g}
|
|
21
|
-
`;f.output.text+=w,f.streamOptions?.onTextDelta?.(w);break}case"tool_call_update":if(y.status){let g=`> [Tool Result] ${y.status}
|
|
22
|
-
|
|
23
|
-
`;f.output.text+=g,f.streamOptions?.onTextDelta?.(g)}break}},"onSessionUpdate")},k=s?.sessionId??"default";this._client||(this._client=new Re(m),await this._client.connect());let _=this._sessionMap.get(k);_||(_=await this._client.createNewSession(),this._sessionMap.set(k,_));let b={text:""};this._activeStreams.set(_,{streamOptions:s,output:b});let p;try{p=await this._client.prompt(l,_,a,{model:s?.modelOverride})}catch(x){if(!(x instanceof Error&&x.name==="AbortError"))throw x}finally{this._activeStreams.delete(_)}return b.text&&c.push({type:"text",text:b.text}),{textBlocks:c,toolBlocks:u,thinkingBlocks:[],usage:Qn(p?.usage)}}disconnect(){this._client&&(this._client.disconnect(),this._client=null),this._activeStreams.clear(),this._sessionMap.clear()}};import{spawn as qn}from"node:child_process";import dt from"node:process";var re=class{static{i(this,"CLIExecutor")}config;_installedCache=null;constructor(e){this.config=e}async isInstalled(){return this._installedCache!==null?this._installedCache:(this._installedCache=await this.checkInstalled(),this._installedCache)}async*execute(e){let n=this.buildArgs(e),o={...dt.env,...this.config.env},s=dt.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=qn(s,n,{cwd:this.config.cwd??dt.cwd(),env:o,stdio:["ignore","pipe","pipe"]}),c="";a.stderr?.on("data",l=>{c+=l.toString()});let u=!1,d=i(()=>{u||a.kill("SIGTERM")},"abortHandler");e.signal?.addEventListener("abort",d),a.on("exit",()=>{u=!0});try{yield*this.parseOutputStream(a.stdout,e.signal),c.trim()&&console.error(`[CLIExecutor] stderr: ${c.trim()}`)}finally{e.signal?.removeEventListener("abort",d),u||a.kill()}}async*parseOutputStream(e,n){let o="";for await(let r of e){if(n?.aborted)break;o+=r.toString();let s=o.split(`
|
|
24
|
-
`);o=s.pop()??"";for(let a of s){if(!a.trim())continue;let c=this.parseLine(a.trim());c&&(yield c)}}if(o.trim()&&!n?.aborted){let r=this.parseLine(o.trim());r&&(yield r)}}};import{spawn as Zn}from"node:child_process";import eo from"node:process";async function Ae(t){try{let e=eo.platform==="win32",n=Zn(e?`${t}.cmd`:t,["--version"]);return await new Promise(o=>{n.on("close",r=>o(r===0)),n.on("error",()=>o(!1))})}catch{return!1}}i(Ae,"checkCliCommandInstalled");var Se=class extends re{static{i(this,"GeminiCLIExecutor")}model;constructor(e){super({command:"gemini",baseArgs:["--output-format","stream-json","--approval-mode","yolo"],timeout:3e5,...e}),this.model=e?.model??"gemini-2.5-pro"}async checkInstalled(){return Ae("gemini")}buildArgs(e){let n=["-m",e.model??this.model];return e.sessionId?(n.push("-r",e.sessionId),n.push(e.prompt)):n.push("-p",e.prompt),[...n,...this.config.baseArgs]}parseLine(e){if(!e.startsWith("{"))return null;try{let n=JSON.parse(e);return this.convertEvent(n)}catch{return null}}convertEvent(e){let n=e.timestamp?Date.parse(e.timestamp):Date.now();switch(e.type){case"init":return{type:"session_start",timestamp:n,sessionId:e.session_id??"",model:e.model??this.model,raw:e};case"message":return{type:"message",timestamp:n,role:e.role,content:e.content??"",delta:e.delta,raw:e};case"tool_use":return{type:"tool_use",timestamp:n,toolId:e.tool_id??"",toolName:e.tool_name??"",parameters:e.parameters??{},raw:e};case"tool_result":return{type:"tool_result",timestamp:n,toolId:e.tool_id??"",status:e.status==="success"?"success":"error",output:e.output??"",raw:e};case"error":return{type:"error",timestamp:n,errorType:"error",message:e.message??"Unknown error",raw:e};case"result":return{type:"complete",timestamp:n,status:e.status==="success"?"success":"failed",usage:e.stats?{inputTokens:e.stats.input_tokens??0,outputTokens:e.stats.output_tokens??0,totalTokens:e.stats.total_tokens??0}:void 0,raw:e};default:return null}}};import{TransformStream as Vt}from"node:stream/web";import{randomUUID as mt}from"node:crypto";function Oe(t){let e=new Vt,n=new Vt,o=e.readable.getReader(),r=n.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,c="",u=mt(),d=new AbortController,l=new Map;(async()=>{try{for(;;){let{done:p,value:x}=await o.read();if(p)break;c+=s.decode(x,{stream:!0});let y=c.split(`
|
|
25
|
-
`);c=y.pop()??"";for(let v of y)if(v.trim())try{let f=JSON.parse(v);k(f).catch(g=>{console.error("[PseudoAcpServer] Failed to handle request:",g)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",v)}}}catch(p){console.error("[PseudoAcpServer] Stream read error:",p)}})();let m=i(async p=>{let x=JSON.stringify(p)+`
|
|
26
|
-
`;await r.write(a.encode(x))},"sendMsg");async function k(p){if(p.method==="initialize")await m({jsonrpc:"2.0",id:p.id,result:{protocolVersion:p.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(p.method==="session/new"||p.method==="sessions/new")u=p.params?.sessionId??mt(),await m({jsonrpc:"2.0",id:p.id,result:{sessionId:u}});else if(p.method==="session/prompt"||p.method==="chat/prompt"){let x=new AbortController,y=p.params.sessionId;l.set(y,x);let v=i(()=>x.abort(),"onGlobalAbort");d.signal.addEventListener("abort",v);let g=await _(y,p.params.prompt,typeof p.params.model=="string"?p.params.model:void 0,x.signal).finally(()=>{l.delete(y),d.signal.removeEventListener("abort",v)});await m({jsonrpc:"2.0",id:p.id,result:g.usage?{stopReason:g.stopReason,usage:g.usage}:{stopReason:g.stopReason}})}else if(p.method==="session/cancel"||p.method==="chat/cancel"){let x=l.get(p.params.sessionId);x&&x.abort(),p.id!==void 0&&await m({jsonrpc:"2.0",id:p.id,result:{}})}else p.id!==void 0&&await m({jsonrpc:"2.0",id:p.id,result:{}})}i(k,"handleRequest");let _=i(async(p,x,y,v)=>{let f=x.find(g=>g.type==="text")?.text??"";try{let g=t.execute({prompt:f,model:y,sessionId:p==="default"?void 0:p,signal:v});for await(let T of g){let w=b(T);if(w&&await m({jsonrpc:"2.0",method:"session/update",params:{sessionId:p,update:w}}),T.type==="complete")return{stopReason:v.aborted?"cancelled":"end_turn",usage:T.usage}}return{stopReason:v.aborted?"cancelled":"end_turn"}}catch(g){return v.aborted||g instanceof Error&&g.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",g),await m({jsonrpc:"2.0",method:"session/update",params:{sessionId:p,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
27
|
-
[Fatal Error: ${g}]
|
|
28
|
-
`}}}}),{stopReason:"end_turn"})}},"executePrompt"),b=i(p=>{switch(p.type){case"message":if(p.role==="assistant"&&p.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:p.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:p.toolName,arguments:p.parameters,status:"running",toolCallId:p.toolId||mt()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:p.toolId,status:p.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
29
|
-
[Error: ${p.message}]
|
|
30
|
-
`}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:n.readable,outputStream:e.writable,abort:i(()=>{d.abort(),e.readable.cancel().catch(()=>{}),n.writable.abort().catch(()=>{})},"abort"),executor:t}}i(Oe,"createPseudoAcpServer");import Ht from"node:fs";import Yt from"node:os";import Jt from"node:path";var to="gpt-5.4",no="auto-gemini-3",oo=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],io=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function Qt(t){let e=new Set,n=[];for(let o of t){let r=o.trim();if(!r)continue;let s=r.toLowerCase();e.has(s)||(e.add(s),n.push(r))}return n}i(Qt,"dedupePreserveOrder");function ro(){let t=Jt.join(Yt.homedir(),".codex","config.toml");try{return Ht.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}i(ro,"readCodexConfiguredModel");function so(){let t=Jt.join(Yt.homedir(),".gemini","settings.json");try{let e=JSON.parse(Ht.readFileSync(t,"utf8")),n=typeof e.model=="string"?e.model.trim():"";return n||(typeof e.general?.model=="string"?e.general.model.trim():"")||null}catch{return null}}i(so,"readGeminiConfiguredModel");function se(){return ro()||to}i(se,"getCodexCliDefaultModel");function ae(){return so()||no}i(ae,"getGeminiCliDefaultModel");function ye(){return Qt([se(),...oo])}i(ye,"getCodexCliKnownModels");function ke(){return Qt([ae(),...io])}i(ke,"getGeminiCliKnownModels");var ft=ae(),ao=ke(),co={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},De=class extends ie{static{i(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:ft,models:ao.filter(e=>e!==ft).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new Se({model:ft});this.acpClientOptions=Oe(e)}getCapabilityProfile(){return X(co)}serializeImageBlockToPromptToken(e){return/\s/.test(e.path)?(console.warn(`[gemini-cli] Image path contains whitespace and cannot be safely passed via @<path> syntax \u2014 dropping image block. Path: ${JSON.stringify(e.path)}`),null):`@${e.path}`}};var Ie=class extends re{static{i(this,"CodexCLIExecutor")}model;constructor(e){super({command:"codex",baseArgs:["exec","--json","--full-auto"],timeout:3e5,...e}),this.model=e?.model??"gpt-5.4"}async checkInstalled(){return Ae("codex")}buildArgs(e){this.model=e.model??this.model;let n=e.model?["-m",e.model]:[];return e.sessionId?["exec","resume",e.sessionId,...n,e.prompt,...this.config.baseArgs.filter(o=>o!=="exec")]:[...this.config.baseArgs,...n,e.prompt]}parseLine(e){if(!e.startsWith("{"))return null;try{let n=JSON.parse(e);return this.convertEvent(n)}catch{return null}}convertEvent(e){let n=Date.now();switch(e.type){case"thread.started":return{type:"session_start",timestamp:n,sessionId:e.thread_id??"",model:this.model,raw:e};case"item.completed":return e.item?.type==="agent_message"?{type:"message",timestamp:n,role:"assistant",content:e.item.text??"",raw:e}:e.item?.type==="command_execution"?{type:"tool_use",timestamp:n,toolId:e.item.id,toolName:"Bash",parameters:{command:e.item.command},raw:e}:null;case"turn.completed":return{type:"complete",timestamp:n,status:"success",usage:e.usage?{inputTokens:e.usage.input_tokens,outputTokens:e.usage.output_tokens,totalTokens:e.usage.input_tokens+e.usage.output_tokens}:void 0,raw:e};case"error":case"turn.failed":return{type:"error",timestamp:n,errorType:e.type,message:e.message??"Unknown error",raw:e};default:return null}}};var gt=se(),lo=ye(),Ke=class extends ie{static{i(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:gt,models:lo.filter(e=>e!==gt).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Ie({model:gt});this.acpClientOptions=Oe(e)}};import uo from"@anthropic-ai/sdk";var qt=ae(),po=ke(),Zt=se(),mo=ye(),N={anthropic:{apiKeyEnv:"ANTHROPIC_API_KEY",model:"claude-sonnet-4-6",models:[{id:"claude-opus-4-6",displayName:"Opus 4.6",thinkingBudgetCap:28e3},{id:"claude-haiku-4-5",displayName:"Haiku 4.5",thinkingBudgetCap:1e4}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:2e5,maxOutputTokens:64e3,thinkingBudgetCap:28e3},openai:{apiKeyEnv:"OPENAI_API_KEY",model:"gpt-5.3-codex",models:[{id:"gpt-5.4",displayName:"GPT-5.4"},{id:"gpt-5.3-codex-spark",displayName:"GPT-5.3 Codex Spark"}],reasoningCapability:"native-effort",capabilityProfile:B,supportsThinking:!0,contextWindow:4e5,maxOutputTokens:32768},deepseek:{apiKeyEnv:"DEEPSEEK_API_KEY",model:"deepseek-v4-flash",models:[{id:"deepseek-v4-pro",displayName:"DeepSeek V4 Pro"}],reasoningCapability:"native-effort",capabilityProfile:B,supportsThinking:!0,contextWindow:1e6,maxOutputTokens:64e3},kimi:{apiKeyEnv:"KIMI_API_KEY",model:"kimi-k2.6",models:[{id:"k2.5",displayName:"K2.5"}],reasoningCapability:"native-effort",capabilityProfile:B,supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32768},"kimi-code":{apiKeyEnv:"KIMI_API_KEY",model:"kimi-for-coding",reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32e3},qwen:{apiKeyEnv:"QWEN_API_KEY",model:"qwen3.5-plus",reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32768},zhipu:{apiKeyEnv:"ZHIPU_API_KEY",model:"glm-5",models:[{id:"glm-5.1",displayName:"GLM-5.1"},{id:"glm-5-turbo",displayName:"GLM-5 Turbo"}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32768},"zhipu-coding":{apiKeyEnv:"ZHIPU_API_KEY",model:"glm-5",models:[{id:"glm-5.1",displayName:"GLM-5.1"},{id:"glm-5-turbo",displayName:"GLM-5 Turbo"}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:2e5,maxOutputTokens:16e3,thinkingBudgetCap:16e3},"minimax-coding":{apiKeyEnv:"MINIMAX_API_KEY",model:"MiniMax-M2.7",models:[{id:"MiniMax-M2.7-highspeed",displayName:"MiniMax M2.7 Highspeed (higher-tier plan)"},{id:"MiniMax-M2.5",displayName:"MiniMax M2.5"},{id:"MiniMax-M2.5-highspeed",displayName:"MiniMax M2.5 Highspeed (higher-tier plan)"},{id:"MiniMax-M2.1",displayName:"MiniMax M2.1"},{id:"MiniMax-M2.1-highspeed",displayName:"MiniMax M2.1 Highspeed (higher-tier plan)"},{id:"MiniMax-M2",displayName:"MiniMax M2"}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:204800,maxOutputTokens:32e3},"mimo-coding":{apiKeyEnv:"MIMO_API_KEY",model:"mimo-v2.5-pro",models:[{id:"mimo-v2.5",displayName:"MiMo V2.5"}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:1e6,maxOutputTokens:32e3,thinkingBudgetCap:16e3},"ark-coding":{apiKeyEnv:"ARK_API_KEY",model:"glm-5.1",models:[{id:"glm-4.7",displayName:"GLM-4.7"},{id:"kimi-k2.6",displayName:"Kimi K2.6",contextWindow:256e3},{id:"kimi-k2.5",displayName:"Kimi K2.5",contextWindow:256e3},{id:"minimax-latest",displayName:"MiniMax Latest",contextWindow:204800},{id:"deepseek-v3.2",displayName:"DeepSeek V3.2",contextWindow:128e3},{id:"deepseek-v4-pro",displayName:"DeepSeek V4 Pro",contextWindow:1e6},{id:"deepseek-v4-flash",displayName:"DeepSeek V4 Flash",contextWindow:1e6},{id:"doubao-seed-2.0-code",displayName:"Doubao Seed 2.0 Code",contextWindow:256e3},{id:"doubao-seed-2.0-pro",displayName:"Doubao Seed 2.0 Pro",contextWindow:256e3},{id:"doubao-seed-2.0-lite",displayName:"Doubao Seed 2.0 Lite",contextWindow:256e3}],reasoningCapability:"native-budget",capabilityProfile:B,supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32e3},"gemini-cli":{apiKeyEnv:"GEMINI_API_KEY",model:qt,models:po.filter(t=>t!==qt).map(t=>({id:t})),reasoningCapability:"prompt-only",capabilityProfile:jt,supportsThinking:!1},"codex-cli":{apiKeyEnv:"OPENAI_API_KEY",model:Zt,models:mo.filter(t=>t!==Zt).map(t=>({id:t})),reasoningCapability:"prompt-only",capabilityProfile:ge,supportsThinking:!1}};function W(t,e={}){let n=N[t];return{apiKeyEnv:n.apiKeyEnv,model:n.model,reasoningCapability:n.reasoningCapability,models:n.models,contextWindow:n.contextWindow,maxOutputTokens:n.maxOutputTokens,thinkingBudgetCap:n.thinkingBudgetCap,supportsThinking:n.supportsThinking??!1,...e}}i(W,"buildProviderConfig");var ht=class extends L{static{i(this,"AnthropicProvider")}name="anthropic";config=W("anthropic",{strictThinkingSignature:!0});constructor(){super(),this.client=new uo({apiKey:this.getApiKey()})}},yt=class extends L{static{i(this,"ZhipuCodingProvider")}name="zhipu-coding";config=W("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",streamMaxDurationMs:3e5});constructor(){super(),this.initClient()}},kt=class extends L{static{i(this,"KimiCodeProvider")}name="kimi-code";config=W("kimi-code",{baseUrl:"https://api.kimi.com/coding/"});constructor(){super(),this.initClient()}},_t=class extends L{static{i(this,"MiniMaxCodingProvider")}name="minimax-coding";config=W("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic"});constructor(){super(),this.initClient()}},xt=class extends L{static{i(this,"MimoCodingProvider")}name="mimo-coding";config=W("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic"});constructor(){super(),this.initClient()}},vt=class extends L{static{i(this,"ArkCodingProvider")}name="ark-coding";config=W("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding"});constructor(){super(),this.initClient()}},bt=class extends F{static{i(this,"OpenAIProvider")}name="openai";config=W("openai");constructor(){super(),this.initClient()}},Ct=class extends F{static{i(this,"DeepSeekProvider")}name="deepseek";config=W("deepseek",{baseUrl:"https://api.deepseek.com",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Mt=class extends F{static{i(this,"KimiProvider")}name="kimi";config=W("kimi",{baseUrl:"https://api.moonshot.cn/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Tt=class extends F{static{i(this,"QwenProvider")}name="qwen";config=W("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",replayReasoningContent:!0});constructor(){super(),this.initClient()}},Et=class extends F{static{i(this,"ZhipuProvider")}name="zhipu";config=W("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",replayReasoningContent:!0});constructor(){super(),this.initClient()}},U={anthropic:i(()=>new ht,"anthropic"),openai:i(()=>new bt,"openai"),deepseek:i(()=>new Ct,"deepseek"),kimi:i(()=>new Mt,"kimi"),"kimi-code":i(()=>new kt,"kimi-code"),qwen:i(()=>new Tt,"qwen"),zhipu:i(()=>new Et,"zhipu"),"zhipu-coding":i(()=>new yt,"zhipu-coding"),"minimax-coding":i(()=>new _t,"minimax-coding"),"mimo-coding":i(()=>new xt,"mimo-coding"),"ark-coding":i(()=>new vt,"ark-coding"),"gemini-cli":i(()=>new De,"gemini-cli"),"codex-cli":i(()=>new Ke,"codex-cli")},Pt=process.env.KODAX_PROVIDER??"zhipu-coding",en=new Map;function fo(t){if(O(t))return N[t].apiKeyEnv}i(fo,"resolveApiKeyEnvForProvider");function tn(t){let e=t??Pt,n=U[e];if(!n)throw new R(`Unknown provider: ${e}. Available: ${Object.keys(U).join(", ")}`,e);let o=fo(e),r=o?process.env[o]:void 0,s=en.get(e);if(s&&s.apiKey===r)return s.instance;let a=n();return en.set(e,{apiKey:r,instance:a}),a}i(tn,"getProvider");function nn(t){return O(t)?!!process.env[N[t].apiKeyEnv]:!1}i(nn,"isProviderConfigured");function on(t){return O(t)?N[t].model:null}i(on,"getProviderModel");function rn(t,e){if(!O(t))return"unknown";let n=N[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}i(rn,"getProviderConfiguredReasoningCapability");function sn(t){return O(t)?X(N[t].capabilityProfile):null}i(sn,"getProviderConfiguredCapabilityProfile");function an(){let t=[];for(let e of Object.keys(U)){let n=N[e];t.push({name:e,model:n.model,models:n.models?[n.model,...n.models.map(o=>o.id)]:[n.model],configured:!!process.env[n.apiKeyEnv],reasoningCapability:n.reasoningCapability,capabilityProfile:X(n.capabilityProfile)})}return t}i(an,"getProviderList");function cn(t){let e=N[t];return e?e.models?[e.model,...e.models.map(n=>n.id)]:[e.model]:[]}i(cn,"getProviderModels");function O(t){return t in U}i(O,"isProviderName");function wt(t){return{id:t.model}}i(wt,"makeDefaultDescriptor");function Le(t,e,n){let o=n.id===e.model;return{provider:t,model:n.id,displayName:n.displayName??n.id,supportsThinking:e.supportsThinking??!1,reasoningCapability:n.reasoningCapability??e.reasoningCapability,contextWindow:n.contextWindow??e.contextWindow,maxOutputTokens:n.maxOutputTokens??e.maxOutputTokens,thinkingBudgetCap:n.thinkingBudgetCap??e.thinkingBudgetCap,isDefault:o}}i(Le,"effectiveCapabilities");function Ne(t){let e=N[t];return e?[wt(e),...e.models??[]]:[]}i(Ne,"getProviderModelDescriptors");function Be(t,e){let n=N[t];if(!n)return;if(e===n.model)return Le(t,n,wt(n));let o=n.models?.find(r=>r.id===e);if(o)return Le(t,n,o)}i(Be,"getModelCapabilities");function Fe(){let t=[];for(let e of Object.keys(U)){let n=N[e];t.push(Le(e,n,wt(n)));for(let o of n.models??[])t.push(Le(e,n,o))}return t}i(Fe,"listBuiltinModelCapabilities");var go=new Set(["compat","sdk"]);function _e(t){if(!t.name||!t.baseUrl||!t.apiKeyEnv||!t.model)throw new Error(`Custom provider requires name, baseUrl, apiKeyEnv, and model. Got: ${JSON.stringify({name:t.name,baseUrl:t.baseUrl,apiKeyEnv:t.apiKeyEnv,model:t.model})}`);if(t.protocol!=="anthropic"&&t.protocol!=="openai")throw new Error(`Unknown protocol "${t.protocol}" for custom provider "${t.name}". Must be "anthropic" or "openai".`);if(t.userAgentMode!==void 0&&!go.has(t.userAgentMode))throw new Error(`Unknown userAgentMode "${t.userAgentMode}" for custom provider "${t.name}". Must be "compat" or "sdk".`)}i(_e,"validateCustomProviderConfig");function ho(t){let e=t.models?.length?t.models.map(n=>typeof n=="string"?{id:n}:n):void 0;return{apiKeyEnv:t.apiKeyEnv,model:t.model,baseUrl:t.baseUrl,models:e,userAgentMode:t.userAgentMode,supportsThinking:t.supportsThinking??!1,reasoningCapability:t.reasoningCapability??"none",capabilityProfile:t.capabilityProfile,contextWindow:t.contextWindow,maxOutputTokens:t.maxOutputTokens,thinkingBudgetCap:t.thinkingBudgetCap,replayReasoningContent:t.replayReasoningContent??!1,strictThinkingSignature:t.strictThinkingSignature??!1,streamMaxDurationMs:t.streamMaxDurationMs}}i(ho,"buildProviderConfig");function Ue(t){_e(t);let e=ho(t);return t.protocol==="anthropic"?new Rt(t.name,e):new At(t.name,e)}i(Ue,"createCustomProvider");var Rt=class extends L{static{i(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}},At=class extends F{static{i(this,"DynamicOpenAIProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}};var H=new Map,St=new Map;function ln(t){let e=new Set,n=new Map,o=new Map;for(let r of t){if(_e(r),e.has(r.name))throw new Error(`Duplicate custom provider name: "${r.name}". Each custom provider must have a unique name.`);r.name in U&&console.warn(`[kodax] Custom provider "${r.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(r.name),n.set(r.name,r),o.set(r.name,()=>Ue(r))}H.clear(),St.clear();for(let[r,s]of n)H.set(r,s);for(let[r,s]of o)St.set(r,s)}i(ln,"registerCustomProviders");function Xe(t){let e=St.get(t);return e?e():void 0}i(Xe,"getCustomProvider");function le(t){return H.has(t)}i(le,"isCustomProviderName");function We(){return[...H.keys()]}i(We,"getCustomProviderNames");function un(){let t=[];for(let[e,n]of H){let o=!!process.env[n.apiKeyEnv],r=(n.models??[]).map(a=>typeof a=="string"?a:a.id),s=n.model&&r.length?[...new Set([n.model,...r])]:[n.model];t.push({name:e,model:n.model,models:s,configured:o,reasoningCapability:n.reasoningCapability??"none",capabilityProfile:X(n.capabilityProfile??fe),custom:!0})}return t}i(un,"getCustomProviderList");function pn(t){let e=H.get(t);if(!e)return;let n=(e.models??[]).map(o=>typeof o=="string"?o:o.id);return e.model&&n.length?[...new Set([e.model,...n])]:[e.model]}i(pn,"getCustomProviderModels");function dn(t){return typeof t=="string"?{id:t}:t}i(dn,"customDescriptorToFull");function $e(t){let e=H.get(t);if(!e)return;let n={id:e.model},o=(e.models??[]).map(dn).filter(r=>r.id!==e.model);return[n,...o]}i($e,"getCustomProviderModelDescriptors");function ce(t,e){let n=H.get(t);if(!n)return;let o=e===n.model,r=o?{id:n.model}:(n.models??[]).map(dn).find(s=>s.id===e);if(r)return{provider:t,model:r.id,displayName:r.displayName??r.id,supportsThinking:n.supportsThinking??!1,reasoningCapability:r.reasoningCapability??n.reasoningCapability??"none",contextWindow:r.contextWindow??n.contextWindow,maxOutputTokens:r.maxOutputTokens??n.maxOutputTokens,thinkingBudgetCap:r.thinkingBudgetCap??n.thinkingBudgetCap,isDefault:o}}i(ce,"getCustomModelCapabilities");function je(){let t=[];for(let[e,n]of H){let o=ce(e,n.model);o&&t.push(o);for(let r of n.models??[]){let s=typeof r=="string"?r:r.id;if(s===n.model)continue;let a=ce(e,s);a&&t.push(a)}}return t}i(je,"listCustomProviderModelCapabilities");var Y=new Map,yo=0;function Ot(t){let e=Y.get(t);if(!(!e||e.length===0))return e[e.length-1]}i(Ot,"getActiveRuntimeProviderRegistration");function ko(t){for(let[e,n]of Y){let o=n.filter(r=>r.id!==t);if(o.length!==n.length){o.length===0?Y.delete(e):Y.set(e,o);return}}}i(ko,"removeRuntimeProviderRegistration");function mn(t,e){let n=t.trim();if(!n)throw new Error("Model provider name cannot be empty.");if(O(n))throw new Error(`Runtime model provider "${n}" conflicts with a built-in provider.`);if(le(n))throw new Error(`Runtime model provider "${n}" conflicts with an existing config-defined custom provider.`);let o={id:`runtime-provider:${++yo}`,name:n,factory:e},r=Y.get(n)??[];return Y.set(n,[...r,o]),()=>{ko(o.id)}}i(mn,"registerModelProvider");function ze(t){let e=Ot(t);return e?e.factory():void 0}i(ze,"getRuntimeModelProvider");function Ge(t){return Ot(t)!==void 0}i(Ge,"isRuntimeModelProviderName");function Ve(){return Array.from(Y.keys()).filter(t=>Ot(t)!==void 0)}i(Ve,"getRuntimeModelProviderNames");function fn(){Y.clear()}i(fn,"clearRuntimeModelProviders");function gn(t){if(O(t))return U[t]();let e=ze(t);if(e)return e;let n=Xe(t);if(n)return n;let o=Dt();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}i(gn,"resolveProvider");function hn(t){return O(t)||Ge(t)||le(t)}i(hn,"isKnownProvider");function Dt(){let t=Object.keys(U),e=Ve(),n=We();return[...new Set([...t,...e,...n])]}i(Dt,"getAvailableProviderNames");function yn(t){return O(t)?Ne(t):$e(t)??[]}i(yn,"resolveProviderModelDescriptors");function kn(t,e){return O(t)?Be(t,e):ce(t,e)}i(kn,"resolveModelCapabilities");function _n(){return[...Fe(),...je()]}i(_n,"listAllModelCapabilities");var xn={anthropic:{"claude-opus-4-6":{inputPer1M:15,outputPer1M:75,cachePer1M:1.875},"claude-sonnet-4-6":{inputPer1M:3,outputPer1M:15,cachePer1M:.375},"claude-haiku-4-5":{inputPer1M:.8,outputPer1M:4,cachePer1M:.08}},openai:{"gpt-5.4":{inputPer1M:30,outputPer1M:120},"gpt-5.3-codex-spark":{inputPer1M:10,outputPer1M:40}},deepseek:{"deepseek-v4-flash":{inputPer1M:.14,outputPer1M:.28,cachePer1M:.028},"deepseek-v4-pro":{inputPer1M:1.68,outputPer1M:3.36,cachePer1M:.14}},kimi:{"k2.5":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.6":{inputPer1M:.005,outputPer1M:.015}},"kimi-code":{"kimi-for-coding":{inputPer1M:.005,outputPer1M:.015}},qwen:{"qwen3.5-plus":{inputPer1M:.003,outputPer1M:.006}},zhipu:{"glm-5":{inputPer1M:.05,outputPer1M:.1},"glm-5.1":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03}},"zhipu-coding":{"glm-5":{inputPer1M:.05,outputPer1M:.1},"glm-5.1":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03}},"minimax-coding":{"MiniMax-M2.7":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.7-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.5":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.5-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.1":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.1-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2":{inputPer1M:.01,outputPer1M:.03}},"mimo-coding":{"mimo-v2.5-pro":{inputPer1M:.01,outputPer1M:.03},"mimo-v2.5":{inputPer1M:.01,outputPer1M:.03}},"ark-coding":{"glm-5.1":{inputPer1M:.005,outputPer1M:.015},"glm-4.7":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.6":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.5":{inputPer1M:.005,outputPer1M:.015},"minimax-latest":{inputPer1M:.005,outputPer1M:.015},"deepseek-v3.2":{inputPer1M:.005,outputPer1M:.015},"deepseek-v4-pro":{inputPer1M:.005,outputPer1M:.015},"deepseek-v4-flash":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-code":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-pro":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-lite":{inputPer1M:.005,outputPer1M:.015}},"gemini-cli":{},"codex-cli":{}};function It(t,e,n){let o=n?.[t]?.[e];return o||xn[t]?.[e]}i(It,"getCostRate");function Kt(t,e,n,o=0){let r=e/1e6*t.inputPer1M,s=n/1e6*t.outputPer1M,a=t.cachePer1M?o/1e6*t.cachePer1M:0;return r+s+a}i(Kt,"calculateCost");function _o(){return{records:[],retries:[]}}i(_o,"createCostTracker");function xo(t,e){let n={timestamp:Date.now(),provider:e.provider,waitMs:e.waitMs,reason:e.reason,source:e.source};return{records:t.records,retries:[...t.retries,n]}}i(xo,"recordRetry");function Lt(t,e,n){let o=It(e.provider,e.model,n),r=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?Kt(o,e.inputTokens,e.outputTokens,r):0,a={timestamp:Date.now(),provider:e.provider,model:e.model,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,cost:s,role:e.role};return{records:[...t.records,a],retries:t.retries}}i(Lt,"recordUsage");function vo(t){let e=0,n=0,o=0,r=0,s=0,a=0,c={},u={};for(let m of t.records){e+=m.cost,n+=m.inputTokens,o+=m.outputTokens,r+=m.cacheReadTokens+m.cacheWriteTokens,s+=m.cacheReadTokens,a+=m.cacheWriteTokens;let k=c[m.provider];c[m.provider]={cost:(k?.cost??0)+m.cost,calls:(k?.calls??0)+1,inputTokens:(k?.inputTokens??0)+m.inputTokens,outputTokens:(k?.outputTokens??0)+m.outputTokens};let _=m.role??"default",b=u[_];u[_]={cost:(b?.cost??0)+m.cost,calls:(b?.calls??0)+1,inputTokens:(b?.inputTokens??0)+m.inputTokens,outputTokens:(b?.outputTokens??0)+m.outputTokens}}let d=0;for(let m of t.retries)d+=m.waitMs;let l=r>0?s/r:0;return{totalCost:e,totalInputTokens:n,totalOutputTokens:o,totalCacheTokens:r,totalCacheReadTokens:s,totalCacheWriteTokens:a,cacheHitRate:l,callCount:t.records.length,retryCount:t.retries.length,retryWaitMs:d,byProvider:c,byRole:u}}i(vo,"getSummary");function He(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}i(He,"formatCost");function bo(t){let e=[];if(e.push(`Session Cost: ${He(t.totalCost)} (${t.callCount} calls)`),e.push(`Tokens: ${t.totalInputTokens.toLocaleString()} in / ${t.totalOutputTokens.toLocaleString()} out`),t.totalCacheTokens>0){let r=(t.cacheHitRate*100).toFixed(0);e.push(`Cache: ${t.totalCacheTokens.toLocaleString()} tokens (${t.totalCacheReadTokens.toLocaleString()} read / ${t.totalCacheWriteTokens.toLocaleString()} write, ${r}% hit rate)`)}if(t.retryCount>0){let r=(t.retryWaitMs/1e3).toFixed(1);e.push(`Retries: ${t.retryCount} (${r}s total wait)`)}e.push("");let n=Object.entries(t.byProvider).sort((r,s)=>s[1].cost-r[1].cost);if(n.length>0){e.push("By Provider:");for(let[r,s]of n)e.push(` ${r}: ${He(s.cost)} (${s.calls} calls, ${s.inputTokens.toLocaleString()} in / ${s.outputTokens.toLocaleString()} out)`);e.push("")}let o=Object.entries(t.byRole).sort((r,s)=>s[1].cost-r[1].cost);if(o.length>1){e.push("By Role:");for(let[r,s]of o)e.push(` ${r}: ${He(s.cost)} (${s.calls} calls)`)}return e.join(`
|
|
31
|
-
`)}i(bo,"formatCostReport");var vn={inputTokens:0,outputTokens:0,totalTokens:0},Co=3e4;async function Mo(t){let e=new AbortController,n=t.timeoutMs??Co,o,r=i(c=>{o||(o=c),e.abort()},"recordAbort"),s=setTimeout(()=>r("timeout"),n),a=i(()=>r("parent"),"onParentAbort");t.abortSignal&&(t.abortSignal.aborted?r("parent"):t.abortSignal.addEventListener("abort",a,{once:!0}));try{let c=await t.provider.stream([...t.messages],[],t.system,t.reasoning??{mode:"off"},{modelOverride:t.model},e.signal),u=c.usage??vn,d=c.textBlocks??[],l=c.toolBlocks??[],m=d.map(_=>_.text).join("");if(l.length>0)return{text:m,usage:u,costTracker:t.costTracker,stopReason:"error",error:new Error(`sideQuery: provider returned ${l.length} tool_use block(s); sideQuery expects text-only output`)};let k=t.costTracker;return k&&(k=Lt(k,{provider:t.provider.name,model:t.model,inputTokens:u.inputTokens,outputTokens:u.outputTokens,cacheReadTokens:u.cachedReadTokens,cacheWriteTokens:u.cachedWriteTokens,role:t.querySource})),{text:m,usage:u,costTracker:k,stopReason:To(c.stopReason)}}catch(c){let u=c instanceof Error?c:new Error(String(c)),d="error";return e.signal.aborted&&(d=o==="timeout"?"timeout":"aborted"),{text:"",usage:vn,costTracker:t.costTracker,stopReason:d,error:u}}finally{clearTimeout(s),t.abortSignal&&t.abortSignal.removeEventListener("abort",a)}}i(Mo,"sideQuery");function To(t){return t==="max_tokens"?"max_tokens":"end_turn"}i(To,"mapStopReason");export{V as a,R as b,me as c,Ye as d,Je as e,Qe as f,Q as g,qe as h,bn as i,Cn as j,Nt as k,Bt as l,Ze as m,q as n,ve as o,Ft as p,Z as q,ee as r,et as s,it as t,rt as u,te as v,Ce as w,at as x,Rn as y,Me as z,Te as A,Ee as B,G as C,ne as D,ct as E,oe as F,lt as G,he as H,L as I,F as J,se as K,ae as L,ye as M,ke as N,N as O,U as P,Pt as Q,tn as R,nn as S,on as T,rn as U,sn as V,an as W,cn as X,O as Y,Ne as Z,Be as _,Fe as $,_e as aa,Ue as ba,ln as ca,Xe as da,le as ea,We as fa,un as ga,pn as ha,$e as ia,ce as ja,je as ka,mn as la,ze as ma,Ge as na,Ve as oa,fn as pa,gn as qa,hn as ra,Dt as sa,yn as ta,kn as ua,_n as va,xn as wa,It as xa,Kt as ya,_o as za,xo as Aa,Lt as Ba,vo as Ca,He as Da,bo as Ea,Mo as Fa};
|