@kodax-ai/kodax 0.7.95 → 0.7.96-alpha.2

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 (163) hide show
  1. package/CHANGELOG.md +178 -1
  2. package/LICENSE +158 -158
  3. package/README.md +149 -24
  4. package/README_CN.md +117 -24
  5. package/config-templates/config.example.jsonc +2 -1
  6. package/config-templates/integrations/a2a.example.jsonc +91 -91
  7. package/config-templates/integrations/extensions.example.jsonc +7 -7
  8. package/config-templates/integrations/mcp.example.jsonc +16 -16
  9. package/dist/builtin/code-review/SKILL.md +82 -82
  10. package/dist/builtin/git-workflow/SKILL.md +84 -84
  11. package/dist/builtin/skill-creator/SKILL.md +127 -127
  12. package/dist/builtin/skill-creator/agents/analyzer.md +12 -12
  13. package/dist/builtin/skill-creator/agents/comparator.md +13 -13
  14. package/dist/builtin/skill-creator/agents/grader.md +13 -13
  15. package/dist/builtin/skill-creator/references/schemas.md +227 -227
  16. package/dist/builtin/skill-creator/scripts/aggregate-benchmark.d.ts +46 -46
  17. package/dist/builtin/skill-creator/scripts/aggregate-benchmark.js +208 -208
  18. package/dist/builtin/skill-creator/scripts/analyze-benchmark.d.ts +46 -46
  19. package/dist/builtin/skill-creator/scripts/analyze-benchmark.js +286 -286
  20. package/dist/builtin/skill-creator/scripts/compare-runs.d.ts +62 -62
  21. package/dist/builtin/skill-creator/scripts/compare-runs.js +330 -330
  22. package/dist/builtin/skill-creator/scripts/generate-review.d.ts +33 -33
  23. package/dist/builtin/skill-creator/scripts/generate-review.js +414 -414
  24. package/dist/builtin/skill-creator/scripts/grade-evals.d.ts +73 -73
  25. package/dist/builtin/skill-creator/scripts/grade-evals.js +402 -402
  26. package/dist/builtin/skill-creator/scripts/improve-description.d.ts +23 -23
  27. package/dist/builtin/skill-creator/scripts/improve-description.js +160 -160
  28. package/dist/builtin/skill-creator/scripts/init-skill.d.ts +14 -14
  29. package/dist/builtin/skill-creator/scripts/init-skill.js +155 -155
  30. package/dist/builtin/skill-creator/scripts/install-skill.d.ts +29 -29
  31. package/dist/builtin/skill-creator/scripts/install-skill.js +173 -173
  32. package/dist/builtin/skill-creator/scripts/package-skill.d.ts +38 -38
  33. package/dist/builtin/skill-creator/scripts/package-skill.js +121 -121
  34. package/dist/builtin/skill-creator/scripts/quick-validate.d.ts +8 -8
  35. package/dist/builtin/skill-creator/scripts/quick-validate.js +163 -163
  36. package/dist/builtin/skill-creator/scripts/run-eval.d.ts +66 -66
  37. package/dist/builtin/skill-creator/scripts/run-eval.js +353 -353
  38. package/dist/builtin/skill-creator/scripts/run-loop.d.ts +49 -49
  39. package/dist/builtin/skill-creator/scripts/run-loop.js +242 -242
  40. package/dist/builtin/skill-creator/scripts/run-trigger-eval.d.ts +58 -58
  41. package/dist/builtin/skill-creator/scripts/run-trigger-eval.js +224 -224
  42. package/dist/builtin/tdd/SKILL.md +56 -56
  43. package/dist/chunks/agent-4FABF6WK.js +2 -0
  44. package/dist/chunks/argument-completer-72VHB2VL.js +2 -0
  45. package/dist/chunks/{chunk-7JXA3533.js → chunk-4OIQZWA5.js} +223 -226
  46. package/dist/chunks/{chunk-BNVSKIAB.js → chunk-6BVF3HZ7.js} +136 -136
  47. package/dist/chunks/chunk-7JZZIFZH.js +501 -0
  48. package/dist/chunks/chunk-AC7Z2OIY.js +2 -0
  49. package/dist/chunks/{chunk-JS452J2F.js → chunk-C4KYZAFU.js} +2 -2
  50. package/dist/chunks/chunk-CHUPIWIF.js +251 -0
  51. package/dist/chunks/{chunk-C4DTUKTR.js → chunk-GYUU7XLH.js} +5 -4
  52. package/dist/chunks/{chunk-OK4AXDC5.js → chunk-HAX55GOQ.js} +1 -1
  53. package/dist/chunks/chunk-JKTJCGO2.js +418 -0
  54. package/dist/chunks/{chunk-O743AJ5V.js → chunk-LQYETRFK.js} +171 -175
  55. package/dist/chunks/{chunk-2PEDBGKN.js → chunk-LTUZTQ6W.js} +1 -1
  56. package/dist/chunks/chunk-LYWDUSKO.js +2 -0
  57. package/dist/chunks/chunk-NGH6T4FD.js +92 -0
  58. package/dist/chunks/{chunk-SRIJX5ZP.js → chunk-NVRWCSA5.js} +1 -1
  59. package/dist/chunks/chunk-O4DS7RIQ.js +384 -0
  60. package/dist/chunks/chunk-ORXU6OWZ.js +2 -0
  61. package/dist/chunks/chunk-POTW3O65.js +124 -0
  62. package/dist/chunks/{chunk-2TM3W3GK.js → chunk-RIQSS56Y.js} +1 -1
  63. package/dist/chunks/chunk-U27XKEN5.js +407 -0
  64. package/dist/chunks/{chunk-6ABQJUK6.js → chunk-XUX6OUCA.js} +2 -2
  65. package/dist/chunks/{client-JDOS3YJR.js → client-4C456K4O.js} +1 -1
  66. package/dist/chunks/compaction-config-3VQRDFF4.js +2 -0
  67. package/dist/chunks/{construction-bootstrap-YCWHHUYO.js → construction-bootstrap-AHN7EDGG.js} +1 -1
  68. package/dist/chunks/dist-BCBQXAGI.js +2 -0
  69. package/dist/chunks/dist-QK2YDWU6.js +2 -0
  70. package/dist/chunks/host-VIHV7ADG.js +2 -0
  71. package/dist/chunks/run-manager-NBVMU3KV.js +2 -0
  72. package/dist/chunks/utils-MEJZ2IGI.js +2 -0
  73. package/dist/index.d.ts +22 -21
  74. package/dist/index.js +7 -7
  75. package/dist/kodax_bootstrap.js +26 -26
  76. package/dist/kodax_cli.js +1905 -1882
  77. package/dist/native/darwin-arm64/LICENSE-APACHE.txt +13 -0
  78. package/dist/native/darwin-arm64/kodax-text-transaction.node +0 -0
  79. package/dist/native/darwin-arm64/manifest.json +16 -0
  80. package/dist/native/darwin-x64/LICENSE-APACHE.txt +13 -0
  81. package/dist/native/darwin-x64/kodax-text-transaction.node +0 -0
  82. package/dist/native/darwin-x64/manifest.json +16 -0
  83. package/dist/native/linux-arm64/LICENSE-APACHE.txt +13 -0
  84. package/dist/native/linux-arm64/kodax-text-transaction.node +0 -0
  85. package/dist/native/linux-arm64/manifest.json +16 -0
  86. package/dist/native/linux-x64/LICENSE-APACHE.txt +13 -0
  87. package/dist/native/linux-x64/kodax-text-transaction.node +0 -0
  88. package/dist/native/linux-x64/manifest.json +16 -0
  89. package/dist/native/win32-x64/LICENSE-APACHE.txt +13 -0
  90. package/dist/native/win32-x64/NOTICE-windows-sandbox.txt +8 -0
  91. package/dist/native/win32-x64/kodax-windows-sandbox.exe +0 -0
  92. package/dist/native/win32-x64/kodax-windows-text-transaction.node +0 -0
  93. package/dist/native/win32-x64/manifest.json +30 -0
  94. package/dist/provider-capabilities.json +108 -2
  95. package/dist/runtime-worker.js +1745 -1727
  96. package/dist/sandbox-network-broker.js +1715 -0
  97. package/dist/sdk-a2a.d.ts +13 -12
  98. package/dist/sdk-a2a.js +1 -1
  99. package/dist/sdk-agent.d.ts +27 -18
  100. package/dist/sdk-agent.js +1 -1
  101. package/dist/sdk-coding.d.ts +107 -58
  102. package/dist/sdk-coding.js +1 -1
  103. package/dist/sdk-experimental-memory.d.ts +4 -4
  104. package/dist/sdk-experimental-memory.js +1 -1
  105. package/dist/sdk-llm.d.ts +9 -10
  106. package/dist/sdk-llm.js +1 -1
  107. package/dist/sdk-mcp.js +1 -1
  108. package/dist/sdk-media.d.ts +1 -1
  109. package/dist/sdk-media.js +1 -1
  110. package/dist/sdk-repl.d.ts +25 -17
  111. package/dist/sdk-repl.js +1 -1
  112. package/dist/sdk-runtime.d.ts +41 -17
  113. package/dist/sdk-runtime.js +1 -1
  114. package/dist/sdk-sandbox.d.ts +17 -3
  115. package/dist/sdk-sandbox.js +1 -1
  116. package/dist/sdk-session.d.ts +8 -7
  117. package/dist/sdk-session.js +1 -1
  118. package/dist/sdk-skills.js +1 -1
  119. package/dist/semantic-worker.js +61 -61
  120. package/dist/types-chunks/{base.d-vopO1rml.d.ts → base.d-COo8E2dk.d.ts} +18 -27
  121. package/dist/types-chunks/{bash-prefix-extractor.d-B2rxNI4L.d.ts → bash-prefix-extractor.d-DQOlA8cy.d.ts} +72 -52
  122. package/dist/types-chunks/{capability-learning.d-CE1tm29C.d.ts → capability-learning.d-lRPgA3Or.d.ts} +1 -1
  123. package/dist/types-chunks/{capsule.d-Y7QRS4J2.d.ts → capsule.d-0zxsgXg_.d.ts} +3 -3
  124. package/dist/types-chunks/{controller.d-BR-UVeUR.d.ts → controller.d-BTtyIIC1.d.ts} +1 -1
  125. package/dist/types-chunks/{controller.d-C5noq5-w.d.ts → controller.d-C7tXUcXo.d.ts} +2 -2
  126. package/dist/types-chunks/{guardrail.d-DqHD-61O.d.ts → guardrail.d-DKTyEHJa.d.ts} +5 -5
  127. package/dist/types-chunks/{history-retrieval.d-CKU8zmt_.d.ts → history-retrieval.d-CHnL99S7.d.ts} +2 -2
  128. package/dist/types-chunks/{public-api.d-D7fXaWW8.d.ts → public-api.d-Dx3L3W4Z.d.ts} +7 -4
  129. package/dist/types-chunks/{repl.d-BYDb14s6.d.ts → repl.d-mO01olIa.d.ts} +5 -5
  130. package/dist/types-chunks/{resolver.d-CwHUwbdE.d.ts → resolver.d-DlXPjeyx.d.ts} +38 -6
  131. package/dist/types-chunks/{review-inbox.d-BSgFewyj.d.ts → review-inbox.d-WDSe1nze.d.ts} +1 -1
  132. package/dist/types-chunks/{run-manager.d-BVJSntpS.d.ts → run-manager.d-DENbbzgR.d.ts} +1 -1
  133. package/dist/types-chunks/{sdk-session-CqEG84oP.d.ts → sdk-session-DYHGXXH4.d.ts} +3 -3
  134. package/dist/types-chunks/{shell-command-sets.d-DqaaBwhU.d.ts → shell-command-sets.d-CjFqS4dp.d.ts} +1 -1
  135. package/dist/types-chunks/{side-query.d-iH0P9ASy.d.ts → side-query.d-j8A3sFv_.d.ts} +2 -2
  136. package/dist/types-chunks/{types.d-rUOjXych.d.ts → types.d-BbZjR0Wr.d.ts} +1 -1
  137. package/dist/types-chunks/{types.d-CaTXAW_Q.d.ts → types.d-BkTIKdH6.d.ts} +2 -2
  138. package/dist/types-chunks/{types.d-C5xQEFcj.d.ts → types.d-DncLrpu_.d.ts} +4 -4
  139. package/dist/types-chunks/{types.d-CK9A9rpP.d.ts → types.d-Xy0f3x4i.d.ts} +9 -0
  140. package/dist/types-chunks/{utils.d-CWUyLiXo.d.ts → utils.d-CnxefMos.d.ts} +6 -6
  141. package/package.json +10 -3
  142. package/public_docs/README.md +130 -0
  143. package/public_docs/configuration/sandbox.md +289 -0
  144. package/public_docs/sdk/embedder-guide.md +6674 -0
  145. package/scripts/kodax-bin.cjs +28 -28
  146. package/scripts/production-env.cjs +25 -25
  147. package/dist/chunks/agent-XXZMXKKA.js +0 -2
  148. package/dist/chunks/argument-completer-KCYDGTQW.js +0 -2
  149. package/dist/chunks/chunk-77PNP27P.js +0 -92
  150. package/dist/chunks/chunk-7QBWHCIZ.js +0 -2
  151. package/dist/chunks/chunk-BHE66SP3.js +0 -123
  152. package/dist/chunks/chunk-BR2OSB2I.js +0 -722
  153. package/dist/chunks/chunk-DSMONSVB.js +0 -407
  154. package/dist/chunks/chunk-Q5VRWSKG.js +0 -418
  155. package/dist/chunks/chunk-XWRPOGJN.js +0 -4
  156. package/dist/chunks/chunk-Y5VIQBT6.js +0 -383
  157. package/dist/chunks/compaction-config-EGS4577X.js +0 -2
  158. package/dist/chunks/dist-ITTXQHRJ.js +0 -2
  159. package/dist/chunks/dist-KFYN3OKD.js +0 -2
  160. package/dist/chunks/host-VAYADIPW.js +0 -2
  161. package/dist/chunks/run-manager-52IJZMZJ.js +0 -2
  162. package/dist/chunks/utils-P7PBSL3R.js +0 -2
  163. package/dist/sandbox-workspace-session.js +0 -1705
