@kodax-ai/kodax 0.7.77 → 0.7.78

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 (98) hide show
  1. package/CHANGELOG.md +176 -4
  2. package/README.md +200 -64
  3. package/README_CN.md +153 -49
  4. package/config-templates/config.example.jsonc +114 -32
  5. package/dist/chunks/agent-ASP4MS3X.js +2 -0
  6. package/dist/chunks/argument-completer-JYQ7FX3W.js +2 -0
  7. package/dist/chunks/{chunk-XSA37BVM.js → chunk-2CFHBKRE.js} +1 -1
  8. package/dist/chunks/chunk-35PPHOQ2.js +292 -0
  9. package/dist/chunks/chunk-43QNNDHR.js +29 -0
  10. package/dist/chunks/chunk-5BNQXXGY.js +1 -0
  11. package/dist/chunks/chunk-5GO6FH7L.js +458 -0
  12. package/dist/chunks/{chunk-FSXI4MAV.js → chunk-5NDCSFOP.js} +14 -14
  13. package/dist/chunks/{chunk-3DD4QEBH.js → chunk-6FOJVETH.js} +10 -10
  14. package/dist/chunks/chunk-6XM4B6K2.js +48 -0
  15. package/dist/chunks/chunk-6YZUE6NC.js +240 -0
  16. package/dist/chunks/{chunk-HORNWBYR.js → chunk-7OEBJGHK.js} +1 -1
  17. package/dist/chunks/{chunk-OAMKECRG.js → chunk-KQLQYHWU.js} +205 -200
  18. package/dist/chunks/{chunk-IQT4RPCE.js → chunk-NXO6GWSY.js} +2 -2
  19. package/dist/chunks/chunk-T2XZTLYE.js +316 -0
  20. package/dist/chunks/chunk-TQDBTTIM.js +348 -0
  21. package/dist/chunks/{chunk-FNW2XUL5.js → chunk-UID7BLAB.js} +1 -1
  22. package/dist/chunks/chunk-VAT2QYXM.js +765 -0
  23. package/dist/chunks/chunk-YAZQTC2L.js +5 -0
  24. package/dist/chunks/chunk-YVRYHC4C.js +655 -0
  25. package/dist/chunks/{chunk-EH7AOMJ7.js → chunk-Z3KFRTSB.js} +1 -1
  26. package/dist/chunks/compaction-config-BQSSIWK5.js +2 -0
  27. package/dist/chunks/{construction-bootstrap-RPRL3L7R.js → construction-bootstrap-VQLQGWPY.js} +1 -1
  28. package/dist/chunks/{dist-FDSOIR35.js → dist-BFT5YIGU.js} +1 -1
  29. package/dist/chunks/dist-PCFE24YP.js +2 -0
  30. package/dist/chunks/host-UTFXCYYM.js +2 -0
  31. package/dist/chunks/run-manager-PJU3WIFJ.js +2 -0
  32. package/dist/chunks/utils-SID4HW2Q.js +2 -0
  33. package/dist/index.d.ts +18 -17
  34. package/dist/index.js +6 -6
  35. package/dist/kodax_cli.js +1751 -1352
  36. package/dist/kodax_resume.js +17 -17
  37. package/dist/runtime-worker.js +1680 -1299
  38. package/dist/sandbox-workspace-session.js +563 -0
  39. package/dist/sdk-a2a.d.ts +16 -16
  40. package/dist/sdk-a2a.js +8 -8
  41. package/dist/sdk-agent.d.ts +275 -60
  42. package/dist/sdk-agent.js +1 -1
  43. package/dist/sdk-coding.d.ts +33 -165
  44. package/dist/sdk-coding.js +1 -1
  45. package/dist/sdk-experimental-memory.d.ts +2 -2
  46. package/dist/sdk-experimental-memory.js +1 -1
  47. package/dist/sdk-llm.d.ts +2 -1
  48. package/dist/sdk-llm.js +1 -1
  49. package/dist/sdk-mcp.js +1 -1
  50. package/dist/sdk-media.js +1 -1
  51. package/dist/sdk-repl.d.ts +67 -25
  52. package/dist/sdk-repl.js +2 -2
  53. package/dist/sdk-runtime.d.ts +194 -147
  54. package/dist/sdk-runtime.js +1 -1
  55. package/dist/sdk-sandbox.d.ts +93 -0
  56. package/dist/sdk-sandbox.js +2 -0
  57. package/dist/sdk-session.d.ts +6 -7
  58. package/dist/sdk-session.js +1 -1
  59. package/dist/sdk-skills.d.ts +2 -2
  60. package/dist/sdk-skills.js +1 -1
  61. package/dist/semantic-worker.js +15 -15
  62. package/dist/types-chunks/{bash-prefix-extractor.d-pZdu6qt7.d.ts → bash-prefix-extractor.d-uAe2Oqda.d.ts} +126 -8
  63. package/dist/types-chunks/{capsule.d-CxCm1KZz.d.ts → capsule.d-BlSv9l3V.d.ts} +1 -1
  64. package/dist/types-chunks/{guardrail.d-CJx9RRd3.d.ts → guardrail.d-BRE_ErEj.d.ts} +1 -1
  65. package/dist/types-chunks/{guardrail.d-B0PwAZVR.d.ts → guardrail.d-CXDYRgZ3.d.ts} +200 -34
  66. package/dist/types-chunks/{history-retrieval.d-B__aEN62.d.ts → history-retrieval.d-DtCy7x64.d.ts} +1 -1
  67. package/dist/types-chunks/{integration-config.d-ojG4swOP.d.ts → integration-config.d-BNowXE8k.d.ts} +23 -8
  68. package/dist/types-chunks/{public-api.d--fF88JrC.d.ts → public-api.d-B3AohsxN.d.ts} +36 -7
  69. package/dist/types-chunks/{commands.d-BccESAMV.d.ts → repl.d-Ie_ZXb_U.d.ts} +89 -78
  70. package/dist/types-chunks/{side-query.d-5JvXhuOZ.d.ts → resolver.d-iAQ9ocLB.d.ts} +3 -66
  71. package/dist/types-chunks/{run-manager.d-B47hIqnI.d.ts → run-manager.d-D1twIhF9.d.ts} +1 -1
  72. package/dist/types-chunks/{sdk-session-CLWf8Adb.d.ts → sdk-session-DB9KksIx.d.ts} +2 -2
  73. package/dist/types-chunks/side-query.d-DTuLPcC5.d.ts +77 -0
  74. package/dist/types-chunks/{types-LanCEDj8.d.ts → types-D3g6XUQr.d.ts} +41 -2
  75. package/dist/types-chunks/{types.d-RdWRfUEs.d.ts → types.d-BA-Jwpfs.d.ts} +459 -7
  76. package/dist/types-chunks/{types.d-CODuyyqy.d.ts → types.d-BH0ZkTGf.d.ts} +1 -1
  77. package/dist/types-chunks/{types.d-DCQVBqVn.d.ts → types.d-BbtGlKZu.d.ts} +25 -3
  78. package/dist/types-chunks/{types.d-DCsKM8aT.d.ts → types.d-DVDTIfB_.d.ts} +2 -2
  79. package/dist/types-chunks/{utils.d-CDduqbFw.d.ts → utils.d-CVp6bFl9.d.ts} +22 -6
  80. package/docs/SDK_EMBEDDER_GUIDE.md +399 -55
  81. package/package.json +8 -1
  82. package/dist/chunks/agent-NGSWFE73.js +0 -2
  83. package/dist/chunks/argument-completer-WGGZPEEO.js +0 -2
  84. package/dist/chunks/chunk-27QLRH3D.js +0 -5
  85. package/dist/chunks/chunk-2MQPVY6P.js +0 -770
  86. package/dist/chunks/chunk-6WAPVAGQ.js +0 -74
  87. package/dist/chunks/chunk-AOENDSVN.js +0 -448
  88. package/dist/chunks/chunk-HV2GMZUZ.js +0 -343
  89. package/dist/chunks/chunk-JS2BHGJP.js +0 -158
  90. package/dist/chunks/chunk-ON2WG2LG.js +0 -622
  91. package/dist/chunks/chunk-RUGAAHTF.js +0 -321
  92. package/dist/chunks/chunk-TGCG7U2W.js +0 -37
  93. package/dist/chunks/compaction-config-BE7VYWH6.js +0 -2
  94. package/dist/chunks/dist-ZZBNVTKU.js +0 -2
  95. package/dist/chunks/host-QAKQVC4A.js +0 -2
  96. package/dist/chunks/run-manager-N4UFWA2D.js +0 -2
  97. package/dist/chunks/utils-AUHCI4D5.js +0 -2
  98. package/dist/types-chunks/center-types.d-BBT122uJ.d.ts +0 -91
package/README_CN.md CHANGED
@@ -41,18 +41,25 @@
41
41
  ```bash
42
42
  npm i -g @kodax-ai/kodax
43
43
 
44
- # 选一个你有 API key 的 provider
45
- export ZHIPU_API_KEY=... # KIMI_API_KEY / MINIMAX_API_KEY / MIMO_API_KEY /
46
- # ARK_API_KEY / DEEPSEEK_API_KEY / ANTHROPIC_API_KEY /
47
- # OPENAI_API_KEY / QWEN_API_KEY / QWEN_TOKEN_API_KEY / GEMINI_API_KEY
44
+ # 选一个你有 API key 的 provider(`kodax setup --help` 会列出全部)
45
+ export ZHIPU_API_KEY=... # ANTHROPIC_API_KEY / OPENAI_API_KEY / DEEPSEEK_API_KEY /
46
+ # KIMI_API_KEY / KIMI_CODE_API_KEY / QWEN_API_KEY /
47
+ # QWEN_TOKEN_API_KEY / ZHIPU_CODING_API_KEY /
48
+ # ZAI_CODING_API_KEY / MINIMAX_CODING_API_KEY /
49
+ # MIMO_API_KEY / MIMO_CODING_API_KEY / ARK_CODING_API_KEY
48
50
 
49
51
  kodax
50
52
  ```
