@kodax-ai/kodax 0.7.87 → 0.7.89

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 (100) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +29 -12
  3. package/README_CN.md +7 -3
  4. package/dist/chunks/agent-AKCXT573.js +2 -0
  5. package/dist/chunks/argument-completer-BJGY57H2.js +2 -0
  6. package/dist/chunks/{chunk-U44C5STU.js → chunk-4Y6OSDZE.js} +1 -1
  7. package/dist/chunks/{chunk-XH7UM4GO.js → chunk-5247AKGN.js} +3 -3
  8. package/dist/chunks/{chunk-DB4O33RR.js → chunk-5UBP47VJ.js} +223 -220
  9. package/dist/chunks/{chunk-ITP7J5HX.js → chunk-72H6JNPN.js} +142 -142
  10. package/dist/chunks/chunk-A63MGLH6.js +415 -0
  11. package/dist/chunks/{chunk-ZQNOEKOB.js → chunk-BOMSVUJS.js} +2 -2
  12. package/dist/chunks/{chunk-4OLXWSCQ.js → chunk-CQHLFQSU.js} +254 -254
  13. package/dist/chunks/chunk-GL6GVYF4.js +320 -0
  14. package/dist/chunks/{chunk-XKLVC7F6.js → chunk-IFD6TUQU.js} +1 -1
  15. package/dist/chunks/{chunk-JS4RSF4B.js → chunk-O2ZV775M.js} +1 -1
  16. package/dist/chunks/chunk-PROPMIT4.js +2 -0
  17. package/dist/chunks/{chunk-YB7YVAPL.js → chunk-QQBFQCMF.js} +4 -4
  18. package/dist/chunks/{chunk-BCYJIACJ.js → chunk-S74F7MFN.js} +124 -124
  19. package/dist/chunks/{chunk-ASFCAPIG.js → chunk-SOIIBADK.js} +2 -2
  20. package/dist/chunks/{chunk-SKELDH3G.js → chunk-UNEC2WXJ.js} +17 -17
  21. package/dist/chunks/{chunk-7XTUXMAI.js → chunk-W2LRTZBJ.js} +37 -34
  22. package/dist/chunks/{chunk-GRJ7NKWP.js → chunk-W5RPVR3O.js} +1 -1
  23. package/dist/chunks/client-ZXBSEDS4.js +2 -0
  24. package/dist/chunks/compaction-config-HVHPJ6CS.js +2 -0
  25. package/dist/chunks/{construction-bootstrap-YTFOT4M2.js → construction-bootstrap-WF6KQ7XV.js} +1 -1
  26. package/dist/chunks/dist-BCT3UNMA.js +2 -0
  27. package/dist/chunks/{dist-X55TWIK4.js → dist-WILA35IA.js} +1 -1
  28. package/dist/chunks/host-V6ENYZAQ.js +2 -0
  29. package/dist/chunks/run-manager-ZOV7EKTZ.js +2 -0
  30. package/dist/chunks/utils-BEWYGEMB.js +2 -0
  31. package/dist/index.d.ts +26 -26
  32. package/dist/index.js +5 -5
  33. package/dist/kodax_bootstrap.js +1 -1
  34. package/dist/kodax_cli.js +1564 -1555
  35. package/dist/kodax_resume.js +35 -826
  36. package/dist/provider-capabilities.json +1156 -1118
  37. package/dist/runtime-worker.js +1346 -1339
  38. package/dist/sandbox-workspace-session.js +261 -261
  39. package/dist/sdk-a2a.d.ts +20 -18
  40. package/dist/sdk-a2a.js +9 -9
  41. package/dist/sdk-agent.d.ts +23 -22
  42. package/dist/sdk-agent.js +1 -1
  43. package/dist/sdk-coding.d.ts +65 -38
  44. package/dist/sdk-coding.js +1 -1
  45. package/dist/sdk-experimental-memory.d.ts +6 -6
  46. package/dist/sdk-experimental-memory.js +1 -1
  47. package/dist/sdk-llm.d.ts +8 -8
  48. package/dist/sdk-llm.js +1 -1
  49. package/dist/sdk-mcp.d.ts +4 -4
  50. package/dist/sdk-mcp.js +1 -1
  51. package/dist/sdk-media.d.ts +1 -1
  52. package/dist/sdk-media.js +1 -1
  53. package/dist/sdk-repl.d.ts +21 -21
  54. package/dist/sdk-repl.js +1 -1
  55. package/dist/sdk-runtime.d.ts +28 -21
  56. package/dist/sdk-runtime.js +1 -1
  57. package/dist/sdk-sandbox.js +1 -1
  58. package/dist/sdk-session.d.ts +10 -10
  59. package/dist/sdk-session.js +1 -1
  60. package/dist/sdk-skills.d.ts +2 -2
  61. package/dist/sdk-skills.js +1 -1
  62. package/dist/semantic-worker.js +59 -59
  63. package/dist/types-chunks/{base.d-vopO1rml.d.ts → base.d-JjF6aKsh.d.ts} +1 -1
  64. package/dist/types-chunks/{bash-prefix-extractor.d-B36OQwNA.d.ts → bash-prefix-extractor.d-BLlhCRI-.d.ts} +33 -9
  65. package/dist/types-chunks/{capability-learning.d-CE1tm29C.d.ts → capability-learning.d-BAxy0mfx.d.ts} +1 -1
  66. package/dist/types-chunks/{capsule.d-DEncDNzD.d.ts → capsule.d-Cw4UlPTC.d.ts} +5 -5
  67. package/dist/types-chunks/{config.d-CJy1WENT.d.ts → config.d-CTPaqsD-.d.ts} +1 -1
  68. package/dist/types-chunks/{controller.d-Dif9pbC9.d.ts → controller.d-1tydJm7c.d.ts} +11 -4
  69. package/dist/types-chunks/{controller.d-C1YdP_pQ.d.ts → controller.d-BvwWz6yP.d.ts} +1 -1
  70. package/dist/types-chunks/{cost-tracker.d-BeaenODW.d.ts → cost-tracker.d-MTAt6N7b.d.ts} +1 -1
  71. package/dist/types-chunks/{guardrail.d-DhpnJv4Y.d.ts → guardrail.d-DqWHIgt6.d.ts} +15 -9
  72. package/dist/types-chunks/{history-retrieval.d-YJQpQt7h.d.ts → history-retrieval.d-ia-4iJpw.d.ts} +2 -2
  73. package/dist/types-chunks/{integration-config.d-BNowXE8k.d.ts → integration-config.d-BHoiz-WZ.d.ts} +3 -3
  74. package/dist/types-chunks/{manager.d-B67TmPO1.d.ts → manager.d-D_1fqveb.d.ts} +3 -3
  75. package/dist/types-chunks/{oauth-login.d-6i-vidxv.d.ts → oauth-login.d-Cz9OpSmz.d.ts} +3 -3
  76. package/dist/types-chunks/{public-api.d-D4q3WxKq.d.ts → public-api.d-CMZa4JPa.d.ts} +12 -7
  77. package/dist/types-chunks/{repl.d-D4ye29Kk.d.ts → repl.d-Byu2osV-.d.ts} +7 -7
  78. package/dist/types-chunks/{resolver.d-RyPo99tB.d.ts → resolver.d-bKttRr1V.d.ts} +4 -4
  79. package/dist/types-chunks/{review-inbox.d-C1_xZ-yg.d.ts → review-inbox.d-D3T-RxRs.d.ts} +3 -3
  80. package/dist/types-chunks/{run-manager.d-D30IvnwV.d.ts → run-manager.d-D0aKe12e.d.ts} +2 -2
  81. package/dist/types-chunks/{sdk-session-DIU6sHa2.d.ts → sdk-session-BEM7yvJB.d.ts} +3 -3
  82. package/dist/types-chunks/{shell-command-sets.d-rIHkZ_VR.d.ts → shell-command-sets.d-_SHjU3KP.d.ts} +2 -2
  83. package/dist/types-chunks/{side-query.d-iH0P9ASy.d.ts → side-query.d-DNes6rHA.d.ts} +3 -3
  84. package/dist/types-chunks/{types-PHjfwebT.d.ts → types-D8OiIEwA.d.ts} +1 -1
  85. package/dist/types-chunks/{types.d-BSPlmJqf.d.ts → types.d-BEMcUOng.d.ts} +1 -1
  86. package/dist/types-chunks/{types.d-COhAF5Xo.d.ts → types.d-B_IFJlti.d.ts} +3 -3
  87. package/dist/types-chunks/{types.d-Bz5Y-PD9.d.ts → types.d-BqK7eZ5u.d.ts} +6 -6
  88. package/dist/types-chunks/{types.d-CK9A9rpP.d.ts → types.d-Cv09EdJR.d.ts} +1 -1
  89. package/dist/types-chunks/{types.d-sW-OqiFt.d.ts → types.d-DeokRBs7.d.ts} +34 -3
  90. package/dist/types-chunks/{utils.d-B65ozSTV.d.ts → utils.d-0h1NTEsX.d.ts} +8 -8
  91. package/package.json +2 -2
  92. package/dist/chunks/agent-Z64QF7KG.js +0 -2
  93. package/dist/chunks/argument-completer-HIJBXRUT.js +0 -2
  94. package/dist/chunks/chunk-3PGNESV3.js +0 -415
  95. package/dist/chunks/chunk-UWKM3HNY.js +0 -319
  96. package/dist/chunks/compaction-config-E4TFBCDJ.js +0 -2
  97. package/dist/chunks/dist-M3JV4PNA.js +0 -2
  98. package/dist/chunks/host-SJHHJBPB.js +0 -2
  99. package/dist/chunks/run-manager-T5QGWNON.js +0 -2
  100. package/dist/chunks/utils-2FHVIO6X.js +0 -2
package/CHANGELOG.md CHANGED
@@ -8,6 +8,101 @@ All notable changes to this project will be documented in this file.
8
8
 
9
9
  ---
10
10
 
11
+ ## [0.7.89] - 2026-08-16
12
+
13
+ ### Fixed
14
+
15
+ - Managed compaction context replacement no longer makes a topology-valid
16
+ ordinary conversation ambiguous or exposes physical branch/copy duplicates.
17
+ Conversation page-cache v3 is invalidated so affected Sessions rebuild the
18
+ corrected projection after upgrade, and the incremental append fast path
19
+ passes managed-context envelopes through without projecting them, so
20
+ managed-heavy Sessions keep warm page caches.
21
+ - Managed-context transparency now keys on the `_source` tag alone (matching
22
+ the compaction stripping side) and also covers the lineage-unavailable
23
+ fallback projection.
24
+
25
+ ### Added
26
+
27
+ - Host Tools first-class visibility (`FEATURE_294`): host tools bound to a
28
+ run by lease now materialize into the agent tool table as run-scoped
29
+ definitions (name + schema) on both the SA and managed-agent paths, so
30
+ models see them without calling `mcp_search`. The cached capability
31
+ catalog gains a `## Host Capability Provider (run-bound)` line
32
+ advertising the bound server entry, tool names, and a content-hash
33
+ revision that stays stable across runs. The `runBoundHostTools`
34
+ capability bumps to `2` (`materializedAgentTools`).
35
+ - Resilient zero-service web search (`FEATURE_293`) now tries DuckDuckGo HTML,
36
+ Bing RSS, and Bing HTML in a bounded order, preserving truthful fallback
37
+ diagnostics, normalized direct URLs, freshness metadata, and isolated custom
38
+ endpoint behavior without adding a hosted service or runtime dependency.
39
+
40
+ ### Changed
41
+
42
+ - Materialized host tool dispatch routes through the run's capability
43
+ channel (`executeCapability('mcp', 'host:<leaseId>:<name>')`), reusing the
44
+ reverse-bridge timeout/idempotency/invocation state machine; results
45
+ render through the `mcp_call` retrieval pipeline. Host tool descriptors
46
+ map conservatively: `none` → readonly + plan-mode allowed,
47
+ `idempotent`/`non_idempotent` → mutates-state + plan-mode blocked
48
+ (fail-closed). Revoking a lease removes the materialized tools and the
49
+ catalog line from subsequent turns.
50
+ - Run bindings whose host tool names collide with registered tools are
51
+ rejected up front with `invalid_params` (before any host-tool run
52
+ record), and host tool lease ids must match
53
+ `[A-Za-z0-9][A-Za-z0-9_-]{0,127}` (colon stays reserved for capability
54
+ ids).
55
+ - Remote managed agents (A2A) can now authorize host capability ids: the
56
+ `authorizeMcp` id pattern accepts `host:` leases and role tool policy
57
+ carries host tool authorization semantics.
58
+
59
+ ### Documentation
60
+
61
+ - Updated the release checklist, product/architecture/design baselines,
62
+ feature tracker, public guides, `kodax_manual`, and v0.7.89 regression
63
+ guides for FEATURE_293, FEATURE_294, and Issue 293.
64
+
65
+ ---
66
+
67
+ ## [0.7.88] - 2026-08-16
68
+
69
+ > Git tag and GitHub Release are created by the release workflow. npm
70
+ > publication remains a separate manual operator step.
71
+
72
+ ### Changed
73
+
74
+ - Actor settlement persistence now separates Actor mutation order, process-local
75
+ storage dequeue, writer eligibility, cancellable pre-commit work, canonical
76
+ replacement, and serialized post-commit maintenance. The v2 contract is
77
+ exposed as `actorSettlementConvergence:2`.
78
+ - Startup and resume paths bound their work and defer heavy provider, image,
79
+ LSP, TypeScript, and extension dependencies past the bootstrap boundary.
80
+ - `zai-coding` and `ark-coding` now default to `glm-5.3` while retaining
81
+ `glm-5.2`; Ark retains the `glm-latest` alias. Coding Plan model IDs are sent
82
+ verbatim, without a synthetic context suffix. GLM-5.3 `off` / `none` intent
83
+ is normalized to low effort.
84
+
85
+ ### Fixed
86
+
87
+ - Issue 292: storage eligibility, canonical Actor settlement, and post-commit
88
+ maintenance no longer compete for one deadline; authoritative persisted-shape
89
+ readback resolves explicit replacement errors and maintenance failures no
90
+ longer roll back a successful terminal Actor state.
91
+ - Guardrail decision diagnostics now expose a bounded classifier reason.
92
+ - REPL startup learning-recovery notices are dismissed after the first submitted
93
+ query instead of remaining stale over the active conversation.
94
+ - CLI bundle startup no longer eagerly imports the Anthropic SDK or `jimp`,
95
+ restoring the audited startup dependency boundary.
96
+ - Known-issue tracker totals are synchronized with the Issue 292 resolution.
97
+
98
+ ### Documentation
99
+
100
+ - Synchronized README/README_CN, PRD/HLD/DD/ADR, feature tracker, public SDK
101
+ guides, `kodax_manual`, `docs/features`, release checklist, and v0.7.88
102
+ regression coverage.
103
+
104
+ ---
105
+
11
106
  ## [0.7.87] - 2026-08-14
