@kodax-ai/kodax 0.7.55 → 0.7.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +22 -24
  3. package/README_CN.md +16 -18
  4. package/dist/builtin/code-review/SKILL.md +22 -3
  5. package/dist/chunks/agent-EHWQZA4C.js +2 -0
  6. package/dist/chunks/argument-completer-AYDAYGKL.js +2 -0
  7. package/dist/chunks/chunk-3WWPJGPQ.js +2 -0
  8. package/dist/chunks/chunk-4SHP3M67.js +2 -0
  9. package/dist/chunks/chunk-KN6IJMTB.js +636 -0
  10. package/dist/chunks/{chunk-ZBK3DZ3S.js → chunk-LZKGOR2C.js} +1 -1
  11. package/dist/chunks/chunk-MJFPFRGK.js +423 -0
  12. package/dist/chunks/chunk-N2N2W3AQ.js +584 -0
  13. package/dist/chunks/chunk-PCPFLPS4.js +5 -0
  14. package/dist/chunks/chunk-TCLSPUTR.js +31 -0
  15. package/dist/chunks/chunk-VACH6QWN.js +315 -0
  16. package/dist/chunks/chunk-YSVPF6SN.js +597 -0
  17. package/dist/chunks/{compaction-config-NAJEEPG5.js → compaction-config-TLDMFMZO.js} +1 -1
  18. package/dist/chunks/{construction-bootstrap-4CIVZMQ5.js → construction-bootstrap-55B7Q5RX.js} +4 -4
  19. package/dist/chunks/dist-IE4HVWP7.js +2 -0
  20. package/dist/chunks/dist-IKOK2MJQ.js +2 -0
  21. package/dist/chunks/paste-WTL2XN7P.js +2 -0
  22. package/dist/chunks/utils-EJ2VCRTC.js +2 -0
  23. package/dist/index.d.ts +21 -16
  24. package/dist/index.js +6 -6
  25. package/dist/kodax_cli.js +1128 -1099
  26. package/dist/provider-capabilities.json +986 -195
  27. package/dist/sdk-agent.d.ts +20 -12
  28. package/dist/sdk-agent.js +1 -1
  29. package/dist/sdk-coding.d.ts +223 -108
  30. package/dist/sdk-coding.js +1 -1
  31. package/dist/sdk-llm.d.ts +10 -5
  32. package/dist/sdk-llm.js +1 -1
  33. package/dist/sdk-mcp.d.ts +1 -1
  34. package/dist/sdk-mcp.js +1 -1
  35. package/dist/sdk-media.d.ts +142 -0
  36. package/dist/sdk-media.js +2 -0
  37. package/dist/sdk-repl.d.ts +106 -96
  38. package/dist/sdk-repl.js +1 -1
  39. package/dist/sdk-session.d.ts +6 -5
  40. package/dist/sdk-session.js +1 -1
  41. package/dist/sdk-skills.js +1 -1
  42. package/dist/semantic-worker.js +11 -0
  43. package/dist/types-chunks/base.d-BnjQrSVf.d.ts +301 -0
  44. package/dist/types-chunks/{bash-prefix-extractor.d-LUGkQHcd.d.ts → bash-prefix-extractor.d-BgvMbfq6.d.ts} +198 -139
  45. package/dist/types-chunks/{capsule.d-CNonpwAZ.d.ts → capsule.d-DwJp5r63.d.ts} +14 -11
  46. package/dist/types-chunks/{types.d-D4jL-gAA.d.ts → guardrail.d-BP3yyr6u.d.ts} +3 -121
  47. package/dist/types-chunks/{guardrail.d-B18oO1gt.d.ts → guardrail.d-C1DhxnvC.d.ts} +31 -9
  48. package/dist/types-chunks/{manager.d-DLmDhX3i.d.ts → manager.d-DBD7SOTT.d.ts} +7 -2
  49. package/dist/types-chunks/{process.d-Bj82oJhD.d.ts → process.d-BZncyzEj.d.ts} +2 -1
  50. package/dist/types-chunks/{resolver.d-CCX9NXWP.d.ts → resolver.d-ZvKQgl0X.d.ts} +82 -17
  51. package/dist/types-chunks/{sdk-session-SjrnWb4-.d.ts → sdk-session-DAScB0rW.d.ts} +6 -4
  52. package/dist/types-chunks/{storage.d-BAuJ0Ks7.d.ts → storage.d-CPvn9qI0.d.ts} +2 -2
  53. package/dist/types-chunks/{base.d-BBNUF9nz.d.ts → types.d-6VOXvF88.d.ts} +101 -290
  54. package/dist/types-chunks/types.d-D8WcfrOD.d.ts +143 -0
  55. package/dist/types-chunks/{utils.d-C9MUY8n3.d.ts → utils.d-CpgVIjYZ.d.ts} +16 -18
  56. package/package.json +15 -6
  57. package/dist/chunks/agent-PYSVWY7M.js +0 -2
  58. package/dist/chunks/argument-completer-CTDNNWV3.js +0 -2
  59. package/dist/chunks/chunk-7C2QUBLE.js +0 -31
  60. package/dist/chunks/chunk-EVIDQWMF.js +0 -5
  61. package/dist/chunks/chunk-FRI7UQSB.js +0 -2
  62. package/dist/chunks/chunk-HQCLPWRI.js +0 -551
  63. package/dist/chunks/chunk-JCDO2FR4.js +0 -584
  64. package/dist/chunks/chunk-MX4G42EV.js +0 -425
  65. package/dist/chunks/chunk-RGPPZOD5.js +0 -314
  66. package/dist/chunks/chunk-THAKTCPE.js +0 -652
  67. package/dist/chunks/dist-7KTO2PUU.js +0 -2
  68. package/dist/chunks/dist-BNKIZRCP.js +0 -2
  69. package/dist/chunks/paste-5DSTHQGK.js +0 -2
  70. package/dist/chunks/utils-2QXBKYPJ.js +0 -2
@@ -1,8 +1,8 @@
1
- import { R as KodaXOptions, u as KodaXContextTokenSnapshot, m as KodaXAgentMode, W as KodaXRepoIntelligenceMode, a7 as KodaXSkillInvocationContext } from './bash-prefix-extractor.d-LUGkQHcd.js';
2
- import { c as SessionStorage$1, b as PermissionMode } from './storage.d-BAuJ0Ks7.js';
3
- import { ac as KodaXSessionUiHistoryItem, a4 as KodaXSessionLineage, Y as KodaXSessionArtifactLedgerEntry, Q as KodaXExtensionSessionState, P as KodaXExtensionSessionRecord, a8 as KodaXSessionRuntimeInfo, aa as KodaXSessionStorage, $ as KodaXSessionData, bD as WorkflowProcessSource } from './process.d-Bj82oJhD.js';
4
- import { o as KodaXMessage, G as KodaXReasoningMode, t as KodaXProviderCapabilityProfile, H as KodaXReasoningOverride, i as KodaXCustomProviderConfig } from './base.d-BBNUF9nz.js';
5
- import { A as AgentsFile, f as AutoModeStats, l as KodaXMcpServersConfig } from './guardrail.d-B18oO1gt.js';
1
+ import { R as KodaXOptions, u as KodaXContextTokenSnapshot, m as KodaXAgentMode, W as KodaXRepoIntelligenceMode, a7 as KodaXSkillInvocationContext } from './bash-prefix-extractor.d-BgvMbfq6.js';
2
+ import { c as SessionStorage$1, b as PermissionMode } from './storage.d-CPvn9qI0.js';
3
+ import { ac as KodaXSessionUiHistoryItem, a4 as KodaXSessionLineage, Y as KodaXSessionArtifactLedgerEntry, Q as KodaXExtensionSessionState, P as KodaXExtensionSessionRecord, a8 as KodaXSessionRuntimeInfo, aa as KodaXSessionStorage, $ as KodaXSessionData, bD as WorkflowProcessSource } from './process.d-BZncyzEj.js';
4
+ import { j as KodaXMessage, E as KodaXReasoningMode, o as KodaXProviderCapabilityProfile, d as KodaXCustomProviderConfig } from './types.d-6VOXvF88.js';
5
+ import { A as AgentsFile, f as AutoModeStats, l as KodaXMcpServersConfig } from './guardrail.d-C1DhxnvC.js';
6
6
  import * as readline from 'readline';
7
7
  import { SpawnSyncReturns } from 'child_process';
8
8
 