51
53
 
52
- 就这样。进 REPL,自然语言提问。如果新机器既没有选择 provider,也没有任何
53
- 受支持的 API Key 环境变量,直接运行 `kodax` 会先打开只配置元数据的向导;它不会
54
- 要求输入或保存 Key。选择 provider/model 后,按提示设置对应环境变量、重启终端,
55
- 再运行 `kodax`。需要主动重新配置时可运行 `kodax setup`。
54
+ 就这样。进 REPL,自然语言提问。新机器只要还没有选择 provider,交互式运行
55
+ `kodax` 就会先进入 setup,即使已经存在受支持的 API Key 环境变量。setup 会检查
56
+ core、MCP、Extensions、A2A 的活跃配置和注释模板,不覆盖已有文件,也不会要求输入
57
+ 或保存 Key。选择 provider/model 后,按提示设置对应环境变量、重启终端,再运行
58
+ `kodax`。使用 `kodax setup --custom` 配置自定义 provider;使用
59
+ `kodax setup --help` 或 REPL `/setup --help` 查看完整路径、环境变量、命令和快捷键。
60
+ 交互式 setup 还会检查一次可选 ASRT sandbox:Windows 可能弹出一次 UAC;
61
+ macOS/Linux 会报告 Seatbelt/bubblewrap 所需依赖。拒绝 UAC 或缺少依赖不会破坏普通
62
+ 权限管理,日常启动也不会反复提醒。
56
63
 