package/README.md CHANGED
@@ -61,7 +61,8 @@ KodaX opens the provider/model metadata setup. Use `kodax setup` to rerun the
61
61
  flow, `kodax setup --custom` for a guided custom provider, and
62
62
  `kodax setup --help` (or REPL `/setup --help`) for paths, provider variables,
63
63
  commands, and shortcuts. Interactive setup also checks the optional ASRT sandbox once:
64
- Windows may show a one-time UAC prompt; macOS/Linux report any required
64
+ Windows requests UAC during activation (an existing v2 account rotation may
65
+ require a second confirmation); macOS/Linux report any required
65
66
  Seatbelt/bubblewrap dependencies. Declining or missing a dependency does not
66
67
  break ordinary permission handling, and normal startup will not keep reminding
67
68
  you.
@@ -206,11 +207,13 @@ kodax sandbox setup
206
207
  ```
207
208
 
208
209
  - Windows uses a restricted sandbox account and network policy. A normal
209
- terminal is sufficient; approve the one-time UAC prompt.
210
+ terminal is sufficient; approve the activation UAC confirmation(s).
210
211
  - macOS uses Seatbelt/`sandbox-exec` and requires ripgrep
211
212
  (`brew install ripgrep`).
212
213
  - Linux uses bubblewrap and requires `bubblewrap`, `socat`, and `ripgrep`
213
- (install them with your distro's `apt`, `dnf`, or `pacman`).
214
+ (install them with your distro's `apt`, `dnf`, or `pacman`). The host kernel
215
+ and security policy must also permit unprivileged user namespaces; KodaX
216
+ reports a failed backend launch and does not change system policy itself.
214
217
 
215
218
  KodaX never runs `sudo` or a package manager automatically. If the sandbox is
216
219
  not active, deterministic safe operations and Auto[LLM] decisions keep the
@@ -341,34 +344,28 @@ Sidecar verifier judge calls use provider-level forced tool choice when supporte
341
344
 
342
345
  #### Opting a custom provider into image / vision input (FEATURE_134 v0.7.40)
343
346
 
344
- If your custom provider's underlying model supports image input (vision), add a `capabilityProfile.multimodalSupport: "image-input"` block so KodaX does not artificially block multimodal requests at the SA-path policy gate. Built-in vision-capable aliases (Anthropic, OpenAI, compatible aliases such as Kimi, Qwen, Zhipu, MiniMax, MiMo, Ark, plus Gemini-CLI via the CLI's `@<path>` file-include syntax) already ship with this flag enabled by default. DeepSeek V4 and Codex-CLI are text-only; custom providers need to opt in when their underlying model supports image input.
347
+ If your custom provider's underlying model supports image input (vision), set `"imageInput": true` so KodaX's image routing and the provider-policy gate both let image artifacts through. This is the typical shape for self-hosted multimodal models served by vLLM or SGLang behind an OpenAI-compatible endpoint (Qwen-VL-style models):
345
348
 
346
349
  ```json