@@ -155,13 +155,14 @@ interface CommandExecutionMetadata {
155
155
  interface CurrentConfig {
156
156
  provider: string;
157
157
  model?: string;
158
+ effort?: string;
159
+ effortOverride?: boolean;
160
+ planModeEffort?: string;
158
161
  thinking: boolean;
159
162
  reasoningMode: KodaXReasoningMode;
160
163
  agentMode: KodaXAgentMode;
161
164
  permissionMode: PermissionMode;
162
165
  repoIntelligenceMode?: KodaXRepoIntelligenceMode;
163
- repointelEndpoint?: string;
164
- repointelBin?: string;
165
166
  repoIntelligenceTrace?: boolean;
166
167
  /** FEATURE_102 Phase 3 — cross-provider child fallback chain. */
167
168
  fallbackProviders?: string[];
@@ -180,14 +181,13 @@ interface CommandCallbacks {
180
181
  clearHistory: () => void;
181
182
  printHistory: () => void;
182
183
  switchProvider?: (provider: string, model?: string) => void;
184
+ setEffort?: (effort?: string) => void;
183
185
  setThinking?: (enabled: boolean) => void;
184
186
  setReasoningMode?: (mode: KodaXReasoningMode) => void;
185
187
  setAgentMode?: (mode: KodaXAgentMode) => void;
186
188
  setPermissionMode?: (mode: PermissionMode) => void;
187
189
  setRepoIntelligenceRuntime?: (update: {
188
190
  mode?: KodaXRepoIntelligenceMode;
189
- endpoint?: string | null;
190
- bin?: string | null;
191
191
  trace?: boolean;
192
192
  }) => void;
193
193
  deleteSession?: (id: string) => Promise<void>;
@@ -339,7 +339,7 @@ declare function executeCommand(parsed: {
339
339
 
340
340
  /**
341
341
  * KodaX CLI Utilities
342
- * CLI 层工具函数
342
+ * CLI 灞傚伐鍏峰嚱鏁?
343
343
  */
344
344
 
345
345
  /**
@@ -411,6 +411,8 @@ declare function isProviderConfigured(name: string): boolean;
411
411
  declare function loadConfig(): {
412
412
  provider?: string;
413
413
  model?: string;
414
+ effort?: string;
415
+ planModeEffort?: string;
414
416
  thinking?: boolean;
415
417
  reasoningMode?: KodaXReasoningMode;
416
418
  /**
@@ -424,14 +426,11 @@ declare function loadConfig(): {
424
426
  agentMode?: KodaXAgentMode;
425
427
  permissionMode?: string;
426
428
  locale?: string;
427
- providerReasoningOverrides?: Record<string, KodaXReasoningOverride>;
428
429
  providerModels?: Record<string, string[]>;
429
430
  customProviders?: KodaXCustomProviderConfig[];
430
431
  extensions?: string[];
431
432
  mcpServers?: KodaXMcpServersConfig;
432
- repoIntelligenceMode?: 'auto' | 'off' | 'oss' | 'premium-shared' | 'premium-native';
433
- repointelEndpoint?: string;
434
- repointelBin?: string;
433
+ repoIntelligenceMode?: 'auto' | 'off' | 'light' | 'full';
435
434
  repoIntelligenceTrace?: boolean;
436
435
  streamIdleTimeoutMs?: number;
437
436
  /**
@@ -464,19 +463,18 @@ declare function prepareRuntimeConfig(): ReturnType<typeof loadConfig>;
464
463
  declare function saveConfig(config: {
465
464
  provider?: string;
466
465
  model?: string;
466
+ effort?: string;
467
+ planModeEffort?: string;
467
468
  thinking?: boolean;
468
469
  reasoningMode?: KodaXReasoningMode;
469
470
  agentMode?: KodaXAgentMode;
470
471
  permissionMode?: string;
471
472
  locale?: string;
472
- providerReasoningOverrides?: Record<string, KodaXReasoningOverride>;
473
473
  providerModels?: Record<string, string[]>;
474
474
  customProviders?: KodaXCustomProviderConfig[];
475
475
  extensions?: string[];
476
476
  mcpServers?: KodaXMcpServersConfig;
477
- repoIntelligenceMode?: 'auto' | 'off' | 'oss' | 'premium-shared' | 'premium-native';
478
- repointelEndpoint?: string;
479
- repointelBin?: string;
477
+ repoIntelligenceMode?: 'auto' | 'off' | 'light' | 'full';
480
478
  repoIntelligenceTrace?: boolean;
481
479
  /** FEATURE_184 Phase D.3 follow-up — opt-in verifier log line. */
482
480
  verifierLog?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodax-ai/kodax",
3
- "version": "0.7.55",
3
+ "version": "0.7.57",
4
4
  "description": "极致轻量化 Coding Agent - TypeScript 实现,支持 12 个 LLM 提供商,可发布为免 Node 单文件二进制",
5
5
  "type": "module",
6
6
  "private": false,
@@ -32,6 +32,10 @@
32
32
  "types": "./dist/sdk-coding.d.ts",
33
33
  "import": "./dist/sdk-coding.js"
34
34
  },
35
+ "./media": {
36
+ "types": "./dist/sdk-media.d.ts",
37
+ "import": "./dist/sdk-media.js"
38
+ },
35
39
  "./repl": {
36
40
  "types": "./dist/sdk-repl.d.ts",
37
41
  "import": "./dist/sdk-repl.js"
@@ -60,9 +64,7 @@
60
64
  "dev:mem-diag": "node scripts/mem-diag-launch.cjs",
61
65
  "dev:mem-snapshot": "node scripts/mem-diag-launch.cjs 2",
62
66
  "probe:reasoning": "tsx scripts/probe-reasoning.ts",
63
- "repointel:install": "node clients/repointel/scripts/install.mjs",
64
- "repointel:demo": "node clients/repointel/scripts/demo.mjs",
65
- "repointel:doctor": "node clients/repointel/scripts/doctor.mjs",
67
+ "probe:max-tokens": "node scripts/probe-max-tokens.mjs",
66
68
  "start": "node --max-old-space-size=4096 --require ./scripts/production-env.cjs dist/kodax_cli.js",
67
69
  "build:binary": "node scripts/build-binary.mjs",
68
70
  "build:binary:all": "node scripts/build-binary.mjs --all",
@@ -71,6 +73,7 @@
71
73
  "test:eval": "vitest run -c vitest.eval.config.ts",
72
74
  "bench:perf": "tsx benchmark/perf/repl-render-perf.bench.ts",
73
75
  "bench:perf:e2e": "tsx benchmark/perf/repl-render-engine-e2e.bench.ts",
76
+ "bench:repo-intel": "tsx benchmark/perf/repo-intelligence-index.bench.ts",
74
77
  "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
75
78
  "clean:packages": "npm run clean --workspaces"
76
79
  },
@@ -145,10 +148,16 @@
145
148
  },
146
149
  "repository": {
147
150
  "type": "git",
148
- "url": "https://github.com/icetomoyo/KodaX.git"
151
+ "url": "git+https://github.com/icetomoyo/KodaX.git"
149
152
  },
150
153
  "files": [
151
- "dist",
154
+ "dist/*.d.ts",
155
+ "dist/*.js",
156
+ "dist/builtin",
157
+ "dist/chunks",
158
+ "dist/provider-capabilities.json",
159
+ "dist/semantic-worker.js",
160
+ "dist/types-chunks",
152
161
  "scripts/kodax-bin.cjs",
153
162
  "scripts/production-env.cjs",
154
163
  "README.md",
@@ -1,2 +0,0 @@
1
- // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{Pb as c,Qb as d,Rb as e,Sb as f,kc as g,lc as h,pd as i,ud as j}from"./chunk-THAKTCPE.js";import"./chunk-7C2QUBLE.js";import{jb as a,kb as b}from"./chunk-JCDO2FR4.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};
@@ -1,2 +0,0 @@
1
- // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{wa as a,xa as b}from"./chunk-HQCLPWRI.js";import"./chunk-FRI7UQSB.js";import"./chunk-ZBK3DZ3S.js";import"./chunk-MX4G42EV.js";import"./chunk-THAKTCPE.js";import"./chunk-7C2QUBLE.js";import"./chunk-JCDO2FR4.js";import"./chunk-V4WSBIXB.js";export{a as ArgumentCompleter,b as createArgumentCompleter};
@@ -1,31 +0,0 @@
1
- // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{a as r}from"./chunk-V4WSBIXB.js";var Y=class extends Error{static{r(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},R=class extends Y{static{r(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},ke=class extends Y{static{r(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},ft=class extends Y{static{r(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},mt=class extends Y{static{r(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var gt=32768,so=32e3,ao=64e3,co=.5;var lo=["off","auto","quick","balanced","deep"],cn={low:6e3,medium:1e4,high:2e4},ln=4096;function ht(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}r(ht,"getReasoningCapability");function oe(t){return Re(t).enabled}r(oe,"isReasoningEnabled");function Re(t){if(typeof t=="boolean")return{enabled:t,mode:t?"auto":"off",depth:t?"medium":"off",taskType:"unknown",executionMode:"implementation"};let e=t?.mode??"off",n=t?.depth??un(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"}}r(Re,"normalizeReasoningRequest");function un(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}r(un,"getDefaultThinkingDepthForMode");function ie(t,e,n="unknown"){if(e==="off")return 0;let o={...cn,...t.defaultThinkingBudgets??{}},s=t.taskBudgetOverrides?.[n]?.[e]??o[e];return t.thinkingBudgetCap?Math.min(s,t.thinkingBudgetCap):s}r(ie,"resolveThinkingBudget");function re(t,e,n=ln){let o=Math.max(1024,e-n);return Math.max(1024,Math.min(t,o))}r(re,"clampThinkingBudget");function yt(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}r(yt,"mapDepthToOpenAIReasoningEffort");import Ae from"fs";import uo from"os";import bt from"path";var vt=null;function po(t){return t==="budget"||t==="effort"||t==="toggle"||t==="adaptive"||t==="none"}r(po,"isReasoningOverride");function fo(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(po)}r(fo,"isStoredConfig");function mo(){return process.env.KODAX_HOME??bt.join(uo.homedir(),".kodax")}r(mo,"getKodaxDir");function dn(){return process.env.KODAX_CONFIG_FILE??bt.join(mo(),"config.json")}r(dn,"getConfigFilePath");function kt(t,e){return vt={filePath:t,config:e},e}r(kt,"updateStoredConfigCache");function go(t){let e=JSON.parse(Ae.readFileSync(t,"utf-8"));return fo(e)?e:{}}r(go,"readStoredConfigFromDisk");function _t(t){switch(t){case"native-budget":return"budget";case"native-effort":return"effort";case"native-toggle":return"toggle";case"native-adaptive":return"adaptive";case"none":return"none";default:return}}r(_t,"reasoningCapabilityToOverride");function Ct(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";case"adaptive":return"native-adaptive";default:return"none"}}r(Ct,"reasoningOverrideToCapability");function se(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}r(se,"buildReasoningOverrideKey");function xt(){let t=dn();if(vt?.filePath===t)return vt.config;try{if(Ae.existsSync(t))return kt(t,go(t))}catch{}return kt(t,{})}r(xt,"loadStoredConfig");function pn(t){let e=dn();try{Ae.mkdirSync(bt.dirname(e),{recursive:!0}),Ae.writeFileSync(e,JSON.stringify(t,null,2)),kt(e,t)}catch(n){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",n)}}r(pn,"saveStoredConfig");function Oe(t,e,n){let o=xt(),i=se(t,e,n);return o.providerReasoningOverrides?.[i]}r(Oe,"loadReasoningOverride");function Tt(t,e,n,o){let i=xt(),s=se(t,e,o);i.providerReasoningOverrides={...i.providerReasoningOverrides??{},[s]:n},pn(i)}r(Tt,"saveReasoningOverride");function ho(t,e,n){let o=xt(),i=se(t,e,n);if(!o.providerReasoningOverrides?.[i])return;let s={...o.providerReasoningOverrides};delete s[i],o.providerReasoningOverrides=Object.keys(s).length>0?s:void 0,pn(o)}r(ho,"clearReasoningOverride");function fn(t,e){if(!t)return;if(typeof t.get=="function")return t.get(e)??void 0;let n=t,o=e.toLowerCase(),i=n[e]??n[o]??n[o.replace(/\b\w/g,s=>s.toUpperCase())];if(i!==void 0)return Array.isArray(i)?i[0]:i}r(fn,"readHeader");function mn(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}r(mn,"parsePositiveNumber");function yo(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 i=o-e;return i>0?i:void 0}r(yo,"parseHttpDate");function De(t,e){let n=e.baseBackoffMs??1e3,o=e.maxBackoffMs??3e4,i=e.maxHeaderWaitMs??12e4,s=e.now?e.now():Date.now(),a=mn(fn(t,"retry-after-ms"));if(a!==void 0){let y=Math.min(a,i);return{type:"header",waitMs:Math.round(y),source:"retry-after-ms",cappedFromHeader:y!==a}}let c=fn(t,"retry-after");if(c!==void 0&&c.trim().length>0){let y=mn(c);if(y!==void 0){let b=y*1e3,p=Math.min(b,i);return{type:"header",waitMs:Math.round(p),source:"retry-after-seconds",cappedFromHeader:p!==b}}let g=yo(c,s);if(g!==void 0){let b=Math.min(g,i);return{type:"header",waitMs:Math.round(b),source:"retry-after-date",cappedFromHeader:b!==g}}}let d=n*Math.pow(2,Math.max(0,e.attempt)),l=Math.min(d,o),f=e.withJitter!==!1?Math.random()*.25*l:0;return{type:"backoff",waitMs:Math.round(l+f),source:"exponential-backoff",attempt:e.attempt}}r(De,"parseRetryAfter");function Ie(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}r(Ie,"extractHeadersFromError");var te={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},gn={...te,multimodalSupport:"image-input"},be={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},hn={...be,multimodalSupport:"image-input"};function Ne(t){return{transport:t.transport,conversationSemantics:t.conversationSemantics,mcpSupport:t.mcpSupport,contextFidelity:t.contextFidelity??"full",toolCallingFidelity:t.toolCallingFidelity??"full",sessionSupport:t.sessionSupport??"full",longRunningSupport:t.longRunningSupport??"full",multimodalSupport:t.multimodalSupport??"none",evidenceSupport:t.evidenceSupport??"full"}}r(Ne,"normalizeCapabilityProfile");function X(t){return{...Ne(t)}}r(X,"cloneCapabilityProfile");function vo(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}r(vo,"parseEnvInt");function Le(){return new DOMException("Request aborted","AbortError")}r(Le,"abortError");function ko(t,e){return t<=0?Promise.resolve():e?.aborted?Promise.reject(Le()):new Promise((n,o)=>{let i,s=r(()=>{e&&e.removeEventListener("abort",a)},"cleanup"),a=r(()=>{i&&clearTimeout(i),s(),o(Le())},"onAbort");e&&e.addEventListener("abort",a,{once:!0}),i=setTimeout(()=>{s(),n()},t)})}r(ko,"waitForRetryDelay");function Et(t){if(typeof t=="number"&&Number.isInteger(t))return t;if(typeof t=="string"&&/^\d{3}$/.test(t))return Number(t)}r(Et,"normalizeHttpStatus");function vn(t){if(!t||typeof t!="object")return;let e=t;return Et(e.status)??Et(e.statusCode)??Et(e.code)??vn(e.cause)}r(vn,"extractHttpStatus");function yn(t){return t instanceof Error?t.message.toLowerCase():String(t).toLowerCase()}r(yn,"getErrorMessage");var G=class{static{r(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let n=vo(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,i,s,a){throw new R(`${this.name} does not support non-streaming fallback`)}isConfigured(){return!!process.env[this.config.apiKeyEnv]}async verifyCredential(e){return{ok:!1,error:"unsupported",strategy:this.config.verifyStrategy??"unsupported",durationMs:0,approxTokensSpent:0,message:`Provider class "${this.name}" does not implement verifyCredential()`}}getModel(){return this.config.model}getAvailableModels(){return this.config.models?.length?[...new Set([this.config.model,...this.config.models.map(e=>e.id)])]:[this.config.model]}getModelDescriptor(e){let n=e??this.config.model,o=this.config.models?.find(i=>i.id===n);if(o)return o;if(n===this.config.model)return{id:this.config.model}}getBaseUrl(){return this.config.baseUrl}getApiKeyEnv(){return this.config.apiKeyEnv}getCapabilityProfile(){return X(this.config.capabilityProfile??te)}getConfiguredReasoningCapability(e){let n=this.getModelDescriptor(e);return n?.reasoningCapability?n.reasoningCapability:ht(this.config)}getReasoningCapability(e){let n=Oe(this.name,this.config,e);return n?Ct(n):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return Oe(this.name,this.config,e)}getReasoningOverrideKey(e){return se(this.name,this.config,e)}persistReasoningCapabilityOverride(e,n){let o=_t(e);o&&Tt(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}shouldFallbackForForcedToolChoiceError(e){let n=yn(e);return(n.includes("tool_choice")||n.includes("tool choice")||n.includes("toolchoice"))&&(n.includes("unknown parameter")||n.includes("invalid parameter")||n.includes("unsupported"))?!0:this.isServerError(e)}isServerError(e){let n=vn(e);if(n!==void 0&&n>=500&&n<=599)return!0;let o=yn(e);return o.includes("internal server error")||o.includes("server error")}getReasoningFallbackChain(e){switch(e){case"native-budget":return["native-budget","native-toggle","none"];case"native-effort":return["native-effort","none"];case"native-adaptive":return["native-adaptive","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 Re(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=Ie(e);if(!n)return;let o=De(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 i of o){let s=n.match(i);if(s){let a=Number(s[1].replace(/,/g,"")),c=Number(s[2].replace(/,/g,"")),d=Math.min(a,c),l=Math.max(a,c);return Math.max(3e3,l-d-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,i,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 d=this.parseContextOverflow(c);if(d){this.maxOutputTokensOverride=d,i?.(a+1,o,0);continue}}if(this.isRateLimitError(c)){if(a===o-1)throw new ke(`API rate limit exceeded after ${o} retries. Please wait and try again later.`,6e4);let d=Ie(c)??{},l=De(d,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),u=l.waitMs,f=this.classifyRateLimitReason(c);if(s?.({provider:this.name,waitMs:u,reason:f,source:l.source,attempt:a+1,maxAttempts:o}),i?i(a+1,o,u):s||console.log(`[Rate Limit] Retrying in ${u/1e3}s (${a+1}/${o})...`),n?.aborted||(await ko(u,n),n?.aborted))throw Le();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 d=c?.cause?.code??c?.code??"";throw(d==="ECONNRESET"||d==="EPIPE")&&this.onStaleConnection(),new R(`${this.name} API error: ${c.message}`,this.name)}throw c}throw new Y("Unexpected end of withRateLimit")}};import Eo from"@anthropic-ai/sdk";import{parse as bo}from"partial-json";function ae(t){if(!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{}try{let e=bo(t);return process.env.KODAX_DEBUG_TOOL_STREAM&&console.warn("[Tool Block Salvaged] partial JSON recovered, rawLength=",t.length),e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}r(ae,"parseToolInputWithSalvage");async function ce(t){if(t.strategy==="unsupported")return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:"Provider does not support credential verification"};let e=t.runners.find(l=>l.strategy===t.strategy);if(!e)return{ok:!1,error:"unsupported",strategy:t.strategy,durationMs:0,approxTokensSpent:0,message:`verifyStrategy="${t.strategy}" is not implemented for this provider's base class`};if(t.signal?.aborted)return{ok:!1,error:"unknown",strategy:t.strategy,durationMs:0,approxTokensSpent:0,message:"caller aborted before verifyCredential started"};let n=new AbortController,o=t.timeoutMs??8e3,i,s=r(l=>{i||(i=l),n.abort()},"recordAbort"),a=setTimeout(()=>s("timeout"),o),c=r(()=>s("parent"),"onParentAbort");t.signal&&t.signal.addEventListener("abort",c,{once:!0});let d=Date.now();try{return await e.run(n.signal),{ok:!0,strategy:t.strategy,durationMs:Date.now()-d,approxTokensSpent:e.approxTokensSpent}}catch(l){return wt(l,{strategy:t.strategy,durationMs:Date.now()-d,approxTokensSpent:0,abortCause:i,providerName:t.providerName})}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",c)}}r(ce,"runVerifyCredential");function _o(t){return t.replace(/\bsk-[A-Za-z0-9_-]{6,}/g,"sk-***")}r(_o,"redactKeyMaterial");function wt(t,e){let n=t,o=n.status??n.statusCode??n.response?.status,i=_o(String(n.message??t)).slice(0,240),s=n.cause?.code??n.code,a=n.constructor?.name??"",c;return e.abortCause==="timeout"?c="timeout":e.abortCause==="parent"?c="unknown":a==="AuthenticationError"||a==="PermissionDeniedError"||o===401||o===403?c="unauthorized":o===429?c="rate_limited":o===400&&e.strategy==="count-tokens"&&e.providerName==="kimi-code"?c="unauthorized":o!==void 0&&o>=500&&o<600?c="server_error":s!==void 0&&/ENOTFOUND|ECONNREFUSED|ECONNRESET|EAI_AGAIN|EPIPE|ETIMEDOUT|ENETUNREACH|ENETDOWN|EHOSTUNREACH/i.test(s)?c="network":/timeout/i.test(i)?c="timeout":c="unknown",{ok:!1,error:c,status:o,message:i,durationMs:e.durationMs,approxTokensSpent:e.approxTokensSpent,strategy:e.strategy}}r(wt,"classifyVerifyError");function Mt(t,e){let n=t[t.length-1];if(n&&le(n)&&n.hint===e)return t;let o=e?{type:"cache-boundary",hint:e}:{type:"cache-boundary"};return[...t,o]}r(Mt,"insertCacheBoundary");function le(t){if(typeof t!="object"||t===null||t.type!=="cache-boundary")return!1;let e=Object.keys(t);return e.length<=2&&e.every(n=>n==="type"||n==="hint")}r(le,"isCacheBoundary");function Pt(t,e){let n=[];for(let o of t){if(le(o)){if(e==="attach"&&n.length>0){let i=n[n.length-1];n[n.length-1]={...i,cache_control:{type:"ephemeral"}}}continue}n.push(o)}return n}r(Pt,"lowerCacheBoundaries");function _e(t){return t.filter(e=>!le(e))}r(_e,"stripCacheBoundaries");import{readFile as Co}from"node:fs/promises";import xo from"node:path";var To={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function Be(t,e){return e??To[xo.extname(t).toLowerCase()]??"image/png"}r(Be,"resolveImageMediaType");async function Fe(t){return(await Co(t)).toString("base64")}r(Fe,"readImageFileAsBase64");async function kn(t,e){let n=Be(t,e),o=await Fe(t);return`data:${n};base64,${o}`}r(kn,"buildImageDataUrl");var wo="KodaX";function Mo(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":wo}}r(Mo,"getAnthropicCompatDefaultHeaders");function St(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,i=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+i+s:e?.inputTokens??0;if(![c,a].some(d=>!Number.isFinite(d)||d<0))return{inputTokens:c,outputTokens:a,totalTokens:c+a,cachedReadTokens:s||void 0,cachedWriteTokens:i||void 0}}r(St,"normalizeAnthropicUsage");var I=class extends G{static{r(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;_client;get client(){return this._client??=this.buildClient()}set client(e){this._client=e}buildClient(){let e=Mo(this.config);return new Eo({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this._client=void 0}async verifyCredential(e){let n=this.config.model,o=this.client,i=[{strategy:"count-tokens",approxTokensSpent:0,run:r(async s=>{await o.messages.countTokens({model:n,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")},{strategy:"models-list",approxTokensSpent:0,run:r(async s=>{await o.models.list({},{signal:s})},"run")},{strategy:"minimal-message",approxTokensSpent:7,run:r(async s=>{await o.messages.create({model:n,max_tokens:1,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")}];return ce({strategy:this.config.verifyStrategy??"count-tokens",runners:i,timeoutMs:e?.timeoutMs,signal:e?.signal,providerName:this.name})}applyCacheControlToSystem(e){if(!e.trim()||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=Mt([{type:"text",text:e}],"system");return Pt(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,i,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(i),d=s?.modelOverride??this.config.model,l=s?.maxOutputTokensOverride??this.getEffectiveMaxOutputTokens(d),u=await this.convertMessages(e,d),f=c.enabled?this.getReasoningCapability(d):"none",y=c.enabled?this.getReasoningFallbackChain(f).filter(h=>h==="native-budget"||h==="native-toggle"||h==="native-adaptive"||h==="none"):["none"],g=!!s?.forcedToolName,b=r(h=>{let M={model:d,max_tokens:l,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:u,tools:this.applyCacheControlToTools(n),stream:!0};if(s?.forcedToolName&&g&&(M.tool_choice={type:"tool",name:s.forcedToolName}),h==="native-budget"){let S=ie(this.config,c.depth,c.taskType);M.thinking={type:"enabled",budget_tokens:re(S,l)}}else h==="native-toggle"?M.thinking={type:"enabled"}:h==="native-adaptive"&&(M.thinking={type:"adaptive"});return M},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let p=[],v=[],k=[],x,_=null,m="",T="",P="",L="",N="",j="",B="",q=!1,w,D=Date.now(),V=Date.now(),Z,Se;for(let h of y){for(;!Z;)try{Z=await this.client.messages.create(b(h),a?{signal:a}:{}),h!==f&&this.persistReasoningCapabilityOverride(h,d)}catch(M){if(Se=M,g&&this.shouldFallbackForForcedToolChoiceError(M)){g=!1,this.logStreamDiagnostic(`[${this.name}] upstream rejected forced tool_choice; retrying without forced tool choice`);continue}let S=h==="native-budget"?["budget_tokens","thinking"]:h==="native-toggle"?["thinking"]:h==="native-adaptive"?["adaptive","thinking"]:[];if(!this.shouldFallbackForReasoningError(M,...S))throw M;break}if(Z)break}if(!Z)throw Se??new R("All reasoning capability attempts failed without a captured error",this.name);let ye=Date.now(),ve=0,E=0,F=3e4;for await(let h of Z){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let M=Date.now(),S=M-ye;if(S>F&&(ve++,E+=S,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(S/1e3)}s gap before ${h.type}`,{stallCount:ve,totalStallMs:E,eventType:h.type})),ye=M,h.type==="content_block_start"||h.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),h.type==="content_block_start"){D=Date.now();let C=h.content_block;_=C.type,process.env.KODAX_DEBUG_TOOL_STREAM&&C.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:C.type,id:C.id,name:C.name}),C.type==="thinking"?(T="",P=C.signature??""):C.type==="redacted_thinking"?(_="redacted_thinking",L=C.data??""):C.type==="text"?m="":C.type==="tool_use"&&(N=C.id,j=C.name,B="")}else if(h.type==="content_block_delta"){D=Date.now();let C=h.delta;C.type==="thinking_delta"?(T+=C.thinking??"",s?.onThinkingDelta?.(C.thinking??"")):C.type==="text_delta"?(m+=C.text??"",s?.onTextDelta?.(C.text??"")):C.type==="input_json_delta"&&(B+=C.partial_json??"",s?.onToolInputDelta?.(j,C.partial_json??"",N?{toolId:N}:void 0))}else if(h.type==="content_block_stop")D=Date.now(),_==="thinking"?T&&(k.push({type:"thinking",thinking:T,signature:P}),s?.onThinkingEnd?.(T)):_==="redacted_thinking"?(L&&k.push({type:"redacted_thinking",data:L}),L=""):_==="text"?m&&p.push({type:"text",text:m}):_==="tool_use"&&(!N||!j?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify(N),name:JSON.stringify(j),input:B.slice(0,100)}):v.push({type:"tool_use",id:N,name:j,input:ae(B)})),_=null;else if(h.type==="message_stop"){if(q=!0,D=Date.now(),process.env.KODAX_DEBUG_STREAM){let C=Date.now()-V;this.logStreamDiagnostic(`[Stream] message_stop received after ${C}ms`)}}else if(h.type==="message_delta"){D=Date.now(),x=St(h.usage,x);let C=h.delta;C?.stop_reason&&(w=C.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${w}`))}else h.type==="message_start"&&(D=Date.now(),x=St(h.message?.usage,x),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!q){let h=Date.now()-V,M=Date.now()-D;if(a?.aborted){let C=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before message_stop:",{duration:h,lastEventAge:M,reason:C,textBlocks:p.length,toolBlocks:v.length,thinkingBlocks:k.length}),new DOMException(C,"AbortError")}let S=new Error(`Stream incomplete: message_stop event not received. Duration: ${h}ms, Last event: ${M}ms ago. This may indicate a network disconnection or API timeout.`);throw S.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:h,lastEventAge:M,textBlocks:p.length,toolBlocks:v.length,thinkingBlocks:k.length}),S}return{textBlocks:p,toolBlocks:v,thinkingBlocks:k,usage:x,stopReason:w}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,i,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(i),d=s?.modelOverride??this.config.model,l=s?.maxOutputTokensOverride??this.getEffectiveMaxOutputTokens(d),u=await this.convertMessages(e,d),f=c.enabled?this.getReasoningCapability(d):"none",y=c.enabled?this.getReasoningFallbackChain(f).filter(m=>m==="native-budget"||m==="native-toggle"||m==="native-adaptive"||m==="none"):["none"],g=!!s?.forcedToolName,b=r(m=>{let T={model:d,max_tokens:l,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:u,tools:this.applyCacheControlToTools(n)};if(s?.forcedToolName&&g&&(T.tool_choice={type:"tool",name:s.forcedToolName}),m==="native-budget"){let P=ie(this.config,c.depth,c.taskType);T.thinking={type:"enabled",budget_tokens:re(P,l)}}else m==="native-toggle"?T.thinking={type:"enabled"}:m==="native-adaptive"&&(T.thinking={type:"adaptive"});return T},"buildRequest"),p,v;for(let m of y){for(;!p;)try{p=await this.client.messages.create(b(m),a?{signal:a}:{}),m!==f&&this.persistReasoningCapabilityOverride(m,d)}catch(T){if(v=T,g&&this.shouldFallbackForForcedToolChoiceError(T)){g=!1,this.logStreamDiagnostic(`[${this.name}] upstream rejected forced tool_choice; retrying without forced tool choice`);continue}let P=m==="native-budget"?["budget_tokens","thinking"]:m==="native-toggle"?["thinking"]:m==="native-adaptive"?["adaptive","thinking"]:[];if(!this.shouldFallbackForReasoningError(T,...P))throw T;break}if(p)break}if(!p)throw v??new R("All reasoning capability attempts failed without a captured error",this.name);let k=[],x=[],_=[];for(let m of p.content)m.type==="text"?(k.push({type:"text",text:m.text}),s?.onTextDelta?.(m.text)):m.type==="thinking"?(_.push({type:"thinking",thinking:m.thinking,signature:m.signature??""}),s?.onThinkingDelta?.(m.thinking),s?.onThinkingEnd?.(m.thinking)):m.type==="redacted_thinking"?_.push({type:"redacted_thinking",data:m.data}):m.type==="tool_use"&&x.push({type:"tool_use",id:m.id,name:m.name,input:typeof m.input=="object"&&m.input!==null?m.input:{}});return{textBlocks:k,toolBlocks:x,thinkingBlocks:_,usage:St(p.usage),stopReason:p.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(le(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(i=>i.role==="system").map(i=>this.serializeSystemMessageContent(i.content)).filter(Boolean);return[e,...o].filter(i=>typeof i=="string"&&i.trim().length>0).join(`
4
-
5
- `)}async convertMessages(e,n){let o=[],i=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=[],d=[];for(let u of s.content)u.type==="thinking"?!i||typeof u.signature=="string"&&u.signature.length>0?c.push({type:"thinking",thinking:u.thinking,signature:u.signature??""}):u.thinking&&d.push(u.thinking):u.type==="redacted_thinking"&&(i||c.push({type:"redacted_thinking",data:u.data}));d.length>0&&s.role==="assistant"&&c.push({type:"text",text:`<prior_reasoning>
6
- ${d.join(`
7
-
8
- `)}
9
- </prior_reasoning>`});for(let u of s.content)if(u.type==="tool_result"&&s.role==="user"){let f;if(typeof u.content=="string")f=u.content;else{let y=[];for(let g of u.content)g.type==="text"?y.push({type:"text",text:g.text}):g.type==="image"&&y.push({type:"image",source:{type:"base64",media_type:Be(g.path,g.mediaType),data:await Fe(g.path)}});f=y}c.push({type:"tool_result",tool_use_id:u.tool_use_id,content:f,...u.is_error===!0?{is_error:!0}:{}})}for(let u of s.content)u.type==="tool_use"&&s.role==="assistant"&&c.push({type:"tool_use",id:u.id,name:u.name,input:u.input});for(let u of s.content)u.type==="text"?c.push({type:"text",text:u.text}):u.type==="image"&&s.role==="user"&&c.push({type:"image",source:{type:"base64",media_type:Be(u.path,u.mediaType),data:await Fe(u.path)}});if(a==="assistant"&&this.config.supportsThinking&&!i){let u=c.some(y=>y.type==="tool_use"),f=c.some(y=>y.type==="thinking"||y.type==="redacted_thinking");u&&!f&&c.unshift({type:"thinking",thinking:"...",signature:""})}let l=c.length===0||a==="assistant"&&c.every(u=>{let f=u;return f.type==="thinking"&&!f.thinking||f.type==="text"&&!f.text});o.push({role:s.role,content:l?[{type:"text",text:"..."}]:c})}return o}};import Po from"openai";var So="KodaX";function Ro(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":So}}r(Ro,"getOpenAICompatDefaultHeaders");function bn(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 i=typeof t.prompt_tokens_details?.cached_tokens=="number"&&t.prompt_tokens_details.cached_tokens>=0?t.prompt_tokens_details.cached_tokens:typeof t.prompt_cache_hit_tokens=="number"&&t.prompt_cache_hit_tokens>=0?t.prompt_cache_hit_tokens:void 0;return{inputTokens:e,outputTokens:n,totalTokens:o,...i!==void 0?{cachedReadTokens:i}:{}}}r(bn,"normalizeOpenAIUsage");function Ao(t){return t?t.type==="function"&&"function"in t:!1}r(Ao,"isOpenAIFunctionToolCall");function Oo(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(""):""}r(Oo,"extractOpenAIMessageText");function Do(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(""):""}r(Do,"extractOpenAIMessageReasoning");function Ke(t){let e=t.role;return typeof e=="string"?e:void 0}r(Ke,"getWireRole");function Io(t){if(Ke(t)!=="assistant")return;let e=t.tool_calls;if(Array.isArray(e))return e.flatMap(n=>{if(!n||typeof n!="object")return[];let o=n.id;return typeof o=="string"&&o.trim().length>0?[{id:o,value:n}]:[]})}r(Io,"getAssistantWireToolCalls");function No(t){if(Ke(t)!=="tool")return;let e=t.tool_call_id;return typeof e=="string"&&e.trim().length>0?e:void 0}r(No,"getToolWireCallId");function Lo(t,e){let n={...t};return e.length>0?(n.tool_calls=e.map(o=>o.value),n):(delete n.tool_calls,(n.content==null||n.content==="")&&(n.content="..."),n)}r(Lo,"rewriteAssistantWireToolCalls");var K=class extends G{static{r(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;_client;get client(){return this._client??=this.buildClient()}set client(e){this._client=e}buildClient(){let e=Ro(this.config);return new Po({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this._client=void 0}async verifyCredential(e){let n=this.config.model,o=this.client,i=[{strategy:"models-list",approxTokensSpent:0,run:r(async s=>{await o.models.list({signal:s})},"run")},{strategy:"minimal-message",approxTokensSpent:6,run:r(async s=>{await o.chat.completions.create({model:n,max_tokens:1,messages:[{role:"user",content:"hi"}]},{signal:s})},"run")}];return ce({strategy:this.config.verifyStrategy??"models-list",runners:i,timeoutMs:e?.timeoutMs,signal:e?.signal,providerName:this.name})}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=_e(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 i=[];for(let s of n){if(s.role!=="system"){i.push(s);continue}let a=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.filter(c=>typeof c=="object"&&c!==null&&c.type==="text"&&typeof c.text=="string").map(c=>c.text).join(`
10
- `):"";a.trim().length>0&&o.push(a)}return{system:o.join(`
11
-
12
- `),rest:i}}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 i=e,s=this.getEffectiveMaxOutputTokens(e.model),a=re(ie(this.config,o.depth,o.taskType),s);switch(n){case"native-effort":{let c=yt(o.depth);c&&(i.reasoning_effort=c);break}case"native-budget":{this.name==="qwen"?this.appendExtraBody(i,{enable_thinking:!0,thinking_budget:a}):this.name==="zhipu"&&(i.thinking={type:"enabled",budget_tokens:a});break}case"native-toggle":{this.name==="qwen"?this.appendExtraBody(i,{enable_thinking:!0}):this.name==="zhipu"&&(i.thinking={type:"enabled"});break}default:break}}getFallbackTerms(e){switch(e){case"native-budget":return["thinking_budget","budget_tokens","thinking"];case"native-effort":return["reasoning_effort"];case"native-toggle":return["enable_thinking","thinking"];default:return[]}}async stream(e,n,o,i,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:d,rest:l}=this.normalizeSystemForWire(o,c),u=s?.modelOverride??this.config.model,f=[{role:"system",content:d},...await this.convertMessages(l,u)],y=n.map(E=>({type:"function",function:{name:E.name,description:E.description,parameters:E.input_schema}})),g=s?.forcedToolName,b=!!g;if(a?.aborted)throw new DOMException("Request aborted","AbortError");let p=new Map,v="",k="",x,_=!0,m=null,T=Date.now(),P=this.normalizeReasoning(i),L=oe(P)?this.getReasoningCapability(u):"none",N=oe(P)?this.getReasoningFallbackChain(L).filter(E=>E==="native-budget"||E==="native-effort"||E==="native-toggle"||E==="none"):["none"],j={model:u,messages:f,tools:y,max_completion_tokens:s?.maxOutputTokensOverride??this.getEffectiveMaxOutputTokens(u),stream:!0};g&&b&&(j.tool_choice={type:"function",function:{name:g}});let B,q;for(let E of N){for(;!B;){let F={...j};_&&(F.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(F),this.applyReasoningCapability(F,E,P);try{B=await this.client.chat.completions.create(F,a?{signal:a}:{}),E!==L&&this.persistReasoningCapabilityOverride(E,u)}catch(h){if(q=h,b&&this.shouldFallbackForForcedToolChoiceError(h)){b=!1,delete j.tool_choice,this.logStreamDiagnostic(`[${this.name}] upstream rejected forced tool_choice; retrying without forced tool choice`);continue}if(_&&this.shouldFallbackForSpecificReasoningError(h,"stream_options","include_usage")){_=!1;continue}if(!this.shouldFallbackForReasoningError(h,...this.getFallbackTerms(E)))throw h;break}}if(B)break}if(!B)throw q??new R("All reasoning capability attempts failed without a captured error",this.name);let w=Date.now(),D=0,V=0,Z=3e4;for await(let E of B){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let F=Date.now(),h=F-w;h>Z&&(D++,V+=h,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(h/1e3)}s gap`,{stallCount:D,totalStallMs:V})),w=F,s?.onHeartbeat?.(),x=bn(E.usage)??x;let M=E.choices[0],S=M?.delta;if(M?.finish_reason&&(m=M.finish_reason,process.env.KODAX_DEBUG_STREAM)){let W=Date.now()-T;this.logStreamDiagnostic(`[Stream] finish_reason: ${m} after ${W}ms`)}S?.content&&(v+=S.content,s?.onTextDelta?.(S.content));let C=this.extractReasoningDelta(S);if(C&&(k+=C,s?.onThinkingDelta?.(C)),S?.tool_calls)for(let W of S.tool_calls){let ee=p.get(W.index)??{id:"",name:"",arguments:""};W.id&&(ee.id=W.id),W.function?.name&&(ee.name=W.function.name),W.function?.arguments&&(ee.arguments+=W.function.arguments,s?.onToolInputDelta?.(ee.name,W.function.arguments,ee.id?{toolId:ee.id}:void 0)),p.set(W.index,ee)}}if(!m){let E=Date.now()-T;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 finish_reason:",{duration:E,reason:h,textContentLength:v.length,toolCallsCount:p.size}),new DOMException(h,"AbortError")}let F=new Error(`Stream incomplete: finish_reason not received. Duration: ${E}ms. This may indicate a network disconnection or API timeout.`);throw F.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:E,textContentLength:v.length,toolCallsCount:p.size}),F}let Se=v?[{type:"text",text:v}]:[],ye=[],ve=[];k&&(ve.push({type:"thinking",thinking:k}),s?.onThinkingEnd?.(k));for(let[,E]of p)E.id&&E.name&&ye.push({type:"tool_use",id:E.id,name:E.name,input:ae(E.arguments)});return{textBlocks:Se,toolBlocks:ye,thinkingBlocks:ve,usage:x,stopReason:m??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,i,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:d,rest:l}=this.normalizeSystemForWire(o,c),u=s?.modelOverride??this.config.model,f=[{role:"system",content:d},...await this.convertMessages(l,u)],y=n.map(w=>({type:"function",function:{name:w.name,description:w.description,parameters:w.input_schema}})),g=s?.forcedToolName,b=!!g,p=this.normalizeReasoning(i),v=oe(p)?this.getReasoningCapability(u):"none",k=oe(p)?this.getReasoningFallbackChain(v).filter(w=>w==="native-budget"||w==="native-effort"||w==="native-toggle"||w==="none"):["none"],x={model:u,messages:f,tools:y,max_completion_tokens:s?.maxOutputTokensOverride??this.getEffectiveMaxOutputTokens(u)};g&&b&&(x.tool_choice={type:"function",function:{name:g}});let _,m;for(let w of k){for(;!_;){let D={...x};this.resetReasoningCapabilityParams(D),this.applyReasoningCapability(D,w,p);try{_=await this.client.chat.completions.create(D,a?{signal:a}:{}),w!==v&&this.persistReasoningCapabilityOverride(w,u)}catch(V){if(m=V,b&&this.shouldFallbackForForcedToolChoiceError(V)){b=!1,delete x.tool_choice,this.logStreamDiagnostic(`[${this.name}] upstream rejected forced tool_choice; retrying without forced tool choice`);continue}if(!this.shouldFallbackForReasoningError(V,...this.getFallbackTerms(w)))throw V;break}}if(_)break}if(!_)throw m??new R("All reasoning capability attempts failed without a captured error",this.name);let T=_.choices[0],P=T?.message,L=Oo(P?.content),N=Do(P),j=(P?.tool_calls??[]).filter(Ao).map(w=>({type:"tool_use",id:w.id,name:w.function.name,input:ae(w.function.arguments)}));L&&s?.onTextDelta?.(L);let B=L?[{type:"text",text:L}]:[],q=[];return N&&(q.push({type:"thinking",thinking:N}),s?.onThinkingDelta?.(N),s?.onThinkingEnd?.(N)),{textBlocks:B,toolBlocks:j,thinkingBlocks:q,usage:bn(_.usage),stopReason:T?.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(l=>l.type==="text").map(l=>l.text).join(`
13
- `),i=e.filter(l=>l.type==="tool_use").map(l=>({id:l.id,type:"function",function:{name:l.name,arguments:JSON.stringify(l.input??{})}})),s=e.filter(l=>l.type==="thinking"||l.type==="redacted_thinking").map(l=>l.type==="thinking"?l.thinking:"").filter(Boolean).join(`
14
-
15
- `),a=e.some(l=>l.type==="thinking"||l.type==="redacted_thinking");if(!o&&i.length===0&&!a)return[];let c;o?c=o:i.length>0?c=null:c="...";let d={role:"assistant",content:c};return i.length>0&&(d.tool_calls=i),this.getEffectiveReplayReasoningContent(n)&&(d.reasoning_content=s||""),[d]}async serializeUserMessage(e){let n=[],o=e.filter(a=>a.type==="text").map(a=>a.text).join(`
16
- `),i=e.filter(a=>a.type==="image");for(let a of e)if(a.type==="tool_result"){let c;typeof a.content=="string"?c=a.content:c=a.content.map(d=>d.type==="text"?d.text:`[Image at ${d.path}${d.mediaType?` (${d.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(i.length===0)return o&&n.push({role:"user",content:o}),n;let s=[];o&&s.push({type:"text",text:o});for(let a of i)s.push({type:"image_url",image_url:{url:await kn(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 i of e){if(i.role==="system"){o.push(...this.serializeSystemMessage(i.content));continue}if(typeof i.content=="string"){o.push({role:i.role,content:i.content});continue}if(i.role==="assistant"){o.push(...this.serializeAssistantMessage(i.content,n));continue}o.push(...await this.serializeUserMessage(i.content))}return this.repairToolCallHistory(o)}repairToolCallHistory(e){let n=[],o=0;for(;o<e.length;){let i=e[o],s=Io(i);if(s===void 0){Ke(i)!=="tool"&&n.push(i),o+=1;continue}let a=new Set(s.map(y=>y.id)),c=new Set,d=[],l=o+1;for(;l<e.length&&Ke(e[l])==="tool";){let y=e[l],g=No(y);g!==void 0&&a.has(g)&&!c.has(g)&&(c.add(g),d.push(y)),l+=1}let u=s.filter(y=>c.has(y.id)),f=u.length===s.length&&s.length>0?i:Lo(i,u);n.push(f),u.length>0&&n.push(...d),o=l}return n}};import{spawn as Uo}from"node:child_process";import{Readable as jo,Writable as Wo}from"node:stream";import Ue from"node:process";import{ClientSideConnection as Xo,PROTOCOL_VERSION as zo,ndJsonStream as Vo}from"@agentclientprotocol/sdk";import{spawn as Bo,spawnSync as wn}from"node:child_process";var Ot=2e3,z=2e3;function At(t){return t.exitCode!==null||t.signalCode!==null}r(At,"isExited");function Ce(t,e){return At(t)?Promise.resolve(!0):new Promise(n=>{let o=!1,i=r(c=>{o||(o=!0,clearTimeout(a),t.off("exit",s),t.off("error",s),n(c))},"finish"),s=r(()=>i(!0),"onExit"),a=setTimeout(()=>i(!1),e);a.unref?.(),t.once("exit",s),t.once("error",s)})}r(Ce,"waitForExit");function _n(t){return new Promise(e=>{let n=Bo("taskkill",["/pid",String(t),"/t","/f"],{stdio:"ignore",windowsHide:!0}),o=!1,i=r(()=>{o||(o=!0,clearTimeout(s),e())},"finish"),s=setTimeout(()=>{try{n.kill()}catch{}i()},Ot);s.unref?.(),n.once("exit",i),n.once("error",i)})}r(_n,"runTaskkill");function Cn(t,e){let n=!1;try{process.kill(-t,e),n=!0}catch{}try{process.kill(t,e),n=!0}catch{}return n}r(Cn,"signalPosixPidTree");function H(t){try{return process.kill(t,0),!0}catch(e){return e.code!=="ESRCH"}}r(H,"signalTargetExists");function xn(t){return H(-t)||H(t)}r(xn,"isPosixPidTreeAlive");async function Tn(t,e){let n=Date.now()+e;for(;Date.now()<n;){if(!xn(t))return!0;await new Promise(o=>setTimeout(o,50))}return!xn(t)}r(Tn,"waitForPosixPidTreeExit");async function Fo(t,e){let n=Date.now()+e;for(;Date.now()<n;){if(!H(t))return!0;await new Promise(o=>setTimeout(o,50))}return!H(t)}r(Fo,"waitForWindowsPidExit");async function Rt(t,e){let n=[...new Set(t.filter(i=>Number.isFinite(i)&&i>0))];if(n.length===0)return!0;let o=Date.now()+e;for(;Date.now()<o;){if(n.every(i=>!H(i)))return!0;await new Promise(i=>setTimeout(i,50))}return n.every(i=>!H(i))}r(Rt,"waitForWindowsPidsExit");function En(t){let e=t.trim();if(!e)return[];try{let n=JSON.parse(e);return(Array.isArray(n)?n:[n]).map(i=>Number(i)).filter(i=>Number.isFinite(i)&&i>0)}catch{return[]}}r(En,"readWindowsPidListJson");function Ko(t){let e=wn("wmic",["process","where",`ParentProcessId=${t}`,"get","ProcessId","/format:list"],{encoding:"utf8",timeout:Ot,windowsHide:!0});if(e.error||e.status!==0)return[];let n=[],o=/ProcessId=(\d+)/g,i;for(;(i=o.exec(e.stdout))!==null;){let s=Number(i[1]);Number.isFinite(s)&&s>0&&s!==t&&n.push(s)}return n}r(Ko,"getWindowsChildPidsViaWmic");function $o(t){let e=[`$children = Get-CimInstance Win32_Process -Filter "ParentProcessId = ${t}"`,"if ($null -eq $children) { exit 0 }","$children | Select-Object -ExpandProperty ProcessId | ConvertTo-Json -Compress"].join("; "),n=wn("powershell.exe",["-NoProfile","-NonInteractive","-Command",e],{encoding:"utf8",timeout:Ot,windowsHide:!0});if(!n.error&&n.status===0){let i=En(n.stdout);if(i.length>0)return i}let o=En(n.stdout);return o.length>0?o:Ko(t)}r($o,"getWindowsChildPids");function Mn(t,e=new Set){let n=[];for(let o of $o(t))e.has(o)||(e.add(o),n.push(o),n.push(...Mn(o,e)));return n}r(Mn,"collectWindowsDescendantPids");async function $e(t,e){try{process.kill(t,e)}catch{return!H(t)}return Fo(t,z)}r($e,"killWindowsPid");async function xe(t){if(process.platform==="win32"&&t.pid!==void 0){let e=Mn(t.pid),n=[...e].reverse(),o=[t.pid,...e];At(t)||await _n(t.pid);for(let i of n)H(i)&&await _n(i);if(await Rt(o,z)){await Ce(t,z);return}for(let i of n)H(i)&&await $e(i,"SIGTERM");if(await $e(t.pid,"SIGTERM"),await Rt(o,z)){await Ce(t,z);return}for(let i of n)H(i)&&await $e(i,"SIGKILL");await $e(t.pid,"SIGKILL"),await Rt(o,z),await Ce(t,z);return}if(t.pid!==void 0&&process.platform!=="win32"){if(!Cn(t.pid,"SIGTERM")||await Tn(t.pid,z))return;Cn(t.pid,"SIGKILL"),await Tn(t.pid,z);return}if(!At(t)){try{t.kill("SIGTERM")}catch{return}if(!await Ce(t,z)){try{t.kill("SIGKILL")}catch{}await Ce(t,z)}}}r(xe,"killChildProcessTree");var je=class{static{r(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=Ue.platform==="win32"&&!this.options.command.endsWith(".cmd")?`${this.options.command}.cmd`:this.options.command;if(this.agentProcess=Uo(s,this.options.args??[],{cwd:this.options.cwd??Ue.cwd(),stdio:["pipe","pipe","inherit"],detached:Ue.platform!=="win32"}),!this.agentProcess.stdin||!this.agentProcess.stdout)throw new Error("Failed to create ACP stdio pipes");n=Wo.toWeb(this.agentProcess.stdin),e=jo.toWeb(this.agentProcess.stdout)}else throw new Error("AcpClient requires either a command or I/O streams");let o=Vo(n,e);this.client=new Xo(()=>({sessionUpdate:r(async i=>{this.options.onSessionUpdate?.(i)},"sessionUpdate"),requestPermission:r(async i=>{let s=i.options??[],a=s.find(c=>c.kind==="allow_once"||c.kind==="allow_always")??s[0];return a?{outcome:{outcome:"selected",optionId:a.optionId}}:{outcome:{outcome:"cancelled"}}},"requestPermission")}),o),await this.client.initialize({protocolVersion:zo,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??Ue.cwd(),mcpServers:[]})).sessionId}async prompt(e,n,o,i){if(!this.client)throw new Error("Client not connected");let s={sessionId:n,prompt:[{type:"text",text:e}]};i?.model&&(s.model=i.model);let a=this.client.prompt(s);if(o){let c=r(()=>{this.client?.cancel({sessionId:n}).catch(()=>{})},"onAbort");o.addEventListener("abort",c),a=a.finally(()=>{o.removeEventListener("abort",c)})}return await a}disconnect(){this.agentProcess&&xe(this.agentProcess),this.options.abort?.();try{this.client?.close?.()}catch{}this.client=null,this.agentProcess=null}};function Go(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,i=typeof e.totalTokens=="number"?e.totalTokens:n+o;if(![n,o,i].some(s=>!Number.isFinite(s)||s<0)&&!(i<n||i<o))return{inputTokens:n,outputTokens:o,totalTokens:i,cachedReadTokens:typeof e.cachedReadTokens=="number"?e.cachedReadTokens:void 0,cachedWriteTokens:typeof e.cachedWriteTokens=="number"?e.cachedWriteTokens:void 0,thoughtTokens:typeof e.thoughtTokens=="number"?e.thoughtTokens:void 0}}r(Go,"normalizeAcpUsage");var ue=class extends G{static{r(this,"KodaXAcpProvider")}_client=null;_sessionMap=new Map;_activeStreams=new Map;isConfigured(){return!0}async verifyCredential(){return{ok:!1,error:"unsupported",strategy:"unsupported",durationMs:0,approxTokensSpent:0,message:`CLI-bridge provider "${this.name}" manages credentials in its CLI binary's token store; not verifiable from the KodaX SDK`}}getCapabilityProfile(){return X(be)}serializeImageBlockToPromptToken(e){return null}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=_e(n.content);return o.length===n.content.length?n:{...n,content:o}})}async stream(e,n,o,i,s,a){if(e=this.stripCacheBoundariesFromMessages(e),this.acpClientOptions.executor&&typeof this.acpClientOptions.executor.isInstalled=="function"&&!await this.acpClientOptions.executor.isInstalled())throw new Error(`${this.name} requires a local CLI environment, but the CLI was not found or is not configured correctly.`);let c=[],d=[],l=e[e.length-1],u="";if(l&&typeof l.content=="string")u=l.content;else if(l&&Array.isArray(l.content)){let v=[];for(let k of l.content)if(k.type==="text")v.push(k.text);else if(k.type==="image"){let x=this.serializeImageBlockToPromptToken(k);x&&v.push(x)}u=v.join(`
19
- `)}let f={...this.acpClientOptions,onSessionUpdate:r(v=>{let k=v.update,x=v.sessionId;if(!("sessionUpdate"in k))return;let _=x?this._activeStreams.get(x):void 0;if(_)switch(k.sessionUpdate){case"agent_message_chunk":if(k.content?.type==="text"){let m=k.content.text;_.output.text+=m,_.streamOptions?.onTextDelta?.(m)}break;case"tool_call":{let m="{}",T=k.arguments??k.parameters;T&&(m=typeof T=="string"?T:JSON.stringify(T)),_.streamOptions?.onToolInputDelta?.(k.title,m);let P=`
20
- > [Tool Use] ${k.title}: ${m}
21
- `;_.output.text+=P,_.streamOptions?.onTextDelta?.(P);break}case"tool_call_update":if(k.status){let m=`> [Tool Result] ${k.status}
22
-
23
- `;_.output.text+=m,_.streamOptions?.onTextDelta?.(m)}break}},"onSessionUpdate")},y=s?.sessionId??"default";this._client||(this._client=new je(f),await this._client.connect());let g=this._sessionMap.get(y);g||(g=await this._client.createNewSession(),this._sessionMap.set(y,g));let b={text:""};this._activeStreams.set(g,{streamOptions:s,output:b});let p;try{p=await this._client.prompt(u,g,a,{model:s?.modelOverride})}catch(v){if(!(v instanceof Error&&v.name==="AbortError"))throw v}finally{this._activeStreams.delete(g)}return b.text&&c.push({type:"text",text:b.text}),{textBlocks:c,toolBlocks:d,thinkingBlocks:[],usage:Go(p?.usage)}}disconnect(){this._client&&(this._client.disconnect(),this._client=null),this._activeStreams.clear(),this._sessionMap.clear()}};import{spawn as Ho}from"node:child_process";import We from"node:process";var de=class{static{r(this,"CLIExecutor")}config;_installedCache=null;constructor(e){this.config=e}async isInstalled(){return this._installedCache!==null?this._installedCache:(this._installedCache=await this.checkInstalled(),this._installedCache)}async*execute(e){let n=this.buildArgs(e),o={...We.env,...this.config.env},s=We.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=Ho(s,n,{cwd:this.config.cwd??We.cwd(),env:o,stdio:["ignore","pipe","pipe"],detached:We.platform!=="win32"}),c="";a.stderr?.on("data",u=>{c+=u.toString()});let d=!1,l=r(()=>{d||xe(a)},"abortHandler");e.signal?.addEventListener("abort",l),a.on("exit",()=>{d=!0});try{yield*this.parseOutputStream(a.stdout,e.signal),c.trim()&&console.error(`[CLIExecutor] stderr: ${c.trim()}`)}finally{e.signal?.removeEventListener("abort",l),d||await xe(a)}}async*parseOutputStream(e,n){let o="";for await(let i of e){if(n?.aborted)break;o+=i.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 i=this.parseLine(o.trim());i&&(yield i)}}};import{spawn as Jo}from"node:child_process";import Yo from"node:process";async function Xe(t){try{let e=Yo.platform==="win32",n=Jo(e?`${t}.cmd`:t,["--version"]);return await new Promise(o=>{n.on("close",i=>o(i===0)),n.on("error",()=>o(!1))})}catch{return!1}}r(Xe,"checkCliCommandInstalled");var ze=class extends de{static{r(this,"GeminiCLIExecutor")}model;constructor(e){super({command:"gemini",baseArgs:["--output-format","stream-json","--approval-mode","yolo"],timeout:3e5,...e}),this.model=e?.model??"gemini-2.5-pro"}async checkInstalled(){return Xe("gemini")}buildArgs(e){let 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 Pn}from"node:stream/web";import{randomUUID as Dt}from"node:crypto";function Ve(t){let e=new Pn,n=new Pn,o=e.readable.getReader(),i=n.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,c="",d=Dt(),l=new AbortController,u=new Map;(async()=>{try{for(;;){let{done:p,value:v}=await o.read();if(p)break;c+=s.decode(v,{stream:!0});let k=c.split(`
25
- `);c=k.pop()??"";for(let x of k)if(x.trim())try{let _=JSON.parse(x);y(_).catch(m=>{console.error("[PseudoAcpServer] Failed to handle request:",m)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",x)}}}catch(p){console.error("[PseudoAcpServer] Stream read error:",p)}})();let f=r(async p=>{let v=JSON.stringify(p)+`
26
- `;await i.write(a.encode(v))},"sendMsg");async function y(p){if(p.method==="initialize")await f({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")d=p.params?.sessionId??Dt(),await f({jsonrpc:"2.0",id:p.id,result:{sessionId:d}});else if(p.method==="session/prompt"||p.method==="chat/prompt"){let v=new AbortController,k=p.params.sessionId;u.set(k,v);let x=r(()=>v.abort(),"onGlobalAbort");l.signal.addEventListener("abort",x);let m=await g(k,p.params.prompt,typeof p.params.model=="string"?p.params.model:void 0,v.signal).finally(()=>{u.delete(k),l.signal.removeEventListener("abort",x)});await f({jsonrpc:"2.0",id:p.id,result:m.usage?{stopReason:m.stopReason,usage:m.usage}:{stopReason:m.stopReason}})}else if(p.method==="session/cancel"||p.method==="chat/cancel"){let v=u.get(p.params.sessionId);v&&v.abort(),p.id!==void 0&&await f({jsonrpc:"2.0",id:p.id,result:{}})}else p.id!==void 0&&await f({jsonrpc:"2.0",id:p.id,result:{}})}r(y,"handleRequest");let g=r(async(p,v,k,x)=>{let _=v.find(m=>m.type==="text")?.text??"";try{let m=t.execute({prompt:_,model:k,sessionId:p==="default"?void 0:p,signal:x});for await(let T of m){let P=b(T);if(P&&await f({jsonrpc:"2.0",method:"session/update",params:{sessionId:p,update:P}}),T.type==="complete")return{stopReason:x.aborted?"cancelled":"end_turn",usage:T.usage}}return{stopReason:x.aborted?"cancelled":"end_turn"}}catch(m){return x.aborted||m instanceof Error&&m.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",m),await f({jsonrpc:"2.0",method:"session/update",params:{sessionId:p,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
27
- [Fatal Error: ${m}]
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
- [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.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
- `)}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};
@@ -1,5 +0,0 @@
1
- // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{a as r}from"./chunk-V4WSBIXB.js";var N="\x1B[?2004h",j="\x1B[?2004l",b=!1,f=!1;function C(){if(!f)try{process.stdout.write(N),f=!0}catch{}}r(C,"enableBracketedPasteMode");function T(){if(f)try{process.stdout.write(j)}catch{}finally{f=!1}}r(T,"disableBracketedPasteMode");function L(){return f}r(L,"isBracketedPasteModeEnabled");function O(){if(b)return;b=!0;let e=r(()=>T(),"handler");process.once("beforeExit",e),process.once("exit",e),process.once("SIGINT",()=>{e(),process.kill(process.pid,"SIGINT")}),process.once("SIGTERM",()=>{e(),process.kill(process.pid,"SIGTERM")}),process.once("uncaughtException",t=>{throw e(),t})}r(O,"installBracketedPasteShutdownGuard");import{readFile as ae}from"node:fs/promises";import{spawn as E}from"node:child_process";import{mkdtemp as F,readFile as I,rm as z}from"node:fs/promises";import{tmpdir as W}from"node:os";import k from"node:path";var P=5e3;async function p(){switch(process.platform){case"darwin":return X();case"win32":return q();case"linux":return J();default:return null}}r(p,"readClipboardImage");async function _(e){let t=await F(k.join(W(),"kodax-clip-")),a=k.join(t,"clip.png");try{return await e(a)}finally{await z(t,{recursive:!0,force:!0}).catch(()=>{})}}r(_,"runWithTempPng");async function X(){return _(async e=>{let t=`set png_data to (the clipboard as \xABclass PNGf\xBB)
3
- set fh to open for access POSIX file "${e.replace(/"/g,'\\"')}" with write permission
4
- write png_data to fh
5
- close access fh`;if(!await M("osascript",["-e",t]))return null;try{let n=await I(e);return n.length>0?n:null}catch{return null}})}r(X,"readMacClipboard");async function q(){return _(async e=>{let t=["Add-Type -AssemblyName System.Drawing | Out-Null","$img = Get-Clipboard -Format Image","if ($null -eq $img) { exit 1 }",`$img.Save('${e.replace(/'/g,"''")}', [System.Drawing.Imaging.ImageFormat]::Png)`].join("; ");if(!await M("powershell",["-NoProfile","-Command",t]))return null;try{let n=await I(e);return n.length>0?n:null}catch{return null}})}r(q,"readWinClipboard");async function J(){let e=await Y();return e||Z()}r(J,"readLinuxClipboard");async function Y(){return S("wl-paste",["--type","image/png"])}r(Y,"readLinuxWaylandClipboard");async function Z(){return S("xclip",["-selection","clipboard","-t","image/png","-o"])}r(Z,"readLinuxX11Clipboard");function M(e,t){return new Promise(a=>{let n=!1,i=E(e,t,{stdio:"ignore"}),o=setTimeout(()=>{if(!n){n=!0;try{i.kill()}catch{}a(!1)}},P);i.once("error",()=>{n||(n=!0,clearTimeout(o),a(!1))}),i.once("exit",s=>{n||(n=!0,clearTimeout(o),a(s===0))})})}r(M,"runCommand");function S(e,t){return new Promise(a=>{let n=!1,i=[],o;try{o=E(e,t,{stdio:["ignore","pipe","ignore"]})}catch{a(null);return}let s=setTimeout(()=>{if(!n){n=!0;try{o.kill()}catch{}a(null)}},P);o.stdout?.on("data",l=>i.push(l)),o.once("error",()=>{n||(n=!0,clearTimeout(s),a(null))}),o.once("exit",l=>{if(n)return;if(n=!0,clearTimeout(s),l!==0){a(null);return}let c=Buffer.concat(i);a(c.length>0?c:null)})})}r(S,"collectStdoutBytes");import{Jimp as H}from"jimp";var g=2e3,d=Math.floor(3.75*1024*1024),u=class extends Error{static{r(this,"ImageResizeError")}constructor(t){super(t),this.name="ImageResizeError"}},U=[80,60,40];async function h(e){if(e.length===0)throw new u("Empty image buffer.");let t;try{t=await H.read(e)}catch(c){let m=c instanceof Error?c.message:String(c);throw new u(`Failed to decode image: ${m}`)}let{width:a,height:n}=t.bitmap,i=Math.max(a,n);if(i>g){let c=g/i;t.resize({w:Math.max(1,Math.round(a*c)),h:Math.max(1,Math.round(n*c))})}let o=t.bitmap.width,s=t.bitmap.height,l=await t.getBuffer("image/png");if(l.length<=d)return{buffer:Buffer.from(l),mediaType:"image/png",width:o,height:s};for(let c of U){let m=await t.getBuffer("image/jpeg",{quality:c});if(m.length<=d)return{buffer:Buffer.from(m),mediaType:"image/jpeg",width:o,height:s}}throw new u(`Image still exceeds budget (${d} bytes raw) after PNG and JPEG q40 compression. Try a smaller image or take a fresh screenshot of a smaller region.`)}r(h,"normalizePastedImage");import{mkdir as V,readdir as K,stat as Q,unlink as v,writeFile as ee}from"node:fs/promises";import{tmpdir as te}from"node:os";import w from"node:path";import{createHash as re}from"node:crypto";var B="KODAX_PASTE_TMP_DIR",A=1440*60*1e3;function D(){return process.env[B]??w.join(te(),"kodax-paste")}r(D,"resolvePasteTmpDir");async function x(e){let t=D();await V(t,{recursive:!0});let a=e.mediaType==="image/jpeg"?".jpg":".png",i=`paste-${re("sha256").update(e.buffer).digest("hex").slice(0,16)}${a}`,o=w.join(t,i);return await ee(o,e.buffer),{type:"image",path:o,mediaType:e.mediaType}}r(x,"persistImageAsBlock");async function ne(e=Date.now()){let t=D(),a;try{a=await K(t)}catch{return 0}let n=e-A,i=0;return await Promise.all(a.filter(o=>o.startsWith("paste-")).map(async o=>{let s=w.join(t,o);try{(await Q(s)).mtimeMs<n&&(await v(s),i+=1)}catch{}})),i}r(ne,"prunePasteTmpDir");var oe=/\.(png|jpe?g|gif|webp|bmp)$/i;async function ie(e){if(e.length===0)return process.platform==="darwin"?R():{kind:"text",text:""};let t=G(e);return t.length>0?ce(t,e):{kind:"text",text:e}}r(ie,"handleBracketedPaste");async function se(){return R()}r(se,"triggerExplicitClipboardImage");async function R(){let e;try{e=await p()}catch(t){return{kind:"error",message:`Failed to read clipboard image: ${y(t)}`}}return e?$(e):{kind:"noop"}}r(R,"readClipboardAsImagesOutcome");async function ce(e,t){let a=[],n=[];for(let i of e){let o;try{o=await ae(i)}catch(l){n.push(`Failed to read ${i}: ${y(l)}`);continue}let s=await $(o);s.kind==="images"?a.push(...s.blocks):s.kind==="error"&&n.push(s.message)}return a.length===0?n.length>0?{kind:"error",message:n.join("; ")}:{kind:"text",text:t}:{kind:"images",blocks:a}}r(ce,"readImagePathsAsOutcome");async function $(e){try{let t=await h(e);return{kind:"images",blocks:[await x(t)]}}catch(t){return t instanceof u?{kind:"error",message:t.message}:{kind:"error",message:`Failed to process pasted image: ${y(t)}`}}}r($,"decodeBufferToOutcome");function G(e){return e.split(/ (?=\/|[A-Za-z]:\\)/).filter(a=>oe.test(a.trim()))}r(G,"extractImagePaths");function y(e){return e instanceof Error?e.message:String(e)}r(y,"describeError");export{C as a,T as b,L as c,O as d,p as e,g as f,d as g,u as h,h as i,B as j,A as k,x as l,ne as m,ie as n,se as o,G as p};
@@ -1,2 +0,0 @@
1
- // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{vb as k,xb as D}from"./chunk-THAKTCPE.js";import{U as S,V as w,W as L,X as I,Y as O,Z as h,ea as x,fa as m,ia as b,sa as A}from"./chunk-7C2QUBLE.js";import{va as R}from"./chunk-JCDO2FR4.js";import{a as o}from"./chunk-V4WSBIXB.js";import s from"fs";import c from"path";import{exec as H,spawnSync as z}from"child_process";import{promisify as U}from"util";import{fileURLToPath as q}from"url";var E="en";function G(){return(process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||"").toLowerCase().startsWith("zh")?"zh":"en"}o(G,"detectSystemLocale");function T(e){if(!e||e==="auto"){E=G();return}E=e.toLowerCase().replace(/[-_].*/,"")==="zh"?"zh":"en"}o(T,"setLocale");var M={en:{"dialog.confirm":"[Confirm]","dialog.select":"[Select]","dialog.input":"[Input]","confirm.instruction.basic":"Press (y) yes, (n) no","confirm.instruction.always":"Press (y) yes, (a) always yes for this tool, (n) no","confirm.instruction.protected":"Press (y) to confirm, (n) to cancel (protected path)","confirm.result.approved":"Approved","confirm.result.approved_always":"Approved (always)","confirm.result.denied":"Denied","tool.bash.title":"Execute bash command?","tool.shell.title":"Execute shell command?","tool.write.title":"Write to file?","tool.edit.title":"Edit file?","tool.generic.title":"Execute {tool}?","field.reason":"Reason","field.intent":"Intent","field.target":"Target","field.scope":"Scope","field.risk":"Risk","field.summary":"Summary","intent.read":"Read project files","intent.delete":"Delete files","intent.deps":"Modify dependencies or environment","intent.modify":"Modify files","intent.execute":"Execute command","intent.write_file":"Write file","intent.edit_file":"Edit file","intent.use_tool":"Use {tool}","risk.destructive":"Destructive change","risk.deps":"May change dependencies or local tools","risk.modify":"May modify files","risk.unknown":"Command effects depend on its arguments","risk.network":"May access network","scope.outside":"Outside project","scope.protected":"Protected path","waiting.confirm":"Waiting: approval required","waiting.select":"Waiting: choose an option","waiting.input":"Waiting: answer the prompt","placeholder.confirm":"Respond to the approval prompt above...","placeholder.select":"Choose an option above...","placeholder.input":"Answer the prompt above...","placeholder.busy":"Agent is busy...","placeholder.queue":"Queue a follow-up for the next round...","placeholder.idle":"Type a message...","select.choice":"Choice:","select.type_number":"(type a number)","select.more":"{count} more choices...","select.more_above":"\u2191 {count} more above","select.more_below":"\u2193 {count} more below","select.confirm_hint":"Press Enter to confirm, Esc to cancel","select.navigate_hint":"Use \u2191\u2193 to navigate, Enter to confirm, Esc to cancel","select.multiselect_hint":"Use \u2191\u2193 to navigate, Space to toggle, Enter to confirm, Esc to cancel","select.multiselect_empty":"Select at least one option with Space before confirming.","select.back_prev":"\u2190 Back to previous question","input.default":"Default:","input.value":"Value:","input.type_response":"(type your response)","managed.completed":"Task completed","managed.completed.blocked":"Task blocked","managed.completed.continuation":"Task needs continuation",cancelled:"[Cancelled] Operation cancelled by user"},zh:{"dialog.confirm":"[\u786E\u8BA4]","dialog.select":"[\u9009\u62E9]","dialog.input":"[\u8F93\u5165]","confirm.instruction.basic":"\u6309 (y) \u786E\u8BA4, (n) \u62D2\u7EDD","confirm.instruction.always":"\u6309 (y) \u786E\u8BA4, (a) \u59CB\u7EC8\u5141\u8BB8\u6B64\u5DE5\u5177, (n) \u62D2\u7EDD","confirm.instruction.protected":"\u6309 (y) \u786E\u8BA4, (n) \u53D6\u6D88 (\u53D7\u4FDD\u62A4\u8DEF\u5F84)","confirm.result.approved":"\u5DF2\u6279\u51C6","confirm.result.approved_always":"\u5DF2\u6279\u51C6 (\u59CB\u7EC8\u5141\u8BB8)","confirm.result.denied":"\u5DF2\u62D2\u7EDD","tool.bash.title":"\u6267\u884C bash \u547D\u4EE4\uFF1F","tool.shell.title":"\u6267\u884C shell \u547D\u4EE4\uFF1F","tool.write.title":"\u5199\u5165\u6587\u4EF6\uFF1F","tool.edit.title":"\u7F16\u8F91\u6587\u4EF6\uFF1F","tool.generic.title":"\u6267\u884C {tool}\uFF1F","field.reason":"\u539F\u56E0","field.intent":"\u610F\u56FE","field.target":"\u76EE\u6807","field.scope":"\u8303\u56F4","field.risk":"\u98CE\u9669","field.summary":"\u6458\u8981","intent.read":"\u8BFB\u53D6\u9879\u76EE\u6587\u4EF6","intent.delete":"\u5220\u9664\u6587\u4EF6","intent.deps":"\u4FEE\u6539\u4F9D\u8D56\u6216\u73AF\u5883","intent.modify":"\u4FEE\u6539\u6587\u4EF6","intent.execute":"\u6267\u884C\u547D\u4EE4","intent.write_file":"\u5199\u5165\u6587\u4EF6","intent.edit_file":"\u7F16\u8F91\u6587\u4EF6","intent.use_tool":"\u4F7F\u7528 {tool}","risk.destructive":"\u7834\u574F\u6027\u53D8\u66F4","risk.deps":"\u53EF\u80FD\u4FEE\u6539\u4F9D\u8D56\u6216\u672C\u5730\u5DE5\u5177","risk.modify":"\u53EF\u80FD\u4FEE\u6539\u6587\u4EF6","risk.unknown":"\u547D\u4EE4\u6548\u679C\u53D6\u51B3\u4E8E\u53C2\u6570","risk.network":"\u53EF\u80FD\u8BBF\u95EE\u7F51\u7EDC","scope.outside":"\u9879\u76EE\u5916\u90E8","scope.protected":"\u53D7\u4FDD\u62A4\u8DEF\u5F84","waiting.confirm":"\u7B49\u5F85\u4E2D\uFF1A\u9700\u8981\u5BA1\u6279","waiting.select":"\u7B49\u5F85\u4E2D\uFF1A\u8BF7\u9009\u62E9","waiting.input":"\u7B49\u5F85\u4E2D\uFF1A\u8BF7\u56DE\u7B54","placeholder.confirm":"\u8BF7\u56DE\u5E94\u4E0A\u65B9\u7684\u5BA1\u6279\u63D0\u793A...","placeholder.select":"\u8BF7\u5728\u4E0A\u65B9\u9009\u62E9\u4E00\u4E2A\u9009\u9879...","placeholder.input":"\u8BF7\u56DE\u7B54\u4E0A\u65B9\u7684\u63D0\u793A...","placeholder.busy":"\u667A\u80FD\u4F53\u6B63\u5728\u5DE5\u4F5C\u4E2D...","placeholder.queue":"\u6392\u961F\u7B49\u5F85\u4E0B\u4E00\u8F6E\u8DDF\u8FDB...","placeholder.idle":"\u8F93\u5165\u6D88\u606F...","select.choice":"\u9009\u9879\uFF1A","select.type_number":"(\u8F93\u5165\u7F16\u53F7)","select.more":"\u8FD8\u6709 {count} \u4E2A\u9009\u9879...","select.more_above":"\u2191 \u4E0A\u65B9\u8FD8\u6709 {count} \u4E2A","select.more_below":"\u2193 \u4E0B\u65B9\u8FD8\u6709 {count} \u4E2A","select.confirm_hint":"\u6309 Enter \u786E\u8BA4\uFF0CEsc \u53D6\u6D88","select.navigate_hint":"\u4F7F\u7528 \u2191\u2193 \u5BFC\u822A\uFF0CEnter \u786E\u8BA4\uFF0CEsc \u53D6\u6D88","select.multiselect_hint":"\u4F7F\u7528 \u2191\u2193 \u5BFC\u822A\uFF0C\u7A7A\u683C \u5207\u6362\u9009\u4E2D\uFF0CEnter \u786E\u8BA4\uFF0CEsc \u53D6\u6D88","select.multiselect_empty":"\u8BF7\u5148\u4F7F\u7528\u7A7A\u683C\u9009\u62E9\u81F3\u5C11\u4E00\u4E2A\u9009\u9879\u3002","select.back_prev":"\u2190 \u8FD4\u56DE\u4E0A\u4E00\u9898","input.default":"\u9ED8\u8BA4\u503C\uFF1A","input.value":"\u503C\uFF1A","input.type_response":"(\u8F93\u5165\u4F60\u7684\u56DE\u7B54)","managed.completed":"\u4EFB\u52A1\u5B8C\u6210","managed.completed.blocked":"\u4EFB\u52A1\u53D7\u963B","managed.completed.continuation":"\u4EFB\u52A1\u9700\u8981\u7EE7\u7EED",cancelled:"[\u5DF2\u53D6\u6D88] \u64CD\u4F5C\u5DF2\u88AB\u7528\u6237\u53D6\u6D88"}};function ve(e,t){let i=M[E][e]??M.en[e]??e;if(t)for(let[r,u]of Object.entries(t))i=i.replace(`{${r}}`,String(u));return i}o(ve,"t");var W=U(H),X=R(),Ie=c.join(X,"sessions"),l=c.join(X,"config.json"),Oe=60,a=null,_=!1,J="dumb";function Q(e){let t=c.basename(e).toLowerCase(),n="__KODAX_SHELL_ENV_START__",i=`printf '%s\\0' '${n}'; env -0`;return t==="fish"?{args:["-i","-c",i],sentinel:n}:{args:t==="bash"||t==="zsh"?["-ic",i]:["-lc",i],sentinel:n}}o(Q,"buildShellEnvCommand");function Y(e,t){let n=`${t}\0`,i=e.lastIndexOf(n);if(i===-1)return{};let r=e.slice(i+n.length),u={};for(let p of r.split("\0")){if(!p)continue;let d=p.indexOf("=");d<=0||(u[p.slice(0,d)]=p.slice(d+1))}return u}o(Y,"parseNullDelimitedShellEnv");function Z(e={}){let t=e.env??process.env;if((e.platform??process.platform)==="win32"||t.KODAX_DISABLE_SHELL_ENV_HYDRATION==="1")return!1;let i=e.shell??t.SHELL;if(!i||!c.isAbsolute(i))return!1;let{args:r,sentinel:u}=Q(i),p=e.run??z,d={...t,TERM:J},f=p(i,r,{encoding:"utf8",env:d,maxBuffer:1024*1024,timeout:5e3,windowsHide:!0,detached:!0,stdio:["ignore","pipe","pipe"]});if(f.status!==0||!f.stdout)return!1;let j=typeof f.stdout=="string"?f.stdout:f.stdout.toString("utf8"),B=Y(j,u),C=!1;for(let[y,V]of Object.entries(B))y!=="TERM"&&t[y]===void 0&&(t[y]=V,C=!0);return C}o(Z,"hydrateProcessEnvFromShell");function ee(){if(!_){_=!0;try{Z()}catch{}}}o(ee,"ensureShellEnvironmentHydrated");function xe(){_=!1}o(xe,"resetShellEnvironmentHydrationForTesting");function te(e){x(e.customProviders??[])}o(te,"registerConfiguredCustomProviders");function $(e){if(!Array.isArray(e))return;let t=e.filter(n=>typeof n=="string").map(n=>n.trim()).filter(n=>n.length>0);return t.length>0?t:[]}o($,"normalizeConfiguredExtensions");function ne(e){if(e.permissionMode!=="default")return e;let t={...e,permissionMode:"accept-edits"};try{s.mkdirSync(c.dirname(l),{recursive:!0}),s.writeFileSync(l,JSON.stringify(t,null,2))}catch{}return t}o(ne,"migrateLegacyPermissionModeInConfig");function ie(e){if(e.permissionMode!=="auto-in-project")return e;try{let t=s.readFileSync(l,"utf-8"),n=t.replace(/("permissionMode"\s*:\s*)"auto-in-project"/,'$1"auto"');n!==t&&s.writeFileSync(l,n)}catch{}return{...e,permissionMode:"auto"}}o(ie,"migrateAutoInProjectAliasInConfig");function oe(){if(a)return a;let e="0.7.55";if(e)return a=e,a;let t=c.join(c.dirname(q(import.meta.url)),"../../package.json");if(s.existsSync(t))try{return a=JSON.parse(s.readFileSync(t,"utf-8")).version??"0.0.0",a??"0.0.0"}catch{}return a="0.0.0",a}o(oe,"getVersion");var Ae=oe();function Re(e){return w(e)}o(Re,"getProviderModel");function P(e,t){let n=new Set(e.map(r=>r.toLowerCase())),i=[...e];for(let r of t)n.has(r.toLowerCase())||i.push(r);return i}o(P,"mergeModels");function re(e,t){t||(t=v().providerModels);let n=t?.[e];if(n&&n.length>0){try{let i=h(e);if(i.length>0)return P(n,i)}catch{}try{let i=m(e);if(i)return P(n,i.getAvailableModels())}catch{}return n}try{let i=h(e);if(i.length>0)return i}catch{}try{let i=m(e);if(i)return i.getAvailableModels()}catch{}return[]}o(re,"getProviderAvailableModels");function se(e,t){let n=L(e,t);if(n!=="unknown")return n;try{let i=m(e);if(i)return i.getReasoningCapability(t)}catch{}return"unknown"}o(se,"getProviderReasoningCapability");function ae(e){let t=I(e);if(t)return t;try{return b().find(i=>i.name===e)?.capabilityProfile??null}catch{return null}}o(ae,"getProviderCapabilityProfile");function F(e,t){let n=ae(e),i=se(e,t);if(n)return{capabilityProfile:n,reasoningCapability:i};try{let r=A(e);return{capabilityProfile:r.getCapabilityProfile(),reasoningCapability:r.getReasoningCapability(t)}}catch{return null}}o(F,"getProviderCapabilityMetadata");function ke(e,t){let n=F(e,t);return n?k({providerName:e,model:t,capabilityProfile:n.capabilityProfile,reasoningCapability:n.reasoningCapability==="unknown"?void 0:n.reasoningCapability}):null}o(ke,"getProviderCapabilitySnapshot");function ce(e,t,n,i){let r=F(e,t);return r?D({providerName:e,model:t,capabilityProfile:r.capabilityProfile,reasoningCapability:r.reasoningCapability==="unknown"?void 0:r.reasoningCapability,reasoningMode:n,hints:i}):null}o(ce,"getProviderPolicyDecision");function De(e){let t=e.transport==="cli-bridge"?"CLI bridge":"Native API",n=e.conversationSemantics==="last-user-message"?"forwards only the latest user message":"preserves full conversation history",i=e.mcpSupport==="native"?"MCP available":"MCP unavailable";return`${t}; ${n}; ${i}`}o(De,"describeProviderCapabilitySummary");function Me(e){switch(e){case"native-budget":return"B";case"native-effort":return"E";case"native-toggle":return"T";case"native-adaptive":return"A";default:return"-"}}o(Me,"formatReasoningCapabilityShort");function le(e){switch(e){case"native-budget":return"budget";case"native-effort":return"effort";case"native-toggle":return"toggle";case"native-adaptive":return"adaptive";default:return"none"}}o(le,"describeReasoningCapabilityControl");function Te(e,t){if(e==="off")return"Reasoning disabled";switch(t){case"native-budget":return"Uses native thinking budget control";case"native-effort":return"Uses native reasoning effort control";case"native-toggle":return"Uses provider-native thinking toggle only";case"native-adaptive":return"Model adaptively decides thinking depth (Opus 4.7+)";case"none":return"Runs without native reasoning parameters";case"prompt-only":return"Uses prompt overlays only; no native reasoning parameter";default:return"Runs without native reasoning parameters"}}o(Te,"describeReasoningExecution");function Ne(e){let t=[];e||(e=v().providerModels);for(let n of O())t.push({name:n.name,model:n.model,models:re(n.name,e),configured:n.capabilityProfile.transport==="cli-bridge"?!0:n.configured,reasoningCapability:n.reasoningCapability,capabilityProfile:n.capabilityProfile});try{let n=b().map(i=>({...i,models:(()=>{let r=e?.[i.name];return r&&r.length>0?P(r,i.models):i.models})()}));t.push(...n)}catch{}return t}o(Ne,"getProviderList");function Ke(e){if(S(e))return!0;try{return m(e)?.isConfigured()??!1}catch{return!1}}o(Ke,"isProviderConfigured");function v(){try{if(s.existsSync(l)){let e=JSON.parse(s.readFileSync(l,"utf-8")),t=e.reasoningCeiling??e.reasoningMode;return ie(ne({...e,reasoningMode:t,extensions:$(e.extensions)}))}}catch{}return{}}o(v,"loadConfig");function ue(e){e.streamIdleTimeoutMs&&!process.env.KODAX_STREAM_IDLE_TIMEOUT_MS&&(process.env.KODAX_STREAM_IDLE_TIMEOUT_MS=String(e.streamIdleTimeoutMs))}o(ue,"applyResilienceRuntimeEnv");function pe(e){e.repoIntelligenceMode&&!process.env.KODAX_REPO_INTELLIGENCE_MODE&&(process.env.KODAX_REPO_INTELLIGENCE_MODE=e.repoIntelligenceMode),e.repointelEndpoint&&!process.env.KODAX_REPOINTEL_ENDPOINT&&(process.env.KODAX_REPOINTEL_ENDPOINT=e.repointelEndpoint),e.repointelBin&&!process.env.KODAX_REPOINTEL_BIN&&(process.env.KODAX_REPOINTEL_BIN=e.repointelBin),e.repoIntelligenceTrace===!0&&!process.env.KODAX_REPO_INTELLIGENCE_TRACE&&(process.env.KODAX_REPO_INTELLIGENCE_TRACE="1")}o(pe,"applyRepoIntelligenceRuntimeEnv");function de(e){e.verifierLog===!0&&!process.env.KODAX_VERIFIER_LOG&&(process.env.KODAX_VERIFIER_LOG="1")}o(de,"applyVerifierRuntimeEnv");function fe(e){e.stallLog===!0&&!process.env.KODAX_STALL_LOG&&(process.env.KODAX_STALL_LOG="1")}o(fe,"applyStallSidecarRuntimeEnv");function me(e){let t=e.fallbackProviders?.filter(n=>n.trim().length>0)??[];t.length>0&&!process.env.KODAX_FALLBACK_PROVIDERS&&(process.env.KODAX_FALLBACK_PROVIDERS=t.join(","))}o(me,"applyFallbackRuntimeEnv");function Xe(){ee();let e=v();return ue(e),pe(e),de(e),fe(e),me(e),te(e),T(e.locale),e}o(Xe,"prepareRuntimeConfig");function $e(e){let n={...v(),...e},i=$(n.extensions);i!==void 0&&(n.extensions=i);for(let r of Object.keys(e))e[r]===void 0&&delete n[r];s.mkdirSync(c.dirname(l),{recursive:!0}),s.writeFileSync(l,JSON.stringify(n,null,2))}o($e,"saveConfig");async function Fe(e){try{let{stdout:t}=await W("git rev-parse --show-toplevel",{cwd:e});return t.trim()}catch{return null}}o(Fe,"getGitRoot");function ge(e){switch(e){case"builtin":return"Built-in";case"runtime":return"Runtime extension";case"custom":return"Custom config";default:return"Unknown"}}o(ge,"formatProviderSourceKind");function je(e){let t=e.transport==="cli-bridge"?"CLI bridge":"Native API",n=e.conversationSemantics==="last-user-message"?"latest-user-message only":"full conversation history";return[`Source: ${ge(e.sourceKind)}`,`Transport: ${t}`,`Conversation semantics: ${n}`,`Context fidelity: ${e.contextFidelity}`,`Tool calling: ${e.toolCallingFidelity}`,`Session behavior: ${e.sessionSupport}`,`Long-running support: ${e.longRunningSupport}`,`Evidence-heavy flows: ${e.evidenceSupport}`,`Multimodal support: ${e.multimodalSupport}`,`MCP support: ${e.mcpSupport}`,`Reasoning control: ${le(e.reasoningCapability)}`]}o(je,"formatProviderCapabilityDetailLines");function Be(e,t,n){return[{label:"General coding",hints:{}},{label:"Evidence-heavy review",hints:{evidenceHeavy:!0}},{label:"Long-running task",hints:{longRunning:!0}}].map(r=>({label:r.label,decision:ce(e,t,n,r.hints)})).filter(r=>r.decision!==null)}o(Be,"getProviderCommonPolicyScenarios");var N=.5,K=0,g={locked:!1,queue:[]};async function Ve(e){for(;g.locked;)await new Promise(t=>g.queue.push(t));g.locked=!0;try{let t=(Date.now()-K)/1e3;t<N&&await new Promise(i=>setTimeout(i,(N-t)*1e3));let n=await e();return K=Date.now(),n}finally{g.locked=!1;let t=g.queue.shift();t&&t()}}o(Ve,"rateLimitedCall");export{ve as a,X as b,Ie as c,l as d,Oe as e,Z as f,xe as g,te as h,oe as i,Ae as j,Re as k,re as l,se as m,ae as n,ke as o,ce as p,De as q,Me as r,le as s,Te as t,Ne as u,Ke as v,v as w,Xe as x,$e as y,Fe as z,ge as A,je as B,Be as C,Ve as D};