57
64
  > **不装 Node 的目标机器**:从 [GitHub Releases](https://github.com/icetomoyo/KodaX/releases) 拿 Bun 编译的单文件二进制(Win / macOS / Linux × x64 + arm64)。详见 [docs/release.md](docs/release.md)。
58
65
 
@@ -107,7 +114,7 @@ daemon Runtime 边界保留结构化 blocked 原因。
107
114
  可选模型,同时保留 `kimi-for-coding-highspeed` 与 1M `k3` tier。K3 支持
108
115
  `low` / `high` / `max` 思考强度,默认 `high`;256K 路由支持图片但不支持视频输入。
109
116
 
110
- **v0.7.77 发布就绪候选版**:AMA 现在通过现有 Actor 控制面按需组合六种具名问题解决
117
+ **v0.7.77 正式版**:AMA 现在通过现有 Actor 控制面按需组合六种具名问题解决
111
118
  模式,不引入固定拓扑或隐藏 Workflow。可选策略元数据会形成有界、仅记录事实的
112
119
  `PatternTrace`,现有 Sidecar 仍是唯一的终态答案质量裁决者。治理式记忆可在工具
113
120
  失败、验证失败或已提交 compact 之后稀疏触发,在下一次 Action-LLM 请求前注入最多
@@ -120,7 +127,60 @@ daemon Runtime 边界保留结构化 blocked 原因。
120
127
  为 `recommend-ship`,随后形成发布确定性契约的联合 `SHIP` 决策。语义记忆选择仍为
121
128
  实验性、宿主显式启用能力;本版本不宣称任务质量、token 或延迟改善。
122
129
 
123
- 同一候选版还增加了由宿主显式配置的 Shell Execution Contract。Runtime Session
130
+ **v0.7.78 证据门禁学习、首次配置与权限/沙盒正式版**:后台学习遵循
131
+ Memory-first;只有重复且独立验证的证据,或带已验证终态证据的显式
132
+ preserve-as-Skill 请求,才能把低风险声明式 Skill 放入不可变、项目级的有界
133
+ canary。自动项目信任需要完成三次精确 revision 使用并取得独立验证成功;每个
134
+ revision 都可在 `/learn` 中查看、禁用、回滚、信任或拒绝。受保护/正式 Skill、
135
+ 全局提升和 Extension 编写仍必须由用户显式决定。
136
+
137
+ ### 将 learned Skill 提升到用户正式目录
138
+
139
+ 自动 canary 激活和用户目录提升不是一回事:
140
+
141
+ - 独立验证成功会把项目 Learned Area 中的 `testing` 变为
142
+ `active_learned`;
143
+ - `/learn promote` 是一次显式所有权转移:它把精确 fingerprint 对应、且已审查的
144
+ `ready` 或 `active_learned` revision 复制到用户正式 Skill 目录,并把生命周期
145
+ 改为 `promoted_user`。
146
+
147
+ 先检查具体 revision,再按名称、slug 或精确 capability ID 提升:
148
+
149
+ ```text
150
+ /learn show normalize-release-notes
151
+ /learn promote normalize-release-notes --scope user
152
+ ```
153
+
154
+ `--scope user` 是目前唯一支持的 scope,也可以省略。错误 scope、未知或重复
155
+ option,以及多余参数都会失败且不改变目录。目标位置是所配置 KodaX home 下的
156
+ `skills/<slug>/SKILL.md`,通常为
157
+ `~/.kodax/skills/<slug>/SKILL.md`;不同内容的同名正式 Skill 永远不会被覆盖。
158
+
159
+ 专属帮助入口为 `/learn promote --help`、`/learn help promote` 和
160
+ `/help learn promote`。在 Ink Learning Center 中可执行 `/learn`,选择一个
161
+ `active_learned` Skill,再选择 **Promote to user catalog**。
162
+
163
+ 首次 setup 会创建并校验 core/MCP/Extensions/A2A 分离配置及带注释模板,不覆盖
164
+ 现有配置,也不收集密钥。Auto[LLM] 在 classifier 延迟之前放行可精确建模的普通
165
+ 读取及 workspace/temp 变更;classifier 基础设施失败只重试一次,随后按
166
+ Accept-edits 边界降级,绝不切换到 rules。ASRT 是可选执行期 containment,不是
167
+ 权限裁决者;`/sandbox` 是显式诊断入口,SDK 宿主也可独立使用 `/sandbox`
168
+ subpath,且不可用时不会静默改为非隔离执行。KodaX 自身的 workspace containment
169
+ 会拒绝读取常见的用户主目录凭据路径及完整的已解析 agent home,同时不把普通外部
170
+ 读取收窄成 allowlist。详见
171
+ [v0.7.78 设计](docs/features/v0.7.78.md)、
172
+ [发布检查清单](docs/release.md#v0778-release-verification)与
173
+ [SDK 指南第 29–30 节](docs/SDK_EMBEDDER_GUIDE.md#29-evidence-gated-background-skill-learning-feature_263-v0778)。
174
+
175
+ 本次发布收口同时保证相邻表面不扭曲意图:Edit/Plan 可加载静态 Skill 指令,但不
176
+ 预授权其后续副作用;动态 Skill 命令必须由宿主显式控制 executor;根 AMA 使用受
177
+ 治理的 `memory_intent` 生命周期(包括在后续取消前已捕获的显式意图);Workflow
178
+ Actor wait 只有在 workflow 显式设置
179
+ deadline 时才超时;embedded、Worker 与 daemon 的 Runtime Auto v4 均声明
180
+ `fallbackPersistsEngine:false`。Actor owner 还会验证 Runtime identity,而不是只看
181
+ PID,因此 PID 复用不会卡住已崩溃 owner。恢复 Session 选择器也改为显示宿主本地时区。
182
+
183
+ v0.7.77 还增加了由宿主显式配置的 Shell Execution Contract。Runtime Session
124
184
  设置或单次 Run 可以选择 `pwsh`、Windows PowerShell、`cmd`、`bash`、`zsh`
125
185
  或 Git Bash 的绝对路径;KodaX 会在实际项目 cwd 中解析 shell 环境,再通过同一
126
186
  解释器执行命令。环境缓存按 contract 与 cwd 隔离,使用有界 TTL,也可由宿主显式
@@ -149,10 +209,11 @@ CLI 也会在配置的 deadline 被终止。详见
149
209
 
150
210
  **v0.7.72–v0.7.73 Runtime 权限契约:**Auto Mode 的权限决策由 Runtime Session 持有,
151
211
  不再由 UI hook 抢先决定。Runtime 会跨 turn 复用 LLM/rules guardrail,先分类、
152
- 仅在 `escalate` 时创建共享 permission 请求,并把自动降级到 rules 的结果持久化到
153
- session。Session 也可设置 classifier model 和有界 timeout;`auto` 默认使用 LLM
154
- 分类,没有有效 classifier model 时会在调用 provider 或创建审批前返回可恢复配置错误,
155
- 绝不静默退回 rules。Runtime 权限请求可给出由 Runtime 生成的精确作用域建议:一次允许、
212
+ 仅在 `escalate` 时创建共享 permission 请求,并持久化显式选择的 engine。
213
+ Session 也可设置 classifier model 和有界 timeout;`auto` 默认使用 LLM
214
+ 分类,没有有效 classifier model 时会在调用 provider 或创建审批前返回可恢复配置错误,
215
+ 绝不静默退回 rules。v0.7.78 classifier 失败会重试一次,再按 Accept-edits
216
+ 安全边界降级,绝不把 engine 改为 rules。Runtime 权限请求可给出由 Runtime 生成的精确作用域建议:一次允许、
156
217
  本 Session 允许,或(仅安全场景)持久允许;客户端只能回传不透明 suggestion id,不能从
157
218
  预览内容自行扩大范围。持久授权由 daemon 持有并通过 revision 管理。没有宿主审批回调时,
158
219
  不会向模型暴露 `exit_plan_mode`。完整 SDK 接入见
@@ -161,8 +222,9 @@ session。Session 也可设置 classifier model 和有界 timeout;`auto` 默
161
222
  **v0.7.74 Auto 切换可靠性:**默认用 `Shift+Tab` 在 `Plan -> Edits -> Auto`
162
223
  之间循环,`Shift+Enter` 仍用于换行。进入 Auto 时状态栏会立即显示已解析的
163
224
  `Auto[LLM]` 或 `Auto[RULES]`,同一 Session 的 Runtime 设置按键入顺序串行提交,
164
- 快速循环不会让较早的异步结果覆盖最后一次选择。`Auto[RULES]` 可能是自动降级或
165
- 手动选择后的合法粘性状态;使用 `/auto-engine llm` 可显式恢复 LLM 分类。
225
+ 快速循环不会让较早的异步结果覆盖最后一次选择。`Auto[RULES]` 是手动选择后的
226
+ 合法粘性状态;从 v0.7.78 起它只由显式/持久化选择产生。使用
227
+ `/auto-engine llm` 可显式选择 LLM 分类。
166
228
 
167
229
  ## 为什么用 KodaX
168
230
 
@@ -245,22 +307,61 @@ kodax
245
307
 
246
308
  可以先运行不会收集 Key 的交互配置:
247
309
 
248
- ```bash
249
- kodax setup
250
- ```
251
-
252
- 命令会保存 provider/model,告诉你准确的环境变量名,然后退出以便重启终端。
253
- 也可以直接设置 API Key:
310
+ ```bash
311
+ kodax setup
312
+
313
+ # 交互配置自定义 OpenAI/Anthropic-compatible provider
314
+ kodax setup --custom
315
+
316
+ # 只显示完整指导,不修改文件
317
+ kodax setup --help
318
+ ```
319
+
320
+ setup 会检查以下活跃文件以及对应的 `*.example.jsonc` 注释模板:
321
+
322
+ - `~/.kodax/config.json` 与 `~/.kodax/config.example.jsonc`
323
+ - `~/.kodax/integrations/mcp.json`
324
+ - `~/.kodax/integrations/extensions.json`
325
+ - `~/.kodax/integrations/a2a.json`
326
+
327
+ 活跃 `config.json` 仍是严格 JSON;`config.example.jsonc` 第一行指向全部分离配置,
328
+ 并注释说明所有受支持的 core 配置项。setup 不覆盖已有文件;创建空的权威分离配置
329
+ 前会先保全可读取的旧 `config.json#mcpServers` / `config.json#extensions`。命令会
330
+ 先验证已有活动配置;发现无效文件时会报告并停止,不创建或覆盖任何配置。随后才会
331
+ 保存 provider/model,告诉你准确的环境变量名,然后退出以便重启终端。也可以直接设置 API Key:
254
332
 
255
333
  ```bash
256
334
  # macOS / Linux
257
335
  export ZHIPU_API_KEY=your_api_key
258
336
 
259
337
  # PowerShell
260
- $env:ZHIPU_API_KEY="your_api_key"
261
- ```
262
-
263
- Qwen Token Plan 需要选择 `qwen-token-plan` 并使用单独的凭据;`QWEN_API_KEY`
338
+ $env:ZHIPU_API_KEY="your_api_key"
339
+ ```
340
+
341
+ ### 2.1 激活可选 sandbox
342
+
343
+ `kodax setup` 与首次安装 setup 会检查 sandbox。也可以显式检查或激活:
344
+
345
+ ```bash
346
+ kodax sandbox doctor
347
+ kodax sandbox setup
348
+ ```
349
+
350
+ - Windows 使用受限 sandbox 账户和网络策略。普通 Terminal 即可,按提示同意一次
351
+ UAC;不必先以管理员身份启动 Terminal。
352
+ - macOS 使用 Seatbelt/`sandbox-exec`,需要 ripgrep:
353
+ `brew install ripgrep`。
354
+ - Linux 使用 bubblewrap,需要 `bubblewrap`、`socat` 和 `ripgrep`,请根据发行版用
355
+ `apt`、`dnf` 或 `pacman` 安装。
356
+
357
+ KodaX 不会自动运行 `sudo` 或系统包管理器。sandbox 未激活时,确定性安全操作与
358
+ Auto[LLM] 的权限体验保持一致,只缺少 OS 级 containment;普通运行不会反复打扰。
359
+ 在 REPL 中,`/sandbox` 会刷新 ready 状态与诊断,但不会激活 backend 或请求提权。
360
+ 逐命令 sandbox 路由属于内部机制,不显示在普通命令历史中。SDK 嵌入方还可通过
361
+ `@kodax-ai/kodax/sandbox` 在 Auto[LLM] 之外独立使用该能力,
362
+ 见 [SDK sandbox 指南](docs/SDK_EMBEDDER_GUIDE.md#30-standalone-sandbox-sdk-v0778)。
363
+
364
+ Qwen Token Plan 需要选择 `qwen-token-plan` 并使用单独的凭据;`QWEN_API_KEY`
264
365
  不能用于该路由:
265
366
 
266
367
  ```bash
@@ -325,13 +426,14 @@ import { createImageArtifactFromPath } from '@kodax-ai/kodax/media'; // 输入 a
325
426
  import { SkillRegistry } from '@kodax-ai/kodax/skills'; // 零依赖 skill loader
326
427
  import { loadConfig } from '@kodax-ai/kodax/repl'; // REPL 配置 / session 工具
327
428
  import { createMcpManager } from '@kodax-ai/kodax/mcp'; // MCP popout manager(v0.7.42 起)
328
- import { listSessions } from '@kodax-ai/kodax/session'; // session 历史工具
329
- import { createKodaXRuntime } from '@kodax-ai/kodax/runtime'; // embedded/Worker/daemon 宿主 API
330
- import { createKodaXA2AServer } from '@kodax-ai/kodax/a2a'; // A2A 1.0 双向接入
331
- import { createMemoryAgent } from '@kodax-ai/kodax/experimental-memory'; // opt-in 实验性记忆 SDK
332
- ```
333
-
334
- 12 个 SDK 入口(root + 11 subpath)通过 ESM 共享 chunk 复用底层代码 —— 只 import `/agent` 不会把 `/repl` 的 Ink + React 一起拉进来。
429
+ import { listSessions } from '@kodax-ai/kodax/session'; // session 历史工具
430
+ import { createKodaXRuntime } from '@kodax-ai/kodax/runtime'; // embedded/Worker/daemon 宿主 API
431
+ import { runKodaXSandboxed } from '@kodax-ai/kodax/sandbox'; // 独立 ASRT 受控执行
432
+ import { createKodaXA2AServer } from '@kodax-ai/kodax/a2a'; // A2A 1.0 双向接入
433
+ import { createMemoryAgent } from '@kodax-ai/kodax/experimental-memory'; // opt-in 实验性记忆 SDK
434
+ ```
435
+
436
+ 13 个 SDK 入口(root + 12 subpath)通过 ESM 共享 chunk 复用底层代码 —— 只 import `/agent` 不会把 `/repl` 的 Ink + React 一起拉进来。
335
437
 
336
438
  完整的宿主集成契约——包括 embedded/Worker/daemon 所有权、外部 Agent 注册与任务控制、session cursor 分页、workflow 模型分层和效率遥测——见 [SDK Embedder Integration Guide](docs/SDK_EMBEDDER_GUIDE.md)。
337
439
 
@@ -571,8 +673,8 @@ dist/binary/linux-x64/
571
673
  | mimo-coding | `MIMO_CODING_API_KEY` | Native | mimo-v2.5-pro(小米 MiMo Token Plan,Anthropic 协议) |
572
674
  | 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) |
573
675
  | deepseek | `DEEPSEEK_API_KEY` | Native | deepseek-v4-flash(可 `/model` 切换 `deepseek-v4-pro`) |
574
- | gemini-cli | `GEMINI_API_KEY` | Prompt-only / CLI bridge | (通过 gemini CLI) |
575
- | codex-cli | `OPENAI_API_KEY` | Prompt-only / CLI bridge | (通过 codex CLI) |
676
+ | gemini-cli | Provider CLI 完成认证(无 KodaX API-key 环境变量) | Prompt-only / CLI bridge | (通过 gemini CLI) |
677
+ | codex-cli | Provider CLI 完成认证(无 KodaX API-key 环境变量) | Prompt-only / CLI bridge | (通过 codex CLI) |
576
678
 
577
679
  > 不在表里的端点:用上面"自定义 Provider"那一节加进来即可。
578
680
 
@@ -655,7 +757,7 @@ kodax --repo-intelligence full --repo-intelligence-trace
655
757
 
656
758
  ## 仓库结构
657
759
 
658
- KodaX 是基于 npm workspaces 的 TypeScript monorepo,**源码层 4 个 workspace 包**(FEATURE_194 v0.7.43 包合并 — 9 → 4,ADR-036),npm 上以单 bundle 包 `@kodax-ai/kodax` 发布 + 11 个 SDK subpath exports(`/agent`、`/llm`、`/coding`、`/media`、`/repl`、`/skills`、`/mcp`、`/session`、`/runtime`、`/a2a`、`/experimental-memory`;ADR-024 + ADR-032 + ADR-038)。核心包:
760
+ KodaX 是基于 npm workspaces 的 TypeScript monorepo,**源码层 4 个 workspace 包**(FEATURE_194 v0.7.43 包合并 — 9 → 4,ADR-036),npm 上以单 bundle 包 `@kodax-ai/kodax` 发布 + 12 个 SDK subpath exports(`/agent`、`/llm`、`/coding`、`/media`、`/repl`、`/skills`、`/mcp`、`/session`、`/runtime`、`/sandbox`、`/a2a`、`/experimental-memory`;ADR-024 + ADR-032 + ADR-038)。核心包:
659
761
 
660
762
  | Workspace 包 | 作用 | 主要依赖 |
661
763
  |----|------|---------|
@@ -664,20 +766,20 @@ KodaX 是基于 npm workspaces 的 TypeScript monorepo,**源码层 4 个 works
664
766
  | `@kodax-ai/coding` | Coding Agent:50+ 工具(含 canonical Actor 协作工具)、role prompts、agent loop、auto-continue + repo-intelligence protocol(v0.7.43 inline) | `@kodax-ai/llm`, `@kodax-ai/agent` |
665
767
  | `@kodax-ai/repl` | 完整交互式终端 UI(Ink / React、权限模式、命令系统、流式渲染) | `@kodax-ai/coding`, `ink`, `react` |
666
768
 
667
- 根目录 `src/kodax_cli.ts` 是 CLI 入口;`src/sdk-{agent,llm,coding,media,repl,skills,mcp,session,runtime,a2a,experimental-memory}.ts` 是 SDK subpath 入口;构建产物在 `dist/`,单文件二进制在 `dist/binary/<target>/`。
769
+ 根目录 `src/kodax_cli.ts` 是 CLI 入口;`src/sdk-{agent,llm,coding,media,repl,skills,mcp,session,runtime,sandbox,a2a,experimental-memory}.ts` 是 SDK subpath 入口;构建产物在 `dist/`,单文件二进制在 `dist/binary/<target>/`。
668
770
 
669
771
  ### 源码层 vs npm 发布层
670
772
 
671
773
  KodaX 有两层结构,SDK 用户需要分开理解:
672
774
 
673
775
  - **源码层**:上面 4 个 workspace 包(开发者读代码时看到的物理结构)。
674
- - **npm 发布层**:单个 bundled 包 `@kodax-ai/kodax`,对外暴露 11 个 SDK subpath(SDK 消费者 `import` 时看到的接口)。subpath 分两种角色:
776
+ - **npm 发布层**:单个 bundled 包 `@kodax-ai/kodax`,对外暴露 12 个 SDK subpath(SDK 消费者 `import` 时看到的接口)。subpath 分两种角色:
675
777
  - **完整包 subpath**(`/agent`、`/llm`、`/coding`、`/repl`)—— 每个 1:1 对应一个源码包,暴露完整公开 API。
676
- - **窄子集 subpath**(`/media`、`/skills`、`/mcp`、`/session`、`/experimental-memory`)—— 从 `/agent` 或 `/repl` 切出聚焦能力;`/experimental-memory` 明确为 opt-in 不稳定接口。
778
+ - **集成与窄子集 subpath**(`/media`、`/skills`、`/mcp`、`/session`、`/runtime`、`/sandbox`、`/a2a`、`/experimental-memory`)—— 聚焦能力或宿主集成边界;`/experimental-memory` 明确为 opt-in 不稳定接口。
677
779
 
678
780
  | 源码包 | npm subpath | 类型 | 内容 | 典型消费者 |
679
781
  |---|---|---|---|---|
680
- | `packages/llm` | `@kodax-ai/kodax/llm` | 完整包 | 15-alias LLM 抽象 (108 exports) | 独立 LLM 客户端 |
782
+ | `packages/llm` | `@kodax-ai/kodax/llm` | 完整包 | 16-alias LLM 抽象 (108 exports) | 独立 LLM 客户端 |
681
783
  | `packages/agent` | `@kodax-ai/kodax/agent` | 完整包 | Runner / fan-out / 外部 Agent plane / session-lineage / capabilities / tracing (331 exports) | 自定义 agent 框架 |
682
784
  | `packages/agent` | `@kodax-ai/kodax/skills` | **窄子集** | 仅 Skills 系统 —— `SkillRegistry` / `loadFullSkill` / `expandSkillForLLM` 等 (26 exports = v0.7.43 之前 `@kodax-ai/skills` 完整 API) | Skill 加载器、IDE 插件 |
683
785
  | `packages/agent` | `@kodax-ai/kodax/mcp` | **窄子集** | 仅 MCP —— `McpCapabilityProvider` / `createMcpTransport` / `searchMcpCatalog` 等 (23 exports) | MCP server 宿主 |
@@ -685,9 +787,10 @@ KodaX 有两层结构,SDK 用户需要分开理解:
685
787
  | `packages/agent` | `@kodax-ai/kodax/experimental-memory` | **实验性子集** | F228-backed `MemoryAgent` / `MemorySession` scope、recall、query、observation、outcome 契约 | 显式评估 FEATURE_260 的 SDK 宿主 |
686
788
  | `packages/coding` | `@kodax-ai/kodax/coding` | 完整包 | Coding agent + 50+ 工具 + repo-intelligence (505 exports) | 构建 Claude Code 形态产品 |
687
789
  | `packages/repl` | `@kodax-ai/kodax/repl` | 完整包 | Ink TUI + 权限模式 + 命令系统 (217 exports) | 终端 UI 消费者 |
688
- | `packages/repl` | `@kodax-ai/kodax/session` | **窄子集** | 仅会话管理 —— `listSessions` / `loadFullTranscript` / `appendClientNotice` / `forkSession` / `compactSession` / `watchSessions` 等 (17 exports) | 读取 session 历史的 IDE 插件和桌面宿主 |
689
- | `src` | `@kodax-ai/kodax/runtime` | 宿主 API | Embedded/Worker/daemon facade,含 sessions/runs/events/permissions/catalog/MCP/artifacts/diagnostics/外部 Agent 和 daemon schema (10 exports) | SDK 宿主、Space/IDE、daemon client |
690
- | `src` | `@kodax-ai/kodax/a2a` | 集成边界 | A2A 1.0 Agent Card 发现、JSON-RPC/SSE F258 executor、安全 fetch 与鉴权 Runtime Agent server | Agent 编排器和 KodaX 宿主 |
790
+ | `packages/repl` | `@kodax-ai/kodax/session` | **窄子集** | 仅会话管理 —— `listSessions` / `loadFullTranscript` / `appendClientNotice` / `forkSession` / `compactSession` / `watchSessions` 等 (17 exports) | 读取 session 历史的 IDE 插件和桌面宿主 |
791
+ | `src` | `@kodax-ai/kodax/runtime` | 宿主 API | Embedded/Worker/daemon facade,含 sessions/runs/events/permissions/catalog/MCP/artifacts/diagnostics/外部 Agent 和 daemon schema (10 exports) | SDK 宿主、Space/IDE、daemon client |
792
+ | `src` | `@kodax-ai/kodax/sandbox` | 宿主 API | 显式 ASRT capability/doctor/setup 与宿主自有受控命令执行;不可用时绝不静默普通执行 | 需要独立进程 containment SDK 宿主 |
793
+ | `src` | `@kodax-ai/kodax/a2a` | 集成边界 | A2A 1.0 Agent Card 发现、JSON-RPC/SSE F258 executor、安全 fetch 与鉴权 Runtime Agent server | Agent 编排器和 KodaX 宿主 |
691
794
 
692
795
  **经验法则**:需要 Runner / Agent / fan-out 时从 `/agent` 引入;只需要 skills 或 mcp API 时从 `/skills` 或 `/mcp` 引入,bundle 更小。窄子集是完整包的真子集 —— **不会**有额外符号。
693
796
 
@@ -705,7 +808,7 @@ runtime、消息、UI 历史、lineage、artifact、extension 状态、标题、
705
808
 
706
809
  **实验性 Memory Agent SDK(FEATURE_260,v0.7.68)**:`/experimental-memory` 暴露基于既有 F228 治理平面的薄 `MemoryAgent` 与 scoped `MemorySession`。被动 recall 零等待,`query()` 只读且由主 Action LLM 主动选择;持久化仍必须经过 proposal/preview/fingerprint/apply。召回内容保持低权限,安全与 scope 边界仍由确定性代码门禁承担。直接 session 示例与宿主边界见 [SDK Embedder Guide §21](docs/SDK_EMBEDDER_GUIDE.md#21-experimental-governed-memory--experimental-memory-feature_260-v0768)。
707
810
 
708
- **双向 A2A 1.0(FEATURE_267,v0.7.69)**:`/a2a` 可发现 allowlist 内的 Agent Card,并通过既有 F258 plane 安装 JSON-RPC/SSE executor。配置中的出站 Agent 还会作为 `external:<name>` 自动注册到 embedded CLI 与用户 daemon Runtime,因此主 Agent 无需宿主代码即可编排。一个 `a2a.json` 可保存多个出站注册,但最多只有一个入站 server;入站可发布 Runtime 默认 Agent,或发布一个经过验证的 `~/.kodax/agents/*.md` Agent。内置 listener 仅允许 loopback;公网部署必须由宿主用 TLS、鉴权和授权包住 `handle()`。不宣称支持 A2A 0.3、gRPC、HTTP+JSON、push notification,也不会自动把本地 Agent 暴露到网络。详见 [SDK Embedder Guide §22](docs/SDK_EMBEDDER_GUIDE.md#22-bidirectional-a2a-10--a2a-feature_267-v0769)。
811
+ **双向 A2A 1.0(FEATURE_267,v0.7.69)**:`/a2a` 可发现 allowlist 内的 Agent Card,并通过既有 F258 plane 安装 JSON-RPC/SSE executor。配置中的出站 Agent 还会作为 `external:<name>` 自动注册到 embedded CLI 与用户 daemon Runtime,因此主 Agent 无需宿主代码即可编排。一个 `a2a.json` 可保存多个出站注册,但最多只有一个入站 server;入站可发布 Runtime 默认 Agent,或发布一个经过验证的 `~/.kodax/agents/*.md` Agent。内置 listener 仅允许 loopback,且不会返回 Fetch 兼容客户端禁止的端口;公网部署必须由宿主用 TLS、鉴权和授权包住 `handle()`。不宣称支持 A2A 0.3、gRPC、HTTP+JSON、push notification,也不会自动把本地 Agent 暴露到网络。详见 [SDK Embedder Guide §22](docs/SDK_EMBEDDER_GUIDE.md#22-bidirectional-a2a-10--a2a-feature_267-v0769)。
709
812
 
710
813
  **A2A 互操作与认证加固**:发现得到的 interface 必须与受信 Agent Card 同源,且只有
711
814
  完整满足 Card/Skill 的一个 security requirement 时才会携带凭据。无代码 client
@@ -755,8 +858,9 @@ kodax a2a expose # 或:kodax a2a expose document-agent
755
858
  kodax a2a serve # 仅监听 http://127.0.0.1:8765
756
859
  ```
757
860
 
758
- MCP、A2A、Extension 分别使用 `~/.kodax/integrations/` 下的一个用户级文件。
759
- 可以通过 `kodax config template <mcp|a2a|extensions>` 查看模板,通过
861
+ MCP、A2A、Extension 分别使用 `~/.kodax/integrations/` 下的一个用户级文件。
862
+ 可以通过 `kodax config paths` 查看全部活跃/模板路径,通过
863
+ `kodax config template <core|mcp|a2a|extensions>` 查看模板,通过
760
864
  `kodax integrations migrate --apply` 迁移旧配置,并用 `kodax mcp`、
761
865
  `kodax a2a`、`kodax extensions` 管理。迁移只导入旧
762
866
  `config.json#mcpServers` 与 `config.json#extensions`;A2A 没有旧来源,且不会
@@ -824,11 +928,11 @@ KodaX/ # 4 workspace packages(FEATURE_194 v0.7.43)
824
928
  │ └── repl/ # @kodax-ai/repl —— Ink TUI
825
929
  ├── src/
826
930
  │ ├── kodax_cli.ts # CLI 主入口(bin: `kodax`)
827
- │ └── sdk-*.ts # SDK subpath 入口 → @kodax-ai/kodax/{agent,llm,coding,media,repl,skills,mcp,session,runtime,a2a,experimental-memory}
931
+ │ └── sdk-*.ts # SDK subpath 入口 → @kodax-ai/kodax/{agent,llm,coding,media,repl,skills,mcp,session,runtime,sandbox,a2a,experimental-memory}
828
932
  ├── scripts/
829
- │ ├── build-bundle.mjs # esbuild 单 bundle 多 entry 打包(CLI + root + 11 SDK subpath + chunks)
933
+ │ ├── build-bundle.mjs # esbuild 单 bundle 多 entry 打包(CLI + root + 12 SDK subpath + chunks)
830
934
  │ ├── build-binary.mjs # Bun --compile 单文件二进制打包
831
- │ └── release.mjs # ADR-024 release-time pkg name/exports 注入
935
+ │ └── release.mjs # 构建/审计后仅临时切换 private pack/publish
832
936
  └── .github/workflows/
833
937
  └── release.yml # 推 v* tag 自动发布 GitHub Release
834
938
  ```
@@ -1,33 +1,115 @@
1
- // KodaX core configuration template.
2
- // Copy only the fields you need to ~/.kodax/config.json (strict JSON).
3
- // MCP, A2A, and Extensions live in ~/.kodax/integrations/*.json; use
4
- // `kodax integrations migrate --dry-run` for legacy declarations.
5
- {
6
- // "provider": "deepseek",
7
- // "model": "deepseek-v4",
8
- // "runtimeMode": "embedded",
9
- // "effort": "high",
10
- // "agentMode": "ama",
11
- // "permissionMode": "accept-edits",
12
- // "locale": "zh",
13
- // "customProviders": [
14
- // {
15
- // "name": "my-relay",
1
+ // Split configs: ~/.kodax/integrations/mcp.json, extensions.json, and a2a.json.
2
+ // KodaX core configuration template.
3
+ // Copy only the fields you need to ~/.kodax/config.json (strict JSON).
4
+ // MCP, A2A, and Extensions live in ~/.kodax/integrations/*.json; use
5
+ // `kodax integrations migrate` to preview legacy declarations.
6
+ {
7
+ // Active provider alias and optional model override. Run `kodax setup` or
8
+ // `/model` instead of editing these manually when possible.
9
+ // "provider": "deepseek",
10
+ // "model": "deepseek-v4-flash",
11
+ // Add or reorder model ids shown by `/model` for a provider.
12
+ // "providerModels": {
13
+ // "deepseek": ["deepseek-v4-flash", "deepseek-v4-pro"]
14
+ // },
15
+
16
+ // Interactive Runtime hosting: "embedded" (this process) or "daemon".
17
+ // "runtimeMode": "embedded",
18
+
19
+ // Native model reasoning. `effort` is the preferred explicit depth;
20
+ // `reasoningCeiling` is the session ceiling. `reasoningMode` and `thinking`
21
+ // remain accepted for backward compatibility.
22
+ // "effort": "high",
23
+ // "planModeEffort": "high",
24
+ // "reasoningCeiling": "auto",
25
+ // "reasoningMode": "auto",
26
+ // "thinking": true,
27
+
28
+ // Agent harness: "ama" enables adaptive multi-agent use; "sa" forces one
29
+ // agent. Permission mode is "plan", "accept-edits", or classifier-backed
30
+ // "auto".
31
+ // "agentMode": "ama",
32
+ // "permissionMode": "accept-edits",
33
+ // User-level Bash allow patterns. Project additions belong in
34
+ // <project>/.kodax/config.local.json. Broad Bash(*) is rejected.
35
+ // "alwaysAllowTools": ["Bash(npm test)", "Bash(git status:*)"],
36
+ // "autoMode": {
37
+ // "engine": "llm",
38
+ // "classifierModel": "provider:model",
39
+ // "timeoutMs": 20000,
40
+ // "speculativeWindowMs": 500
41
+ // },
42
+
43
+ // UI/manual locale.
44
+ // "locale": "zh",
45
+
46
+ // Custom providers store public connection metadata only. Put the actual
47
+ // credential in the named environment variable, never in this file. Use
48
+ // `kodax setup --custom` for the guided writer.
49
+ // "customProviders": [
50
+ // {
51
+ // "name": "my-relay",
16
52
  // "protocol": "openai",
17
- // "baseUrl": "https://api.example.com/v1",
18
- // "apiKeyEnv": "MY_RELAY_API_KEY",
19
- // "model": "provider/model",
20
- // "reasoning": { "efforts": ["off", "low", "high"], "default": "high" }
21
- // }
22
- // ],
23
- // "repoIntelligenceMode": "auto",
24
- // Automatic large compaction is always enabled. Percentage defaults to 75
25
- // and is clamped to 15..90. A missing/zero absolute threshold is inactive;
26
- // otherwise the smaller percentage, absolute, and physical limit wins.
27
- // "compaction": {
28
- // "triggerPercent": 75,
29
- // "triggerTokens": 0
30
- // },
31
- // "sessionRetentionDays": 0,
32
- // "workflow": { "maxConcurrency": 8 }
33
- }
53
+ // "baseUrl": "https://api.example.com/v1",
54
+ // "apiKeyEnv": "MY_RELAY_API_KEY",
55
+ // "model": "provider/model",
56
+ // "models": ["provider/model", "provider/fast-model"],
57
+ // "reasoning": { "efforts": ["off", "low", "high"], "default": "high" },
58
+ // "userAgentMode": "compat",
59
+ // "contextWindow": 128000,
60
+ // "maxOutputTokens": 8192,
61
+ // "thinkingBudgetCap": 32000,
62
+ // "promptCacheAffinity": false,
63
+ // "replayReasoningContent": false,
64
+ // "strictThinkingSignature": false,
65
+ // "streamMaxDurationMs": 300000,
66
+ // "verifyStrategy": "models-list"
67
+ // }
68
+ // ],
69
+
70
+ // Repository intelligence. Mode: "auto", "full", "light", or "off".
71
+ // "repoIntelligenceMode": "auto",
72
+ // "repoIntelligenceTrace": false,
73
+ // "repoIntelligence": {
74
+ // "toolWaitMs": 250,
75
+ // "workerTimeoutMs": 30000,
76
+ // "workerOldSpaceMb": 1024,
77
+ // "storageDir": "~/.kodax/repo-intelligence"
78
+ // },
79
+
80
+ // Runtime/provider diagnostics and timeouts.
81
+ // "streamIdleTimeoutMs": 120000,
82
+ // "verifierLog": false,
83
+ // "stallLog": false,
84
+
85
+ // Ordered provider fallback for child tasks and optional model tiers used by
86
+ // workflow/dispatch model hints.
87
+ // "fallbackProviders": ["ark-coding", "kimi-code"],
88
+ // "fastProvider": "openai",
89
+ // "fastModel": "gpt-5-mini",
90
+ // "deepProvider": "anthropic",
91
+ // "deepModel": "claude-opus-4-6",
92
+
93
+ // Provider/LSP/ACP process settings.
94
+ // "maxOutputTokens": 8192,
95
+ // "disablePromptCache": false,
96
+ // "lsp": true,
97
+ // "lspAutoDownload": false,
98
+ // "acpLogLevel": "info",
99
+
100
+ // Automatic large compaction is always enabled. Percentage defaults to 75
101
+ // and is clamped to 15..90. A missing/zero absolute threshold is inactive;
102
+ // otherwise the smaller percentage, absolute, and physical limit wins.
103
+ // "compaction": {
104
+ // "enabled": true,
105
+ // "contextWindow": 128000,
106
+ // "triggerPercent": 75,
107
+ // "triggerTokens": 0
108
+ // },
109
+
110
+ // 0 disables automatic session pruning.
111
+ // "sessionRetentionDays": 0,
112
+
113
+ // Workflow host concurrency. The Runtime still applies its system cap.
114
+ // "workflow": { "maxConcurrency": 8 }
115
+ }
@@ -0,0 +1,2 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{Ja as g,La as h,Ya as i,a as c,cb as j,ra as d,sa as e,ta as f}from"./chunk-TQDBTTIM.js";import"./chunk-Z3KFRTSB.js";import"./chunk-KQLQYHWU.js";import"./chunk-YAZQTC2L.js";import"./chunk-5NDCSFOP.js";import{qb as a,rb as b}from"./chunk-VAT2QYXM.js";import"./chunk-6XM4B6K2.js";import"./chunk-2CFHBKRE.js";import"./chunk-NXO6GWSY.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,j as runKodaX,i as saveSessionSnapshot,a as validateAndFixToolHistory};
@@ -0,0 +1,2 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{Ua as a,Va as b}from"./chunk-YVRYHC4C.js";import"./chunk-6YZUE6NC.js";import"./chunk-7OEBJGHK.js";import"./chunk-5GO6FH7L.js";import"./chunk-TQDBTTIM.js";import"./chunk-UID7BLAB.js";import"./chunk-Z3KFRTSB.js";import"./chunk-6FOJVETH.js";import"./chunk-KQLQYHWU.js";import"./chunk-YAZQTC2L.js";import"./chunk-5NDCSFOP.js";import"./chunk-VAT2QYXM.js";import"./chunk-6XM4B6K2.js";import"./chunk-2CFHBKRE.js";import"./chunk-NXO6GWSY.js";import"./chunk-ONUPGMER.js";export{a as ArgumentCompleter,b as createArgumentCompleter};
@@ -1,5 +1,5 @@
1
1
  // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{g as R,h as _}from"./chunk-IQT4RPCE.js";import{a as r}from"./chunk-ONUPGMER.js";var g={user:0,background:1};function Z(t,e){return g[t]<=g[e]}r(Z,"priorityWithinMax");function O(t,e){return!(t.agentId!==e.agentId||!Z(t.priority,e.maxPriority)||e.mode!==void 0&&t.mode!==e.mode||e.id!==void 0&&t.id!==e.id||e.predicate&&!e.predicate(t))}r(O,"matchesFilter");var E=class{static{r(this,"MessageQueue")}messages=[];nextSeq=1;listeners=new Set;snapshotRef=Object.freeze([]);notify(e){this.snapshotRef=Object.freeze([...this.messages]);for(let i of this.listeners)try{i(e)}catch{}}subscribe=r(e=>(this.listeners.add(e),()=>{this.listeners.delete(e)}),"subscribe");getSnapshot=r(()=>this.snapshotRef,"getSnapshot");enqueue(e){let i=`msg-${this.nextSeq++}`,o={id:i,priority:e.priority,mode:e.mode,content:e.content,agentId:e.agentId,inputArtifacts:e.inputArtifacts,taskResult:e.taskResult,enqueuedAt:Date.now()};return this.messages=[...this.messages,o],this.notify({kind:"enqueued",message:o}),i}dequeue(e){let i=[];for(let s=0;s<this.messages.length;s++){let m=this.messages[s];m&&O(m,e)&&i.push({originalIndex:s,message:m})}i.sort((s,m)=>{let l=g[s.message.priority]-g[m.message.priority];return l!==0?l:s.originalIndex-m.originalIndex});let o=e.limit,n=typeof o=="number"&&i.length>o?i.slice(0,o):i;if(n.length===0)return[];let a=new Set(n.map(s=>s.originalIndex));this.messages=this.messages.filter((s,m)=>!a.has(m));let d=n.map(s=>s.message);return this.notify({kind:"dequeued",messages:d}),d}peek(e){let i=[];for(let a=0;a<this.messages.length;a++){let d=this.messages[a];d&&O(d,e)&&i.push({originalIndex:a,message:d})}i.sort((a,d)=>{let s=g[a.message.priority]-g[d.message.priority];return s!==0?s:a.originalIndex-d.originalIndex});let o=e.limit;return(typeof o=="number"&&i.length>o?i.slice(0,o):i).map(a=>a.message)}size(){return this.messages.length}count(e){return this.peek(e).length}has(e){return this.count(e)>0}clear(){if(this.messages.length===0)return;let e=this.messages;this.messages=[],this.notify({kind:"cleared",messages:e})}},w;function h(){return w||(w=new E),w}r(h,"getMessageQueue");function ee(){w=void 0}r(ee,"_resetMessageQueueForTests");function A(t,e){return t?`actor:${t}:${e}`:e==="/root"?void 0:e}r(A,"actorQueueId");var f=new Map;function te(t){f.set(t,(f.get(t)??0)+1);let e=!1;return()=>{if(e)return;e=!0;let i=f.get(t);i===void 0||i<=1?f.delete(t):f.set(t,i-1)}}r(te,"registerActiveRootQueueRoute");function x(){if(f.size!==0){if(f.size===1)return f.keys().next().value;throw new Error("Cannot infer queued follow-up target: multiple Actor root sessions are active. Pass sessionId or agentId explicitly.")}}r(x,"resolveActiveRootQueueRoute");function ie(){f.clear()}r(ie,"_resetActiveRootQueueRoutesForTests");var N=new Set(["wait_agent"]);function $(t){return t.some(i=>N.has(i))?"background":"user"}r($,"midTurnDrainPriority");function re(t){let e=$(t.lastTurnToolNames);return h().dequeue({agentId:t.agentId,maxPriority:e,limit:t.limit})}r(re,"maybeDrainMidTurn");var u=class extends Error{static{r(this,"KodaXMediaError")}code;detail;cause;constructor(e,i,o={}){super(i),this.name="KodaXMediaError",this.code=e,this.detail=o.detail,this.cause=o.cause}},p=class extends u{static{r(this,"ImageResizeError")}constructor(e,i={}){super(i.code??"IMAGE_TOO_LARGE",e,i),this.name="ImageResizeError"}};import F from"node:path";var ne={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"},oe={".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 C(t){return ne[F.extname(t).toLowerCase()]}r(C,"inferImageMediaType");function U(t){return oe[F.extname(t).toLowerCase()]}r(U,"inferVideoMediaType");function ae(t,e={}){let i=e.mediaType??C(t);return{kind:"image",path:t,...i?{mediaType:i}:{},...e.source?{source:e.source}:{},...e.description?{description:e.description}:{}}}r(ae,"createImageArtifactFromPath");function se(t,e={}){if(e.mediaType!==void 0&&e.mimeType!==void 0&&e.mediaType!==e.mimeType)throw new u("UNSUPPORTED_MEDIA_TYPE",`File artifact mediaType and mimeType disagree: ${e.mediaType} != ${e.mimeType}.`);return{kind:"file",path:t,...e.mediaType?{mediaType:e.mediaType}:{},...e.mimeType?{mimeType:e.mimeType}:{},...e.name?{name:e.name}:{},...e.source?{source:e.source}:{},...e.description?{description:e.description}:{}}}r(se,"createFileArtifactFromPath");function de(t,e={}){let i=e.mediaType??U(t);if(!i)throw new u("UNSUPPORTED_MEDIA_TYPE",`Cannot infer video media type from path: ${t}.`);return{kind:"video",path:t,mediaType:i,...e.name?{name:e.name}:{},...e.source?{source:e.source}:{},...e.description?{description:e.description}:{}}}r(de,"createVideoArtifactFromPath");import{Jimp as me}from"jimp";var K=2e3,L=Math.floor(3.75*1024*1024),ue=[80,60,40];async function k(t,e={}){let i=e.maxDimension??K,o=e.targetBytes??L;if(t.length===0)throw new p("Empty image buffer.",{code:"IMAGE_DECODE_FAILED"});let n;try{n=await me.read(t)}catch(c){let I=c instanceof Error?c.message:String(c);throw new p(`Failed to decode image: ${I}`,{code:"IMAGE_DECODE_FAILED",cause:c})}let{width:a,height:d}=n.bitmap,s=Math.max(a,d);if(s>i){let c=i/s;n.resize({w:Math.max(1,Math.round(a*c)),h:Math.max(1,Math.round(d*c))})}let m=n.bitmap.width,l=n.bitmap.height;if(e.preferMediaType!=="image/jpeg"){let c=await n.getBuffer("image/png");if(c.length<=o)return{buffer:Buffer.from(c),mediaType:"image/png",width:m,height:l}}for(let c of ue){let I=await n.getBuffer("image/jpeg",{quality:c});if(I.length<=o)return{buffer:Buffer.from(I),mediaType:"image/jpeg",width:m,height:l}}if(e.preferMediaType==="image/jpeg"){let c=await n.getBuffer("image/png");if(c.length<=o)return{buffer:Buffer.from(c),mediaType:"image/png",width:m,height:l}}throw new p(`Image still exceeds budget (${o} 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"})}r(k,"normalizePastedImage");import{spawn as j}from"node:child_process";import{mkdtemp as ce,readFile as fe,rm as pe}from"node:fs/promises";import{tmpdir as le}from"node:os";import q from"node:path";var B=5e3;async function G(){switch(process.platform){case"darwin":return he();case"win32":return Te();case"linux":return ye();default:throw new u("UNSUPPORTED_PLATFORM",`Clipboard image fallback is not supported on platform "${process.platform}".`)}}r(G,"readClipboardImage");async function ge(t={}){let e=await G();return e?k(e,t):null}r(ge,"readAndNormalizeClipboardImage");async function Y(t){let e=await ce(q.join(le(),"kodax-clip-")),i=q.join(e,"clip.png");try{return await t(i)}finally{await pe(e,{recursive:!0,force:!0}).catch(o=>{})}}r(Y,"runWithTempPng");async function he(){return Y(async t=>{let e=`set png_data to (the clipboard as \xABclass PNGf\xBB)
2
+ import{g as R,h as _}from"./chunk-NXO6GWSY.js";import{a as r}from"./chunk-ONUPGMER.js";var g={user:0,background:1};function Z(t,e){return g[t]<=g[e]}r(Z,"priorityWithinMax");function O(t,e){return!(t.agentId!==e.agentId||!Z(t.priority,e.maxPriority)||e.mode!==void 0&&t.mode!==e.mode||e.id!==void 0&&t.id!==e.id||e.predicate&&!e.predicate(t))}r(O,"matchesFilter");var E=class{static{r(this,"MessageQueue")}messages=[];nextSeq=1;listeners=new Set;snapshotRef=Object.freeze([]);notify(e){this.snapshotRef=Object.freeze([...this.messages]);for(let i of this.listeners)try{i(e)}catch{}}subscribe=r(e=>(this.listeners.add(e),()=>{this.listeners.delete(e)}),"subscribe");getSnapshot=r(()=>this.snapshotRef,"getSnapshot");enqueue(e){let i=`msg-${this.nextSeq++}`,o={id:i,priority:e.priority,mode:e.mode,content:e.content,agentId:e.agentId,inputArtifacts:e.inputArtifacts,taskResult:e.taskResult,enqueuedAt:Date.now()};return this.messages=[...this.messages,o],this.notify({kind:"enqueued",message:o}),i}dequeue(e){let i=[];for(let s=0;s<this.messages.length;s++){let m=this.messages[s];m&&O(m,e)&&i.push({originalIndex:s,message:m})}i.sort((s,m)=>{let l=g[s.message.priority]-g[m.message.priority];return l!==0?l:s.originalIndex-m.originalIndex});let o=e.limit,n=typeof o=="number"&&i.length>o?i.slice(0,o):i;if(n.length===0)return[];let a=new Set(n.map(s=>s.originalIndex));this.messages=this.messages.filter((s,m)=>!a.has(m));let d=n.map(s=>s.message);return this.notify({kind:"dequeued",messages:d}),d}peek(e){let i=[];for(let a=0;a<this.messages.length;a++){let d=this.messages[a];d&&O(d,e)&&i.push({originalIndex:a,message:d})}i.sort((a,d)=>{let s=g[a.message.priority]-g[d.message.priority];return s!==0?s:a.originalIndex-d.originalIndex});let o=e.limit;return(typeof o=="number"&&i.length>o?i.slice(0,o):i).map(a=>a.message)}size(){return this.messages.length}count(e){return this.peek(e).length}has(e){return this.count(e)>0}clear(){if(this.messages.length===0)return;let e=this.messages;this.messages=[],this.notify({kind:"cleared",messages:e})}},w;function h(){return w||(w=new E),w}r(h,"getMessageQueue");function ee(){w=void 0}r(ee,"_resetMessageQueueForTests");function A(t,e){return t?`actor:${t}:${e}`:e==="/root"?void 0:e}r(A,"actorQueueId");var f=new Map;function te(t){f.set(t,(f.get(t)??0)+1);let e=!1;return()=>{if(e)return;e=!0;let i=f.get(t);i===void 0||i<=1?f.delete(t):f.set(t,i-1)}}r(te,"registerActiveRootQueueRoute");function x(){if(f.size!==0){if(f.size===1)return f.keys().next().value;throw new Error("Cannot infer queued follow-up target: multiple Actor root sessions are active. Pass sessionId or agentId explicitly.")}}r(x,"resolveActiveRootQueueRoute");function ie(){f.clear()}r(ie,"_resetActiveRootQueueRoutesForTests");var N=new Set(["wait_agent"]);function $(t){return t.some(i=>N.has(i))?"background":"user"}r($,"midTurnDrainPriority");function re(t){let e=$(t.lastTurnToolNames);return h().dequeue({agentId:t.agentId,maxPriority:e,limit:t.limit})}r(re,"maybeDrainMidTurn");var u=class extends Error{static{r(this,"KodaXMediaError")}code;detail;cause;constructor(e,i,o={}){super(i),this.name="KodaXMediaError",this.code=e,this.detail=o.detail,this.cause=o.cause}},p=class extends u{static{r(this,"ImageResizeError")}constructor(e,i={}){super(i.code??"IMAGE_TOO_LARGE",e,i),this.name="ImageResizeError"}};import F from"node:path";var ne={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"},oe={".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 C(t){return ne[F.extname(t).toLowerCase()]}r(C,"inferImageMediaType");function U(t){return oe[F.extname(t).toLowerCase()]}r(U,"inferVideoMediaType");function ae(t,e={}){let i=e.mediaType??C(t);return{kind:"image",path:t,...i?{mediaType:i}:{},...e.source?{source:e.source}:{},...e.description?{description:e.description}:{}}}r(ae,"createImageArtifactFromPath");function se(t,e={}){if(e.mediaType!==void 0&&e.mimeType!==void 0&&e.mediaType!==e.mimeType)throw new u("UNSUPPORTED_MEDIA_TYPE",`File artifact mediaType and mimeType disagree: ${e.mediaType} != ${e.mimeType}.`);return{kind:"file",path:t,...e.mediaType?{mediaType:e.mediaType}:{},...e.mimeType?{mimeType:e.mimeType}:{},...e.name?{name:e.name}:{},...e.source?{source:e.source}:{},...e.description?{description:e.description}:{}}}r(se,"createFileArtifactFromPath");function de(t,e={}){let i=e.mediaType??U(t);if(!i)throw new u("UNSUPPORTED_MEDIA_TYPE",`Cannot infer video media type from path: ${t}.`);return{kind:"video",path:t,mediaType:i,...e.name?{name:e.name}:{},...e.source?{source:e.source}:{},...e.description?{description:e.description}:{}}}r(de,"createVideoArtifactFromPath");import{Jimp as me}from"jimp";var K=2e3,L=Math.floor(3.75*1024*1024),ue=[80,60,40];async function k(t,e={}){let i=e.maxDimension??K,o=e.targetBytes??L;if(t.length===0)throw new p("Empty image buffer.",{code:"IMAGE_DECODE_FAILED"});let n;try{n=await me.read(t)}catch(c){let I=c instanceof Error?c.message:String(c);throw new p(`Failed to decode image: ${I}`,{code:"IMAGE_DECODE_FAILED",cause:c})}let{width:a,height:d}=n.bitmap,s=Math.max(a,d);if(s>i){let c=i/s;n.resize({w:Math.max(1,Math.round(a*c)),h:Math.max(1,Math.round(d*c))})}let m=n.bitmap.width,l=n.bitmap.height;if(e.preferMediaType!=="image/jpeg"){let c=await n.getBuffer("image/png");if(c.length<=o)return{buffer:Buffer.from(c),mediaType:"image/png",width:m,height:l}}for(let c of ue){let I=await n.getBuffer("image/jpeg",{quality:c});if(I.length<=o)return{buffer:Buffer.from(I),mediaType:"image/jpeg",width:m,height:l}}if(e.preferMediaType==="image/jpeg"){let c=await n.getBuffer("image/png");if(c.length<=o)return{buffer:Buffer.from(c),mediaType:"image/png",width:m,height:l}}throw new p(`Image still exceeds budget (${o} 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"})}r(k,"normalizePastedImage");import{spawn as j}from"node:child_process";import{mkdtemp as ce,readFile as fe,rm as pe}from"node:fs/promises";import{tmpdir as le}from"node:os";import q from"node:path";var B=5e3;async function G(){switch(process.platform){case"darwin":return he();case"win32":return Te();case"linux":return ye();default:throw new u("UNSUPPORTED_PLATFORM",`Clipboard image fallback is not supported on platform "${process.platform}".`)}}r(G,"readClipboardImage");async function ge(t={}){let e=await G();return e?k(e,t):null}r(ge,"readAndNormalizeClipboardImage");async function Y(t){let e=await ce(q.join(le(),"kodax-clip-")),i=q.join(e,"clip.png");try{return await t(i)}finally{await pe(e,{recursive:!0,force:!0}).catch(o=>{})}}r(Y,"runWithTempPng");async function he(){return Y(async t=>{let e=`set png_data to (the clipboard as \xABclass PNGf\xBB)
3
3
  set fh to open for access POSIX file "${t.replace(/"/g,'\\"')}" with write permission
4
4
  write png_data to fh
5
5
  close access fh`;return await Q("osascript",["-e",e])?z(t):null})}r(he,"readMacClipboard");async function Te(){return Y(async t=>{let e=["Add-Type -AssemblyName System.Drawing | Out-Null","$img = Get-Clipboard -Format Image","if ($null -eq $img) { exit 1 }",`$img.Save('${t.replace(/'/g,"''")}', [System.Drawing.Imaging.ImageFormat]::Png)`].join("; ");return await Q("powershell",["-NoProfile","-Command",e])?z(t):null})}r(Te,"readWinClipboard");async function ye(){return await X("wl-paste",["--type","image/png"])??X("xclip",["-selection","clipboard","-t","image/png","-o"])}r(ye,"readLinuxClipboard");async function z(t){try{let e=await fe(t);return e.length>0?e:null}catch(e){return null}}r(z,"readNonEmptyFile");function Q(t,e){return new Promise(i=>{let o=!1,n=j(t,[...e],{stdio:"ignore",windowsHide:!0}),a=setTimeout(()=>{o||(o=!0,n.kill(),i(!1))},B);n.once("error",()=>{o||(o=!0,clearTimeout(a),i(!1))}),n.once("exit",d=>{o||(o=!0,clearTimeout(a),i(d===0))})})}r(Q,"runCommand");function X(t,e){return new Promise(i=>{let o=!1,n=[],a=j(t,[...e],{stdio:["ignore","pipe","ignore"],windowsHide:!0}),d=setTimeout(()=>{o||(o=!0,a.kill(),i(null))},B);a.stdout?.on("data",s=>n.push(s)),a.once("error",()=>{o||(o=!0,clearTimeout(d),i(null))}),a.once("exit",s=>{if(o)return;if(o=!0,clearTimeout(d),s!==0){i(null);return}let m=Buffer.concat(n);i(m.length>0?m:null)})})}r(X,"collectStdoutBytes");import{createHash as Ie}from"node:crypto";import{mkdir as we,readdir as Ee,stat as _e,unlink as Ae,writeFile as xe}from"node:fs/promises";import{tmpdir as ke}from"node:os";import M from"node:path";var V="KODAX_PASTE_TMP_DIR",W=1440*60*1e3;function H(){return process.env[V]??M.join(ke(),"kodax-paste")}r(H,"resolvePasteTmpDir");function Me(t){let e=t?.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return e&&e.length>0?e:"paste"}r(Me,"sanitizeFileNamePrefix");async function De(t,e={}){let i=e.directory??H();await we(i,{recursive:!0});let o=t.mediaType==="image/jpeg"?".jpg":".png",n=Ie("sha256").update(t.buffer).digest("hex").slice(0,16),a=`${Me(e.fileNamePrefix)}-${n}${o}`,d=M.join(i,a);return await xe(d,t.buffer),{type:"image",path:d,mediaType:t.mediaType}}r(De,"persistImageAsBlock");async function Pe(t=Date.now()){let e=H(),i;try{i=await Ee(e)}catch(a){return 0}let o=t-W,n=0;return await Promise.all(i.filter(a=>/-[0-9a-f]{16}\.(?:png|jpg)$/.test(a)).map(async a=>{let d=M.join(e,a);try{(await _e(d)).mtimeMs<o&&(await Ae(d),n+=1)}catch(s){}})),n}r(Pe,"prunePasteTmpDir");var T=["image/png","image/jpeg","image/webp","image/gif"],y=["video/mp4","video/mpeg","video/quicktime","video/x-msvideo","video/x-flv","video/webm","video/x-ms-wmv","video/3gpp"],ve=[],Se=new Set(["anthropic","openai"]),be=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-preview","qwen-token-plan/qwen3.7-plus","qwen-token-plan/qwen3.6-flash"]),Re=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 D(t){return{nativeSupported:!1,sdkSupported:!1,status:"unsupported",mediaTypes:[],maxCount:0,reason:t}}r(D,"unsupported");function Oe(t){return{nativeSupported:!0,sdkSupported:!0,status:"supported",mediaTypes:T,nativeMediaTypes:T,reason:t}}r(Oe,"supportedImage");function Ne(t){return{nativeSupported:!0,sdkSupported:!1,status:"provider-native-unwired",mediaTypes:[],nativeMediaTypes:y,maxCount:0,reason:t}}r(Ne,"nativeVideoUnwired");function $e(t){return t.trim().toLowerCase()}r($e,"normalizeProvider");function Fe(t){return _[t]?.model}r(Fe,"resolveProviderDefaultModel");function J(t,e){if(!e)return;let i=e.trim().toLowerCase();if(t==="kimi"){if(i==="k2.5")return"kimi-k2.5";if(i==="k2.6")return"kimi-k2.6";if(i==="k2.7-code")return"kimi-k2.7-code";if(i==="k2.7-code-highspeed")return"kimi-k2.7-code-highspeed"}return(t==="minimax-coding"||t==="minimax")&&i==="minimax-m3"?"minimax-m3":i}r(J,"normalizeModel");function Ce(t){if(!Se.has(t))return!1;let e=_[t];return e?R(e.capabilityProfile).multimodalSupport!=="none":!1}r(Ce,"hasOfficialImageSupport");function Ue(t,e){let i=J(t,e);if(!i)return!1;let o=`${t}/${i}`;return Re.has(o)}r(Ue,"hasSourceBackedNativeMedia");function Ke(t,e){let i=J(t,e);return i?be.has(`${t}/${i}`):!1}r(Ke,"hasSourceBackedImage");function Le(t,e,i){if(i)return"source-backed";if(e){if(t==="openai")return"openai-official";if(t==="anthropic")return"anthropic-official"}}r(Le,"resolveImageCapabilityRoute");function qe(t){switch(t){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."}}r(qe,"imageCapabilityReason");function P(t){let e=$e(t.provider),i=t.model?.trim()||Fe(e),o=Ce(e),n=Ue(e,i),a=n||Ke(e,i),d=Le(e,o,a),s=d!==void 0,m=n;return{text:!0,image:s?Oe(qe(d)):D("No verified KodaX image-input route for this provider/model."),video:m?Ne("Model route is native-video capable, but KodaX SDK video sending is not wired yet. Reject or downgrade before send."):D("No verified native video route for this provider/model."),file:D("File artifact contract is stable, but KodaX SDK file sending/extraction is not wired yet. Reject or downgrade before send.")}}r(P,"getModelInputCapabilities");function Xe(t){return T.includes(t)}r(Xe,"isKnownImageMediaType");function je(t){return y.includes(t)}r(je,"isKnownVideoMediaType");function v(t){return`${t.provider}${t.model?`/${t.model}`:""}`}r(v,"routeLabel");function S(t){return t.reason?`${t.status}: ${t.reason}`:t.status}r(S,"capabilityDetail");function b(t,e){if(t.length===0)return;let i=P(e);for(let o of t){let n=o;if(n.kind==="image"){if(!i.image.nativeSupported||!i.image.sdkSupported)throw new u("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume image artifacts: ${v(e)}.`,{detail:S(i.image)});if(typeof n.mediaType=="string"&&!Xe(n.mediaType))throw new u("UNSUPPORTED_MEDIA_TYPE",`Unsupported image media type: ${n.mediaType}.`);continue}throw n.kind==="video"?typeof n.mediaType!="string"||!je(n.mediaType)?new u("UNSUPPORTED_MEDIA_TYPE",`Unsupported video media type: ${String(n.mediaType)}.`,{detail:`Supported video media types: ${y.join(", ")}`}):new u("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume video artifacts through this SDK runtime: ${v(e)}.`,{detail:S(i.video)}):n.kind==="file"?typeof n.mediaType=="string"&&typeof n.mimeType=="string"&&n.mediaType!==n.mimeType?new u("UNSUPPORTED_MEDIA_TYPE",`File artifact mediaType and mimeType disagree: ${n.mediaType} != ${n.mimeType}.`):new u("MODEL_INPUT_UNSUPPORTED",`Provider/model cannot consume file artifacts through this SDK runtime: ${v(e)}.`,{detail:S(i.file)}):new u("MODEL_INPUT_UNSUPPORTED",`Unsupported input artifact kind: ${String(n.kind)}.`)}}r(b,"validateInputArtifactsForModel");function Be(t){if(b(t.inputArtifacts??[],t),t.agentId!==void 0&&t.sessionId!==void 0)throw new Error("enqueueWithArtifacts accepts either agentId or sessionId, not both.");if(t.sessionId!==void 0&&t.sessionId.trim().length===0)throw new Error("enqueueWithArtifacts sessionId must not be empty.");let e=t.agentId??(t.sessionId!==void 0?A(t.sessionId,"/root"):x());return h().enqueue({priority:t.priority??"user",mode:"prompt",content:t.content,agentId:e,inputArtifacts:t.inputArtifacts})}r(Be,"enqueueWithArtifacts");export{E as a,h as b,ee as c,A as d,te as e,x as f,ie as g,N as h,$ as i,re as j,u as k,p as l,C as m,U as n,ae as o,se as p,de as q,K as r,L as s,k as t,G as u,ge as v,V as w,W as x,De as y,Pe as z,T as A,y as B,ve as C,P as D,b as E,Be as F};