347
350
  {
348
351
  "customProviders": [
349
352
  {
350
- "name": "my-vision-provider",
353
+ "name": "my-vllm",
351
354
  "protocol": "openai",
352
- "baseUrl": "https://example.com/v1",
353
- "apiKeyEnv": "MY_LLM_API_KEY",
354
- "model": "my-vision-model",
355
- "capabilityProfile": {
356
- "transport": "native-api",
357
- "conversationSemantics": "full-history",
358
- "mcpSupport": "none",
359
- "contextFidelity": "full",
360
- "toolCallingFidelity": "full",
361
- "sessionSupport": "full",
362
- "longRunningSupport": "full",
363
- "multimodalSupport": "image-input",
364
- "evidenceSupport": "full"
365
- }
355
+ "baseUrl": "http://localhost:8000/v1",
356
+ "apiKeyEnv": "MY_VLLM_API_KEY",
357
+ "model": "Qwen/Qwen3.8-27B-Instruct",
358
+ "imageInput": true
366
359
  }
367
360
  ]
368
361
  }
369
362
  ```
370
363
 
371
- The serializer layer (`packages/llm/src/providers/anthropic.ts:770` for Anthropic-compat, `openai.ts:904` for OpenAI-compat) forwards image blocks automatically through base-class inheritance. The flag only gates whether KodaX's policy layer pre-rejects multimodal requests — the model-level vision contract remains your upstream provider's responsibility. If the model is actually text-only, you'll see the real upstream API error instead of a KodaX-side rejection.
364
+ `imageInput: true` forces `capabilityProfile.multimodalSupport: "image-input"` on every KodaX surface (provider instance, capability queries, policy gates), overriding an explicit `"none"`. The advanced alternative — a hand-written `capabilityProfile` block with `"multimodalSupport": "image-input"` — works too; see [Custom Providers](public_docs/configuration/custom-providers.md). Leave it unset for text-only models and image artifacts are rejected with `MODEL_INPUT_UNSUPPORTED` before the request is sent.
365
+
366
+ Built-in vision-capable aliases (Anthropic, OpenAI, compatible aliases such as Kimi, Qwen, Zhipu, MiniMax, MiMo, Ark, plus Gemini-CLI via the CLI's `@<path>` file-include syntax) already ship with image input enabled. DeepSeek V4's default models (`deepseek-v4-flash` / `deepseek-v4-pro`) and Codex-CLI are text-only — on the built-in `deepseek` alias only `deepseek-v4-flash-vision-exp` takes images; custom providers need to opt in when their underlying model supports image input.
367
+
368
+ The serializer layer (`packages/llm/src/providers/anthropic.ts:1431` for Anthropic-compat, `openai.ts:1496` for OpenAI-compat) forwards image blocks automatically through base-class inheritance — OpenAI-compatible endpoints receive standard `image_url` blocks. The flag only gates whether KodaX's policy layer pre-rejects multimodal requests — the model-level vision contract remains your upstream provider's responsibility. If the model is actually text-only, you'll see the real upstream API error instead of a KodaX-side rejection.
372
369
 
373
370
  ### 3. Start in REPL or run a one-shot task
374
371
 
@@ -436,6 +433,37 @@ const isolated = await createKodaXRuntime({
436
433
  });
437
434
  ```