12
107
 
13
108
  > Git tag and GitHub Release are created by the release workflow. npm
package/README.md CHANGED
@@ -682,16 +682,33 @@ policy revisions. Issue
682
682
  stays open and was scheduled for v0.7.87. See the
683
683
  [v0.7.86 release checklist](docs/release.md#v0786-release-preparation).
684
684
 
685
- **v0.7.87 GLM provider release:** `zhipu-coding` now defaults to `glm-5.3`
686
- and retains `glm-5.2` as an explicit rollback route. `zai-coding` retains both
687
- models but defaults to `glm-5.2`, because GLM-5.3 availability on the overseas
688
- Coding Plan is account-dependent. Both aliases send the upstream model IDs
689
- verbatim: `glm-5.3` and `glm-5.2`, without a context suffix. GLM-5.3 is an
690
- always-thinking model, so an `off` / `none` intent is lowered to `low` instead
691
- of sending an unsupported disabled-thinking request; REPL controls do not offer
692
- the impossible off rung and label a legacy saved choice as `off->low`. Issue 256's remaining
693
- Worker owner-lease boundary is not part of this provider release and remains
694
- open after v0.7.87; this release assigns no replacement target. See the
685
+ **v0.7.88 release:** this release contains the Actor settlement convergence v2
686
+ durability contract, bounded startup/resume work, the guarded classifier reason
687
+ diagnostic, and the REPL fix that dismisses stale learning-recovery notices
688
+ after the first submitted query. These are intentional Runtime, Agent, LLM,
689
+ and REPL system-code changes. `zhipu-coding`, `zai-coding`, and `ark-coding`
690
+ default to `glm-5.3` while retaining `glm-5.2` as an explicit route; Ark keeps
691
+ the `glm-latest` alias. Coding Plan model IDs are sent verbatim without a
692
+ synthetic context suffix, and GLM-5.3 `off` / `none` intent is lowered to
693
+ `low`. See the [v0.7.88 release checklist](docs/release.md#v0788-release-preparation).
694
+
695
+ **v0.7.89 release:** this release ships Issue 293's topology-transparent managed
696
+ context projection and v4 conversation page cache, FEATURE_293's bounded
697
+ zero-service web search fallback (DuckDuckGo HTML → Bing RSS → Bing HTML), and
698
+ FEATURE_294's run-scoped Host Tools. Host tools appear in the leased run's model
699
+ surface and capability catalog, dispatch registry-first, revoke fail-closed, and
700
+ never enter the global registry or unrelated CLI runs. The web-search custom
701
+ endpoint remains isolated, and no shell/sandbox system code changed in this
702
+ release. See the [v0.7.89 release checklist](docs/release.md#v0789-release-preparation).
703
+
704
+ **v0.7.87 GLM provider release:** `zhipu-coding` defaults to `glm-5.3` and
705
+ retains `glm-5.2` as an explicit rollback route. `zai-coding` retained both
706
+ models but defaulted to `glm-5.2` until the overseas Coding Plan rollout
707
+ changed in v0.7.88. Coding Plan model IDs are sent verbatim without a context
708
+ suffix. GLM-5.3 is an always-thinking model, so an `off` / `none` intent is
709
+ lowered to `low` instead of sending an unsupported disabled-thinking request.
710
+ Issue 256's remaining Worker owner-lease boundary remained open after v0.7.87;
711
+ the release assigned no replacement target. See the
695
712
  [v0.7.87 release checklist](docs/release.md#v0787-release-preparation).
696
713
 
697
714
  The v0.7.77 release also adds an opt-in, host-configurable Shell Execution Contract.
@@ -1649,11 +1666,11 @@ await runInkInteractiveMode({ provider: 'zhipu-coding', effort: 'auto' });
1649
1666
  | qwen-token-plan | `QWEN_TOKEN_API_KEY` | Native | qwen3.8-max (Anthropic-compat; legacy `qwen3.8-max-preview` plus `qwen3.7-max` / `qwen3.7-plus` / `qwen3.6-flash` / `glm-5.2` / `deepseek-v4-pro` via `/model`; all 1M context; image input on both Qwen 3.8 IDs / 3.7 Plus / 3.6 Flash) |
1650
1667
  | zhipu | `ZHIPU_API_KEY` | Native | glm-5 (`glm-5.3` / `glm-5.2` 1M ctx, plus `glm-5.1` / `glm-5-turbo` via `/model`; GLM-5.3 is pre-registered while the public API remains marked upcoming) |
1651
1668
  | zhipu-coding | `ZHIPU_CODING_API_KEY` | Native | glm-5.3 (1M ctx, 128K output; `glm-5.2` rollback plus `glm-5-turbo` / `glm-4.7` via `/model`; raw upstream IDs) |
1652
- | zai-coding | `ZAI_CODING_API_KEY` | Native | glm-5.2 (`glm-5.3` remains selectable when the overseas Coding Plan account has access; raw upstream IDs) |
1669
+ | zai-coding | `ZAI_CODING_API_KEY` | Native | glm-5.3 (`glm-5.2` rollback; raw upstream IDs; switched from glm-5.2 default on 2026-08-15) |
1653
1670
  | minimax-coding | `MINIMAX_CODING_API_KEY` | Native | MiniMax-M3 (Frontier Coding, native multimodal + 1M ctx; legacy `MiniMax-M2.7` / `MiniMax-M2.7-highspeed` remain selectable via `/model`) |
1654
1671
  | mimo | `MIMO_API_KEY` | Native | mimo-v2.5-pro (Xiaomi MiMo pay-per-token, Anthropic-compat) |
1655
1672
  | mimo-coding | `MIMO_CODING_API_KEY` | Native | mimo-v2.5-pro (Xiaomi Token Plan, Anthropic-compat) |
1656
- | ark-coding | `ARK_CODING_API_KEY` | Native | glm-5.2 (Volcengine Ark Coding Plan — GLM-5.2 (alias: `glm-latest`) · Kimi K2.7 Code / K2.6 · MiniMax M3 / M2.7 · DeepSeek V4 Pro / V4 Flash · Doubao Seed 2.0 Code / Pro / Lite · Doubao Seed Code) |
1673
+ | ark-coding | `ARK_CODING_API_KEY` | Native | glm-5.3 (Volcengine Ark Coding Plan — GLM-5.3 (1M ctx, 128K out) · GLM-5.2 (alias: `glm-latest`) · Kimi K2.7 Code / K2.6 · MiniMax M3 / M2.7 · DeepSeek V4 Pro / V4 Flash · Doubao Seed 2.0 Code / Pro / Lite · Doubao Seed Code) |
1657
1674
  | deepseek | `DEEPSEEK_API_KEY` | Native | deepseek-v4-flash (`deepseek-v4-pro` via `/model`) |
1658
1675
  | gemini-cli | Provider CLI authentication (no KodaX API-key variable) | Prompt-only / CLI bridge | (via gemini CLI) |
1659
1676
  | codex-cli | Provider CLI authentication (no KodaX API-key variable) | Prompt-only / CLI bridge | (via codex CLI) |
package/README_CN.md CHANGED
@@ -247,7 +247,11 @@ v0.7.93。详见 [v0.7.83 发布清单](docs/release.md#v0783-release-preparatio
247
247
 
248
248
  **v0.7.86 加固发布**:本补丁版本加入 abandoned inline Runtime owner 的原子恢复、Runtime 与 learning lock 的 OS process-start identity 校验,以及 Windows sandbox 生命周期 attestation。Sandbox ACL owner marker 持久化并在不同 Runtime profile 间串行恢复;停止流程在 ACL 恢复前等待 process-tree termination proof,保留组合清理错误;如果 Shell effect 未证明已 drain,则继续 fence 后续文件系统 effect,绝不重放可能已经产生副作用的命令。POSIX workspace session 会在策略身份计算前初始化全新的 `KODAX_HOME` 内部目录,仅在既有 Shell abort/deadline 内等待当前 workspace 的 warm-up,并在 lease cleanup 失败后退役失效缓存;进程树或清理结果无法确认时同样保持 fail-closed,不允许旧 session 与替换 session 竞态。规范化 workspace、Agent Home、附加文件系统、toolchain 与网络策略完全一致的命令,可以跨 KodaX 进程共享同一个 Windows sandbox policy group。文件系统 effect 协调锁会在合法进程交接时等待完整的 30 秒 stale-owner 证明窗口,但不同 effect 类别之间原有的一秒 fail-closed 边界不变;不同策略或目标启动前的 sandbox 基础设施失败会回到已经授权的普通权限执行路径,目标已经启动或启动状态未知时绝不重放。Runtime sandbox capability v3 会隔离旧 daemon 的执行策略版本。Issue 256 剩余的 Worker owner lease 边界仍未关闭,曾改期到 v0.7.87。详见 [v0.7.86 发布清单](docs/release.md#v0786-release-preparation)。
249
249
 
250
- **v0.7.87 GLM Provider 发布**:`zhipu-coding` 现在默认使用 `glm-5.3`,并保留 `glm-5.2` 作为显式回退路由。`zai-coding` 同时保留两个模型,但默认使用 `glm-5.2`,因为海外 Coding Plan GLM-5.3 权限按账号开放。两个 alias 都向上游原样发送 `glm-5.3` / `glm-5.2`,不再附加 context 后缀。GLM-5.3 的思考不可关闭,因此 `off` / `none` 会降级为 `low`,不会发送上游不支持的 disabled-thinking 请求;REPL 不再提供无效的 off 档,旧配置会显示为 `off->low`。Issue 256 剩余的 Worker owner lease 边界不在本次 Provider 发布范围内,在 v0.7.87 后仍保持 Open,且本版本不指定新的替代目标。详见 [v0.7.87 发布清单](docs/release.md#v0787-release-preparation)。
250
+ **v0.7.88 发布**:本版本包含 Actor settlement convergence v2 持久化边界、受界定的启动/恢复工作、guardrail classifier reason 诊断,以及首次提交查询后自动收起过期 learning-recovery 提示的 REPL 修复。这些都是明确的 Runtime、Agent、LLM 与 REPL 系统代码改动。`zhipu-coding`、`zai-coding` `ark-coding` 均默认使用 `glm-5.3`,同时保留 `glm-5.2` 作为显式路由;Ark 继续保留 `glm-latest` 别名。Coding Plan model ID 原样发送,不附加虚假的 context 后缀;GLM-5.3 `off` / `none` 会降为 `low`。详见 [v0.7.88 发布清单](docs/release.md#v0788-release-preparation)。
251
+
252
+ **v0.7.89 发布**:本版本包含 Issue 293 的 managed context 拓扑透明投影与 v4 conversation page cache、FEATURE_293 的有界零服务 web search fallback(DuckDuckGo HTML → Bing RSS → Bing HTML),以及 FEATURE_294 的 run-scoped Host Tools。绑定到 Run 的 Host Tools 会出现在该 Run 的模型工具表和 capability catalog 中,按 registry-first 规则 dispatch,撤销后 fail-closed,不进入全局 registry,也不会泄漏到其他 CLI Run。自定义 web-search endpoint 仍保持隔离;本版本没有修改 shell/sandbox 系统代码。详见 [v0.7.89 发布清单](docs/release.md#v0789-release-preparation)。
253
+
254
+ **v0.7.87 GLM Provider 发布**:`zhipu-coding` 默认使用 `glm-5.3`,并保留 `glm-5.2` 作为显式回退路由。`zai-coding` 当时保留两个模型但默认使用 `glm-5.2`,直到 v0.7.88 的海外 Coding Plan 路由切换。Coding Plan model ID 原样发送,不附加 context 后缀。GLM-5.3 的思考不可关闭,因此 `off` / `none` 会降级为 `low`,不会发送上游不支持的 disabled-thinking 请求。Issue 256 剩余的 Worker owner lease 边界在 v0.7.87 后仍保持 Open,且本版本不指定新的替代目标。详见 [v0.7.87 发布清单](docs/release.md#v0787-release-preparation)。
251
255
 
252
256
  Windows workspace Shell 还会保留大小写不敏感的 `PATH`/`Path` 与 `PATHEXT` 约定,
253
257
  按最终 PATH 和 shell executable 生成有界读取授权,并在 broker 层之间保留 `cmd.exe`
@@ -776,11 +780,11 @@ dist/binary/linux-x64/
776
780
  | qwen-token-plan | `QWEN_TOKEN_API_KEY` | Native | qwen3.8-max(Anthropic 协议;可 `/model` 切换兼容项 `qwen3.8-max-preview` 及 `qwen3.7-max` / `qwen3.7-plus` / `qwen3.6-flash` / `glm-5.2` / `deepseek-v4-pro`;均为 1M ctx;两个 Qwen 3.8 ID / 3.7 Plus / 3.6 Flash 支持图片理解) |
777
781
  | zhipu | `ZHIPU_API_KEY` | Native | glm-5(可 `/model` 切换 `glm-5.3` / `glm-5.2`,均为 1M ctx,另有 `glm-5.1` / `glm-5-turbo`;GLM-5.3 开放平台 API 仍标注为即将上线) |
778
782
  | zhipu-coding | `ZHIPU_CODING_API_KEY` | Native | glm-5.3(1M ctx、128K 最大输出;可回退到 `glm-5.2`,也可切换 `glm-5-turbo` / `glm-4.7`;原样发送上游 ID) |
779
- | zai-coding | `ZAI_CODING_API_KEY` | Native | glm-5.2(保留 `glm-5.3` 供已获海外 Coding Plan 权限的账号选择;原样发送上游 ID) |
783
+ | zai-coding | `ZAI_CODING_API_KEY` | Native | glm-5.3(保留 `glm-5.2` 回退;原样发送上游 ID;2026-08-15 起默认从 glm-5.2 切换) |
780
784
  | minimax-coding | `MINIMAX_CODING_API_KEY` | Native | MiniMax-M3(Frontier Coding,原生多模态 + 1M ctx;仍可通过 `/model` 显式选择兼容模型 `MiniMax-M2.7` / `MiniMax-M2.7-highspeed`) |
781
785
  | mimo | `MIMO_API_KEY` | Native | mimo-v2.5-pro(小米 MiMo 按量计费,Anthropic 协议) |
782
786
  | mimo-coding | `MIMO_CODING_API_KEY` | Native | mimo-v2.5-pro(小米 MiMo Token Plan,Anthropic 协议) |
783
- | ark-coding | `ARK_CODING_API_KEY` | Native | glm-5.2(火山方舟 Coding Plan — GLM-5.2(别名 `glm-latest`) · Kimi K2.7 Code / K2.6 · MiniMax M3 / M2.7 · DeepSeek V4 Pro / V4 Flash · Doubao Seed 2.0 Code / Pro / Lite · Doubao Seed Code) |
787
+ | ark-coding | `ARK_CODING_API_KEY` | Native | glm-5.3(火山方舟 Coding Plan — GLM-5.3(1M ctx、128K out) · GLM-5.2(别名 `glm-latest`) · Kimi K2.7 Code / K2.6 · MiniMax M3 / M2.7 · DeepSeek V4 Pro / V4 Flash · Doubao Seed 2.0 Code / Pro / Lite · Doubao Seed Code) |
784
788
  | deepseek | `DEEPSEEK_API_KEY` | Native | deepseek-v4-flash(可 `/model` 切换 `deepseek-v4-pro`) |
785
789
  | gemini-cli | 由 Provider CLI 完成认证(无 KodaX API-key 环境变量) | Prompt-only / CLI bridge | (通过 gemini CLI) |
786
790
  | codex-cli | 由 Provider CLI 完成认证(无 KodaX API-key 环境变量) | Prompt-only / CLI bridge | (通过 codex CLI) |
@@ -0,0 +1,2 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{Ka as g,Ma as h,Za as i,_a as j,a as c,sa as d,ta as e,ua as f,yc as k}from"./chunk-A63MGLH6.js";import"./chunk-O2ZV775M.js";import"./chunk-5UBP47VJ.js";import"./chunk-W5RPVR3O.js";import"./chunk-PROPMIT4.js";import"./chunk-UNEC2WXJ.js";import{Jb as a,Kb as b}from"./chunk-72H6JNPN.js";import"./chunk-5247AKGN.js";import"./chunk-ONUPGMER.js";export{e as bucketProviderPayloadSize,g as buildAutoRepoIntelligenceContext,f as checkPromiseSignal,b as cleanupIncompleteToolCalls,h as describeTransientProviderRetry,c as emitResilienceDebug,d as estimateProviderPayloadBytes,k as runKodaX,j as saveRequiredSessionSnapshot,i as saveSessionSnapshot,a as validateAndFixToolHistory};
@@ -0,0 +1,2 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{Ha as a,Ia as b}from"./chunk-CQHLFQSU.js";import"./chunk-SOIIBADK.js";import"./chunk-4Y6OSDZE.js";import"./chunk-S74F7MFN.js";import"./chunk-IFD6TUQU.js";import"./chunk-A63MGLH6.js";import"./chunk-O2ZV775M.js";import"./chunk-BOMSVUJS.js";import"./chunk-5UBP47VJ.js";import"./chunk-W5RPVR3O.js";import"./chunk-PROPMIT4.js";import"./chunk-UNEC2WXJ.js";import"./chunk-72H6JNPN.js";import"./chunk-5247AKGN.js";import"./chunk-ONUPGMER.js";export{a as ArgumentCompleter,b as createArgumentCompleter};
@@ -1,2 +1,2 @@
1
1
  // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{Ja as c,df as o}from"./chunk-ITP7J5HX.js";import{a as n}from"./chunk-ONUPGMER.js";import{readFile as a}from"fs/promises";var i={enabled:!0,triggerPercent:75};async function s(r){let t=c("config.json");try{let e=await f(t);if(e?.compaction)return o({...i,...e.compaction})}catch{}return o(i)}n(s,"loadCompactionConfig");async function f(r){try{let t=await a(r,"utf-8");return JSON.parse(t)}catch{return null}}n(f,"readConfigFile");export{s as a};
2
+ import{Ja as c,df as o}from"./chunk-72H6JNPN.js";import{a as n}from"./chunk-ONUPGMER.js";import{readFile as a}from"fs/promises";var i={enabled:!0,triggerPercent:75};async function s(r){let t=c("config.json");try{let e=await f(t);if(e?.compaction)return o({...i,...e.compaction})}catch{}return o(i)}n(s,"loadCompactionConfig");async function f(r){try{let t=await a(r,"utf-8");return JSON.parse(t)}catch{return null}}n(f,"readConfigFile");export{s as a};
@@ -1,8 +1,8 @@
1
1
  // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{a as n}from"./chunk-ONUPGMER.js";var M={user:0,background:1};function xt(e,t){return M[e]<=M[t]}n(xt,"priorityWithinMax");function me(e,t){return!(e.agentId!==t.agentId||!xt(e.priority,t.maxPriority)||t.mode!==void 0&&e.mode!==t.mode||t.id!==void 0&&e.id!==t.id||t.predicate&&!t.predicate(e))}n(me,"matchesFilter");var U=class{static{n(this,"MessageQueue")}messages=[];nextSeq=1;listeners=new Set;snapshotRef=Object.freeze([]);notify(t){this.snapshotRef=Object.freeze([...this.messages]);for(let o of this.listeners)try{o(t)}catch{}}subscribe=n(t=>(this.listeners.add(t),()=>{this.listeners.delete(t)}),"subscribe");getSnapshot=n(()=>this.snapshotRef,"getSnapshot");enqueue(t){let o=`msg-${this.nextSeq++}`,r={id:o,priority:t.priority,mode:t.mode,content:t.content,agentId:t.agentId,inputArtifacts:t.inputArtifacts,taskResult:t.taskResult,enqueuedAt:Date.now()};return this.messages=[...this.messages,r],this.notify({kind:"enqueued",message:r}),o}dequeue(t){let o=[];for(let d=0;d<this.messages.length;d++){let l=this.messages[d];l&&me(l,t)&&o.push({originalIndex:d,message:l})}o.sort((d,l)=>{let y=M[d.message.priority]-M[l.message.priority];return y!==0?y:d.originalIndex-l.originalIndex});let r=t.limit,i=typeof r=="number"&&o.length>r?o.slice(0,r):o;if(i.length===0)return[];let s=new Set(i.map(d=>d.originalIndex));this.messages=this.messages.filter((d,l)=>!s.has(l));let a=i.map(d=>d.message);return this.notify({kind:"dequeued",messages:a}),a}peek(t){let o=[];for(let s=0;s<this.messages.length;s++){let a=this.messages[s];a&&me(a,t)&&o.push({originalIndex:s,message:a})}o.sort((s,a)=>{let d=M[s.message.priority]-M[a.message.priority];return d!==0?d:s.originalIndex-a.originalIndex});let r=t.limit;return(typeof r=="number"&&o.length>r?o.slice(0,r):o).map(s=>s.message)}size(){return this.messages.length}count(t){return this.peek(t).length}has(t){return this.count(t)>0}clear(){if(this.messages.length===0)return;let t=this.messages;this.messages=[],this.notify({kind:"cleared",messages:t})}},j;function I(){return j||(j=new U),j}n(I,"getMessageQueue");function wt(){j=void 0}n(wt,"_resetMessageQueueForTests");function J(e,t){return e?`actor:${e}:${t}`:t==="/root"?void 0:t}n(J,"actorQueueId");var k=new Map;function Mt(e){k.set(e,(k.get(e)??0)+1);let t=!1;return()=>{if(t)return;t=!0;let o=k.get(e);o===void 0||o<=1?k.delete(e):k.set(e,o-1)}}n(Mt,"registerActiveRootQueueRoute");function Y(){if(k.size!==0){if(k.size===1)return k.keys().next().value;throw new Error("Cannot infer queued follow-up target: multiple Actor root sessions are active. Pass sessionId or agentId explicitly.")}}n(Y,"resolveActiveRootQueueRoute");function St(){k.clear()}n(St,"_resetActiveRootQueueRoutesForTests");var he=new Set(["wait_agent"]);function ye(e){return e.some(o=>he.has(o))?"background":"user"}n(ye,"midTurnDrainPriority");function _t(e){let t=ye(e.lastTurnToolNames);return I().dequeue({agentId:e.agentId,maxPriority:t,limit:e.limit})}n(_t,"maybeDrainMidTurn");var m=class extends Error{static{n(this,"KodaXMediaError")}code;detail;cause;constructor(t,o,r={}){super(o),this.name="KodaXMediaError",this.code=t,this.detail=r.detail,this.cause=r.cause}},x=class extends m{static{n(this,"ImageResizeError")}constructor(t,o={}){super(o.code??"IMAGE_TOO_LARGE",t,o),this.name="ImageResizeError"}};import be from"node:path";var At={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"},Kt={".3gp":"video/3gpp",".3gpp":"video/3gpp",".avi":"video/x-msvideo",".flv":"video/x-flv",".mov":"video/quicktime",".mp4":"video/mp4",".mpeg":"video/mpeg",".mpg":"video/mpeg",".webm":"video/webm",".wmv":"video/x-ms-wmv"};function ve(e){return At[be.extname(e).toLowerCase()]}n(ve,"inferImageMediaType");function ke(e){return Kt[be.extname(e).toLowerCase()]}n(ke,"inferVideoMediaType");function Xt(e,t={}){let o=t.mediaType??ve(e);return{kind:"image",path:e,...o?{mediaType:o}:{},...t.source?{source:t.source}:{},...t.description?{description:t.description}:{}}}n(Xt,"createImageArtifactFromPath");function It(e,t={}){if(t.mediaType!==void 0&&t.mimeType!==void 0&&t.mediaType!==t.mimeType)throw new m("UNSUPPORTED_MEDIA_TYPE",`File artifact mediaType and mimeType disagree: ${t.mediaType} != ${t.mimeType}.`);return{kind:"file",path:e,...t.mediaType?{mediaType:t.mediaType}:{},...t.mimeType?{mimeType:t.mimeType}:{},...t.name?{name:t.name}:{},...t.source?{source:t.source}:{},...t.description?{description:t.description}:{}}}n(It,"createFileArtifactFromPath");function Ot(e,t={}){let o=t.mediaType??ke(e);if(!o)throw new m("UNSUPPORTED_MEDIA_TYPE",`Cannot infer video media type from path: ${e}.`);return{kind:"video",path:e,mediaType:o,...t.name?{name:t.name}:{},...t.source?{source:t.source}:{},...t.description?{description:t.description}:{}}}n(Ot,"createVideoArtifactFromPath");import{Jimp as Dt}from"jimp";var Ce=2e3,Pe=Math.floor(3.75*1024*1024),Nt=[80,60,40];async function Q(e,t={}){let o=t.maxDimension??Ce,r=t.targetBytes??Pe;if(e.length===0)throw new x("Empty image buffer.",{code:"IMAGE_DECODE_FAILED"});let i;try{i=await Dt.read(e)}catch(u){let v=u instanceof Error?u.message:String(u);throw new x(`Failed to decode image: ${v}`,{code:"IMAGE_DECODE_FAILED",cause:u})}let{width:s,height:a}=i.bitmap,d=Math.max(s,a);if(d>o){let u=o/d;i.resize({w:Math.max(1,Math.round(s*u)),h:Math.max(1,Math.round(a*u))})}let l=i.bitmap.width,y=i.bitmap.height;if(t.preferMediaType!=="image/jpeg"){let u=await i.getBuffer("image/png");if(u.length<=r)return{buffer:Buffer.from(u),mediaType:"image/png",width:l,height:y}}for(let u of Nt){let v=await i.getBuffer("image/jpeg",{quality:u});if(v.length<=r)return{buffer:Buffer.from(v),mediaType:"image/jpeg",width:l,height:y}}if(t.preferMediaType==="image/jpeg"){let u=await i.getBuffer("image/png");if(u.length<=r)return{buffer:Buffer.from(u),mediaType:"image/png",width:l,height:y}}throw new x(`Image still exceeds budget (${r} bytes raw) after PNG and JPEG q40 compression. Try a smaller image or take a fresh screenshot of a smaller region.`,{code:"IMAGE_TOO_LARGE"})}n(Q,"normalizePastedImage");import{spawn as Ee}from"node:child_process";import{mkdtemp as Bt,readFile as Lt,rm as Ft}from"node:fs/promises";import{tmpdir as $t}from"node:os";import Te from"node:path";var xe=5e3;async function we(){switch(process.platform){case"darwin":return Ut();case"win32":return Wt();case"linux":return zt();default:throw new m("UNSUPPORTED_PLATFORM",`Clipboard image fallback is not supported on platform "${process.platform}".`)}}n(we,"readClipboardImage");async function jt(e={}){let t=await we();return t?Q(t,e):null}n(jt,"readAndNormalizeClipboardImage");async function Me(e){let t=await Bt(Te.join($t(),"kodax-clip-")),o=Te.join(t,"clip.png");try{return await e(o)}finally{await Ft(t,{recursive:!0,force:!0}).catch(r=>{})}}n(Me,"runWithTempPng");async function Ut(){return Me(async e=>{let t=`set png_data to (the clipboard as \xABclass PNGf\xBB)
2
+ import{a as n}from"./chunk-ONUPGMER.js";var M={user:0,background:1};function xt(e,t){return M[e]<=M[t]}n(xt,"priorityWithinMax");function me(e,t){return!(e.agentId!==t.agentId||!xt(e.priority,t.maxPriority)||t.mode!==void 0&&e.mode!==t.mode||t.id!==void 0&&e.id!==t.id||t.predicate&&!t.predicate(e))}n(me,"matchesFilter");var U=class{static{n(this,"MessageQueue")}messages=[];nextSeq=1;listeners=new Set;snapshotRef=Object.freeze([]);notify(t){this.snapshotRef=Object.freeze([...this.messages]);for(let o of this.listeners)try{o(t)}catch{}}subscribe=n(t=>(this.listeners.add(t),()=>{this.listeners.delete(t)}),"subscribe");getSnapshot=n(()=>this.snapshotRef,"getSnapshot");enqueue(t){let o=`msg-${this.nextSeq++}`,r={id:o,priority:t.priority,mode:t.mode,content:t.content,agentId:t.agentId,inputArtifacts:t.inputArtifacts,taskResult:t.taskResult,enqueuedAt:Date.now()};return this.messages=[...this.messages,r],this.notify({kind:"enqueued",message:r}),o}dequeue(t){let o=[];for(let d=0;d<this.messages.length;d++){let l=this.messages[d];l&&me(l,t)&&o.push({originalIndex:d,message:l})}o.sort((d,l)=>{let y=M[d.message.priority]-M[l.message.priority];return y!==0?y:d.originalIndex-l.originalIndex});let r=t.limit,i=typeof r=="number"&&o.length>r?o.slice(0,r):o;if(i.length===0)return[];let s=new Set(i.map(d=>d.originalIndex));this.messages=this.messages.filter((d,l)=>!s.has(l));let a=i.map(d=>d.message);return this.notify({kind:"dequeued",messages:a}),a}peek(t){let o=[];for(let s=0;s<this.messages.length;s++){let a=this.messages[s];a&&me(a,t)&&o.push({originalIndex:s,message:a})}o.sort((s,a)=>{let d=M[s.message.priority]-M[a.message.priority];return d!==0?d:s.originalIndex-a.originalIndex});let r=t.limit;return(typeof r=="number"&&o.length>r?o.slice(0,r):o).map(s=>s.message)}size(){return this.messages.length}count(t){return this.peek(t).length}has(t){return this.count(t)>0}clear(){if(this.messages.length===0)return;let t=this.messages;this.messages=[],this.notify({kind:"cleared",messages:t})}},j;function I(){return j||(j=new U),j}n(I,"getMessageQueue");function wt(){j=void 0}n(wt,"_resetMessageQueueForTests");function J(e,t){return e?`actor:${e}:${t}`:t==="/root"?void 0:t}n(J,"actorQueueId");var k=new Map;function Mt(e){k.set(e,(k.get(e)??0)+1);let t=!1;return()=>{if(t)return;t=!0;let o=k.get(e);o===void 0||o<=1?k.delete(e):k.set(e,o-1)}}n(Mt,"registerActiveRootQueueRoute");function Y(){if(k.size!==0){if(k.size===1)return k.keys().next().value;throw new Error("Cannot infer queued follow-up target: multiple Actor root sessions are active. Pass sessionId or agentId explicitly.")}}n(Y,"resolveActiveRootQueueRoute");function St(){k.clear()}n(St,"_resetActiveRootQueueRoutesForTests");var he=new Set(["wait_agent"]);function ye(e){return e.some(o=>he.has(o))?"background":"user"}n(ye,"midTurnDrainPriority");function _t(e){let t=ye(e.lastTurnToolNames);return I().dequeue({agentId:e.agentId,maxPriority:t,limit:e.limit})}n(_t,"maybeDrainMidTurn");var m=class extends Error{static{n(this,"KodaXMediaError")}code;detail;cause;constructor(t,o,r={}){super(o),this.name="KodaXMediaError",this.code=t,this.detail=r.detail,this.cause=r.cause}},x=class extends m{static{n(this,"ImageResizeError")}constructor(t,o={}){super(o.code??"IMAGE_TOO_LARGE",t,o),this.name="ImageResizeError"}};import be from"node:path";var At={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"},Kt={".3gp":"video/3gpp",".3gpp":"video/3gpp",".avi":"video/x-msvideo",".flv":"video/x-flv",".mov":"video/quicktime",".mp4":"video/mp4",".mpeg":"video/mpeg",".mpg":"video/mpeg",".webm":"video/webm",".wmv":"video/x-ms-wmv"};function ve(e){return At[be.extname(e).toLowerCase()]}n(ve,"inferImageMediaType");function ke(e){return Kt[be.extname(e).toLowerCase()]}n(ke,"inferVideoMediaType");function Xt(e,t={}){let o=t.mediaType??ve(e);return{kind:"image",path:e,...o?{mediaType:o}:{},...t.source?{source:t.source}:{},...t.description?{description:t.description}:{}}}n(Xt,"createImageArtifactFromPath");function It(e,t={}){if(t.mediaType!==void 0&&t.mimeType!==void 0&&t.mediaType!==t.mimeType)throw new m("UNSUPPORTED_MEDIA_TYPE",`File artifact mediaType and mimeType disagree: ${t.mediaType} != ${t.mimeType}.`);return{kind:"file",path:e,...t.mediaType?{mediaType:t.mediaType}:{},...t.mimeType?{mimeType:t.mimeType}:{},...t.name?{name:t.name}:{},...t.source?{source:t.source}:{},...t.description?{description:t.description}:{}}}n(It,"createFileArtifactFromPath");function Ot(e,t={}){let o=t.mediaType??ke(e);if(!o)throw new m("UNSUPPORTED_MEDIA_TYPE",`Cannot infer video media type from path: ${e}.`);return{kind:"video",path:e,mediaType:o,...t.name?{name:t.name}:{},...t.source?{source:t.source}:{},...t.description?{description:t.description}:{}}}n(Ot,"createVideoArtifactFromPath");var Ce=2e3,Pe=Math.floor(3.75*1024*1024),Dt=[80,60,40];async function Q(e,t={}){let o=t.maxDimension??Ce,r=t.targetBytes??Pe;if(e.length===0)throw new x("Empty image buffer.",{code:"IMAGE_DECODE_FAILED"});let i;try{let{Jimp:u}=await import("jimp");i=await u.read(e)}catch(u){let v=u instanceof Error?u.message:String(u);throw new x(`Failed to decode image: ${v}`,{code:"IMAGE_DECODE_FAILED",cause:u})}let{width:s,height:a}=i.bitmap,d=Math.max(s,a);if(d>o){let u=o/d;i.resize({w:Math.max(1,Math.round(s*u)),h:Math.max(1,Math.round(a*u))})}let l=i.bitmap.width,y=i.bitmap.height;if(t.preferMediaType!=="image/jpeg"){let u=await i.getBuffer("image/png");if(u.length<=r)return{buffer:Buffer.from(u),mediaType:"image/png",width:l,height:y}}for(let u of Dt){let v=await i.getBuffer("image/jpeg",{quality:u});if(v.length<=r)return{buffer:Buffer.from(v),mediaType:"image/jpeg",width:l,height:y}}if(t.preferMediaType==="image/jpeg"){let u=await i.getBuffer("image/png");if(u.length<=r)return{buffer:Buffer.from(u),mediaType:"image/png",width:l,height:y}}throw new x(`Image still exceeds budget (${r} bytes raw) after PNG and JPEG q40 compression. Try a smaller image or take a fresh screenshot of a smaller region.`,{code:"IMAGE_TOO_LARGE"})}n(Q,"normalizePastedImage");import{spawn as Ee}from"node:child_process";import{mkdtemp as Nt,readFile as Bt,rm as Lt}from"node:fs/promises";import{tmpdir as Ft}from"node:os";import Te from"node:path";var xe=5e3;async function we(){switch(process.platform){case"darwin":return jt();case"win32":return Ut();case"linux":return Wt();default:throw new m("UNSUPPORTED_PLATFORM",`Clipboard image fallback is not supported on platform "${process.platform}".`)}}n(we,"readClipboardImage");async function $t(e={}){let t=await we();return t?Q(t,e):null}n($t,"readAndNormalizeClipboardImage");async function Me(e){let t=await Nt(Te.join(Ft(),"kodax-clip-")),o=Te.join(t,"clip.png");try{return await e(o)}finally{await Lt(t,{recursive:!0,force:!0}).catch(r=>{})}}n(Me,"runWithTempPng");async function jt(){return Me(async e=>{let t=`set png_data to (the clipboard as \xABclass PNGf\xBB)
3
3
  set fh to open for access POSIX file "${e.replace(/"/g,'\\"')}" with write permission
4
4
  write png_data to fh
5
- close access fh`;return await _e("osascript",["-e",t])?Se(e):null})}n(Ut,"readMacClipboard");async function Wt(){return Me(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("; ");return await _e("powershell",["-NoProfile","-Command",t])?Se(e):null})}n(Wt,"readWinClipboard");async function zt(){return await Re("wl-paste",["--type","image/png"])??Re("xclip",["-selection","clipboard","-t","image/png","-o"])}n(zt,"readLinuxClipboard");async function Se(e){try{let t=await Lt(e);return t.length>0?t:null}catch(t){return null}}n(Se,"readNonEmptyFile");function _e(e,t){return new Promise(o=>{let r=!1,i=Ee(e,[...t],{stdio:"ignore",windowsHide:!0}),s=setTimeout(()=>{r||(r=!0,i.kill(),o(!1))},xe);i.once("error",()=>{r||(r=!0,clearTimeout(s),o(!1))}),i.once("exit",a=>{r||(r=!0,clearTimeout(s),o(a===0))})})}n(_e,"runCommand");function Re(e,t){return new Promise(o=>{let r=!1,i=[],s=Ee(e,[...t],{stdio:["ignore","pipe","ignore"],windowsHide:!0}),a=setTimeout(()=>{r||(r=!0,s.kill(),o(null))},xe);s.stdout?.on("data",d=>i.push(d)),s.once("error",()=>{r||(r=!0,clearTimeout(a),o(null))}),s.once("exit",d=>{if(r)return;if(r=!0,clearTimeout(a),d!==0){o(null);return}let l=Buffer.concat(i);o(l.length>0?l:null)})})}n(Re,"collectStdoutBytes");import{createHash as Vt}from"node:crypto";import{mkdir as Gt,readdir as qt,stat as Ht,unlink as Jt,writeFile as Yt}from"node:fs/promises";import{tmpdir as Qt}from"node:os";import Z from"node:path";var Ae="KODAX_PASTE_TMP_DIR",Ke=1440*60*1e3;function Xe(){return process.env[Ae]??Z.join(Qt(),"kodax-paste")}n(Xe,"resolvePasteTmpDir");function Zt(e){let t=e?.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return t&&t.length>0?t:"paste"}n(Zt,"sanitizeFileNamePrefix");async function en(e,t={}){let o=t.directory??Xe();await Gt(o,{recursive:!0});let r=e.mediaType==="image/jpeg"?".jpg":".png",i=Vt("sha256").update(e.buffer).digest("hex").slice(0,16),s=`${Zt(t.fileNamePrefix)}-${i}${r}`,a=Z.join(o,s);return await Yt(a,e.buffer),{type:"image",path:a,mediaType:e.mediaType}}n(en,"persistImageAsBlock");async function tn(e=Date.now()){let t=Xe(),o;try{o=await qt(t)}catch(s){return 0}let r=e-Ke,i=0;return await Promise.all(o.filter(s=>/-[0-9a-f]{16}\.(?:png|jpg)$/.test(s)).map(async s=>{let a=Z.join(t,s);try{(await Ht(a)).mtimeMs<r&&(await Jt(a),i+=1)}catch(d){}})),i}n(tn,"prunePasteTmpDir");import{AsyncLocalStorage as nn}from"node:async_hooks";var on=new nn;function rn(e){let t=on.getStore()?.credential;return t?O(e,t,new WeakMap):e}n(rn,"redactScopedProviderCredential");function O(e,t,o){if(typeof e=="string")return e.split(t).join("[REDACTED_CREDENTIAL]");if(e===null||typeof e!="object")return e;let r=o.get(e);if(r!==void 0)return r;if(e instanceof Error){let s=new Error(O(e.message,t,o));return o.set(e,s),s.name=e.name,e.stack!==void 0&&(s.stack=O(e.stack,t,o)),s}if(Array.isArray(e)){let s=[];o.set(e,s);for(let a of e)s.push(O(a,t,o));return s}let i={};o.set(e,i);for(let[s,a]of Object.entries(Object.getOwnPropertyDescriptors(e))){if(!a.enumerable||!("value"in a))continue;let d=s.split(t).join("[REDACTED_CREDENTIAL]");i[d]=O(a.value,t,o)}return i}n(O,"redactCredentialValue");function W(e,t){return`${e}/${t??""}`}n(W,"capabilityCacheKey");function sn(e,t,o){return e[W(t,o)]?.rejected??[]}n(sn,"getRejectedEfforts");function an(e,t,o,r,i,s){let a=W(t,o),d=e[a],l=d?.rejected.includes(r)?d.rejected:[...d?.rejected??[],r];return{...e,[a]:{rejected:l,source:i,updatedAt:s}}}n(an,"addRejectedEffort");function dn(e,t,o){if(!t)return{};let r={...e};return delete r[W(t,o)],r}n(dn,"removeCacheEntry");function ln(e){if(!e||typeof e!="object")return{};let t={};for(let[o,r]of Object.entries(e)){if(!r||typeof r!="object")continue;let i=r,s=Array.isArray(i.rejected)?i.rejected.filter(l=>typeof l=="string"):[],a=i.source==="probed"?"probed":"observed",d=typeof i.updatedAt=="string"?i.updatedAt:"";t[o]={rejected:s,source:a,updatedAt:d}}return t}n(ln,"sanitizeCapabilityCache");import{AsyncLocalStorage as un}from"node:async_hooks";var cn=new un,Ie=8,Oe=32;function fn(e){if(e===void 0)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}n(fn,"parsePositiveInt");function pn(){let e=ee()?.workflow?.maxConcurrency,t=typeof e=="number"&&Number.isInteger(e)&&e>0?e:fn(process.env.KODAX_WORKFLOW_MAX_CONCURRENCY)??Ie;return Math.max(1,Math.min(Oe,t))}n(pn,"resolveWorkflowMaxConcurrency");function ee(){return cn.getStore()}n(ee,"getRunScopedConfig");var D={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},De={...D,multimodalSupport:"image-input"},z={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},Ne={...z,multimodalSupport:"image-input"};function N(e){return{transport:e.transport,conversationSemantics:e.conversationSemantics,mcpSupport:e.mcpSupport,contextFidelity:e.contextFidelity??"full",toolCallingFidelity:e.toolCallingFidelity??"full",sessionSupport:e.sessionSupport??"full",longRunningSupport:e.longRunningSupport??"full",multimodalSupport:e.multimodalSupport??"none",evidenceSupport:e.evidenceSupport??"full"}}n(N,"normalizeCapabilityProfile");import Ti from"@anthropic-ai/sdk";import{parse as li}from"partial-json";import Li from"openai";import{ClientSideConnection as rs,PROTOCOL_VERSION as is,ndJsonStream as ss}from"@agentclientprotocol/sdk";var Yi=Object.freeze({status:"terminated"}),Qi=Object.freeze({status:"already-exited"}),Zi=Object.freeze({status:"unknown"}),es=String.raw`
5
+ close access fh`;return await _e("osascript",["-e",t])?Se(e):null})}n(jt,"readMacClipboard");async function Ut(){return Me(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("; ");return await _e("powershell",["-NoProfile","-Command",t])?Se(e):null})}n(Ut,"readWinClipboard");async function Wt(){return await Re("wl-paste",["--type","image/png"])??Re("xclip",["-selection","clipboard","-t","image/png","-o"])}n(Wt,"readLinuxClipboard");async function Se(e){try{let t=await Bt(e);return t.length>0?t:null}catch(t){return null}}n(Se,"readNonEmptyFile");function _e(e,t){return new Promise(o=>{let r=!1,i=Ee(e,[...t],{stdio:"ignore",windowsHide:!0}),s=setTimeout(()=>{r||(r=!0,i.kill(),o(!1))},xe);i.once("error",()=>{r||(r=!0,clearTimeout(s),o(!1))}),i.once("exit",a=>{r||(r=!0,clearTimeout(s),o(a===0))})})}n(_e,"runCommand");function Re(e,t){return new Promise(o=>{let r=!1,i=[],s=Ee(e,[...t],{stdio:["ignore","pipe","ignore"],windowsHide:!0}),a=setTimeout(()=>{r||(r=!0,s.kill(),o(null))},xe);s.stdout?.on("data",d=>i.push(d)),s.once("error",()=>{r||(r=!0,clearTimeout(a),o(null))}),s.once("exit",d=>{if(r)return;if(r=!0,clearTimeout(a),d!==0){o(null);return}let l=Buffer.concat(i);o(l.length>0?l:null)})})}n(Re,"collectStdoutBytes");import{createHash as zt}from"node:crypto";import{mkdir as Vt,readdir as Gt,stat as qt,unlink as Ht,writeFile as Jt}from"node:fs/promises";import{tmpdir as Yt}from"node:os";import Z from"node:path";var Ae="KODAX_PASTE_TMP_DIR",Ke=1440*60*1e3;function Xe(){return process.env[Ae]??Z.join(Yt(),"kodax-paste")}n(Xe,"resolvePasteTmpDir");function Qt(e){let t=e?.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return t&&t.length>0?t:"paste"}n(Qt,"sanitizeFileNamePrefix");async function Zt(e,t={}){let o=t.directory??Xe();await Vt(o,{recursive:!0});let r=e.mediaType==="image/jpeg"?".jpg":".png",i=zt("sha256").update(e.buffer).digest("hex").slice(0,16),s=`${Qt(t.fileNamePrefix)}-${i}${r}`,a=Z.join(o,s);return await Jt(a,e.buffer),{type:"image",path:a,mediaType:e.mediaType}}n(Zt,"persistImageAsBlock");async function en(e=Date.now()){let t=Xe(),o;try{o=await Gt(t)}catch(s){return 0}let r=e-Ke,i=0;return await Promise.all(o.filter(s=>/-[0-9a-f]{16}\.(?:png|jpg)$/.test(s)).map(async s=>{let a=Z.join(t,s);try{(await qt(a)).mtimeMs<r&&(await Ht(a),i+=1)}catch(d){}})),i}n(en,"prunePasteTmpDir");import{AsyncLocalStorage as tn}from"node:async_hooks";var nn=new tn;function on(e){let t=nn.getStore()?.credential;return t?O(e,t,new WeakMap):e}n(on,"redactScopedProviderCredential");function O(e,t,o){if(typeof e=="string")return e.split(t).join("[REDACTED_CREDENTIAL]");if(e===null||typeof e!="object")return e;let r=o.get(e);if(r!==void 0)return r;if(e instanceof Error){let s=new Error(O(e.message,t,o));return o.set(e,s),s.name=e.name,e.stack!==void 0&&(s.stack=O(e.stack,t,o)),s}if(Array.isArray(e)){let s=[];o.set(e,s);for(let a of e)s.push(O(a,t,o));return s}let i={};o.set(e,i);for(let[s,a]of Object.entries(Object.getOwnPropertyDescriptors(e))){if(!a.enumerable||!("value"in a))continue;let d=s.split(t).join("[REDACTED_CREDENTIAL]");i[d]=O(a.value,t,o)}return i}n(O,"redactCredentialValue");function W(e,t){return`${e}/${t??""}`}n(W,"capabilityCacheKey");function rn(e,t,o){return e[W(t,o)]?.rejected??[]}n(rn,"getRejectedEfforts");function sn(e,t,o,r,i,s){let a=W(t,o),d=e[a],l=d?.rejected.includes(r)?d.rejected:[...d?.rejected??[],r];return{...e,[a]:{rejected:l,source:i,updatedAt:s}}}n(sn,"addRejectedEffort");function an(e,t,o){if(!t)return{};let r={...e};return delete r[W(t,o)],r}n(an,"removeCacheEntry");function dn(e){if(!e||typeof e!="object")return{};let t={};for(let[o,r]of Object.entries(e)){if(!r||typeof r!="object")continue;let i=r,s=Array.isArray(i.rejected)?i.rejected.filter(l=>typeof l=="string"):[],a=i.source==="probed"?"probed":"observed",d=typeof i.updatedAt=="string"?i.updatedAt:"";t[o]={rejected:s,source:a,updatedAt:d}}return t}n(dn,"sanitizeCapabilityCache");import{AsyncLocalStorage as ln}from"node:async_hooks";var un=new ln,Ie=8,Oe=32;function cn(e){if(e===void 0)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}n(cn,"parsePositiveInt");function fn(){let e=ee()?.workflow?.maxConcurrency,t=typeof e=="number"&&Number.isInteger(e)&&e>0?e:cn(process.env.KODAX_WORKFLOW_MAX_CONCURRENCY)??Ie;return Math.max(1,Math.min(Oe,t))}n(fn,"resolveWorkflowMaxConcurrency");function ee(){return un.getStore()}n(ee,"getRunScopedConfig");var D={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},De={...D,multimodalSupport:"image-input"},z={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},Ne={...z,multimodalSupport:"image-input"};function N(e){return{transport:e.transport,conversationSemantics:e.conversationSemantics,mcpSupport:e.mcpSupport,contextFidelity:e.contextFidelity??"full",toolCallingFidelity:e.toolCallingFidelity??"full",sessionSupport:e.sessionSupport??"full",longRunningSupport:e.longRunningSupport??"full",multimodalSupport:e.multimodalSupport??"none",evidenceSupport:e.evidenceSupport??"full"}}n(N,"normalizeCapabilityProfile");import{createRequire as Mn}from"node:module";import{parse as li}from"partial-json";var Ki=Mn(import.meta.url);import{createRequire as An}from"node:module";var qi=An(import.meta.url);var Yi=Object.freeze({status:"terminated"}),Qi=Object.freeze({status:"already-exited"}),Zi=Object.freeze({status:"unknown"}),es=String.raw`
6
6
  using System;
7
7
  using System.Runtime.InteropServices;
8
8
  using System.Text;
@@ -89,4 +89,4 @@ public static class KodaXNativeProcessSnapshot {
89
89
  CloseHandle(snapshot);
90
90
  }
91
91
  }
92
- }`;import We from"node:fs";import ze from"node:os";import Ve from"node:path";var On="gpt-5.4",Dn="auto-gemini-3",Nn=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],Bn=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function Ge(e){let t=new Set,o=[];for(let r of e){let i=r.trim();if(!i)continue;let s=i.toLowerCase();t.has(s)||(t.add(s),o.push(i))}return o}n(Ge,"dedupePreserveOrder");function Ln(){let e=Ve.join(ze.homedir(),".codex","config.toml");try{return We.readFileSync(e,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}n(Ln,"readCodexConfiguredModel");function Fn(){let e=Ve.join(ze.homedir(),".gemini","settings.json");try{let t=JSON.parse(We.readFileSync(e,"utf8")),o=typeof t.model=="string"?t.model.trim():"";return o||(typeof t.general?.model=="string"?t.general.model.trim():"")||null}catch{return null}}n(Fn,"readGeminiConfiguredModel");function S(){return Ln()||On}n(S,"getCodexCliDefaultModel");function _(){return Fn()||Dn}n(_,"getGeminiCliDefaultModel");function B(){return Ge([S(),...Nn])}n(B,"getCodexCliKnownModels");function L(){return Ge([_(),...Bn])}n(L,"getGeminiCliKnownModels");var Fs=_(),$s=L();var Zs=S(),ea=B();import{existsSync as Yn,readFileSync as Qn}from"node:fs";import K from"node:path";import{fileURLToPath as Zn}from"node:url";var qe=["none","prompt-only","native-effort","native-budget","native-toggle","native-adaptive","unknown"],He=["openai-responses-effort","openai-chat-effort","codex-cli-config","anthropic-output-effort","anthropic-reasoning-effort","provider-budget","provider-toggle","prompt-only","none"],Je=["anthropic-adaptive","anthropic-budget","provider-budget","provider-toggle","none"],Ye=["zai-glm-5.3","zai-glm-5.2","zai-glm-toggle","deepseek-v4-flash-openai","deepseek-v4-pro-openai","deepseek-v4-openai","deepseek-v4-anthropic","deepseek-toggle","kimi-k3","kimi-k2.7-code","kimi-hybrid-toggle","minimax-m3","minimax-m2-always","mimo-v2.5-toggle","qwen-hybrid-thinking","openai-chat-reasoning","openai-responses-reasoning","codex-cli-effort","claude-adaptive-xhigh","claude-adaptive-max","anthropic-budget","generic-thinking-toggle","none"],Qe=["max_tokens","max_completion_tokens"],Ze=["native","image-input-native","cli-bridge","image-input-cli-bridge"],et=["count-tokens","models-list","minimal-message","unsupported"];function C(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}n(C,"isPlainObject");function w(e,t){if(typeof e!="string"||e.length===0)throw new Error(`provider-capabilities.json: ${t} must be a non-empty string`);return e}n(w,"requireString");function A(e,t){if(e!==void 0)return w(e,t)}n(A,"optionalString");function ot(e,t){if(e!==void 0){if(typeof e!="string"||!Qe.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Qe.join(", ")}, got ${JSON.stringify(e)}`);return e}}n(ot,"optionalMaxOutputTokensField");function E(e,t){if(e!==void 0){if(typeof e!="number"||!Number.isFinite(e)||e<0)throw new Error(`provider-capabilities.json: ${t} must be a non-negative finite number`);return e}}n(E,"optionalNumber");function h(e,t){if(e!==void 0){if(typeof e!="boolean")throw new Error(`provider-capabilities.json: ${t} must be a boolean`);return e}}n(h,"optionalBoolean");function tt(e,t){if(e!==void 0){if(!Array.isArray(e))throw new Error(`provider-capabilities.json: ${t} must be an array`);return e.map((o,r)=>w(o,`${t}[${r}]`))}}n(tt,"optionalStringArray");function jn(e,t){if(e===void 0)return;if(!C(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let o={};for(let[r,i]of Object.entries(e))o[r]=w(i,`${t}.${r}`);return o}n(jn,"optionalStringMap");function Un(e,t){if(e!==void 0){if(typeof e!="string"||!Ye.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Ye.join(", ")}, got ${JSON.stringify(e)}`);return e}}n(Un,"optionalReasoningPreset");function oe(e,t){if(typeof e!="string"||!qe.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${qe.join(", ")}, got ${JSON.stringify(e)}`);return e}n(oe,"requireReasoningCapability");function Wn(e,t){if(typeof e!="string"||!He.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${He.join(", ")}, got ${JSON.stringify(e)}`);return e}n(Wn,"requireEffortStrategy");function zn(e,t){if(e!==void 0){if(typeof e!="string"||!Je.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Je.join(", ")}, got ${JSON.stringify(e)}`);return e}}n(zn,"optionalThinkingStrategy");function nt(e,t){if(e===void 0)return;if(!C(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let o=Wn(e.effortStrategy,`${t}.effortStrategy`),r=Un(e.reasoningPreset,`${t}.reasoningPreset`),i=zn(e.thinkingStrategy,`${t}.thinkingStrategy`),s=A(e.defaultEffort,`${t}.defaultEffort`),a=jn(e.effortAliases,`${t}.effortAliases`),d=tt(e.disabledEfforts,`${t}.disabledEfforts`),l=tt(e.localRejectEfforts,`${t}.localRejectEfforts`),y=h(e.allowCustomEffort,`${t}.allowCustomEffort`),u=h(e.supportsReasoningEffort,`${t}.supportsReasoningEffort`),v=h(e.supportsReasoningSummary,`${t}.supportsReasoningSummary`),P=h(e.supportsEncryptedReasoningReplay,`${t}.supportsEncryptedReasoningReplay`),T=h(e.supportsAdaptiveThinking,`${t}.supportsAdaptiveThinking`),c=h(e.supportsManualThinkingBudget,`${t}.supportsManualThinkingBudget`),R=h(e.supportsDisabledThinking,`${t}.supportsDisabledThinking`),b=h(e.requiresEffortBetaHeader,`${t}.requiresEffortBetaHeader`),f={effortStrategy:o};if(r!==void 0&&(f.reasoningPreset=r),i!==void 0&&(f.thinkingStrategy=i),s!==void 0&&(f.defaultEffort=s),a!==void 0&&(f.effortAliases=a),d!==void 0&&(f.disabledEfforts=d),l!==void 0&&(f.localRejectEfforts=l),e.supportedEfforts!==void 0){if(!Array.isArray(e.supportedEfforts))throw new Error(`provider-capabilities.json: ${t}.supportedEfforts must be an array`);f.supportedEfforts=e.supportedEfforts.map((p,g)=>{if(!C(p))throw new Error(`provider-capabilities.json: ${t}.supportedEfforts[${g}] must be an object`);return{value:w(p.value,`${t}.supportedEfforts[${g}].value`),...A(p.description,`${t}.supportedEfforts[${g}].description`)!==void 0?{description:A(p.description,`${t}.supportedEfforts[${g}].description`)}:{},...h(p.isDefault,`${t}.supportedEfforts[${g}].isDefault`)!==void 0?{isDefault:h(p.isDefault,`${t}.supportedEfforts[${g}].isDefault`)}:{},...h(p.isUserVisible,`${t}.supportedEfforts[${g}].isUserVisible`)!==void 0?{isUserVisible:h(p.isUserVisible,`${t}.supportedEfforts[${g}].isUserVisible`)}:{}}})}if(e.budgetByEffort!==void 0){if(!C(e.budgetByEffort))throw new Error(`provider-capabilities.json: ${t}.budgetByEffort must be an object`);let p={};for(let[g,ge]of Object.entries(e.budgetByEffort))p[g]=E(ge,`${t}.budgetByEffort.${g}`)??0;f.budgetByEffort=p}return y!==void 0&&(f.allowCustomEffort=y),u!==void 0&&(f.supportsReasoningEffort=u),v!==void 0&&(f.supportsReasoningSummary=v),P!==void 0&&(f.supportsEncryptedReasoningReplay=P),T!==void 0&&(f.supportsAdaptiveThinking=T),c!==void 0&&(f.supportsManualThinkingBudget=c),R!==void 0&&(f.supportsDisabledThinking=R),b!==void 0&&(f.requiresEffortBetaHeader=b),f}n(nt,"validateReasoningProfile");function rt(e,t){let o=e.reasoningProfile,r=e.reasoningCapabilityV2;if(o!==void 0&&r!==void 0)throw new Error(`provider-capabilities.json: ${t} must not define both reasoningProfile and deprecated reasoningCapabilityV2`);return o!==void 0?nt(o,`${t}.reasoningProfile`):nt(r,`${t}.reasoningCapabilityV2`)}n(rt,"validateReasoningProfileField");function Vn(e,t){if(typeof e!="string"||!Ze.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Ze.join(", ")}, got ${JSON.stringify(e)}`);return e}n(Vn,"requireProfileName");function Gn(e,t){if(typeof e!="string"||!et.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${et.join(", ")}, got ${JSON.stringify(e)}`);return e}n(Gn,"requireVerifyStrategy");function qn(e,t){if(!C(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let o=w(e.id,`${t}.id`),r=A(e.wireModel,`${t}.wireModel`),i=A(e.displayName,`${t}.displayName`),s=E(e.contextWindow,`${t}.contextWindow`),a=E(e.maxOutputTokens,`${t}.maxOutputTokens`),d=ot(e.maxOutputTokensField,`${t}.maxOutputTokensField`),l=E(e.thinkingBudgetCap,`${t}.thinkingBudgetCap`),y=h(e.replayReasoningContent,`${t}.replayReasoningContent`),u=h(e.strictThinkingSignature,`${t}.strictThinkingSignature`),v=E(e.streamMaxDurationMs,`${t}.streamMaxDurationMs`),P=e.reasoningCapability===void 0?void 0:oe(e.reasoningCapability,`${t}.reasoningCapability`),T=rt(e,t),c={id:o};return r!==void 0&&(c.wireModel=r),i!==void 0&&(c.displayName=i),s!==void 0&&(c.contextWindow=s),a!==void 0&&(c.maxOutputTokens=a),d!==void 0&&(c.maxOutputTokensField=d),l!==void 0&&(c.thinkingBudgetCap=l),P!==void 0&&(c.reasoningCapability=P),T!==void 0&&(c.reasoningProfile=T),y!==void 0&&(c.replayReasoningContent=y),u!==void 0&&(c.strictThinkingSignature=u),v!==void 0&&(c.streamMaxDurationMs=v),c}n(qn,"validateModelDescriptor");function Hn(e,t){if(e===void 0)return;if(!C(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let o={};for(let[r,i]of Object.entries(e))o[r]=oe(i,`${t}.${r}`);return o}n(Hn,"validateModelReasoningCapabilities");function Jn(e,t){if(!C(e))throw new Error(`provider-capabilities.json: providers.${t} must be an object`);let o=h(e.cliBridge,`providers.${t}.cliBridge`),r=w(e.apiKeyEnv,`providers.${t}.apiKeyEnv`),i=oe(e.reasoningCapability,`providers.${t}.reasoningCapability`),s=rt(e,`providers.${t}`),a=Vn(e.capabilityProfile,`providers.${t}.capabilityProfile`),d=Gn(e.verifyStrategy,`providers.${t}.verifyStrategy`);if(o&&d!=="unsupported")throw new Error(`provider-capabilities.json: providers.${t} is a cliBridge entry but verifyStrategy="${d}" \u2014 must be "unsupported" (CLI binary owns credentials)`);let l=E(e.contextWindow,`providers.${t}.contextWindow`),y=E(e.maxOutputTokens,`providers.${t}.maxOutputTokens`),u=ot(e.maxOutputTokensField,`providers.${t}.maxOutputTokensField`),v=E(e.thinkingBudgetCap,`providers.${t}.thinkingBudgetCap`),P=h(e.supportsThinking,`providers.${t}.supportsThinking`),T=Hn(e.modelReasoningCapabilities,`providers.${t}.modelReasoningCapabilities`),c=A(e.model,`providers.${t}.model`);if(o&&(c!==void 0||e.models!==void 0))throw new Error(`provider-capabilities.json: providers.${t} is a cliBridge entry but defines model/models \u2014 must be omitted (filled at load time)`);if(!o&&c===void 0)throw new Error(`provider-capabilities.json: providers.${t}.model is required (only cliBridge entries may omit)`);let R;if(e.models!==void 0){if(!Array.isArray(e.models))throw new Error(`provider-capabilities.json: providers.${t}.models must be an array`);R=e.models.map((p,g)=>qn(p,`providers.${t}.models[${g}]`));let f=new Set([...c===void 0?[]:[c],...R.map(p=>p.id)]);for(let[p,g]of R.entries())if(g.wireModel!==void 0&&!f.has(g.wireModel))throw new Error(`provider-capabilities.json: providers.${t}.models[${p}].wireModel must reference a declared model, got ${JSON.stringify(g.wireModel)}`)}let b={apiKeyEnv:r,reasoningCapability:i,capabilityProfile:a,verifyStrategy:d};return s!==void 0&&(b.reasoningProfile=s),c!==void 0&&(b.model=c),R!==void 0&&(b.models=R),l!==void 0&&(b.contextWindow=l),y!==void 0&&(b.maxOutputTokens=y),u!==void 0&&(b.maxOutputTokensField=u),v!==void 0&&(b.thinkingBudgetCap=v),P!==void 0&&(b.supportsThinking=P),T!==void 0&&(b.modelReasoningCapabilities=T),o&&(b.cliBridge=!0),b}n(Jn,"validateProviderEntry");function it(e){if(!C(e))throw new Error("provider-capabilities.json: root must be an object");if(e.version!==1)throw new Error(`provider-capabilities.json: version must be 1, got ${JSON.stringify(e.version)}`);let t=w(e.updatedAt,"updatedAt");if(!C(e.providers))throw new Error("provider-capabilities.json: providers must be an object");let o={};for(let[r,i]of Object.entries(e.providers))o[r]=Jn(i,r);return{version:1,updatedAt:t,providers:o}}n(it,"validateProviderCapabilitiesJson");var eo=Object.freeze({native:D,"image-input-native":De,"cli-bridge":z,"image-input-cli-bridge":Ne}),H=null;function to(){if(process.env.KODAX_BUNDLED==="true")return K.join(K.dirname(process.execPath),"provider-capabilities.json");let e=K.dirname(Zn(import.meta.url)),t=[K.join(e,"provider-capabilities.json"),K.join(K.dirname(e),"provider-capabilities.json")];for(let o of t)if(Yn(o))return o;return t[0]}n(to,"resolveJsonPath");function no(e){if(e.models){for(let t of e.models)t.reasoningProfile&&st(t.reasoningProfile);for(let t of e.models)Object.freeze(t);Object.freeze(e.models)}return e.reasoningProfile&&st(e.reasoningProfile),e.modelReasoningCapabilities&&Object.freeze(e.modelReasoningCapabilities),Object.freeze(e)}n(no,"deepFreezeSnapshot");function st(e){if(e.supportedEfforts){for(let t of e.supportedEfforts)Object.freeze(t);Object.freeze(e.supportedEfforts)}e.budgetByEffort&&Object.freeze(e.budgetByEffort),e.effortAliases&&Object.freeze(e.effortAliases),e.disabledEfforts&&Object.freeze(e.disabledEfforts),e.localRejectEfforts&&Object.freeze(e.localRejectEfforts),Object.freeze(e)}n(st,"freezeReasoningProfile");function oo(e){if(e==="gemini-cli"){let t=_();return{model:t,models:L().filter(o=>o!==t).map(o=>({id:o}))}}if(e==="codex-cli"){let t=S();return{model:t,models:B().filter(o=>o!==t).map(o=>({id:o}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${e}'`)}n(oo,"resolveCliBridgeModels");function ro(e,t){let o=eo[t.capabilityProfile];if(!o)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${t.capabilityProfile}' for provider '${e}'`);if(t.cliBridge){let i=oo(e),s={model:i.model,models:i.models,apiKeyEnv:t.apiKeyEnv,reasoningCapability:t.reasoningCapability,capabilityProfile:o,verifyStrategy:t.verifyStrategy};return t.reasoningProfile!==void 0&&(s.reasoningProfile=t.reasoningProfile),t.supportsThinking!==void 0&&(s.supportsThinking=t.supportsThinking),s}let r={model:t.model,apiKeyEnv:t.apiKeyEnv,reasoningCapability:t.reasoningCapability,capabilityProfile:o,verifyStrategy:t.verifyStrategy};return t.reasoningProfile!==void 0&&(r.reasoningProfile=t.reasoningProfile),t.models!==void 0&&(r.models=t.models),t.modelReasoningCapabilities!==void 0&&(r.modelReasoningCapabilities=t.modelReasoningCapabilities),t.contextWindow!==void 0&&(r.contextWindow=t.contextWindow),t.maxOutputTokens!==void 0&&(r.maxOutputTokens=t.maxOutputTokens),t.maxOutputTokensField!==void 0&&(r.maxOutputTokensField=t.maxOutputTokensField),t.thinkingBudgetCap!==void 0&&(r.thinkingBudgetCap=t.thinkingBudgetCap),t.supportsThinking!==void 0&&(r.supportsThinking=t.supportsThinking),r}n(ro,"buildSnapshot");function at(){if(H)return H;let e=to(),t;try{let i=Qn(e,"utf8");t=JSON.parse(i)}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`provider-capabilities loader: failed to read ${e}: ${s}`)}let o=it(t),r={};for(let[i,s]of Object.entries(o.providers))r[i]=no(ro(i,s));return H=Object.freeze(r),H}n(at,"getProviderSnapshots");import Ra from"@anthropic-ai/sdk";var X=at();var dt=process.env.KODAX_PROVIDER??"zhipu-coding";var F=["image/png","image/jpeg","image/webp","image/gif"],$=["video/mp4","video/mpeg","video/quicktime","video/x-msvideo","video/x-flv","video/webm","video/x-ms-wmv","video/3gpp"],Ko=[],Xo=new Set(["anthropic","openai"]),Io=new Set(["ark-coding/doubao-seed-2.0-code","ark-coding/doubao-seed-2.0-pro","ark-coding/kimi-k2.6","ark-coding/kimi-k2.7-code","ark-coding/minimax-m3","kimi-code/k3-256k","qwen-token-plan/qwen3.8-max","qwen-token-plan/qwen3.8-max-preview","qwen-token-plan/qwen3.7-plus","qwen-token-plan/qwen3.6-flash"]),Oo=new Set(["kimi-code/kimi-for-coding","kimi-code/kimi-for-coding-highspeed","kimi-code/k3","kimi/kimi-k3","kimi/kimi-k2.5","kimi/kimi-k2.6","kimi/kimi-k2.7-code","kimi/kimi-k2.7-code-highspeed","minimax-coding/minimax-m3","minimax/minimax-m3","mimo-coding/mimo-v2.5","mimo/mimo-v2.5"]);function le(e){return{nativeSupported:!1,sdkSupported:!1,status:"unsupported",mediaTypes:[],maxCount:0,reason:e}}n(le,"unsupported");function Do(e){return{nativeSupported:!0,sdkSupported:!0,status:"supported",mediaTypes:F,nativeMediaTypes:F,reason:e}}n(Do,"supportedImage");function No(e){return{nativeSupported:!0,sdkSupported:!1,status:"provider-native-unwired",mediaTypes:[],nativeMediaTypes:$,maxCount:0,reason:e}}n(No,"nativeVideoUnwired");function Bo(e){return e.trim().toLowerCase()}n(Bo,"normalizeProvider");function Lo(e){return X[e]?.model}n(Lo,"resolveProviderDefaultModel");function Et(e,t){if(!t)return;let o=t.trim().toLowerCase();if(e==="kimi"){if(o==="k2.5")return"kimi-k2.5";if(o==="k2.6")return"kimi-k2.6";if(o==="k2.7-code")return"kimi-k2.7-code";if(o==="k2.7-code-highspeed")return"kimi-k2.7-code-highspeed"}return(e==="minimax-coding"||e==="minimax")&&o==="minimax-m3"?"minimax-m3":o}n(Et,"normalizeModel");function Fo(e){if(!Xo.has(e))return!1;let t=X[e];return t?N(t.capabilityProfile).multimodalSupport!=="none":!1}n(Fo,"hasOfficialImageSupport");function $o(e,t){let o=Et(e,t);if(!o)return!1;let r=`${e}/${o}`;return Oo.has(r)}n($o,"hasSourceBackedNativeMedia");function jo(e,t){let o=Et(e,t);return o?Io.has(`${e}/${o}`):!1}n(jo,"hasSourceBackedImage");function Uo(e,t,o){if(o)return"source-backed";if(t){if(e==="openai")return"openai-official";if(e==="anthropic")return"anthropic-official"}}n(Uo,"resolveImageCapabilityRoute");function Wo(e){switch(e){case"openai-official":return"Model route supports KodaX image input. Direct-path image/gif is sent as image/gif, but OpenAI requires non-animated GIF semantics.";case"anthropic-official":return"Model route supports KodaX image input. Direct-path image/gif is sent as image/gif, but Anthropic uses only the first frame of animated GIFs.";case"source-backed":return"Model route supports KodaX image input. Direct-path image/gif is sent as image/gif; animated-GIF interpretation is provider-owned."}}n(Wo,"imageCapabilityReason");function ue(e){let t=Bo(e.provider),o=e.model?.trim()||Lo(t),r=Fo(t),i=$o(t,o),s=i||jo(t,o),a=Uo(t,r,s),d=a!==void 0,l=i;return{text:!0,image:d?Do(Wo(a)):le("No verified KodaX image-input route for this provider/model."),video:l?No("Model route is native-video capable, but KodaX SDK video sending is not wired yet. Reject or downgrade before send."):le("No verified native video route for this provider/model."),file:le("File artifact contract is stable, but KodaX SDK file sending/extraction is not wired yet. Reject or downgrade before send.")}}n(ue,"getModelInputCapabilities");function zo(e){return F.includes(e)}n(zo,"isKnownImageMediaType");function Vo(e){return $.includes(e)}n(Vo,"isKnownVideoMediaType");function ce(e){return`${e.provider}${e.model?`/${e.model}`:""}`}n(ce,"routeLabel");function fe(e){return e.reason?`${e.status}: ${e.reason}`:e.status}n(fe,"capabilityDetail");function pe(e,t){if(e.length===0)return;let o=ue(t);for(let r of e){let i=r;if(i.kind==="image"){if(!o.image.nativeSupported||!o.image.sdkSupported)throw new m("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume image artifacts: ${ce(t)}.`,{detail:fe(o.image)});if(typeof i.mediaType=="string"&&!zo(i.mediaType))throw new m("UNSUPPORTED_MEDIA_TYPE",`Unsupported image media type: ${i.mediaType}.`);continue}throw i.kind==="video"?typeof i.mediaType!="string"||!Vo(i.mediaType)?new m("UNSUPPORTED_MEDIA_TYPE",`Unsupported video media type: ${String(i.mediaType)}.`,{detail:`Supported video media types: ${$.join(", ")}`}):new m("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume video artifacts through this SDK runtime: ${ce(t)}.`,{detail:fe(o.video)}):i.kind==="file"?typeof i.mediaType=="string"&&typeof i.mimeType=="string"&&i.mediaType!==i.mimeType?new m("UNSUPPORTED_MEDIA_TYPE",`File artifact mediaType and mimeType disagree: ${i.mediaType} != ${i.mimeType}.`):new m("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume file artifacts through this SDK runtime: ${ce(t)}.`,{detail:fe(o.file)}):new m("MODEL_INPUT_UNSUPPORTED",`Unsupported input artifact kind: ${String(i.kind)}.`)}}n(pe,"validateInputArtifactsForModel");function Go(e){if(pe(e.inputArtifacts??[],e),e.agentId!==void 0&&e.sessionId!==void 0)throw new Error("enqueueWithArtifacts accepts either agentId or sessionId, not both.");if(e.sessionId!==void 0&&e.sessionId.trim().length===0)throw new Error("enqueueWithArtifacts sessionId must not be empty.");let t=e.agentId??(e.sessionId!==void 0?J(e.sessionId,"/root"):Y());return I().enqueue({priority:e.priority??"user",mode:"prompt",content:e.content,agentId:t,inputArtifacts:e.inputArtifacts})}n(Go,"enqueueWithArtifacts");export{rn as a,sn as b,an as c,dn as d,ln as e,pn as f,U as g,I as h,wt as i,J as j,Mt as k,Y as l,St as m,he as n,ye as o,_t as p,m as q,x as r,ve as s,ke as t,Xt as u,It as v,Ot as w,Ce as x,Pe as y,Q as z,we as A,jt as B,Ae as C,Ke as D,en as E,tn as F,F as G,$ as H,Ko as I,ue as J,pe as K,Go as L};
92
+ }`;import We from"node:fs";import ze from"node:os";import Ve from"node:path";var Dn="gpt-5.4",Nn="auto-gemini-3",Bn=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],Ln=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function Ge(e){let t=new Set,o=[];for(let r of e){let i=r.trim();if(!i)continue;let s=i.toLowerCase();t.has(s)||(t.add(s),o.push(i))}return o}n(Ge,"dedupePreserveOrder");function Fn(){let e=Ve.join(ze.homedir(),".codex","config.toml");try{return We.readFileSync(e,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}n(Fn,"readCodexConfiguredModel");function $n(){let e=Ve.join(ze.homedir(),".gemini","settings.json");try{let t=JSON.parse(We.readFileSync(e,"utf8")),o=typeof t.model=="string"?t.model.trim():"";return o||(typeof t.general?.model=="string"?t.general.model.trim():"")||null}catch{return null}}n($n,"readGeminiConfiguredModel");function S(){return Fn()||Dn}n(S,"getCodexCliDefaultModel");function _(){return $n()||Nn}n(_,"getGeminiCliDefaultModel");function B(){return Ge([S(),...Bn])}n(B,"getCodexCliKnownModels");function L(){return Ge([_(),...Ln])}n(L,"getGeminiCliKnownModels");var Ds=_(),Ns=L();var Hs=S(),Js=B();import{existsSync as Qn,readFileSync as Zn}from"node:fs";import K from"node:path";import{fileURLToPath as eo}from"node:url";var qe=["none","prompt-only","native-effort","native-budget","native-toggle","native-adaptive","unknown"],He=["openai-responses-effort","openai-chat-effort","codex-cli-config","anthropic-output-effort","anthropic-reasoning-effort","provider-budget","provider-toggle","prompt-only","none"],Je=["anthropic-adaptive","anthropic-budget","provider-budget","provider-toggle","none"],Ye=["zai-glm-5.3","zai-glm-5.2","zai-glm-toggle","deepseek-v4-flash-openai","deepseek-v4-pro-openai","deepseek-v4-openai","deepseek-v4-anthropic","deepseek-toggle","kimi-k3","kimi-k2.7-code","kimi-hybrid-toggle","minimax-m3","minimax-m2-always","mimo-v2.5-toggle","qwen-hybrid-thinking","openai-chat-reasoning","openai-responses-reasoning","codex-cli-effort","claude-adaptive-xhigh","claude-adaptive-max","anthropic-budget","generic-thinking-toggle","none"],Qe=["max_tokens","max_completion_tokens"],Ze=["native","image-input-native","cli-bridge","image-input-cli-bridge"],et=["count-tokens","models-list","minimal-message","unsupported"];function C(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}n(C,"isPlainObject");function w(e,t){if(typeof e!="string"||e.length===0)throw new Error(`provider-capabilities.json: ${t} must be a non-empty string`);return e}n(w,"requireString");function A(e,t){if(e!==void 0)return w(e,t)}n(A,"optionalString");function ot(e,t){if(e!==void 0){if(typeof e!="string"||!Qe.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Qe.join(", ")}, got ${JSON.stringify(e)}`);return e}}n(ot,"optionalMaxOutputTokensField");function E(e,t){if(e!==void 0){if(typeof e!="number"||!Number.isFinite(e)||e<0)throw new Error(`provider-capabilities.json: ${t} must be a non-negative finite number`);return e}}n(E,"optionalNumber");function h(e,t){if(e!==void 0){if(typeof e!="boolean")throw new Error(`provider-capabilities.json: ${t} must be a boolean`);return e}}n(h,"optionalBoolean");function tt(e,t){if(e!==void 0){if(!Array.isArray(e))throw new Error(`provider-capabilities.json: ${t} must be an array`);return e.map((o,r)=>w(o,`${t}[${r}]`))}}n(tt,"optionalStringArray");function Un(e,t){if(e===void 0)return;if(!C(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let o={};for(let[r,i]of Object.entries(e))o[r]=w(i,`${t}.${r}`);return o}n(Un,"optionalStringMap");function Wn(e,t){if(e!==void 0){if(typeof e!="string"||!Ye.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Ye.join(", ")}, got ${JSON.stringify(e)}`);return e}}n(Wn,"optionalReasoningPreset");function oe(e,t){if(typeof e!="string"||!qe.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${qe.join(", ")}, got ${JSON.stringify(e)}`);return e}n(oe,"requireReasoningCapability");function zn(e,t){if(typeof e!="string"||!He.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${He.join(", ")}, got ${JSON.stringify(e)}`);return e}n(zn,"requireEffortStrategy");function Vn(e,t){if(e!==void 0){if(typeof e!="string"||!Je.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Je.join(", ")}, got ${JSON.stringify(e)}`);return e}}n(Vn,"optionalThinkingStrategy");function nt(e,t){if(e===void 0)return;if(!C(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let o=zn(e.effortStrategy,`${t}.effortStrategy`),r=Wn(e.reasoningPreset,`${t}.reasoningPreset`),i=Vn(e.thinkingStrategy,`${t}.thinkingStrategy`),s=A(e.defaultEffort,`${t}.defaultEffort`),a=Un(e.effortAliases,`${t}.effortAliases`),d=tt(e.disabledEfforts,`${t}.disabledEfforts`),l=tt(e.localRejectEfforts,`${t}.localRejectEfforts`),y=h(e.allowCustomEffort,`${t}.allowCustomEffort`),u=h(e.supportsReasoningEffort,`${t}.supportsReasoningEffort`),v=h(e.supportsReasoningSummary,`${t}.supportsReasoningSummary`),P=h(e.supportsEncryptedReasoningReplay,`${t}.supportsEncryptedReasoningReplay`),T=h(e.supportsAdaptiveThinking,`${t}.supportsAdaptiveThinking`),c=h(e.supportsManualThinkingBudget,`${t}.supportsManualThinkingBudget`),R=h(e.supportsDisabledThinking,`${t}.supportsDisabledThinking`),b=h(e.requiresEffortBetaHeader,`${t}.requiresEffortBetaHeader`),f={effortStrategy:o};if(r!==void 0&&(f.reasoningPreset=r),i!==void 0&&(f.thinkingStrategy=i),s!==void 0&&(f.defaultEffort=s),a!==void 0&&(f.effortAliases=a),d!==void 0&&(f.disabledEfforts=d),l!==void 0&&(f.localRejectEfforts=l),e.supportedEfforts!==void 0){if(!Array.isArray(e.supportedEfforts))throw new Error(`provider-capabilities.json: ${t}.supportedEfforts must be an array`);f.supportedEfforts=e.supportedEfforts.map((p,g)=>{if(!C(p))throw new Error(`provider-capabilities.json: ${t}.supportedEfforts[${g}] must be an object`);return{value:w(p.value,`${t}.supportedEfforts[${g}].value`),...A(p.description,`${t}.supportedEfforts[${g}].description`)!==void 0?{description:A(p.description,`${t}.supportedEfforts[${g}].description`)}:{},...h(p.isDefault,`${t}.supportedEfforts[${g}].isDefault`)!==void 0?{isDefault:h(p.isDefault,`${t}.supportedEfforts[${g}].isDefault`)}:{},...h(p.isUserVisible,`${t}.supportedEfforts[${g}].isUserVisible`)!==void 0?{isUserVisible:h(p.isUserVisible,`${t}.supportedEfforts[${g}].isUserVisible`)}:{}}})}if(e.budgetByEffort!==void 0){if(!C(e.budgetByEffort))throw new Error(`provider-capabilities.json: ${t}.budgetByEffort must be an object`);let p={};for(let[g,ge]of Object.entries(e.budgetByEffort))p[g]=E(ge,`${t}.budgetByEffort.${g}`)??0;f.budgetByEffort=p}return y!==void 0&&(f.allowCustomEffort=y),u!==void 0&&(f.supportsReasoningEffort=u),v!==void 0&&(f.supportsReasoningSummary=v),P!==void 0&&(f.supportsEncryptedReasoningReplay=P),T!==void 0&&(f.supportsAdaptiveThinking=T),c!==void 0&&(f.supportsManualThinkingBudget=c),R!==void 0&&(f.supportsDisabledThinking=R),b!==void 0&&(f.requiresEffortBetaHeader=b),f}n(nt,"validateReasoningProfile");function rt(e,t){let o=e.reasoningProfile,r=e.reasoningCapabilityV2;if(o!==void 0&&r!==void 0)throw new Error(`provider-capabilities.json: ${t} must not define both reasoningProfile and deprecated reasoningCapabilityV2`);return o!==void 0?nt(o,`${t}.reasoningProfile`):nt(r,`${t}.reasoningCapabilityV2`)}n(rt,"validateReasoningProfileField");function Gn(e,t){if(typeof e!="string"||!Ze.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Ze.join(", ")}, got ${JSON.stringify(e)}`);return e}n(Gn,"requireProfileName");function qn(e,t){if(typeof e!="string"||!et.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${et.join(", ")}, got ${JSON.stringify(e)}`);return e}n(qn,"requireVerifyStrategy");function Hn(e,t){if(!C(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let o=w(e.id,`${t}.id`),r=A(e.wireModel,`${t}.wireModel`),i=A(e.displayName,`${t}.displayName`),s=E(e.contextWindow,`${t}.contextWindow`),a=E(e.maxOutputTokens,`${t}.maxOutputTokens`),d=ot(e.maxOutputTokensField,`${t}.maxOutputTokensField`),l=E(e.thinkingBudgetCap,`${t}.thinkingBudgetCap`),y=h(e.replayReasoningContent,`${t}.replayReasoningContent`),u=h(e.strictThinkingSignature,`${t}.strictThinkingSignature`),v=E(e.streamMaxDurationMs,`${t}.streamMaxDurationMs`),P=e.reasoningCapability===void 0?void 0:oe(e.reasoningCapability,`${t}.reasoningCapability`),T=rt(e,t),c={id:o};return r!==void 0&&(c.wireModel=r),i!==void 0&&(c.displayName=i),s!==void 0&&(c.contextWindow=s),a!==void 0&&(c.maxOutputTokens=a),d!==void 0&&(c.maxOutputTokensField=d),l!==void 0&&(c.thinkingBudgetCap=l),P!==void 0&&(c.reasoningCapability=P),T!==void 0&&(c.reasoningProfile=T),y!==void 0&&(c.replayReasoningContent=y),u!==void 0&&(c.strictThinkingSignature=u),v!==void 0&&(c.streamMaxDurationMs=v),c}n(Hn,"validateModelDescriptor");function Jn(e,t){if(e===void 0)return;if(!C(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let o={};for(let[r,i]of Object.entries(e))o[r]=oe(i,`${t}.${r}`);return o}n(Jn,"validateModelReasoningCapabilities");function Yn(e,t){if(!C(e))throw new Error(`provider-capabilities.json: providers.${t} must be an object`);let o=h(e.cliBridge,`providers.${t}.cliBridge`),r=w(e.apiKeyEnv,`providers.${t}.apiKeyEnv`),i=oe(e.reasoningCapability,`providers.${t}.reasoningCapability`),s=rt(e,`providers.${t}`),a=Gn(e.capabilityProfile,`providers.${t}.capabilityProfile`),d=qn(e.verifyStrategy,`providers.${t}.verifyStrategy`);if(o&&d!=="unsupported")throw new Error(`provider-capabilities.json: providers.${t} is a cliBridge entry but verifyStrategy="${d}" \u2014 must be "unsupported" (CLI binary owns credentials)`);let l=E(e.contextWindow,`providers.${t}.contextWindow`),y=E(e.maxOutputTokens,`providers.${t}.maxOutputTokens`),u=ot(e.maxOutputTokensField,`providers.${t}.maxOutputTokensField`),v=E(e.thinkingBudgetCap,`providers.${t}.thinkingBudgetCap`),P=h(e.supportsThinking,`providers.${t}.supportsThinking`),T=Jn(e.modelReasoningCapabilities,`providers.${t}.modelReasoningCapabilities`),c=A(e.model,`providers.${t}.model`);if(o&&(c!==void 0||e.models!==void 0))throw new Error(`provider-capabilities.json: providers.${t} is a cliBridge entry but defines model/models \u2014 must be omitted (filled at load time)`);if(!o&&c===void 0)throw new Error(`provider-capabilities.json: providers.${t}.model is required (only cliBridge entries may omit)`);let R;if(e.models!==void 0){if(!Array.isArray(e.models))throw new Error(`provider-capabilities.json: providers.${t}.models must be an array`);R=e.models.map((p,g)=>Hn(p,`providers.${t}.models[${g}]`));let f=new Set([...c===void 0?[]:[c],...R.map(p=>p.id)]);for(let[p,g]of R.entries())if(g.wireModel!==void 0&&!f.has(g.wireModel))throw new Error(`provider-capabilities.json: providers.${t}.models[${p}].wireModel must reference a declared model, got ${JSON.stringify(g.wireModel)}`)}let b={apiKeyEnv:r,reasoningCapability:i,capabilityProfile:a,verifyStrategy:d};return s!==void 0&&(b.reasoningProfile=s),c!==void 0&&(b.model=c),R!==void 0&&(b.models=R),l!==void 0&&(b.contextWindow=l),y!==void 0&&(b.maxOutputTokens=y),u!==void 0&&(b.maxOutputTokensField=u),v!==void 0&&(b.thinkingBudgetCap=v),P!==void 0&&(b.supportsThinking=P),T!==void 0&&(b.modelReasoningCapabilities=T),o&&(b.cliBridge=!0),b}n(Yn,"validateProviderEntry");function it(e){if(!C(e))throw new Error("provider-capabilities.json: root must be an object");if(e.version!==1)throw new Error(`provider-capabilities.json: version must be 1, got ${JSON.stringify(e.version)}`);let t=w(e.updatedAt,"updatedAt");if(!C(e.providers))throw new Error("provider-capabilities.json: providers must be an object");let o={};for(let[r,i]of Object.entries(e.providers))o[r]=Yn(i,r);return{version:1,updatedAt:t,providers:o}}n(it,"validateProviderCapabilitiesJson");var to=Object.freeze({native:D,"image-input-native":De,"cli-bridge":z,"image-input-cli-bridge":Ne}),H=null;function no(){if(process.env.KODAX_BUNDLED==="true")return K.join(K.dirname(process.execPath),"provider-capabilities.json");let e=K.dirname(eo(import.meta.url)),t=[K.join(e,"provider-capabilities.json"),K.join(K.dirname(e),"provider-capabilities.json")];for(let o of t)if(Qn(o))return o;return t[0]}n(no,"resolveJsonPath");function oo(e){if(e.models){for(let t of e.models)t.reasoningProfile&&st(t.reasoningProfile);for(let t of e.models)Object.freeze(t);Object.freeze(e.models)}return e.reasoningProfile&&st(e.reasoningProfile),e.modelReasoningCapabilities&&Object.freeze(e.modelReasoningCapabilities),Object.freeze(e)}n(oo,"deepFreezeSnapshot");function st(e){if(e.supportedEfforts){for(let t of e.supportedEfforts)Object.freeze(t);Object.freeze(e.supportedEfforts)}e.budgetByEffort&&Object.freeze(e.budgetByEffort),e.effortAliases&&Object.freeze(e.effortAliases),e.disabledEfforts&&Object.freeze(e.disabledEfforts),e.localRejectEfforts&&Object.freeze(e.localRejectEfforts),Object.freeze(e)}n(st,"freezeReasoningProfile");function ro(e){if(e==="gemini-cli"){let t=_();return{model:t,models:L().filter(o=>o!==t).map(o=>({id:o}))}}if(e==="codex-cli"){let t=S();return{model:t,models:B().filter(o=>o!==t).map(o=>({id:o}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${e}'`)}n(ro,"resolveCliBridgeModels");function io(e,t){let o=to[t.capabilityProfile];if(!o)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${t.capabilityProfile}' for provider '${e}'`);if(t.cliBridge){let i=ro(e),s={model:i.model,models:i.models,apiKeyEnv:t.apiKeyEnv,reasoningCapability:t.reasoningCapability,capabilityProfile:o,verifyStrategy:t.verifyStrategy};return t.reasoningProfile!==void 0&&(s.reasoningProfile=t.reasoningProfile),t.supportsThinking!==void 0&&(s.supportsThinking=t.supportsThinking),s}let r={model:t.model,apiKeyEnv:t.apiKeyEnv,reasoningCapability:t.reasoningCapability,capabilityProfile:o,verifyStrategy:t.verifyStrategy};return t.reasoningProfile!==void 0&&(r.reasoningProfile=t.reasoningProfile),t.models!==void 0&&(r.models=t.models),t.modelReasoningCapabilities!==void 0&&(r.modelReasoningCapabilities=t.modelReasoningCapabilities),t.contextWindow!==void 0&&(r.contextWindow=t.contextWindow),t.maxOutputTokens!==void 0&&(r.maxOutputTokens=t.maxOutputTokens),t.maxOutputTokensField!==void 0&&(r.maxOutputTokensField=t.maxOutputTokensField),t.thinkingBudgetCap!==void 0&&(r.thinkingBudgetCap=t.thinkingBudgetCap),t.supportsThinking!==void 0&&(r.supportsThinking=t.supportsThinking),r}n(io,"buildSnapshot");function at(){if(H)return H;let e=no(),t;try{let i=Zn(e,"utf8");t=JSON.parse(i)}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`provider-capabilities loader: failed to read ${e}: ${s}`)}let o=it(t),r={};for(let[i,s]of Object.entries(o.providers))r[i]=oo(io(i,s));return H=Object.freeze(r),H}n(at,"getProviderSnapshots");var X=at();var dt=process.env.KODAX_PROVIDER??"zhipu-coding";var F=["image/png","image/jpeg","image/webp","image/gif"],$=["video/mp4","video/mpeg","video/quicktime","video/x-msvideo","video/x-flv","video/webm","video/x-ms-wmv","video/3gpp"],Xo=[],Io=new Set(["anthropic","openai"]),Oo=new Set(["ark-coding/doubao-seed-2.0-code","ark-coding/doubao-seed-2.0-pro","ark-coding/kimi-k2.6","ark-coding/kimi-k2.7-code","ark-coding/minimax-m3","kimi-code/k3-256k","qwen-token-plan/qwen3.8-max","qwen-token-plan/qwen3.8-max-preview","qwen-token-plan/qwen3.7-plus","qwen-token-plan/qwen3.6-flash"]),Do=new Set(["kimi-code/kimi-for-coding","kimi-code/kimi-for-coding-highspeed","kimi-code/k3","kimi/kimi-k3","kimi/kimi-k2.5","kimi/kimi-k2.6","kimi/kimi-k2.7-code","kimi/kimi-k2.7-code-highspeed","minimax-coding/minimax-m3","minimax/minimax-m3","mimo-coding/mimo-v2.5","mimo/mimo-v2.5"]);function le(e){return{nativeSupported:!1,sdkSupported:!1,status:"unsupported",mediaTypes:[],maxCount:0,reason:e}}n(le,"unsupported");function No(e){return{nativeSupported:!0,sdkSupported:!0,status:"supported",mediaTypes:F,nativeMediaTypes:F,reason:e}}n(No,"supportedImage");function Bo(e){return{nativeSupported:!0,sdkSupported:!1,status:"provider-native-unwired",mediaTypes:[],nativeMediaTypes:$,maxCount:0,reason:e}}n(Bo,"nativeVideoUnwired");function Lo(e){return e.trim().toLowerCase()}n(Lo,"normalizeProvider");function Fo(e){return X[e]?.model}n(Fo,"resolveProviderDefaultModel");function Et(e,t){if(!t)return;let o=t.trim().toLowerCase();if(e==="kimi"){if(o==="k2.5")return"kimi-k2.5";if(o==="k2.6")return"kimi-k2.6";if(o==="k2.7-code")return"kimi-k2.7-code";if(o==="k2.7-code-highspeed")return"kimi-k2.7-code-highspeed"}return(e==="minimax-coding"||e==="minimax")&&o==="minimax-m3"?"minimax-m3":o}n(Et,"normalizeModel");function $o(e){if(!Io.has(e))return!1;let t=X[e];return t?N(t.capabilityProfile).multimodalSupport!=="none":!1}n($o,"hasOfficialImageSupport");function jo(e,t){let o=Et(e,t);if(!o)return!1;let r=`${e}/${o}`;return Do.has(r)}n(jo,"hasSourceBackedNativeMedia");function Uo(e,t){let o=Et(e,t);return o?Oo.has(`${e}/${o}`):!1}n(Uo,"hasSourceBackedImage");function Wo(e,t,o){if(o)return"source-backed";if(t){if(e==="openai")return"openai-official";if(e==="anthropic")return"anthropic-official"}}n(Wo,"resolveImageCapabilityRoute");function zo(e){switch(e){case"openai-official":return"Model route supports KodaX image input. Direct-path image/gif is sent as image/gif, but OpenAI requires non-animated GIF semantics.";case"anthropic-official":return"Model route supports KodaX image input. Direct-path image/gif is sent as image/gif, but Anthropic uses only the first frame of animated GIFs.";case"source-backed":return"Model route supports KodaX image input. Direct-path image/gif is sent as image/gif; animated-GIF interpretation is provider-owned."}}n(zo,"imageCapabilityReason");function ue(e){let t=Lo(e.provider),o=e.model?.trim()||Fo(t),r=$o(t),i=jo(t,o),s=i||Uo(t,o),a=Wo(t,r,s),d=a!==void 0,l=i;return{text:!0,image:d?No(zo(a)):le("No verified KodaX image-input route for this provider/model."),video:l?Bo("Model route is native-video capable, but KodaX SDK video sending is not wired yet. Reject or downgrade before send."):le("No verified native video route for this provider/model."),file:le("File artifact contract is stable, but KodaX SDK file sending/extraction is not wired yet. Reject or downgrade before send.")}}n(ue,"getModelInputCapabilities");function Vo(e){return F.includes(e)}n(Vo,"isKnownImageMediaType");function Go(e){return $.includes(e)}n(Go,"isKnownVideoMediaType");function ce(e){return`${e.provider}${e.model?`/${e.model}`:""}`}n(ce,"routeLabel");function fe(e){return e.reason?`${e.status}: ${e.reason}`:e.status}n(fe,"capabilityDetail");function pe(e,t){if(e.length===0)return;let o=ue(t);for(let r of e){let i=r;if(i.kind==="image"){if(!o.image.nativeSupported||!o.image.sdkSupported)throw new m("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume image artifacts: ${ce(t)}.`,{detail:fe(o.image)});if(typeof i.mediaType=="string"&&!Vo(i.mediaType))throw new m("UNSUPPORTED_MEDIA_TYPE",`Unsupported image media type: ${i.mediaType}.`);continue}throw i.kind==="video"?typeof i.mediaType!="string"||!Go(i.mediaType)?new m("UNSUPPORTED_MEDIA_TYPE",`Unsupported video media type: ${String(i.mediaType)}.`,{detail:`Supported video media types: ${$.join(", ")}`}):new m("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume video artifacts through this SDK runtime: ${ce(t)}.`,{detail:fe(o.video)}):i.kind==="file"?typeof i.mediaType=="string"&&typeof i.mimeType=="string"&&i.mediaType!==i.mimeType?new m("UNSUPPORTED_MEDIA_TYPE",`File artifact mediaType and mimeType disagree: ${i.mediaType} != ${i.mimeType}.`):new m("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume file artifacts through this SDK runtime: ${ce(t)}.`,{detail:fe(o.file)}):new m("MODEL_INPUT_UNSUPPORTED",`Unsupported input artifact kind: ${String(i.kind)}.`)}}n(pe,"validateInputArtifactsForModel");function qo(e){if(pe(e.inputArtifacts??[],e),e.agentId!==void 0&&e.sessionId!==void 0)throw new Error("enqueueWithArtifacts accepts either agentId or sessionId, not both.");if(e.sessionId!==void 0&&e.sessionId.trim().length===0)throw new Error("enqueueWithArtifacts sessionId must not be empty.");let t=e.agentId??(e.sessionId!==void 0?J(e.sessionId,"/root"):Y());return I().enqueue({priority:e.priority??"user",mode:"prompt",content:e.content,agentId:t,inputArtifacts:e.inputArtifacts})}n(qo,"enqueueWithArtifacts");export{on as a,rn as b,sn as c,an as d,dn as e,fn as f,U as g,I as h,wt as i,J as j,Mt as k,Y as l,St as m,he as n,ye as o,_t as p,m as q,x as r,ve as s,ke as t,Xt as u,It as v,Ot as w,Ce as x,Pe as y,Q as z,we as A,$t as B,Ae as C,Ke as D,Zt as E,en as F,F as G,$ as H,Xo as I,ue as J,pe as K,qo as L};