438
435
 
436
+ ### Structured Runtime failures
437
+
438
+ Since v0.7.96, when Runtime has a structured failure fact, failed/cancelled runs
439
+ and unknown settlement states project the same credential-safe `failureDetail`
440
+ through failure or settlement events, `handle.result` / `runs.await()`,
441
+ `runs.get()` / `runs.list()`, and `sessions.diagnostics()`. Branch on the stable
442
+ KodaX `providerErrorCode`; use `safeMessage` for display, and treat
443
+ `upstreamErrorCode`, `requestId`, `httpStatus`, and `retryAfterMs` as optional
444
+ support metadata.
445
+
446
+ ```ts
447
+ const session = await isolated.sessions.create({ title: 'Repository summary' });
448
+ const handle = await isolated.runs.start({
449
+ sessionId: session.id,
450
+ input: { type: 'text', text: 'Summarize this repo.' },
451
+ });
452
+ const result = await handle.result;
453
+
454
+ if (result.failureDetail) {
455
+ const { providerErrorCode, safeMessage, requestId } = result.failureDetail;
456
+ showFailure(safeMessage, { providerErrorCode, requestId });
457
+ }
458
+ ```
459
+
460
+ `safeMessage` is a bounded KodaX-owned template, not copied upstream text. The
461
+ Runtime never copies credentials, prompts, request/response bodies, raw header
462
+ collections, URLs, full local paths, stacks, or raw `Error` objects into
463
+ `failureDetail`; only the documented allowlisted metadata may be extracted.
464
+ See [Structured Runtime failures](public_docs/sdk/embedder-guide.md#structured-credential-safe-runtime-failures)
465
+ for the field contract, taxonomy, migration guidance, and security boundary.
466
+
439
467
  Inline is private and lowest-overhead; Worker is private and hard-disposable;
440
468
  daemon is process-isolated and shared. `runtime.close()` closes private
441
469
  inline/Worker ownership, but only detaches one daemon client. Contradictory
@@ -484,7 +512,8 @@ bootstrap-only child exec boundary and removed before daemon or ordinary user
484
512
  child code loads. The default-enabled Electron `RunAsNode` fuse is required;
485
513
  hosts that disable it must start the daemon through ordinary Node/KodaX CLI and
486
514
  connect in attach-only mode. For SDK calls, `homeDir` is the CLI-style base
487
- directory that owns `.kodax`, not the `.kodax` path itself.
515
+ directory that owns `.kodax`, not the `.kodax` path itself. Electron embedders
516
+ must also follow the [native artifact unpacking contract](public_docs/sdk/embedder-guide.md#packaged-electron-native-artifact-layout).
488
517
 
489
518
  **v0.7.75 Windows GUI stabilization candidate:** Runtime Worker-reachable
490
519
  non-interactive subprocesses request hidden Windows consoles across memory/Git,
@@ -726,6 +755,102 @@ permission UI, and recovers stale prepared Session tails through an
726
755
  authoritative merge. Background persistence failures are surfaced as
727
756
  diagnostics rather than hidden.
728
757
 
758
+ **v0.7.96-alpha.2 release (Windows hotfix):** restored the Windows
759
+ boot-identity PowerShell resolution helper that the FEATURE_295 cleanup
760
+ deleted while its last caller stayed. On v0.7.96-alpha.1 every Windows exit
761
+ settlement crashed with `windowsAclPowerShellExecutable is not defined` and
762
+ left sandbox cleanup `unverified`; the restored helper plus a win32 regression
763
+ test close Issue 325. v0.7.96-alpha.1 is broken on Windows — upgrade to
764
+ v0.7.96-alpha.2. See the
765
+ [v0.7.96-alpha.2 release checklist](docs/release.md#v0796-alpha2-release-preparation).
766
+
767
+ **v0.7.96-alpha.1 release:** controlled
768
+ text tools and shell containment are separate authorities on every desktop
769
+ platform. `write`, `edit`, `multi_edit`,
770
+ `insert_after_anchor`, and `undo` run in the trusted KodaX Runtime with final
771
+ path/identity policy checks, a cross-Runtime per-file kernel lock, revision
772
+ CAS, metadata-preserving flushed atomic replacement, and a protected native
773
+ state root. They do not enter ASRT, a workspace
774
+ session, shell runner, setup, cleanup, owner, reset, or poison state, and are
775
+ not described as OS-token-sandboxed. The root and `/coding` direct SDK entries
776
+ (`runKodaX`, `startKodaX`, `runManagedTask`, `createKodaXTaskRunner`, `createDefaultCodingAgent`,
777
+ `KodaXClient`, and its `Client` alias) bind the same native text
778
+ authority by default and read newly registered linked-worktree roots at
779
+ transaction time. Windows shell commands keep ASRT only for network/account
780
+ services and use the KodaX native restricted-token runner with
781
+ a nonce-bound per-policy private desktop, creation-time Job containment, and framed stdio. Native shell commands from
782
+ different policies, Sessions, and Runtime processes do not share a
783
+ command-lifetime filesystem-effect lease. Commands in one Runtime with the
784
+ same network policy and sandbox-account generation share one ASRT network
785
+ broker while retaining independent policy tokens and Jobs. Unlike policies do
786
+ not share authority; Issue 308 tracks ASRT 0.0.65's remaining fixed-port
787
+ capacity limit across distinct policies and Runtime processes. Arbitrary shell writes remain normal
788
+ OS races; only controlled text tools participate in KodaX CAS. Target stdin EOF
789
+ does not close the native control stream. Authenticated directional pipes keep
790
+ control and events independent; timeout/cancel validates a nonce-bound runner
791
+ Job-drain record before returning the original stop reason.
792
+ Windows trusted replacement automatically converts an obsolete sandbox-owned
793
+ file to trusted-host ownership and preserves the ordered effective ACE policy.
794
+ The filesystem may canonicalize DACL protection/inheritance control at the
795
+ atomic namespace commit; stale inherited authority is not copied from an old
796
+ parent. The
797
+ shell cannot read or write workspace-local `.kodax/runtime` control state even
798
+ when the surrounding workspace is writable.
799
+ Each shared broker owns a verified native liveness controller whose named pipe
800
+ is created with a protected Host/SYSTEM-only DACL and multiple pending
801
+ instances. Restricted targets cannot connect or exhaust it; controller or
802
+ broker loss closes the channel and drains every attached command Job.
803
+ Native request/terminal state is kept in a no-reparse, host/SYSTEM-only control
804
+ directory; both SDK policy validation and the native host reject overlapping
805
+ allow roots and deny roots at/below it before target launch. Doctor only
806
+ verifies. After proving the sandbox account idle, explicit setup can retire an
807
+ expired dead-PID request or a dead-owner terminal record that already proves
808
+ Job drainage before repairing host-owned state. Live, unexpired, malformed,
809
+ unknown, and deny-recovery records remain fail-closed.
810
+ If Unix cannot prove directory durability after the atomic commit, the tool
811
+ returns `text_mutation_commit_uncertain` with the complete pre/post receipt and
812
+ requires a reread instead of a blind retry. Existing-file edits retain their
813
+ Undo backup; a commit-uncertain Undo is rebound to the observed post-commit
814
+ revision so a later CAS-checked Undo can resolve it. See
815
+ [ADR-066](docs/ADR.md#adr-066-trusted-text-transactions-and-a-native-windows-shell-sandbox-are-separate-authorities).
816
+ This incompatible authority split is fenced by `sandboxRuntime:6`, so a new
817
+ client never silently reuses a daemon that still implements the v0.7.95 graph.
818
+ Existing Windows installations run `kodax sandbox setup` once: the cutover
819
+ waits for old sandbox processes to exit, recreates the dedicated account with
820
+ a new SID, and records the native protocol/SID generation. Missing migration
821
+ state blocks native shell admission, not trusted text tools.
822
+ On Windows, the embedded release manifest pins text/shell protocols and hashes
823
+ plus the ASRT release version and hash. Verified executables are staged in a
824
+ content-addressed protected LocalAppData store independent of `KODAX_HOME`;
825
+ ASRT is checked before materialization and again before broker startup. Text
826
+ remains Host/SYSTEM-only, the dedicated sandbox group SID receives read/execute
827
+ on the shell artifact, and local Users receive read/execute on ASRT; neither
828
+ sandbox trustee nor local Users receives write/delete authority.
829
+ A package-store hardlink is accepted only in bundled builds, through a
830
+ handle-bound bounded read whose complete bytes match the embedded release
831
+ digest; development manifests and sources remain single-link. The executable
832
+ used by the broker is still a separate, protected single-link file. Allow-root
833
+ authorization changes only exact canonical roots and never rewrites their
834
+ private ancestor DACLs.
835
+ Linux and macOS use the same trusted-text authority with native no-follow/
836
+ `flock`/CAS/atomic commit, while shell commands remain per-command ASRT
837
+ bubblewrap/Seatbelt invocations with no KodaX workspace-session owner.
838
+ Issue 307 tracks the narrower ASRT-owned runner pre-main creation window that
839
+ also remains in current Codex; final command targets are still placed in their
840
+ Job at process creation, and trusted text tools never enter that boundary.
841
+ Issue 309 records the other Codex-compatible Windows residual: stable root
842
+ capabilities do not override an explicit ambient loader-compatibility ACE,
843
+ whether left by an earlier sandbox command or already present on an external or
844
+ host-owned descendant. This release also replaces the local tool-result
845
+ capacity hard gate with capacity-debt admission and a bounded recovery
846
+ ladder (ADR-067), classifies local capacity terminals as
847
+ `failureKind: "context_capacity"` with structured `contextTokens`, and
848
+ exposes one credential-safe `failureDetail` across failure events, Run
849
+ result/status, and Session diagnostics. It advertises Windows
850
+ `sandboxRuntime:6`; `runtimeExitSettlement:2` and `crashOutcomeModel:2` are
851
+ unchanged. See the
852
+ [v0.7.96-alpha.1 release checklist](docs/release.md#v0796-alpha1-release-preparation).
853
+
729
854
  **v0.7.95 release:** stale learning locks with zero-byte,
730
855
  malformed, or truncated owner records self-recover after an unchanged
731
856
  bytes/stat check. Same-boot Windows `unconfirmed-owner` cleanup retries until
@@ -943,7 +1068,7 @@ KodaX/
943
1068
  │ ├── kodax_cli.ts # Main CLI entry point (bin: `kodax`)
944
1069
  │ └── sdk-*.ts # SDK subpath re-exports → @kodax-ai/kodax/{agent,llm,coding,media,repl,skills,mcp,session,runtime,sandbox,a2a,experimental-memory}
945
1070
  │
946
- └── package.json # Publish-shaped exports; release.mjs only toggles private during pack/publish
1071
+ └── package.json # Publish-shaped exports; publish ships the CI-built tarball (release.mjs), local --pack-only keeps private:true
947
1072
  ```
948
1073
 
949
1074
  ### Package Dependencies
@@ -1147,7 +1272,7 @@ changes require an explicit server restart. Managed
1147
1272
  A2A contexts default to `~/kodax_a2a_server_workspace/<runtime-profile>/contexts/`.
1148
1273
  Exact Skill scripts require the opt-in isolated policy and a passing
1149
1274
  `kodax sandbox doctor` (`kodax sandbox setup` performs the explicit Windows
1150
- one-time provisioning).
1275
+ provisioning or v2 account-SID cutover).
1151
1276
 
1152
1277
  ---
1153
1278
 
@@ -1796,7 +1921,7 @@ await runInkInteractiveMode({ provider: 'zhipu-coding', effort: 'auto' });
1796
1921
  | mimo | `MIMO_API_KEY` | Native | mimo-v2.5-pro (Xiaomi MiMo pay-per-token, Anthropic-compat) |
1797
1922
  | mimo-coding | `MIMO_CODING_API_KEY` | Native | mimo-v2.5-pro (Xiaomi Token Plan, Anthropic-compat) |
1798
1923
  | 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) |
1799
- | deepseek | `DEEPSEEK_API_KEY` | Native | deepseek-v4-flash (`deepseek-v4-pro` via `/model`) |
1924
+ | deepseek | `DEEPSEEK_API_KEY` | Native | deepseek-v4-flash (`deepseek-v4-pro` plus vision model `deepseek-v4-flash-vision-exp` with image input, via `/model`) |
1800
1925
  | gemini-cli | Provider CLI authentication (no KodaX API-key variable) | Prompt-only / CLI bridge | (via gemini CLI) |
1801
1926
  | codex-cli | Provider CLI authentication (no KodaX API-key variable) | Prompt-only / CLI bridge | (via codex CLI) |
1802
1927
 
package/README_CN.md CHANGED
@@ -58,7 +58,8 @@ kodax
58
58
  provider/model 元数据设置。使用 `kodax setup` 重新运行设置,
59
59
  使用 `kodax setup --custom` 配置自定义 provider;使用 `kodax setup --help` 或
60
60
  REPL `/setup --help` 查看完整路径、环境变量、命令和快捷键。交互式 setup 还会检查
61
- 一次可选 ASRT sandbox:Windows 可能弹出一次 UAC;
61
+ 一次可选 ASRT sandbox:Windows 激活时会请求 UAC(已有安装进行 v2 账户 SID
62
+ 轮换时可能需要第二次确认);
62
63
  macOS/Linux 会报告 Seatbelt/bubblewrap 所需依赖。拒绝 UAC 或缺少依赖不会破坏普通
63
64
  权限管理,日常启动也不会反复提醒。
64
65
 
@@ -92,12 +93,39 @@ data/session root 下的 inline Runtime,不参与 Coder owner fence。capabili
92
93
  fail closed,不能静默退回 inline Coder。完整接入说明见
93
94
  [SDK Embedder Guide §23](public_docs/sdk/embedder-guide.md#23-shared-coder-daemon-for-space-and-ide-hosts-feature_269-v0769)。
94
95
 
96
+ ### 结构化且凭据安全的 Runtime 错误
97
+
98
+ 自 v0.7.96 起,当 Runtime 已生成结构化失败事实时,失败和取消 Run
99
+ 会在终端事件、
100
+ `handle.result` / `runs.await()`、
101
+ `runs.get()` / `runs.list()` 以及 `sessions.diagnostics()` 中提供一致的
102
+ `failureDetail`;Runtime 收尾失败形成 `unknown` 状态时通过 `run.updated` 透出。
103
+ 上述字段是可选的,只在 Runtime 已生成结构化失败事实时出现。宿主应按稳定的
104
+ KodaX `providerErrorCode` 处理错误,向用户展示
105
+ `safeMessage`;`upstreamErrorCode`、`requestId`、`httpStatus` 和
106
+ `retryAfterMs` 仅作为可能缺失的支持信息。
107
+
108
+ ```ts
109
+ const result = await handle.result;
110
+ if (result.failureDetail) {
111
+ const { providerErrorCode, safeMessage, requestId } = result.failureDetail;
112
+ showFailure(safeMessage, { providerErrorCode, requestId });
113
+ }
114
+ ```
115
+
116
+ `safeMessage` 是长度受限的 KodaX 固定文案,不复制上游错误正文;Runtime 不会把
117
+ 凭据、prompt、请求/响应正文、原始 headers 集合、URL、完整本地路径、stack 或原始
118
+ `Error` 复制进 `failureDetail`,仅提取文档明确列出的 allowlist 元数据。字段定义、
119
+ 分类表、迁移方法和安全边界详见
120
+ [Structured Runtime failures](public_docs/sdk/embedder-guide.md#structured-credential-safe-runtime-failures)。
121
+
95
122
  **v0.7.71 Electron 打包修复**:packaged/asar Electron 宿主可以直接自动启动
96
123
  daemon,不会再次打开 GUI。`ELECTRON_RUN_AS_NODE` 只存在于子进程启动边界,
97
124
  在 daemon 与普通用户子进程代码加载前即被移除。该路径要求 Electron 默认开启的
98
125
  `RunAsNode` fuse;主动关闭该 fuse 的宿主必须通过普通 Node/KodaX CLI 启动 daemon,
99
126
  再使用 attach-only 模式连接。SDK 的 `homeDir` 是拥有 `.kodax` 的 CLI 风格基础目录,
100
- 不是 `.kodax` 目录本身。
127
+ 不是 `.kodax` 目录本身。Electron 宿主还必须遵循
128
+ [native artifact 解包契约](public_docs/sdk/embedder-guide.md#packaged-electron-native-artifact-layout)。
101
129
 
102
130
  **v0.7.75 Windows GUI 稳定性候选版**:Runtime Worker 可达的非交互后台子进程
103
131
  在 Windows 上统一请求隐藏控制台,覆盖 memory/Git、provider CLI/ACP、LSP、
@@ -266,6 +294,76 @@ SDK 系统代码契约更新,但没有放宽 shell/sandbox 的 fail-closed 边
266
294
  `handleRuntimePermissionRequest()` 管理 SDK 权限 UI,并在 prepared Session 尾部遇到
267
295
  `data_changed` 时通过权威 delta 合并恢复;后台持久化失败会显示为诊断,不再静默丢失。
268
296
 
297
+ **v0.7.96-alpha.2 发布(Windows 修复)**:恢复被 FEATURE_295 清理误删的
298
+ Windows boot-identity PowerShell 解析函数(其唯一调用方仍保留)。在
299
+ v0.7.96-alpha.1 上,每次 Windows exit settlement 都会以
300
+ `windowsAclPowerShellExecutable is not defined` 崩溃,sandbox cleanup 只能标记为
301
+ `unverified`;恢复后的实现附带 win32 回归测试,关闭 Issue 325。Windows 用户请
302
+ 从 v0.7.96-alpha.1 升级到 v0.7.96-alpha.2。详见
303
+ [v0.7.96-alpha.2 发布清单](docs/release.md#v0796-alpha2-release-preparation)。
304
+
305
+ **v0.7.96-alpha.1 发布**:所有桌面平台的受控
306
+ 文本工具与 shell containment 拆分为两个独立权威。`write`、`edit`、`multi_edit`、`insert_after_anchor`、
307
+ `undo` 在可信 KodaX Runtime 中完成最终路径/identity 策略校验、跨 Runtime
308
+ 逐文件内核锁、revision CAS、元数据保留的 flush 后原子替换与受保护 native 状态根;它们不进入 ASRT、workspace
309
+ session、shell runner、setup、cleanup、owner、reset 或 poison 状态,也不宣称受到
310
+ OS token sandbox enforcement。根入口和 `/coding` 的 `runKodaX`、`startKodaX`、
311
+ `runManagedTask`、`createKodaXTaskRunner`、`createDefaultCodingAgent`、`KodaXClient` 及其 `Client` 别名默认绑定同一 native 文本权威,并在每次事务读取新注册的 linked-
312
+ worktree 根。Windows shell 仅由 ASRT 提供网络/专用账户服务,
313
+ KodaX native runner 负责 restricted token、nonce 绑定且按 policy 隔离的私有 desktop、创建时 Job containment 和 framed stdio;
314
+ 不同 policy、Session、Runtime 的 native shell 不共享覆盖命令生命周期的 filesystem-
315
+ effect lease。同一 Runtime 中具有完全相同网络策略和 sandbox 账户代际的命令共享
316
+ 一个 ASRT 网络 broker,但仍各自拥有 policy token 与 Job;不同策略绝不共享权威。
317
+ Issue 308 记录 ASRT 0.0.65 对不同策略/Runtime 仍存在的固定端口容量限制。任意 shell 写文件仍是正常 OS 数据竞争,KodaX CAS 只约束受控文本
318
+ 工具。目标 stdin EOF 不会关闭 native 控制流;控制与事件使用相互独立且认证过的
319
+ 单向管道。timeout/cancel 只有在校验 nonce 绑定的 runner 终态记录、确认整个 Job
320
+ 已排空后才返回原始停止原因。每个共享 broker 还拥有一个经校验的 native 存活
321
+ controller。Windows 可信替换会把旧 sandbox owner 的文件自动归一为可信 host
322
+ owner,并保留有序的最终有效 ACE 策略;文件系统可在原子命名空间提交时规范化
323
+ DACL protection/inheritance 控制位,旧父目录的继承权限不会被原样冻结。
324
+ 即使工作区整体可写,shell 也不能读写工作区内的 `.kodax/runtime` 控制状态。
325
+ 其 named pipe 创建时即应用仅 Host/SYSTEM 的 protected DACL,并保留
326
+ 多个 pending instance。受限目标无法连接或耗尽它;controller/broker 丢失会关闭
327
+ 通道并排空所有关联命令的 Job。native 请求与终态记录位于无 reparse、仅 host/SYSTEM
328
+ 可访问的控制目录;SDK policy 校验和 native host 都会在目标启动前拒绝与该目录
329
+ 祖先或子孙重叠的 allow root,以及指向该目录或其子项的 deny root。doctor 只验证;
330
+ 显式 setup 会先证明 sandbox 账户已空闲,只回收已过 deadline 且 owner PID 已死的
331
+ 请求,或已证明 Job 排空的死 owner 终态记录,再修复 host-owned 状态;live、未过期、
332
+ 损坏、未知及 deny-recovery 记录继续 fail-closed。Unix 在原子提交后若无法证明目录 durability,会携带
333
+ 完整的提交前/后 receipt 返回 `text_mutation_commit_uncertain`,要求先重读,禁止盲目重试。已有文件的修改会
334
+ 保留 Undo backup;若 Undo 本身处于提交不确定状态,其 receipt 会重绑定到观测到的
335
+ 提交后 revision,之后只能通过 CAS 校验的 Undo 继续收敛。详见
336
+ [ADR-066](docs/ADR.md#adr-066-trusted-text-transactions-and-a-native-windows-shell-sandbox-are-separate-authorities)。
337
+ 这次不兼容的权威拆分由 `sandboxRuntime:6` 门禁;新客户端不会静默复用仍执行
338
+ v0.7.95 旧调用图的 daemon。
339
+ 现有 Windows 安装需要运行一次 `kodax sandbox setup`:切换流程会等待旧沙箱进程
340
+ 退出,使用新 SID 重建专用账户,并记录 native protocol/SID 代际。迁移状态缺失时
341
+ 只阻止 native shell 准入,不会阻止可信文本工具。
342
+ Windows 的嵌入发布 manifest 会钉住 text/shell 的 protocol 与 hash,以及 ASRT
343
+ release version 与 hash。已校验的可执行文件进入独立于 `KODAX_HOME` 的 LocalAppData
344
+ content-addressed 受保护存储;ASRT 在落库前与 broker 启动前都会重验。text 仅
345
+ Host/SYSTEM 可访问,专用 sandbox group SID 对 shell artifact 只有 read/execute,
346
+ local Users 对 ASRT 只有 read/execute;sandbox trustee 与 local Users 均无
347
+ write/delete 权限。
348
+ 包存储中的 hardlink 仅在 bundled 构建中可作为 ASRT 来源,并通过同一文件句柄的
349
+ 有界读取核对完整字节与内嵌发布 digest;开发态 manifest 与来源仍须单链接。broker
350
+ 实际执行的仍是独立、受保护、单链接文件。allow-root 授权只修改精确 canonical
351
+ root,不再改写其私有祖先目录的 DACL。
352
+ Linux/macOS 使用同一可信文本权威及 native no-follow/`flock`/CAS/原子提交;
353
+ shell 仍是逐命令 ASRT bubblewrap/Seatbelt 执行,不保留 KodaX workspace-session owner。
354
+ Issue 307 记录 ASRT 所有的 runner 在 KodaX 代码运行前启动这一更窄的 pre-main
355
+ 窗口;当前 Codex 也保留相同边界。最终命令仍在创建时加入 Job,可信文本工具完全
356
+ 不经过该边界。Issue 309 记录另一个与 Codex 相同的 Windows 残余:稳定 root
357
+ capability 无法覆盖显式 ambient loader-compatibility ACE;该 ACE 既可能由此前
358
+ sandbox 命令留下,也可能原本就存在于 external 或 host-owned descendant 上。
359
+ 本版本同时以容量债务准入(capacity-debt admission)和有界恢复阶梯取代本地
360
+ tool-result 容量硬门禁(ADR-067),本地容量终态归类为
361
+ `failureKind: "context_capacity"` 并附带结构化 `contextTokens`,失败事件、Run
362
+ 结果/状态与 Session 诊断提供同一份凭据安全的 `failureDetail`。本版本广告
363
+ Windows `sandboxRuntime:6`;`runtimeExitSettlement:2` 与 `crashOutcomeModel:2`
364
+ 不变。详见
365
+ [v0.7.96-alpha.1 发布清单](docs/release.md#v0796-alpha1-release-preparation)。
366
+
269
367
  **v0.7.95 发布**:零字节、畸形或截断 owner 的过期 learning lock
270
368
  会在字节与 stat 二次确认未变后自动恢复。同一次 Windows 启动内的
271
369
  `unconfirmed-owner` 会持续自动重试,只有精确 sandbox-user SID 探针证明空闲后
@@ -518,12 +616,13 @@ kodax sandbox doctor
518
616
  kodax sandbox setup
519
617
  ```
520
618
 
521
- - Windows 使用受限 sandbox 账户和网络策略。普通 Terminal 即可,按提示同意一次
522
- UAC;不必先以管理员身份启动 Terminal。
619
+ - Windows 使用受限 sandbox 账户和网络策略。普通 Terminal 即可,按提示同意激活
620
+ 所需的 UAC 确认;不必先以管理员身份启动 Terminal。
523
621
  - macOS 使用 Seatbelt/`sandbox-exec`,需要 ripgrep:
524
622
  `brew install ripgrep`。
525
623
  - Linux 使用 bubblewrap,需要 `bubblewrap`、`socat` 和 `ripgrep`,请根据发行版用
526
- `apt`、`dnf` 或 `pacman` 安装。
624
+ `apt`、`dnf` 或 `pacman` 安装。宿主内核与安全策略还必须允许非特权 user
625
+ namespace;若 backend 无法启动,KodaX 会明确报告,且不会自行修改系统策略。
527
626
 
528
627
  KodaX 不会自动运行 `sudo` 或系统包管理器。sandbox 未激活时,确定性安全操作与
529
628
  Auto[LLM] 的权限体验保持一致,只缺少 OS 级 containment;普通运行不会反复打扰。
@@ -723,34 +822,28 @@ Verifier 的 `revise` / `blocked` 可执行消息;JSONL 输出使用同形
723
822
 
724
823
  #### 给自定义 provider 开图片 / vision 输入(FEATURE_134 v0.7.40)
725
824
 
726
- 如果你的自定义 provider 后面的模型支持 vision,加 `capabilityProfile.multimodalSupport: "image-input"` 显式开启,KodaX 的 SA-path policy gate 就不会人为拦截多模态请求。内置 vision-capable alias(Anthropic、OpenAI、Kimi、Qwen、Zhipu、MiniMax、MiMo、Ark,以及通过 CLI `@<path>` file-include 语法传图的 Gemini-CLI)已经默认开了这个 flag。DeepSeek V4 和 Codex-CLI 是纯文本模型;自定义 provider 在底层模型支持图片输入时需要手动 opt-in。
825
+ 如果你的自定义 provider 后面的模型支持 vision,设置 `"imageInput": true` 即可,KodaX 的图片路由和 provider policy gate 都会放行图片输入。这是自托管多模态模型(vLLM / SGLang 部署 Qwen-VL 类模型、OpenAI-compatible 端点)的典型用法:
727
826
 
728
827
  ```json
729
828
  {
730
829
  "customProviders": [
731
830
  {
732
- "name": "my-vision-provider",
831
+ "name": "my-vllm",
733
832
  "protocol": "openai",
734
- "baseUrl": "https://example.com/v1",
735
- "apiKeyEnv": "MY_LLM_API_KEY",
736
- "model": "my-vision-model",
737
- "capabilityProfile": {
738
- "transport": "native-api",
739
- "conversationSemantics": "full-history",
740
- "mcpSupport": "none",
741
- "contextFidelity": "full",
742
- "toolCallingFidelity": "full",
743
- "sessionSupport": "full",
744
- "longRunningSupport": "full",
745
- "multimodalSupport": "image-input",
746
- "evidenceSupport": "full"
747
- }
833
+ "baseUrl": "http://localhost:8000/v1",
834
+ "apiKeyEnv": "MY_VLLM_API_KEY",
835
+ "model": "Qwen/Qwen3.8-27B-Instruct",
836
+ "imageInput": true
748
837
  }
749
838
  ]
750
839
  }
751
840
  ```
752
841
 
753
- 序列化层(Anthropic-compat 走 `packages/llm/src/providers/anthropic.ts:770`,OpenAI-compat 走 `openai.ts:904`)通过基类继承自动转发 image block。这个 flag 只控制 KodaX 自身是否预先拒绝多模态请求 —— 上游模型到底支不支持 vision 由 provider 自己决定。如果模型实际是 text-only,你会看到真实的上游 API 错误,而不是 KodaX 一侧的 `[Provider Policy] multimodal requests are unsupported` 预拦截。
842
+ `imageInput: true` 会在 KodaX 所有层面(provider 实例、能力查询、policy gate)强制 `capabilityProfile.multimodalSupport: "image-input"`,显式写了 `"none"` 也会被覆盖。进阶写法 —— 手写 `capabilityProfile` 块并设 `"multimodalSupport": "image-input"` —— 同样有效,详见 [Custom Providers](public_docs/configuration/custom-providers.md)。纯文本模型保持不设即可,图片 artifact 会在请求发出前被 `MODEL_INPUT_UNSUPPORTED` 拒绝。
843
+
844
+ 内置 vision-capable alias(Anthropic、OpenAI、Kimi、Qwen、Zhipu、MiniMax、MiMo、Ark,以及通过 CLI `@<path>` file-include 语法传图的 Gemini-CLI)已经默认开了图片输入。DeepSeek V4 默认模型(`deepseek-v4-flash` / `deepseek-v4-pro`)和 Codex-CLI 是纯文本 —— 内置 `deepseek` 只有 `deepseek-v4-flash-vision-exp` 这一个路由收图;自定义 provider 在底层模型支持图片输入时需要手动 opt-in。
845
+
846
+ 序列化层(Anthropic-compat 走 `packages/llm/src/providers/anthropic.ts:1431`,OpenAI-compat 走 `openai.ts:1496`)通过基类继承自动转发 image block —— OpenAI-compatible 端点收到的是标准 `image_url` 块。这个 flag 只控制 KodaX 自身是否预先拒绝多模态请求 —— 上游模型到底支不支持 vision 由 provider 自己决定。如果模型实际是 text-only,你会看到真实的上游 API 错误,而不是 KodaX 一侧的 `[Provider Policy] multimodal requests are unsupported` 预拦截。
754
847
 
755
848
  库模式下用 `registerCustomProviders()` 显式注册:
756
849
 
@@ -873,7 +966,7 @@ dist/binary/linux-x64/
873
966
  | mimo | `MIMO_API_KEY` | Native | mimo-v2.5-pro(小米 MiMo 按量计费,Anthropic 协议) |
874
967
  | mimo-coding | `MIMO_CODING_API_KEY` | Native | mimo-v2.5-pro(小米 MiMo Token Plan,Anthropic 协议) |
875
968
  | 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) |
876
- | deepseek | `DEEPSEEK_API_KEY` | Native | deepseek-v4-flash(可 `/model` 切换 `deepseek-v4-pro`) |
969
+ | deepseek | `DEEPSEEK_API_KEY` | Native | deepseek-v4-flash(可 `/model` 切换 `deepseek-v4-pro` 及视觉模型 `deepseek-v4-flash-vision-exp`,后者支持图片输入) |
877
970
  | gemini-cli | 由 Provider CLI 完成认证(无 KodaX API-key 环境变量) | Prompt-only / CLI bridge | (通过 gemini CLI) |
878
971
  | codex-cli | 由 Provider CLI 完成认证(无 KodaX API-key 环境变量) | Prompt-only / CLI bridge | (通过 codex CLI) |
879
972
 
@@ -1145,7 +1238,7 @@ KodaX/ # 4 workspace packages(FEATURE_194 v0.7.43)
1145
1238
  ├── scripts/
1146
1239
  │ ├── build-bundle.mjs # esbuild 单 bundle 多 entry 打包(CLI + root + 12 SDK subpath + chunks)
1147
1240
  │ ├── build-binary.mjs # Bun --compile 单文件二进制打包
1148
- │ └── release.mjs # 构建/审计后仅临时切换 private 以 pack/publish
1241
+ │ └── release.mjs # 发布 CI 构建的通用 tarball;本地 --pack-only 保持 private:true
1149
1242
  └── .github/workflows/
1150
1243
  └── release.yml # 推 v* tag 自动发布 GitHub Release
1151
1244
  ```
@@ -10,7 +10,7 @@
10
10
  // "model": "deepseek-v4-flash",
11
11
  // Add or reorder model ids shown by `/model` for a provider.
12
12
  // "providerModels": {
13
- // "deepseek": ["deepseek-v4-flash", "deepseek-v4-pro"]
13
+ // "deepseek": ["deepseek-v4-flash", "deepseek-v4-pro", "deepseek-v4-flash-vision-exp"]
14
14
  // },
15
15
 
16
16
  // Interactive Runtime hosting: "embedded" (this process) or "daemon".
@@ -81,6 +81,7 @@
81
81
  // "maxOutputTokens": 8192,
82
82
  // "maxOutputTokensField": "max_completion_tokens",
83
83
  // "thinkingBudgetCap": 32000,
84
+ // "imageInput": true,
84
85
  // "promptCacheAffinity": false,
85
86
  // "replayReasoningContent": false,
86
87
  // "strictThinkingSignature": false,