@kodax-ai/kodax 0.7.83 → 0.7.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +154 -4
- package/README.md +48 -26
- package/README_CN.md +26 -21
- package/dist/chunks/agent-OQ37XUWF.js +2 -0
- package/dist/chunks/argument-completer-IMRSIF2N.js +2 -0
- package/dist/chunks/chunk-2XJQNFVR.js +379 -0
- package/dist/chunks/chunk-3E4OSFP2.js +1279 -0
- package/dist/chunks/chunk-CDWYKVZC.js +482 -0
- package/dist/chunks/chunk-CZCEFGQG.js +412 -0
- package/dist/chunks/chunk-IA246OAN.js +679 -0
- package/dist/chunks/chunk-IWRNGH4M.js +319 -0
- package/dist/chunks/chunk-MJ4G5ZCW.js +2 -0
- package/dist/chunks/{chunk-RAQGGVIF.js → chunk-ODRLFQQH.js} +1 -1
- package/dist/chunks/chunk-RSOAHVUR.js +5 -0
- package/dist/chunks/chunk-RTFVMEF6.js +415 -0
- package/dist/chunks/{chunk-XB2JNLXH.js → chunk-SR4E5FQK.js} +2 -2
- package/dist/chunks/{chunk-HI6RCW5Y.js → chunk-TBBY2DKE.js} +2 -2
- package/dist/chunks/chunk-UH5WNJXF.js +92 -0
- package/dist/chunks/{chunk-6QILIBOU.js → chunk-ZVOXWLT6.js} +214 -201
- package/dist/chunks/compaction-config-3WLLNN57.js +2 -0
- package/dist/chunks/{construction-bootstrap-E4M3CY3N.js → construction-bootstrap-CZ6NWEWQ.js} +1 -1
- package/dist/chunks/dist-NFLLOZWF.js +2 -0
- package/dist/chunks/host-LWUSSCWH.js +2 -0
- package/dist/chunks/run-manager-PBMOVP7A.js +2 -0
- package/dist/chunks/utils-KFLK3EHJ.js +2 -0
- package/dist/index.d.ts +17 -15
- package/dist/index.js +2 -2
- package/dist/kodax_bootstrap.js +1 -1
- package/dist/kodax_cli.js +1975 -1564
- package/dist/kodax_resume.js +269 -90
- package/dist/runtime-worker.js +1824 -1419
- package/dist/sandbox-workspace-session.js +979 -66
- package/dist/sdk-a2a.d.ts +11 -10
- package/dist/sdk-a2a.js +9 -8
- package/dist/sdk-agent.d.ts +39 -299
- package/dist/sdk-agent.js +1 -1
- package/dist/sdk-coding.d.ts +103 -16
- package/dist/sdk-coding.js +1 -1
- package/dist/sdk-experimental-memory.d.ts +7 -20
- package/dist/sdk-experimental-memory.js +1 -1
- package/dist/sdk-mcp.js +1 -1
- package/dist/sdk-media.js +1 -1
- package/dist/sdk-repl.d.ts +14 -13
- package/dist/sdk-repl.js +2 -2
- package/dist/sdk-runtime.d.ts +64 -23
- package/dist/sdk-runtime.js +1 -1
- package/dist/sdk-sandbox.js +1 -1
- package/dist/sdk-session.d.ts +7 -6
- package/dist/sdk-session.js +1 -1
- package/dist/sdk-skills.d.ts +2 -2
- package/dist/sdk-skills.js +1 -1
- package/dist/semantic-worker.js +251 -64
- package/dist/types-chunks/{bash-prefix-extractor.d-CJM7OY-L.d.ts → bash-prefix-extractor.d-BnZQDirs.d.ts} +130 -13
- package/dist/types-chunks/{capsule.d-B7yoH4dM.d.ts → capsule.d-CN_iMqAS.d.ts} +2 -1
- package/dist/types-chunks/controller.d-A73Kf6tH.d.ts +105 -0
- package/dist/types-chunks/{controller.d-CYNuR2n9.d.ts → controller.d-Dzxz22X-.d.ts} +28 -1020
- package/dist/types-chunks/{guardrail.d-fM3mn4Op.d.ts → guardrail.d-BCkgaWT1.d.ts} +25 -19
- package/dist/types-chunks/{history-retrieval.d-BDI-ZMvY.d.ts → history-retrieval.d-Debbzn1z.d.ts} +1 -1
- package/dist/types-chunks/{public-api.d-i10kvYFs.d.ts → public-api.d-N6G6Jw8X.d.ts} +3 -2
- package/dist/types-chunks/{repl.d-Cs3eqGVT.d.ts → repl.d-BkTIOkJD.d.ts} +5 -5
- package/dist/types-chunks/review-inbox.d-DuZqFX-z.d.ts +221 -0
- package/dist/types-chunks/{run-manager.d-CodHf6rw.d.ts → run-manager.d-BS4lJfL3.d.ts} +1 -1
- package/dist/types-chunks/{sdk-session-CRXu5xNs.d.ts → sdk-session-DLkZTOc-.d.ts} +2 -2
- package/dist/types-chunks/{shell-command-sets.d-DfeSUjjM.d.ts → shell-command-sets.d-BrLw-WN9.d.ts} +3 -2
- package/dist/types-chunks/{types-Bf3Y3mW-.d.ts → types-PHjfwebT.d.ts} +62 -190
- package/dist/types-chunks/{types.d-BbtGlKZu.d.ts → types.d-BSPlmJqf.d.ts} +25 -6
- package/dist/types-chunks/{types.d-DIXZFauU.d.ts → types.d-Bo4fyMLu.d.ts} +1 -1
- package/dist/types-chunks/{types.d-DKs4tfSd.d.ts → types.d-Ch3BD97c.d.ts} +2 -2
- package/dist/types-chunks/types.d-DlLBRqZ9.d.ts +1057 -0
- package/dist/types-chunks/{utils.d-CgITiLyc.d.ts → utils.d-BI-kjuev.d.ts} +7 -4
- package/package.json +4 -2
- package/dist/chunks/agent-S7LMMTG7.js +0 -2
- package/dist/chunks/argument-completer-SQHG2LYE.js +0 -2
- package/dist/chunks/chunk-37RT45HT.js +0 -379
- package/dist/chunks/chunk-3DKQC7A2.js +0 -479
- package/dist/chunks/chunk-45E23YJI.js +0 -885
- package/dist/chunks/chunk-6UENDY33.js +0 -89
- package/dist/chunks/chunk-DSFHIUHZ.js +0 -655
- package/dist/chunks/chunk-DZUMH6GJ.js +0 -2
- package/dist/chunks/chunk-E7C4DRD2.js +0 -5
- package/dist/chunks/chunk-EVXIJPZ6.js +0 -218
- package/dist/chunks/chunk-KHEFUT6O.js +0 -5
- package/dist/chunks/chunk-LF2JBTBG.js +0 -319
- package/dist/chunks/chunk-TC2VHPG5.js +0 -348
- package/dist/chunks/chunk-URCS6CVP.js +0 -292
- package/dist/chunks/compaction-config-SSQ5NXUP.js +0 -2
- package/dist/chunks/dist-MIXP4ULB.js +0 -2
- package/dist/chunks/host-ZCPI7SMC.js +0 -2
- package/dist/chunks/run-manager-4RYG7HSP.js +0 -2
- package/dist/chunks/utils-7DKE2EKT.js +0 -2
- package/docs/SDK_EMBEDDER_GUIDE.md +0 -5735
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,156 @@ No changes yet.
|
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
+
## [0.7.85] - 2026-08-11
|
|
14
|
+
|
|
15
|
+
> Git tag and GitHub Release are created by the release workflow. npm
|
|
16
|
+
> publication remains a separate manual operator step.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Runtime event ordering is now Session-scoped. Every event carries a
|
|
21
|
+
`{ sessionId, journalEpoch, seq }` cursor; public subscribe/replay calls must
|
|
22
|
+
specify `sessionId` or `runId`, and replay resumes from `after` rather than a
|
|
23
|
+
Runtime-global numeric sequence. Independent Sessions no longer contend on
|
|
24
|
+
one `event-sequence.lock`.
|
|
25
|
+
- A2A assigns one Runtime Session to each A2A Task and persists that Session
|
|
26
|
+
cursor in a small progress checkpoint for recovery, avoiding a full
|
|
27
|
+
`tasks.json` rewrite per micro-event. Only semantic task-state transitions
|
|
28
|
+
are projected to the A2A stream; token/tool progress remains Runtime telemetry.
|
|
29
|
+
- Daemon clients require the `sessionEventJournal:1` capability. Legacy global
|
|
30
|
+
Runtime event logs remain on disk for audit but are not mixed into live
|
|
31
|
+
Session replay.
|
|
32
|
+
- Session failure latches and retention watermarks are journal-scoped. Reusing
|
|
33
|
+
a deleted Session ID rotates the epoch, ambiguous Windows path components remain
|
|
34
|
+
distinct, malformed cursors and mismatched Session/Run scopes fail closed,
|
|
35
|
+
legacy watermarks without an epoch cannot poison new replay, and a durable
|
|
36
|
+
per-Run journal index keeps fully trimmed child journals attributable if a
|
|
37
|
+
watermark is later corrupted. Missing or corrupt index evidence fails closed
|
|
38
|
+
instead of treating an ambiguous trimmed journal as unrelated.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Memory/Learning command output is now rendered through the Ink-captured
|
|
43
|
+
command channel instead of raw stdout. `/learn` reports an explicit empty
|
|
44
|
+
state, `/learn ready` is the canonical ready-capability query, and the legacy
|
|
45
|
+
`/learn pending` alias explains that it is unrelated to episode-review work.
|
|
46
|
+
Memory management is now conversation-first: explicit remember, correction,
|
|
47
|
+
forget, recall, and exceptional-decision requests use one governed hidden tool.
|
|
48
|
+
Safe explicit mutations apply immediately; stable semantic claim keys make
|
|
49
|
+
later contradictions address the same fact/preference/policy/procedure slot.
|
|
50
|
+
A host-owned handled-operation marker prevents the instruction from being duplicated
|
|
51
|
+
into the outcome review, while the rest of the episode still participates in
|
|
52
|
+
autonomous Memory/Skill learning. Ambiguity and broad input request
|
|
53
|
+
clarification, conflicts become readable decisions, secrets are rejected,
|
|
54
|
+
and inferred changes stay governed. `/memory` remains a compact advanced escape hatch for accepted
|
|
55
|
+
Memory, decisions, diagnostics, and external-editor opening. Raw review/status
|
|
56
|
+
and derived-index rebuild commands remain hidden diagnostics; `MEMORY.md` is a
|
|
57
|
+
projection rather than the source of truth. The
|
|
58
|
+
`@kodax-ai/kodax/experimental-memory` factory now returns an additive
|
|
59
|
+
`MemoryManagementAgent` only for a management-capable controller, exposing
|
|
60
|
+
list, remember, and forget without widening the existing
|
|
61
|
+
`MemoryAgent`/`MemoryController` structural contracts. Natural-language
|
|
62
|
+
decision handles carry their preview revision across turns and fail closed if stale.
|
|
63
|
+
- Unified Memory review accepts a minimal model-owned action/warning plan and
|
|
64
|
+
binds trigger, timestamps, source/candidate references, and digest authority
|
|
65
|
+
on the host. This removes redundant schema work that caused GLM providers to
|
|
66
|
+
return invalid plans without weakening deterministic action validation.
|
|
67
|
+
- Issue 282 follow-up: Actor progress is now batched once per controller tree,
|
|
68
|
+
terminal persistence excludes known mutation-queue waits from its five-second
|
|
69
|
+
ambiguity budget, and a permanently blocked predecessor remains bounded by a
|
|
70
|
+
separate queue-wait fence. Progress promises also reject when an ownership
|
|
71
|
+
conflict self-fences their controller instead of remaining pending forever.
|
|
72
|
+
- A durability-unknown Actor tree now fail-closes its owning root executor and
|
|
73
|
+
automatically reconciles only an exact same-owner late snapshot. Runs settle
|
|
74
|
+
as `actor_settlement_not_persisted` unless a stronger executor Promise fact
|
|
75
|
+
was captured before the fence. Same-owner durable repair plus root abort and
|
|
76
|
+
post-fence admission suppression closes the Session route after every exact
|
|
77
|
+
tool execution admitted before the fence has settled. It does not wait for
|
|
78
|
+
an abort-ignoring provider Promise; callbacks and new Runtime-mediated effects
|
|
79
|
+
from the fenced root remain blocked.
|
|
80
|
+
- Healthy `after_turn` input keeps the established coding-mode default. It
|
|
81
|
+
inherits a managed predecessor's mode only when it actually drains behind an
|
|
82
|
+
Actor durability repair.
|
|
83
|
+
- Self-fenced Actor admission now reports the causal settlement-persistence
|
|
84
|
+
error instead of the misleading `actor_owner_conflict`. Genuine foreign-owner
|
|
85
|
+
conflicts remain fail-closed.
|
|
86
|
+
- Runtime capability negotiation now exposes `actorSettlementConvergence:1`,
|
|
87
|
+
including automatic repair and safe after-turn queueing behind an unknown Run.
|
|
88
|
+
- Issue 286: Learned Skill discovery now traverses the distinct remote and local
|
|
89
|
+
hashed project roots and routes every canary mutation to the record's owning
|
|
90
|
+
store. `remote-hash:*` receives the same local fallback, while the public
|
|
91
|
+
deprecated `expectedScope` configuration remains source/runtime compatible
|
|
92
|
+
with the optional multi-scope form.
|
|
93
|
+
- Issue 285: Rules-mode agent-home access now protects the home root from whole-
|
|
94
|
+
tree removal, hard-denies Runtime mutations, and reviews credential/security
|
|
95
|
+
config plus generic sensitive filenames.
|
|
96
|
+
The legacy `processes/children` registry is now treated as host control state:
|
|
97
|
+
model writes are hard-denied, and upgrade cleanup quarantines unauthenticated
|
|
98
|
+
historical records without using them to signal a process.
|
|
99
|
+
Learned Area persistence is also host-owned and no longer directly writable
|
|
100
|
+
by model file or shell tools.
|
|
101
|
+
Ordinary descendants—including `agents/*.md`, Sessions, tool results, and
|
|
102
|
+
intermediate artifacts—remain readable and writable without approval.
|
|
103
|
+
- Issue 285 execution-time file sinks now recheck the hard boundary after
|
|
104
|
+
queueing. Undo backups are context-scoped and identity-fenced, while workflow
|
|
105
|
+
worktree roots are accepted only through the trusted controller context.
|
|
106
|
+
Agent Home root and Runtime shell mutations use a non-authorizable gate in
|
|
107
|
+
both Auto[LLM] and Auto[Rules]; sensitive configuration remains reviewable.
|
|
108
|
+
A cross-process category lease prevents model-started shell effects from
|
|
109
|
+
racing a privileged file sink's canonical check and write without serializing
|
|
110
|
+
independent shell calls or independent direct-file mutations.
|
|
111
|
+
- Every coding run now carries a non-removable Agent Home shell boundary.
|
|
112
|
+
Opaque Bash requires a fail-closed OS sandbox with authoritative process-tree
|
|
113
|
+
containment; unsandboxed or filesystem-only standalone callers
|
|
114
|
+
may run only completely modeled exact commands. Runtime supplies that sandbox
|
|
115
|
+
in every permission mode and fails closed when preparation is unavailable.
|
|
116
|
+
Linux uses the built-in ASRT PID namespace and Windows adds a per-effect Job;
|
|
117
|
+
macOS and legacy custom adapters without the optional containment capability
|
|
118
|
+
retain exact modeled commands but fail closed for opaque Bash.
|
|
119
|
+
Protected Agent Home reads still require review, but are not permanently
|
|
120
|
+
denied by the OS sandbox after an explicit approval.
|
|
121
|
+
On Windows, ACL grants target verified ordinary Agent Home children rather
|
|
122
|
+
than the Home object itself, so `agents`, Sessions, and intermediate results
|
|
123
|
+
remain writable without granting permission to delete the whole Home root.
|
|
124
|
+
- Session event replay now rejects cursors ahead of the current journal instead
|
|
125
|
+
of silently returning no events. Limited replay retains the latest-event
|
|
126
|
+
behavior without a cursor and returns the earliest forward page when `after`
|
|
127
|
+
is supplied; replay limits must be positive safe integers. Corrupt aggregate
|
|
128
|
+
journal/status metadata is reported without widening the failure to unrelated
|
|
129
|
+
Sessions, valid retired journals are not misreported as corrupt, and A2A
|
|
130
|
+
regression coverage pins legacy numeric event positions as non-cursors.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## [0.7.84] - 2026-08-07
|
|
135
|
+
|
|
136
|
+
> Git tag and GitHub Release are created by the release workflow. npm
|
|
137
|
+
> publication remains a separate manual operator step.
|
|
138
|
+
|
|
139
|
+
### Fixed
|
|
140
|
+
|
|
141
|
+
- Issue 282: Agent progress persistence is now backpressured and coalesced to
|
|
142
|
+
one in-flight write plus one latest replacement. Terminal settlement no
|
|
143
|
+
longer waits behind an unbounded progress backlog and exposes an explicit
|
|
144
|
+
durability-unknown state when the remaining write cannot settle in time.
|
|
145
|
+
- A same-owner Stop can reconcile a late Actor snapshot after settlement
|
|
146
|
+
timeout, durably quiesce remaining children, and retry the repair on a later
|
|
147
|
+
Stop. Foreign owners, missing snapshots, and persistent storage failures
|
|
148
|
+
remain fail-closed.
|
|
149
|
+
- Promise success/failure facts are retained while Actor durability is unknown
|
|
150
|
+
and outrank fallback terminal callbacks after repair. A stale durable unknown
|
|
151
|
+
status cannot rewind an already terminal local Run, duplicate cancellation
|
|
152
|
+
effects, or emit conflicting terminal events.
|
|
153
|
+
- A quiesce with no eligible turn is now a true no-op and avoids an unnecessary
|
|
154
|
+
Session snapshot rewrite.
|
|
155
|
+
|
|
156
|
+
### Documentation
|
|
157
|
+
|
|
158
|
+
- Updated the release baseline, SDK embedder guidance, `kodax_manual`, feature
|
|
159
|
+
design index, regression guides, and known-issue disposition for Issue 282.
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
13
163
|
## [0.7.83] - 2026-08-06
|
|
14
164
|
|
|
15
165
|
> Git tag and GitHub Release are created by the release workflow. npm
|
|
@@ -1993,7 +2143,7 @@ No changes yet.
|
|
|
1993
2143
|
|
|
1994
2144
|
- **`code_search` / `semantic_lookup` teaching in the Worker REPO INTELLIGENCE prompt (FEATURE_250).** A two-line, eval-justified teaching block: the floor-tier alias under-adopted the hint-only tools on ambiguous tasks (75%), and the teaching recovered adoption to 100% while being strictly non-negative on every other alias.
|
|
1995
2145
|
- **CAP-099 live turn attribution — session/turn identity on streamed events (Space SDK).** A shared live-turn scope (`createLiveTurnScope` / `withLiveTurnAttribution`, `event-emitter.ts`) stamps `KodaXActivityEventMeta` (`sessionId` / `seq` / `turnId` / `deliveryId` / `timestamp`) onto every streamed activity callback, and explicit turn-boundary events (`emitTurnStarted` / `emitTurnCompleted` / `emitTurnFailed`) share one monotonic per-session sequence — so an SDK host can route streamed assistant events to the owning turn's UI bubble by turn ownership instead of fragile ordering-by-observation. Threaded through messaging (queue/drain), orchestration (idle-yield), run-substrate, runner-driven, run-workflow, and dispatch-child-tasks; a host that ignores the metadata sees unchanged behavior. New `cap-099-live-turn-attribution` contract test; existing `cap-005/006/007/041/046/054/086` event-contract tests updated for the added meta parameter.
|
|
1996
|
-
- **Client-only transcript notices + structured transcript entries (CAP-099, Space SDK).** The persisted transcript gains structured entry types (`message` / `compaction` / `branch_summary` / `client_notice` / `task_result`) with `source` + `turnId`. A `client_notice` is persisted as a lineage entry, NOT a model message: `loadSession()` (active model context) omits it while `loadFullTranscript()` returns it with `type: 'client_notice'`, `source: 'client'`, and `payload.entersModelContext === false` — so a host can render client-side scrollback notices without polluting the model's context. SDK embedder guide updated (`
|
|
2146
|
+
- **Client-only transcript notices + structured transcript entries (CAP-099, Space SDK).** The persisted transcript gains structured entry types (`message` / `compaction` / `branch_summary` / `client_notice` / `task_result`) with `source` + `turnId`. A `client_notice` is persisted as a lineage entry, NOT a model message: `loadSession()` (active model context) omits it while `loadFullTranscript()` returns it with `type: 'client_notice'`, `source: 'client'`, and `payload.entersModelContext === false` — so a host can render client-side scrollback notices without polluting the model's context. SDK embedder guide updated (`public_docs/sdk/embedder-guide.md`).
|
|
1997
2147
|
- **Transcript clone provenance for SDK hosts (CAP-099, Space SDK).** Lineage entries now carry optional `logicalId` / `sourceEntryId`, and `loadFullTranscript().transcriptEntries[]` always exposes a stable `logicalId` (falling back to `entryId` for old sessions). Forked/cloned entries keep the source `logicalId` and point `sourceEntryId` at the root physical source entry, so hosts can fold cloned history precisely without guessing from role/content/timestamp or `[compacted]` placeholders. `loadFullTranscript()` remains raw append-order scrollback; it does not silently merge branches or hide compaction notices.
|
|
1998
2148
|
|
|
1999
2149
|
### Changed
|
|
@@ -2340,7 +2490,7 @@ No changes yet.
|
|
|
2340
2490
|
### Added
|
|
2341
2491
|
|
|
2342
2492
|
- **FEATURE_132 — Native LSP integration: edit-time diagnostics reflux (TS/JS, Python, Go, Rust, Java).** After the `write` / `edit` / `multi_edit` tools change a file, KodaX now opens it through a language server and refluxes any type ERRORs straight back into the tool result, so the agent fixes them the same turn instead of waiting for the next build (saving ≥1 LLM round-trip). Servers are discovered on `PATH` / project `node_modules` (typescript-language-server, pyright, gopls, rust-analyzer, jdtls); when none is installed the feature is **silent** (no nagging), and a one-shot blacklist + spawn-dedup keep it cheap. It is **default-on but self-limiting**: only ERROR severity, ≤20 per file, a 5s per-file wait that runs OUTSIDE the file-mutation lock, and `KODAX_LSP=0` disables it entirely. Auto-installing a missing server is **opt-in** (`KODAX_LSP_DOWNLOAD=1`; `KODAX_LSP_NO_DOWNLOAD=1` hard-off) — KodaX never runs `go install` / `npm i` unprompted. The LSP TypeScript server runs as its own subprocess, isolated from the in-process repo-intelligence TS engine. It also adds four read-only navigation tools — `lsp_definition` / `lsp_hover` / `lsp_references` / `lsp_document_symbols` — for precise, position-anchored, real-time questions about the current code (complementing the repo-scope repo-intelligence symbol tools; the tool descriptions teach the boundary). Implemented under `packages/coding/src/lsp/`; new exports from `@kodax-ai/coding`: `LspService`, `getDefaultLspService`, `shutdownDefaultLspService`, `languageIdForPath`. See [docs/features/v0.7.47.md FEATURE_132](docs/features/v0.7.47.md).
|
|
2343
|
-
- **FEATURE_221 — Injectable self-manual for SDK consumers (`selfManual`).** Products built on the KodaX SDK (e.g. KodaX-Space) can now inject their **own** product manual so the built-in `kodax_manual` tool answers *their* users' "how do I use / configure …?" questions on-brand, instead of returning KodaX's internal manual. `runKodaX({ selfManual: { productName, topics } })` re-brands the ≤250-token routing rule + scope anchors to `productName` and **extend-merges** your `KodaXManualTopicInput[]` over KodaX's base topics (same `id` overrides, new `id` appends), so users can still ask about the underlying provider / config / SDK topics. **Opt-in and backward-compatible** — omit `selfManual` and the system prompt is byte-identical to before. Topics stay **tool-on-demand and 4 KB-capped**: nothing large is injected into the prompt, only the short routing rule. New exports from `@kodax-ai/coding`: `KodaXManualTopicInput`, `KodaXSelfManualConfig`, `ResolveKodaXManualOptions`, `buildSelfKnowledgeRoutingRule`. See [SDK Embedder Guide §13](
|
|
2493
|
+
- **FEATURE_221 — Injectable self-manual for SDK consumers (`selfManual`).** Products built on the KodaX SDK (e.g. KodaX-Space) can now inject their **own** product manual so the built-in `kodax_manual` tool answers *their* users' "how do I use / configure …?" questions on-brand, instead of returning KodaX's internal manual. `runKodaX({ selfManual: { productName, topics } })` re-brands the ≤250-token routing rule + scope anchors to `productName` and **extend-merges** your `KodaXManualTopicInput[]` over KodaX's base topics (same `id` overrides, new `id` appends), so users can still ask about the underlying provider / config / SDK topics. **Opt-in and backward-compatible** — omit `selfManual` and the system prompt is byte-identical to before. Topics stay **tool-on-demand and 4 KB-capped**: nothing large is injected into the prompt, only the short routing rule. New exports from `@kodax-ai/coding`: `KodaXManualTopicInput`, `KodaXSelfManualConfig`, `ResolveKodaXManualOptions`, `buildSelfKnowledgeRoutingRule`. See [SDK Embedder Guide §13](public_docs/sdk/embedder-guide.md#13-inject-your-products-manual--selfmanual-feature_221-v0747) + [docs/features/v0.7.47.md FEATURE_221](docs/features/v0.7.47.md).
|
|
2344
2494
|
- **FEATURE_218 — KodaX self-knowledge manual + `kodax_manual` help tool.** KodaX now ships a version-bound, structured product manual (17 topics: overview / install / providers / custom-providers / config / permissions / commands / tools / agents / skills / mcp / repo-intelligence / sessions / doctor / sdk / troubleshooting) behind a read-only `kodax_manual` tool, plus a ≤250-token routing rule that tells the model to look up KodaX usage/config questions instead of guessing or mixing in Claude Code / Codex CLI knowledge. The provider list is sourced from the single-source-of-truth capability snapshots (drift-proof, not hand-copied) and each answer is anchored to KodaX scope. REPL `/help <topic>` reuses the same registry. Lookup is deterministic (exact id → alias, incl. Chinese → query token-overlap → index) and never fabricates; single-topic output ≤4 KB, index ≤2 KB. No RAG, no vector DB, no background index, no prompt bloat. See [docs/features/v0.7.47.md FEATURE_218](docs/features/v0.7.47.md).
|
|
2345
2495
|
- **MCP client — protocol `2025-11-25` compatibility (P0+P1).** KodaX's self-built MCP client now speaks the `2025-11-25` revision. **P0 (protocol compliance):** answers a server `ping` with an empty result instead of `-32601`; emits `notifications/cancelled` when a request times out (the `initialize` request is exempt); and resumes a dropped Streamable-HTTP notification stream via SSE `id`/`retry` + `Last-Event-ID`, with a reconnect cap so an empty-EOF stream can't reconnect-loop forever. **P1 (version + data surface):** advertises protocol `2025-11-25` with negotiation validation + the `MCP-Protocol-Version` header; carries tool/resource/prompt `icons` into descriptors (filtering unsafe URI schemes); and surfaces `execution.taskSupport`, failing fast on task-required tools. Unwired `elicitation` dead code removed. (Reverse / server-side capabilities are planned as FEATURE_222 for v0.7.48.)
|
|
2346
2496
|
|
|
@@ -2419,7 +2569,7 @@ shared names — the new name is required for the coding-plan provider to start.
|
|
|
2419
2569
|
- **P2 — explicit per-dispatch override.** `dispatch_child_task` gains optional `provider` / `model` params, so the agent can deliberately send a child to another model family — e.g. a second independent review of the same change by a different family, to catch blind spots a single family would share. Resolution priority in `child-executor`: `bundle.provider/model` > specialist's declared model (FEATURE_191) > parent default. Omitting both is byte-identical to the prior behavior. Tolerant parse (empty/whitespace → undefined) so a misuse never fails the dispatch.
|
|
2420
2570
|
- **P3 — cross-provider fallback + `doctor --ping`.** When a child's primary provider is *exhausted or down* (the LLM layer's same-provider `withRateLimit` retries gave up, a 5xx, or a network error), KodaX re-runs the child once on the next provider in an operator-configured chain instead of failing the whole child. Configured via `/fallback ark-coding,kimi-code` (persists to `~/.kodax/config.json` + mirrors to `KODAX_FALLBACK_PROVIDERS`; `/fallback off` to clear, `/fallback status` to inspect). Empty chain = OFF. Scope is deliberately minimal (per user direction): only hard availability errors trigger fallback — a returned `success:false` is a task outcome (not retried elsewhere) and aborts are never faked over; the speculative tool-call-fidelity / context-overflow / quality-anomaly triggers are unbuilt (YAGNI). `kodax doctor --ping` completes the health check: it sends one minimal request per configured provider (10s timeout, concurrent) to prove the key actually works and the subscription is active — opt-in, small token cost, never on the default `doctor`. 16 tests (11 fallback core + 5 `/fallback` command).
|
|
2421
2571
|
- **P1-auto — `model_hint` → tier routing.** The previously dormant `model_hint` field (`fast`/`balanced`/`deep`, FEATURE_120) now selects an operator-configured tier: `fast` → `KODAX_FAST_PROVIDER`/`KODAX_FAST_MODEL` (**read-only children only** — the gating eval validated cheap-model quality on read-only investigation but not write/codegen, so write children stay on the parent tier), `deep` → `KODAX_DEEP_PROVIDER`/`KODAX_DEEP_MODEL` (read or write). `balanced`/unset, or any unconfigured tier, falls back to the parent — **routing is OFF by default** and turns on only when you point a tier env var at a model (no separate toggle). Specialist and explicit-P2 overrides both win over the hint. Per KodaX minimalism the original 5-name capability-alias layer (`vision`/`long-context`/…) was descoped to this env-tier form — no consumer exists for the rest yet (YAGNI). Pure routing wiring; the Worker prompt is unchanged (an eval non-trigger per `CLAUDE.md`), so $0 / no panel. Gating eval (`tests/feature-102-model-tier-quality.eval.ts`, canonical 5-alias × 3 read-only investigation × 5 run) kept as permanent regression: cheap floor `ark/v4flash` = 15/15, ≥ strong-mean 92% → cheap PRESERVES read-only quality. New unit + integration tests (7 `model-hint-routing` + 5 child-executor P2/P1-auto priority); also de-flaked the pre-existing `merges findings` child-executor test (parallel children made `mergeChildResults` emit in completion order — now deterministic dispatch order). Design: [docs/features/v0.7.45.md](docs/features/v0.7.45.md#phase-1--model_hint--真实跨-provider-子派发mvp).
|
|
2422
|
-
- **FEATURE_216 — `verifyProviderCredential(name)` SDK API + per-provider strategy.** New top-level helper for SDK consumers (KodaX Space, third-party embedders) to validate a provider's API key against the actual upstream — never-throws, mostly zero-token. Closes the "test connection" UI gap: existing `isConfigured()` only checks env presence; `stream()`/`sideQuery()` are too heavy. Three primitives, one per provider, baked into `provider-capabilities.json` `verifyStrategy` field: **`count-tokens`** (Anthropic `messages.countTokens()`, 0 token) for `anthropic` + 4 anthropic-coding providers; **`models-list`** (`models.list()`, 0 token) for `openai`/`deepseek`/`kimi`/`qwen`; **`minimal-message`** (~6-7 token `chat.completions.create({max_tokens:1})`) for `zhipu`/`mimo`/`mimo-coding` (where `models.list()` is publicly-served or `count_tokens` returns 404). CLI-bridge providers (`gemini-cli`, `codex-cli`) return `unsupported` — their credentials live in the CLI binary's token store, outside SDK reach. Top-level `verifyProviderCredential(name, opts?)` short-circuits unknown name / unsupported strategy / missing env var BEFORE instantiating the provider class — avoids the constructor throw on missing key, and ALSO wraps the actual `verifyCredential()` call in try/catch so the never-throws contract survives runtime-registered providers whose 3rd-party overrides might throw instead of returning an envelope. Error categorization (`unauthorized` / `network` / `timeout` / `unsupported` / `unconfigured` / `server_error` / `rate_limited` / `unknown`) is stable for UI consumers to map to user-facing states — `rate_limited` (429) is distinct from `unauthorized` so a transiently throttled key isn't misread as invalid. The error `message` field redacts `sk-...` key fragments before truncation so upstream error bodies that echo the submitted key don't leak the fragment into UI logs. The `kimi-code`-specific 400→`unauthorized` mapping is gated by `providerName` to avoid false-positives on other count-tokens providers that might 400 on a legitimate bad request (bad model id / schema mismatch). Network error detection extended to `ETIMEDOUT` + `ENETUNREACH` + `EHOSTUNREACH` + `ENETDOWN` beyond the original `ENOTFOUND`/`ECONNREFUSED`/`ECONNRESET`/`EAI_AGAIN`/`EPIPE` set. Companion `listProviderModels(name)` returns the static curated list (always `source: 'static'` in v0.7.45 — upstream `/v1/models` is noisy + inconsistent across providers per the 2026-05-28 12-provider probe matrix). Custom providers auto-inherit by `protocol`; explicit `verifyStrategy` overrides allowed. 88 tests total (28 orchestrator + 14 resolver + 38 schema + 10 real-key integration gated on `KODAX_INTEGRATION_TEST=1`). Reference industry validator: opencode's `setup-recording-env.ts` makes the same per-provider decision across 20+ providers — per-provider strategy IS industry standard, no universal 0-token primitive exists. Design + probe data: [docs/features/v0.7.45.md#feature_216](docs/features/v0.7.45.md#feature_216-provider-credential-verification-api). SDK usage guide: [
|
|
2572
|
+
- **FEATURE_216 — `verifyProviderCredential(name)` SDK API + per-provider strategy.** New top-level helper for SDK consumers (KodaX Space, third-party embedders) to validate a provider's API key against the actual upstream — never-throws, mostly zero-token. Closes the "test connection" UI gap: existing `isConfigured()` only checks env presence; `stream()`/`sideQuery()` are too heavy. Three primitives, one per provider, baked into `provider-capabilities.json` `verifyStrategy` field: **`count-tokens`** (Anthropic `messages.countTokens()`, 0 token) for `anthropic` + 4 anthropic-coding providers; **`models-list`** (`models.list()`, 0 token) for `openai`/`deepseek`/`kimi`/`qwen`; **`minimal-message`** (~6-7 token `chat.completions.create({max_tokens:1})`) for `zhipu`/`mimo`/`mimo-coding` (where `models.list()` is publicly-served or `count_tokens` returns 404). CLI-bridge providers (`gemini-cli`, `codex-cli`) return `unsupported` — their credentials live in the CLI binary's token store, outside SDK reach. Top-level `verifyProviderCredential(name, opts?)` short-circuits unknown name / unsupported strategy / missing env var BEFORE instantiating the provider class — avoids the constructor throw on missing key, and ALSO wraps the actual `verifyCredential()` call in try/catch so the never-throws contract survives runtime-registered providers whose 3rd-party overrides might throw instead of returning an envelope. Error categorization (`unauthorized` / `network` / `timeout` / `unsupported` / `unconfigured` / `server_error` / `rate_limited` / `unknown`) is stable for UI consumers to map to user-facing states — `rate_limited` (429) is distinct from `unauthorized` so a transiently throttled key isn't misread as invalid. The error `message` field redacts `sk-...` key fragments before truncation so upstream error bodies that echo the submitted key don't leak the fragment into UI logs. The `kimi-code`-specific 400→`unauthorized` mapping is gated by `providerName` to avoid false-positives on other count-tokens providers that might 400 on a legitimate bad request (bad model id / schema mismatch). Network error detection extended to `ETIMEDOUT` + `ENETUNREACH` + `EHOSTUNREACH` + `ENETDOWN` beyond the original `ENOTFOUND`/`ECONNREFUSED`/`ECONNRESET`/`EAI_AGAIN`/`EPIPE` set. Companion `listProviderModels(name)` returns the static curated list (always `source: 'static'` in v0.7.45 — upstream `/v1/models` is noisy + inconsistent across providers per the 2026-05-28 12-provider probe matrix). Custom providers auto-inherit by `protocol`; explicit `verifyStrategy` overrides allowed. 88 tests total (28 orchestrator + 14 resolver + 38 schema + 10 real-key integration gated on `KODAX_INTEGRATION_TEST=1`). Reference industry validator: opencode's `setup-recording-env.ts` makes the same per-provider decision across 20+ providers — per-provider strategy IS industry standard, no universal 0-token primitive exists. Design + probe data: [docs/features/v0.7.45.md#feature_216](docs/features/v0.7.45.md#feature_216-provider-credential-verification-api). SDK usage guide: [public_docs/sdk/embedder-guide.md §12](public_docs/sdk/embedder-guide.md#12-provider-credential-verification--verifyprovidercredential-feature_216-v0745).
|
|
2423
2573
|
|
|
2424
2574
|
### Performance
|
|
2425
2575
|
|
|
@@ -2491,7 +2641,7 @@ shared names — the new name is required for the coding-plan provider to start.
|
|
|
2491
2641
|
|
|
2492
2642
|
### Added
|
|
2493
2643
|
|
|
2494
|
-
- **FEATURE-SDK-MODEL-CAPS — Expose Per-Model Capabilities Without API Key** (2 commits `7f627d0c` feat + `c37b0a13` fix, shipped 2026-05-25). SDK consumers (KodaX Space etc.) need to list providers + their models with context-window / reasoning info in popout UIs — but the pre-v0.7.43 path forced instantiation of each `KodaXProvider` class, which throws on missing API key. Static metadata was hidden behind runtime credentials, an architectural mismatch — that data is KodaX-maintained, not negotiated with the upstream. **Fix** (2-part): (1) Promote capability metadata (`contextWindow` / `maxOutputTokens` / `thinkingBudgetCap` / `supportsThinking` / full `KodaXModelDescriptor[]`) from per-Provider `class.config` field initializers UP to the existing `KODAX_PROVIDER_SNAPSHOTS` constant — Provider classes now derive their runtime `config` from the snapshot via `buildProviderConfig` (single source of truth, no drift risk; net −160 lines duplication / +30 lines metadata / byte-equivalent runtime behavior). (2) Add 9 new SDK exports reading directly from the snapshot (zero API keys touched): built-in `getProviderModelDescriptors` / `getModelCapabilities` / `listBuiltinModelCapabilities`; custom (from `~/.kodax/config.json#customProviders`) `getCustomProviderModelDescriptors` / `getCustomModelCapabilities` / `listCustomProviderModelCapabilities`; unified dispatchers `resolveProviderModelDescriptors` / `resolveModelCapabilities` / `listAllModelCapabilities`. New public type `KodaXModelCapabilities` exposed from `@kodax-ai/kodax/llm`. **`maxOutputTokens` rationale** (fix commit `c37b0a13`): the field IS reliable — it's the KodaX-side per-turn `max_tokens` request decision (bench-validated against kill-windows / decode-rate / cost-per-turn), NOT the upstream "theoretical maximum" (which is often inflated or absent — zhipu-coding / kimi-code / minimax-coding / ark-coding / deepseek `/v1/models` returns `{id, object, owned_by, created}` only). Embedders showing "expected output size" should use this value; theoretical ceilings should be looked up from the upstream provider's own docs. **Maintainer-probe scripts shipped**: `scripts/probe-upstream-model-metadata.mjs` (re-run periodically to detect upstream API improvements) + `scripts/probe-ark-tokens.mjs` (Ark-specific drill-down). **Tests**: `packages/llm/src/providers/model-capabilities.test.ts` 20/20 ✓ (no-API-key verification clears 6 env vars during assertion; snapshot drift guard asserts every `supportsThinking` provider declares `contextWindow` + every `models[]` entry is a descriptor object); full llm suite 304/304 ✓. **Bundle impact**: `dist/sdk-llm.d.ts` +1.2 kB (new types + symbols); `dist/sdk-llm.js` +400 bytes. **Architectural debt followup**: `KODAX_PROVIDER_SNAPSHOTS` still TS const compiled into bundle; capability data update path still needs `npm publish` + consumer `npm update`. FEATURE_198 (filed for v0.7.44) splits the snapshot to JSON + runtime loader for dist-patch-time updates (hot-update over network deferred to v0.7.46+). Docs: [`SDK_EMBEDDER_GUIDE.md §9`](
|
|
2644
|
+
- **FEATURE-SDK-MODEL-CAPS — Expose Per-Model Capabilities Without API Key** (2 commits `7f627d0c` feat + `c37b0a13` fix, shipped 2026-05-25). SDK consumers (KodaX Space etc.) need to list providers + their models with context-window / reasoning info in popout UIs — but the pre-v0.7.43 path forced instantiation of each `KodaXProvider` class, which throws on missing API key. Static metadata was hidden behind runtime credentials, an architectural mismatch — that data is KodaX-maintained, not negotiated with the upstream. **Fix** (2-part): (1) Promote capability metadata (`contextWindow` / `maxOutputTokens` / `thinkingBudgetCap` / `supportsThinking` / full `KodaXModelDescriptor[]`) from per-Provider `class.config` field initializers UP to the existing `KODAX_PROVIDER_SNAPSHOTS` constant — Provider classes now derive their runtime `config` from the snapshot via `buildProviderConfig` (single source of truth, no drift risk; net −160 lines duplication / +30 lines metadata / byte-equivalent runtime behavior). (2) Add 9 new SDK exports reading directly from the snapshot (zero API keys touched): built-in `getProviderModelDescriptors` / `getModelCapabilities` / `listBuiltinModelCapabilities`; custom (from `~/.kodax/config.json#customProviders`) `getCustomProviderModelDescriptors` / `getCustomModelCapabilities` / `listCustomProviderModelCapabilities`; unified dispatchers `resolveProviderModelDescriptors` / `resolveModelCapabilities` / `listAllModelCapabilities`. New public type `KodaXModelCapabilities` exposed from `@kodax-ai/kodax/llm`. **`maxOutputTokens` rationale** (fix commit `c37b0a13`): the field IS reliable — it's the KodaX-side per-turn `max_tokens` request decision (bench-validated against kill-windows / decode-rate / cost-per-turn), NOT the upstream "theoretical maximum" (which is often inflated or absent — zhipu-coding / kimi-code / minimax-coding / ark-coding / deepseek `/v1/models` returns `{id, object, owned_by, created}` only). Embedders showing "expected output size" should use this value; theoretical ceilings should be looked up from the upstream provider's own docs. **Maintainer-probe scripts shipped**: `scripts/probe-upstream-model-metadata.mjs` (re-run periodically to detect upstream API improvements) + `scripts/probe-ark-tokens.mjs` (Ark-specific drill-down). **Tests**: `packages/llm/src/providers/model-capabilities.test.ts` 20/20 ✓ (no-API-key verification clears 6 env vars during assertion; snapshot drift guard asserts every `supportsThinking` provider declares `contextWindow` + every `models[]` entry is a descriptor object); full llm suite 304/304 ✓. **Bundle impact**: `dist/sdk-llm.d.ts` +1.2 kB (new types + symbols); `dist/sdk-llm.js` +400 bytes. **Architectural debt followup**: `KODAX_PROVIDER_SNAPSHOTS` still TS const compiled into bundle; capability data update path still needs `npm publish` + consumer `npm update`. FEATURE_198 (filed for v0.7.44) splits the snapshot to JSON + runtime loader for dist-patch-time updates (hot-update over network deferred to v0.7.46+). Docs: [`SDK_EMBEDDER_GUIDE.md §9`](public_docs/sdk/embedder-guide.md#9-querying-per-model-capabilities-without-api-keys).
|
|
2495
2645
|
- **FEATURE_197 — Read-Only Markdown Agent Discovery: `discoverMarkdownAgents` SDK API (FEATURE_191 follow-up)** (1 commit, shipped 2026-05-24). KodaX Space (SDK 消费方) 2026-05-24 反馈:F191 `loadAgentsFromMarkdown` 触发 admission + 全局 registry 注册 side effect,他们想做 "agent picker" UI(用户 preview 已有 markdown agents 后再选择性激活),现有 loader 形态不匹配。`listConstructedAgentsWithSource()` 虽然技术上能 list 但是 `@internal` 标记的([`agent-resolver.ts:159-164`](packages/coding/src/construction/agent-resolver.ts#L159-L164) 明确写 "NOT yet a stable SDK surface; embedders SHOULD continue using `listConstructedAgents()`"),不能给 SDK consumer 用。F035 `discoverSkills(root?, opts?)` 是 pure read-only 形态,F191 没有对应的 read-only counterpart 是 SDK surface 设计 gap。**Fix**:抽 `parseMarkdownAgentFile(filePath)` shared helper(loader 和 discover 共用 parser,loader 行为 byte-identical),新增 `discoverMarkdownAgents(opts): Promise<{agents: DiscoveredMarkdownAgent[], failed: MarkdownLoadFailure[]}>` 公开 API:扫描同 two-tier path (user → project) → 返回 metadata `{name, description, source: 'markdown:user' | 'markdown:project', path, tools?, model?}`,**零 admission / 零 registration / 零全局 registry mutation**。Last-write-wins 与 loader parity(project 同名 shadow user)。Tools 字段返回 raw 名字不带 `builtin:` 前缀(discovery 暴露用户写的形态,ref-prefix 逻辑移到 loader 内 inline `.map(ref:)` 应用)。**Validation 边界**:discover 不验 admission(unknown tool ref / handoff cycle 都 surface),admission 仍在 `loadAgentsFromMarkdown` 兜底 — 与 F035 discoverSkills 不验 skill admission 形态对齐。**测试**:13 既有 F191 loader test 全过(parser 抽取无行为变化)+ 15 新 F197 unit test 覆盖 empty/missing-frontmatter/missing-name/missing-description/empty-body/project-shadows-user/tools-array/tools-csv/model-passthrough/admission-not-validated/loader-roundtrip-parity;**Read-only 硬契约**断言(`listConstructedAgents().length` discover 前后不变 + `resolveConstructedAgent(name)` discover 后仍 `undefined`)锁定 "discover 不能误注册" 边界。**Round-trip parity**断言 `discover.agents.length === loader.loaded` + 失败路径 set 相等 + 名字 set 相等 — 同 parser 共用保证 SDK consumer 用 discover preview 决定的 set 与最终 loader 激活的 set 一致。**Public surface**:`discoverMarkdownAgents` + `DiscoveredMarkdownAgent` + `DiscoverMarkdownAgentsResult` 从 `@kodax-ai/coding` 一路 reexport 到 `@kodax-ai/kodax` + `@kodax-ai/kodax/coding` 子路径。**Eval $0** — pure file-system + YAML parse, no LLM-facing change. 28/28 tests pass, tsc clean. 详见 [v0.7.43.md §FEATURE_197](docs/features/v0.7.43.md#feature_197-read-only-markdown-agent-discovery--discovermarkdownagents-sdk-apif191-follow-up).
|
|
2496
2646
|
- **FEATURE_195 — Sidecar Verifier UI Silent Accept: Default-Hide Accept Verdict Evidence Entry + Transcript-Mode Opt-In** (1 commit `1b53150e`, shipped 2026-05-24). User 2026-05-24 实战 session 截图("你好 → 你好!" 对话)显示 sidecar verifier accept verdict 的 `reason` 文本以 `> [Evaluator] ...` event-item 渲染到 transcript,背离 FEATURE_184 (v0.7.42, ADR-030) "silent accept" 设计意图(accept verdict 应只走 session.jsonl + artifact,UI 端仅看 `[AMA Verifying]` spinner)。3-step pipeline 漏 silent 到 UI 层:(a) [`verifier-recorder-bridge.ts:89-104`](packages/coding/src/agent-runtime/middleware/sidecar-verifier/verifier-recorder-bridge.ts#L89) 历史 backward-compat 写 `role:'evaluator'` 入 recorder;(b) [`payload-builder.ts:249-298`](packages/coding/src/task-engine/_internal/managed-task/payload-builder.ts#L249) recorder 进 evidence.entries;(c) [`InkREPL.tsx:574-624`](packages/repl/src/ui/InkREPL.tsx#L574) `buildManagedTaskTranscriptItems` 无差别 render 全部 evidence.entries 为 event-item。**Fix**:单 commit REPL render filter — `shouldFilterSidecarAcceptEntry(entry, verifierLog)` helper + extend `buildManagedTaskTranscriptItems(result, options?: { verifierLog?: boolean })`;filter 规则 `role==='evaluator' AND signal==='COMPLETE' AND !verifierLog ⇒ filter`;revise/blocked verdict 因 signal 不是 `'COMPLETE'` 自然 fall-through。Default 读 `process.env.KODAX_VERIFIER_LOG === '1'` (复用 F184 Phase D.3 已有 env var);config 入口同时支持 `verifierLog: true` in `~/.kodax/config.json`。**数据层 0 改动**:`recorder.verdict` 仍写 session.jsonl + artifact —— replay / debug / scorecard / `kodax sessions` resume 全完整。**测试**:8 新 unit test 覆盖 4 verdict state (accept-no-userAnswer / accept-with-userAnswer / revise / blocked) × 2 mode (default / verifierLog=true)。**Root cause refinement during impl**:立项 doc 假设 H0_DIRECT trivial-chat `decidedByAssignmentId='evaluator'`,实际生产 `payload-builder.ts:218-219` 三元 `harness === 'H0_DIRECT' ? 'direct' : verdictStatus ? 'evaluator' : 'worker'` 让 H0_DIRECT 是 `direct`(最高优先级)——所有 fixture 已对齐生产路径用 `direct`。**Eval $0**:无 LLM-facing prompt change;UI render filter 是 deterministic 行为,unit test 覆盖 sufficient。**Concurrent-thread safety**:0 文件 overlap with F194 (改 `packages/{mcp,skills,tracing,session-lineage}`);atomic stage + commit + push 同 Bash 调用 per `feedback_concurrent_thread_git_race`。详见 [v0.7.43.md §FEATURE_195](docs/features/v0.7.43.md#feature_195-sidecar-verifier-ui-silent-accept--default-hide-accept-verdict-evidence-entry--transcript-mode-opt-in) + ADR-030 §F195/F196 cross-reference。
|
|
2497
2647
|
- **FEATURE_196 — Sidecar Verifier Content-Aware Fire Gate: Action-Surface Detector + Conversational User-Intent Skip** (4 commits `10b8b290` → `c25ff99c` → `af7bc588` → this commit, shipped 2026-05-24). FEATURE_184 (v0.7.42, ADR-030) 在 Worker text-only termination 时无差别 fire sidecar verifier,包括 "你好" 这种零 action-surface trivial-chat 也跑 3-10s + LLM cost。F184 设计动机是抓 zhipu intent-vs-action floor(Worker 说 "明白,我用 todo_create..." 但没真调 tool),不是 trivial-chat 内容审查器;trivial chat 没有可 verify 的"声称完成"surface。F196 在 [`runner-driven.ts`](packages/coding/src/task-engine/runner-driven.ts) `composedStopHook` `!isIdleYieldTurn` 分支 `observer.sidecarStarted()` 之前加 deterministic 前置 gate `composeGateDecision(ctx, process.env)`,`fire===false` 直返 `extensionTurnCompleteHook(ctx)` 不进 sidecar;F184 fire 路径保持 byte-identical。**Gate 逻辑** (新模块 [`packages/coding/src/agent-runtime/middleware/sidecar-verifier/gate.ts`](packages/coding/src/agent-runtime/middleware/sidecar-verifier/gate.ts) ~213 LoC):(1) Layer 1 `detectActionSurface` — 看 last assistant message 有无 `tool_use` content block,有则 fire (action-surface);(2) Layer 2 `detectConversationalIntent` — greeting prefix regex (中英双语 + 通用 punctuation 👋 🙏) AND 长度 ≤ 20 codepoint AND 无 imperative verb (中文单字查/写/修/改/删/搜... + 中文多字 + 英文 imperative),三合取真则 skip (conversational);(3) escape hatch `KODAX_VERIFIER_ALWAYS=1` 强制 fire;(4) 默认 fire(保守失败 — F184 跑一遍 cost < 漏抓 zhipu floor)。`KODAX_VERIFIER_LOG=1` stderr `[sidecar-gate] {fire|skip}: <reason>` 复用 F195 env var。**测试**:23 unit (`gate.test.ts` — 6 actionSurface + 11 conversationalIntent + 6 composeGateDecision) + 3 integration (`runner-driven.test.ts` FEATURE_196 describe block — trivial-greeting skip / mutation-tool fire / imperative+zero-action fire) 全 pass。**Layer 2 eval — SHIP gate ALL EXCEEDED**(4 case × 5 canonical alias × 1 run = 60 panel cells + pilot 12 cells):(a) C1 greeting skip 5/5 alias **100%** (≥95% 立项门槛) / (b) C2 imperative fire 5/5 alias **100%** (≥95%) / (c) C3 long-message fire 5/5 alias **100%** (=100%) / (d) C4 no-greeting fire 5/5 alias **100%** (=100%) / (e) 5/5 alias meet (a)+(b) → **SHIP**。Eval cost **~$2 actual vs $10-15 budget** (under-spend ~8×) — gate logic deterministic(`composeGateDecision` is pure function),Layer 1 unit tests authoritative;Layer 2 scope 收窄到 tuple realism only("do real Worker LLM outputs across 5 provider families produce `KodaXContentBlock[]` shapes that `lastAssistantHasToolUse` detector handles?" + "do real model families respond to canonical user-message inputs with response patterns case categories assume?")。**3-judge audit 跳过** per EVAL_GUIDELINES.md §Layer 1 justification:gate decision per cell 是 `actualDecision === c.expectedDecision` 严格等值,无 LLM 歧义空间,3-judge majority 适用 LLM-judge 场景不适用 deterministic gate eval (raw text 抽查 spot-check 6 行已在 commit-3 message 记录)。**Eval drivers retained as permanent regression sweep**:`tests/feature-196-sidecar-content-gate.eval.ts` + `benchmark/datasets/feature-196-sidecar-content-gate/cases.ts` 入 repo;raw dumps 留 `<tmpdir>/kodax-eval-dumps/feature-196-sidecar-content-gate/` per `feedback_eval_dumps_stay_in_temp` 不入 repo;mkdirSync per flush survive Windows tmpdir race per `feedback_audit_dump_dir_vanishes`。**Behavior change for users**:trivial-chat (greeting + 零 tool call + ≤20 codepoint) 无 sidecar latency (省 3-10s tail + LLM cost);imperative + zero-action (zhipu intent-vs-action floor) 仍 fire 保 F184 contract;mutation + worker tool_use 仍 fire;`KODAX_VERIFIER_ALWAYS=1` env opt-back-in 强制 fire (debug / audit)。详见 [v0.7.43.md §FEATURE_196](docs/features/v0.7.43.md#feature_196-sidecar-verifier-content-aware-gate--action-surface-detector--conversational-user-intent-skip) + ADR-030 §F195/F196 cross-reference。
|
package/README.md
CHANGED
|
@@ -220,7 +220,7 @@ and diagnostics without activating the backend or requesting elevation.
|
|
|
220
220
|
Per-command sandbox routing remains internal and is not shown in normal command
|
|
221
221
|
history. SDK embedders can use the same capability independently through
|
|
222
222
|
`@kodax-ai/kodax/sandbox`; see the
|
|
223
|
-
[SDK sandbox guide](
|
|
223
|
+
[SDK sandbox guide](public_docs/sdk/embedder-guide.md#30-standalone-sandbox-sdk-v0778).
|
|
224
224
|
|
|
225
225
|
Credential-shaped environment variables are filtered from model-issued shell
|
|
226
226
|
commands by default. To expose exact host variables to those command targets,
|
|
@@ -415,7 +415,7 @@ const result = await runKodaX(
|
|
|
415
415
|
```
|
|
416
416
|
|
|
417
417
|
> **Embedding KodaX inside another app?** (KodaX Space, IDE extensions, custom CLIs)
|
|
418
|
-
> See [
|
|
418
|
+
> See [public_docs/sdk/embedder-guide.md](public_docs/sdk/embedder-guide.md) for the runtime-mutation
|
|
419
419
|
> surface (`startKodaX` + `RunningSession`), MCP popout manager API (`McpManager`),
|
|
420
420
|
> Skill `` !`cmd` `` host hook, and per-app data dir namespacing (`getAppDataDir`).
|
|
421
421
|
|
|
@@ -546,13 +546,14 @@ home credential paths and the complete resolved agent home without turning
|
|
|
546
546
|
ordinary external reads into an allowlist. See the
|
|
547
547
|
[v0.7.78 design](docs/features/v0.7.78.md), the
|
|
548
548
|
[release checklist](docs/release.md#v0778-release-verification), and
|
|
549
|
-
[SDK guide sections 29–30](
|
|
549
|
+
[SDK guide sections 29–30](public_docs/sdk/embedder-guide.md#29-evidence-gated-background-skill-learning-feature_263-v0778).
|
|
550
550
|
|
|
551
551
|
The release closure also preserves intent across adjacent surfaces: static
|
|
552
552
|
Skill instructions load in Edit/Plan without granting later side effects,
|
|
553
|
-
dynamic Skill commands require an explicit host-controlled executor, root AMA
|
|
554
|
-
|
|
555
|
-
|
|
553
|
+
dynamic Skill commands require an explicit host-controlled executor, root AMA
|
|
554
|
+
handles explicit remember/correct/forget requests immediately through the
|
|
555
|
+
governed `memory_intent` control plane while exceptional or inferred changes
|
|
556
|
+
remain reviewable, Workflow Actor waits remain
|
|
556
557
|
unbounded unless the workflow sets a deadline, and Runtime Auto capability v4
|
|
557
558
|
advertises `fallbackPersistsEngine:false` across embedded, Worker, and daemon
|
|
558
559
|
hosts. Actor ownership additionally uses Runtime identity rather than PID alone,
|
|
@@ -609,7 +610,7 @@ before KodaX reports them as delivered. Every delivered item exposes its
|
|
|
609
610
|
restart. A multi-input safe-boundary drain keeps each prompt as a separate user
|
|
610
611
|
message and maps it to its own entry. Runtime-owned persistence or provenance
|
|
611
612
|
failure fails the delivery closed rather than emitting an unverifiable event.
|
|
612
|
-
FEATURE_287 remains planned for v0.7.
|
|
613
|
+
FEATURE_287 remains planned for v0.7.93; this is a non-Feature patch. See the
|
|
613
614
|
[v0.7.81 release checklist](docs/release.md#v0781-release-preparation).
|
|
614
615
|
|
|
615
616
|
**v0.7.82 Runtime causality release:** Daemon capability discovery now composes
|
|
@@ -621,7 +622,7 @@ trusted Abort remains terminal causality before credential redaction without
|
|
|
621
622
|
overriding a real completion or independent failure. Input submission resolves
|
|
622
623
|
the admitted authoritative Run before reading mutable Session history, so
|
|
623
624
|
active interrupt and after-turn admission do not produce a transient
|
|
624
|
-
`data_changed` rejection. FEATURE_287 remains planned for v0.7.
|
|
625
|
+
`data_changed` rejection. FEATURE_287 remains planned for v0.7.93; this is a
|
|
625
626
|
non-Feature patch. See the [v0.7.82 release checklist](docs/release.md#v0782-release-preparation).
|
|
626
627
|
|
|
627
628
|
**v0.7.83 Windows daemon containment release:** Windows daemon startup creates
|
|
@@ -631,9 +632,30 @@ exports `waitForRuntimeDaemonShutdown()` and capability
|
|
|
631
632
|
`daemonShutdownVerification:1`; CLI stop waits for both daemon and supervisor
|
|
632
633
|
exit. Legacy uncontained daemons are not reported as verified and are not
|
|
633
634
|
silently upgraded in place. The Worker owner-lease portion of Issue 256 remains
|
|
634
|
-
scheduled for v0.7.
|
|
635
|
+
scheduled for v0.7.85, and FEATURE_287 remains planned for v0.7.93. See the
|
|
635
636
|
[v0.7.83 release checklist](docs/release.md#v0783-release-preparation).
|
|
636
637
|
|
|
638
|
+
**v0.7.84 Actor settlement recovery release:** Agent progress persistence is
|
|
639
|
+
now bounded to one in-flight write plus one latest replacement, so terminal
|
|
640
|
+
settlement cannot wait behind an unbounded progress backlog. A same-owner Stop
|
|
641
|
+
can reconcile a late Actor snapshot after a durability timeout, durably quiesce
|
|
642
|
+
remaining children, and retry the repair. Promise success/failure facts remain
|
|
643
|
+
authoritative over fallback callbacks after repair; stale durable unknown state
|
|
644
|
+
cannot rewind a local terminal Run or duplicate cancellation effects. No-op
|
|
645
|
+
quiescence avoids an unnecessary Session rewrite. See the
|
|
646
|
+
[v0.7.84 release checklist](docs/release.md#v0784-release-preparation).
|
|
647
|
+
|
|
648
|
+
**v0.7.85 release:** this release ships the F289/F290 Memory review and
|
|
649
|
+
lesson/verdict pipeline, F291 Session-scoped Runtime Event Journals, and F292
|
|
650
|
+
conversation-first Memory management with the additive experimental SDK
|
|
651
|
+
management facade. It also includes Actor settlement convergence, Agent Home
|
|
652
|
+
and learned-root guardrails, terminal startup replay avoidance, idle
|
|
653
|
+
repo-intelligence Worker retirement, Windows sandbox/ACL hardening, and the
|
|
654
|
+
matching regression guides. These include intentional runtime and system-code
|
|
655
|
+
changes. Issue 256's remaining Worker owner-lease boundary is still open and
|
|
656
|
+
is scheduled for v0.7.86; this release does not claim descendant-closure proof
|
|
657
|
+
for that unresolved portion. See the [v0.7.85 release checklist](docs/release.md#v0785-release-preparation).
|
|
658
|
+
|
|
637
659
|
The v0.7.77 release also adds an opt-in, host-configurable Shell Execution Contract.
|
|
638
660
|
Runtime Session settings or an individual Run can select `pwsh`, Windows
|
|
639
661
|
PowerShell, `cmd`, `bash`, `zsh`, or an explicit Git Bash executable; KodaX
|
|
@@ -645,7 +667,7 @@ before profile/setup code and again before the command starts. Credential-shaped
|
|
|
645
667
|
variables are also filtered on the legacy platform-shell path; explicit names
|
|
646
668
|
in user-level `sandbox.envPass` are restored only for the final command target.
|
|
647
669
|
When `shellExecution` is absent, the established interpreter path is unchanged. See
|
|
648
|
-
[SDK Embedder Guide section 28](
|
|
670
|
+
[SDK Embedder Guide section 28](public_docs/sdk/embedder-guide.md#28-host-configurable-shell-execution-contract-v0777)
|
|
649
671
|
and the [Issue 214 regression guide](docs/test-guides/ISSUE_214_v0.7.77_REGRESSION_GUIDE.md).
|
|
650
672
|
|
|
651
673
|
Kimi Code requests also receive a stable, opaque prompt-cache affinity key
|
|
@@ -687,10 +709,10 @@ silently fall back to inline Coder.
|
|
|
687
709
|
For the full host-integration contract, including inline/Worker/daemon selection,
|
|
688
710
|
multi-client permission handling, config/catalog/MCP admin APIs, artifacts,
|
|
689
711
|
context diagnostics, and daemon protocol schemas, see
|
|
690
|
-
[
|
|
712
|
+
[public_docs/sdk/embedder-guide.md §17](public_docs/sdk/embedder-guide.md#17-runtime-sdk-worker-isolation-and-local-daemon-feature_253-feature_257).
|
|
691
713
|
|
|
692
714
|
The Space/IDE shared-daemon contract is documented in
|
|
693
|
-
[SDK Embedder Guide section 23](
|
|
715
|
+
[SDK Embedder Guide section 23](public_docs/sdk/embedder-guide.md#23-shared-coder-daemon-for-space-and-ide-hosts-feature_269-v0769).
|
|
694
716
|
|
|
695
717
|
**v0.7.72–v0.7.73 Runtime permission contract:** Auto Mode is owned by the Runtime session,
|
|
696
718
|
not by a UI hook. It reuses its LLM/rules guardrail across turns, classifies
|
|
@@ -703,7 +725,7 @@ the Accept-edits safety boundary; they never change the engine to rules.
|
|
|
703
725
|
Runtime permission prompts offer opaque, exact
|
|
704
726
|
allow-once/session/persistent grant suggestions; persistent grants are
|
|
705
727
|
daemon-owned and revisioned. Host plan exit is exposed only when the host
|
|
706
|
-
supplies an approval callback. See the [Runtime Auto Mode integration guide](
|
|
728
|
+
supplies an approval callback. See the [Runtime Auto Mode integration guide](public_docs/sdk/embedder-guide.md#24-runtime-owned-auto-mode-and-plan-approval-bridges-v0772v0773).
|
|
707
729
|
|
|
708
730
|
## Repo Intelligence
|
|
709
731
|
|
|
@@ -804,7 +826,7 @@ KodaX has two layers that consumers should understand separately:
|
|
|
804
826
|
| `packages/agent` | `@kodax-ai/kodax/skills` | **Narrow subset** | Skills system only — `SkillRegistry` / `loadFullSkill` / `expandSkillForLLM` / ... (26 exports = pre-v0.7.43 `@kodax-ai/skills` complete API) | Skill loaders, IDE plugins |
|
|
805
827
|
| `packages/agent` | `@kodax-ai/kodax/mcp` | **Narrow subset** | MCP only — `McpCapabilityProvider` / `createMcpTransport` / `searchMcpCatalog` / ... (23 exports) | MCP server hosts |
|
|
806
828
|
| `packages/agent` | `@kodax-ai/kodax/media` | **Narrow subset** | Structured image/file/video input-artifact helpers (22 exports) | Desktop hosts and multimodal clients |
|
|
807
|
-
| `packages/agent` | `@kodax-ai/kodax/experimental-memory` | **Experimental subset** | Thin F228-backed `MemoryAgent` / `MemorySession`
|
|
829
|
+
| `packages/agent` | `@kodax-ai/kodax/experimental-memory` | **Experimental subset** | Thin F228-backed `MemoryAgent` / `MemorySession` lifecycle plus additive `MemoryManagementAgent` list/remember/forget | SDK hosts explicitly evaluating FEATURE_260 / FEATURE_292 |
|
|
808
830
|
| `packages/coding` | `@kodax-ai/kodax/coding` | Full package | Coding agent + 50+ tools + repo-intelligence (505 exports) | Build a Claude Code-shape product |
|
|
809
831
|
| `packages/repl` | `@kodax-ai/kodax/repl` | Full package | Ink TUI + permission modes + commands (217 exports) | Terminal-UI consumers |
|
|
810
832
|
| `packages/repl` | `@kodax-ai/kodax/session` | **Narrow subset** | Session management only — `listSessions` / `loadFullTranscript` / `appendClientNotice` / `forkSession` / `compactSession` / `watchSessions` / ... (17 exports) | IDE plugins and desktop hosts reading session history |
|
|
@@ -828,21 +850,21 @@ KodaX has two layers that consumers should understand separately:
|
|
|
828
850
|
|
|
829
851
|
**Context-Efficient Tool Results + Workflow Quality Preflight (FEATURE_251 + FEATURE_252, v0.7.61; corrected 2026-07-14)**: local tools collect complete output and apply only contract-equivalent normalization that is strictly shorter; command-specific lossy Bash filters are off by default, and compound Bash uses no semantic adapter. One owner evaluates the complete parallel-result batch against the final provider request: it solves the largest final input `Pmax` for which `Pmax + output reserve + max(2048, 3% of Pmax) <= context window`, then admits only the remaining physical capacity. Results stay verbatim whenever they fit; only real overflow persists the complete value and emits `KODAX_RESULT_INCOMPLETE`. History keeps the same physical-capacity safety rule: no default lossy microcompaction below capacity, summary-first at pressure, and typed failure without silent deletion when a recoverable request cannot be formed. FEATURE_272 supersedes FEATURE_251 only for the default major-compaction trigger. FEATURE_252's deterministic pre-start workflow contract lint is unchanged. See [docs/features/v0.7.61.md](docs/features/v0.7.61.md) and [docs/ADR.md ADR-050](docs/ADR.md).
|
|
830
852
|
|
|
831
|
-
**Reliable Always-On Context Compaction (FEATURE_272, v0.7.74)**: automatic major compaction cannot be disabled. Its percentage trigger defaults to 75% and clamps to 15-90%; optional `triggerTokens` is inactive when omitted/zero, otherwise the smaller percentage, absolute, and physical-capacity threshold wins. The protected raw tail is 20% of that effective trigger. One transaction summarizes the complete eligible prefix, preserves every genuine user request through an exact ledger, and emits success only after a physically valid token reduction and awaited durable commit. Before raw bodies are evicted, the Session owner durably flushes their exact lineage; stable entry IDs merge the sidecar and slim Session without duplicates. Root and persistent child Agents can recover omitted user/assistant/tool details through bounded `session_history_search` → `session_history_read`, with children isolated to hidden worker Sessions and never granted root-history access. SDK/Runtime clients use revision-bound `transcriptSearch`, pages, and lossless chunks. Hidden reasoning, system instructions, and synthetic checkpoints are excluded from model search. See [the feature design](docs/features/v0.7.74.md), [SDK guide §25](
|
|
853
|
+
**Reliable Always-On Context Compaction (FEATURE_272, v0.7.74)**: automatic major compaction cannot be disabled. Its percentage trigger defaults to 75% and clamps to 15-90%; optional `triggerTokens` is inactive when omitted/zero, otherwise the smaller percentage, absolute, and physical-capacity threshold wins. The protected raw tail is 20% of that effective trigger. One transaction summarizes the complete eligible prefix, preserves every genuine user request through an exact ledger, and emits success only after a physically valid token reduction and awaited durable commit. Before raw bodies are evicted, the Session owner durably flushes their exact lineage; stable entry IDs merge the sidecar and slim Session without duplicates. Root and persistent child Agents can recover omitted user/assistant/tool details through bounded `session_history_search` → `session_history_read`, with children isolated to hidden worker Sessions and never granted root-history access. SDK/Runtime clients use revision-bound `transcriptSearch`, pages, and lossless chunks. Hidden reasoning, system instructions, and synthetic checkpoints are excluded from model search. See [the feature design](docs/features/v0.7.74.md), [SDK guide §25](public_docs/sdk/embedder-guide.md#25-always-on-context-compaction-and-bounded-transcript-recovery-v0774), and [ADR-057](docs/ADR.md#adr-057-large-compaction-is-an-always-on-context-scoped-full-coverage-transaction).
|
|
832
854
|
|
|
833
|
-
**Mailbox-Driven Agent Coordination (FEATURE_273, v0.7.74)**: `wait_agent` is now a true model-facing mailbox yield with one bounded `timeout_ms`, not an Actor progress/event reader. It wakes for scoped Agent messages or completions, root user input, interruption, or timeout; progress remains available to UI/SDK snapshot, replay, and long-poll consumers without resampling the parent model. The tool returns only a wake acknowledgement, while authenticated Agent evidence and structured task metadata enter the next safe model boundary once. Unacknowledged root completions survive a hard restart, same-process Runtime rebuilds deduplicate by child turn ID, and acknowledged or legacy historical completions are not replayed. Use `list_agents` for tree state and `agent_output` for a targeted known result. See [the feature design](docs/features/v0.7.74.md#feature_273-mailbox-driven-agent-wait-and-telemetrycontrol-separation), [SDK guide §26](
|
|
855
|
+
**Mailbox-Driven Agent Coordination (FEATURE_273, v0.7.74)**: `wait_agent` is now a true model-facing mailbox yield with one bounded `timeout_ms`, not an Actor progress/event reader. It wakes for scoped Agent messages or completions, root user input, interruption, or timeout; progress remains available to UI/SDK snapshot, replay, and long-poll consumers without resampling the parent model. The tool returns only a wake acknowledgement, while authenticated Agent evidence and structured task metadata enter the next safe model boundary once. Unacknowledged root completions survive a hard restart, same-process Runtime rebuilds deduplicate by child turn ID, and acknowledged or legacy historical completions are not replayed. Use `list_agents` for tree state and `agent_output` for a targeted known result. See [the feature design](docs/features/v0.7.74.md#feature_273-mailbox-driven-agent-wait-and-telemetrycontrol-separation), [SDK guide §26](public_docs/sdk/embedder-guide.md#26-agent-mailbox-control-versus-sdk-event-telemetry-v0774), and [ADR-058](docs/ADR.md#adr-058-model-agent-wait-is-mailbox-control-not-event-telemetry).
|
|
834
856
|
|
|
835
857
|
**Active-Run Interrupt Input (v0.7.74)**: embedded Runtime and the shared daemon advertise `interruptInput:1`. `runtime.runs.submitInput()` queues an immutable, ordered input for the current active Actor Run; all inputs admitted before one safe Runner boundary are delivered FIFO as separate user messages in the next LLM request, without creating continuation Runs. Queued/delivered state is visible in typed Run snapshots/events, delivery is acknowledged against the exact consumed IDs, and terminal cleanup prevents undelivered input from leaking into later Runs.
|
|
836
858
|
|
|
837
|
-
**External Agent SDK Plane (FEATURE_258, v0.7.67)**: `/agent` exports the protocol-neutral executor, registration, policy, credential-broker, artifact-policy, catalog, and durable task contracts. `/runtime` exposes the installed plane through `admin.agentRegistrations`, `agents`, and `agentTasks`, with the same DTO service methods over embedded and daemon clients. Executor factories are host functions: install them in an inline owner or while creating a new in-process daemon owner; they cannot be injected through an existing daemon connection or across a Runtime Worker boundary. Plane shutdown is terminal: pending waits and all later service calls reject. Restricted Workflow scripts preserve validated `phase` and external `target` routing. See the [complete owner/consumer recipes and safety contract](
|
|
859
|
+
**External Agent SDK Plane (FEATURE_258, v0.7.67)**: `/agent` exports the protocol-neutral executor, registration, policy, credential-broker, artifact-policy, catalog, and durable task contracts. `/runtime` exposes the installed plane through `admin.agentRegistrations`, `agents`, and `agentTasks`, with the same DTO service methods over embedded and daemon clients. Executor factories are host functions: install them in an inline owner or while creating a new in-process daemon owner; they cannot be injected through an existing daemon connection or across a Runtime Worker boundary. Plane shutdown is terminal: pending waits and all later service calls reject. Restricted Workflow scripts preserve validated `phase` and external `target` routing. See the [complete owner/consumer recipes and safety contract](public_docs/sdk/embedder-guide.md#18-external-agent-executor-plane-feature_258-v0767).
|
|
838
860
|
|
|
839
|
-
**Cost-Disciplined Workflow SDK (FEATURE_259, v0.7.67)**: SDK callers configure run-scoped `modelTiers` and `workflow.maxConcurrency`, while workflow authors express semantic `fast` / `balanced` / `deep` intent. Terminal workflow events expose resolved tier/source/fallback/usage/duration facts, and each durable `run.json` contains an `efficiencyReport` with token coverage, role/tier starts, packet-read topology, review waves, and quality-gate outcomes. See the [routing and telemetry contract](
|
|
861
|
+
**Cost-Disciplined Workflow SDK (FEATURE_259, v0.7.67)**: SDK callers configure run-scoped `modelTiers` and `workflow.maxConcurrency`, while workflow authors express semantic `fast` / `balanced` / `deep` intent. Terminal workflow events expose resolved tier/source/fallback/usage/duration facts, and each durable `run.json` contains an `efficiencyReport` with token coverage, role/tier starts, packet-read topology, review waves, and quality-gate outcomes. See the [routing and telemetry contract](public_docs/sdk/embedder-guide.md#20-cost-disciplined-workflow-routing-and-telemetry-feature_259-v0767).
|
|
840
862
|
|
|
841
|
-
**Paged Session Listing (FEATURE_261, v0.7.67)**: both `/session` `listSessions()` and `runtime.sessions.list()` accept an exact `surface` filter and opaque continuation `cursor`; each returned summary carries the cursor for the next page. Filtering happens before the page limit, so a host does not need to over-fetch mixed surfaces. See the [pagination recipes](
|
|
863
|
+
**Paged Session Listing (FEATURE_261, v0.7.67)**: both `/session` `listSessions()` and `runtime.sessions.list()` accept an exact `surface` filter and opaque continuation `cursor`; each returned summary carries the cursor for the next page. Filtering happens before the page limit, so a host does not need to over-fetch mixed surfaces. See the [pagination recipes](public_docs/sdk/embedder-guide.md#19-session-surface-filtering-and-cursor-pagination-feature_261-v0767).
|
|
842
864
|
|
|
843
|
-
**Experimental Memory Agent SDK (FEATURE_260
|
|
865
|
+
**Experimental Memory Agent SDK (FEATURE_260 + FEATURE_292)**: `/experimental-memory` exposes the source-compatible `MemoryAgent`/`MemorySession` lifecycle plus the additive `MemoryManagementAgent` facade when `createMemoryAgent()` receives a `MemoryManagementController`. That facade provides governed `list()`, `remember()`, and `forget()` through the same plane used by the conversation-first product surface. Passive recall is zero-wait; `query()` is read-only and deliberate; recalled content stays low-authority, and safety/scope gates remain deterministic. See the [direct session and boundary guide](public_docs/sdk/embedder-guide.md#21-experimental-governed-memory--experimental-memory-feature_260--feature_275--feature_292-v0768v0785).
|
|
844
866
|
|
|
845
|
-
**Bidirectional A2A 1.0 (FEATURE_267, v0.7.69)**: `/a2a` discovers allowed Agent Cards and installs a JSON-RPC/SSE executor through the existing F258 plane. Configured outbound Agents are also registered automatically as `external:<name>` in embedded CLI and user-daemon Runtimes, so the main Agent can orchestrate them without host code. One `a2a.json` may hold many outbound registrations and at most one inbound server, which publishes either the Runtime default or one validated `~/.kodax/agents/*.md` Agent behind an authenticated Runtime facade. The built-in listener is loopback-only and will not return a port blocked by Fetch-compatible clients; public deployment uses `handle()` behind host-owned TLS and authorization. A2A 0.3, gRPC, HTTP+JSON, push notifications, and automatic public exposure are not advertised. See the [client/server recipes and security boundaries](
|
|
867
|
+
**Bidirectional A2A 1.0 (FEATURE_267, v0.7.69)**: `/a2a` discovers allowed Agent Cards and installs a JSON-RPC/SSE executor through the existing F258 plane. Configured outbound Agents are also registered automatically as `external:<name>` in embedded CLI and user-daemon Runtimes, so the main Agent can orchestrate them without host code. One `a2a.json` may hold many outbound registrations and at most one inbound server, which publishes either the Runtime default or one validated `~/.kodax/agents/*.md` Agent behind an authenticated Runtime facade. The built-in listener is loopback-only and will not return a port blocked by Fetch-compatible clients; public deployment uses `handle()` behind host-owned TLS and authorization. A2A 0.3, gRPC, HTTP+JSON, push notifications, and automatic public exposure are not advertised. See the [client/server recipes and security boundaries](public_docs/sdk/embedder-guide.md#22-bidirectional-a2a-10--a2a-feature_267-v0769).
|
|
846
868
|
|
|
847
869
|
**A2A interoperability and authentication hardening** keeps a discovered
|
|
848
870
|
interface on the trusted Agent Card origin and sends credentials only when one
|
|
@@ -1077,9 +1099,9 @@ All 13 SDK entries (root + 12 subpaths) share internal code via ESM chunk splitt
|
|
|
1077
1099
|
For the complete host-facing contract — including embedded/Worker/daemon ownership,
|
|
1078
1100
|
external-agent registration and task control, session cursor pagination, workflow
|
|
1079
1101
|
model-tier routing, and efficiency telemetry — see the
|
|
1080
|
-
[SDK Embedder Integration Guide](
|
|
1102
|
+
[SDK Embedder Integration Guide](public_docs/sdk/embedder-guide.md).
|
|
1081
1103
|
|
|
1082
|
-
> **ESM-only.** The SDK is published as ES Modules. In a CommonJS context (Electron main process, legacy Webpack CJS bundles, `require()`-based code) you must use `await import(...)` instead of `require()`. See [
|
|
1104
|
+
> **ESM-only.** The SDK is published as ES Modules. In a CommonJS context (Electron main process, legacy Webpack CJS bundles, `require()`-based code) you must use `await import(...)` instead of `require()`. See [public_docs/sdk/embedder-guide.md §5](public_docs/sdk/embedder-guide.md#5-consuming-from-a-commonjs-context-electron-main-cjs-bundles) for the canonical recipe + the technical reason most subpaths cannot ship a dual ESM/CJS build.
|
|
1083
1105
|
|
|
1084
1106
|
For CLI users, provider defaults live in `~/.kodax/config.json`. For library users, API keys are still read from environment variables; if you need custom base URLs or provider aliases, use `registerCustomProviders()` as shown above.
|
|
1085
1107
|
|
|
@@ -1424,7 +1446,7 @@ import { createKodaXA2AServer } from '@kodax-ai/kodax/a2a'; // A2A 1.0 clie
|
|
|
1424
1446
|
import { createMemoryAgent } from '@kodax-ai/kodax/experimental-memory'; // opt-in experimental memory SDK
|
|
1425
1447
|
```
|
|
1426
1448
|
|
|
1427
|
-
> The SDK is **ESM-only**. CommonJS consumers (Electron main / Webpack CJS / `require()` callers) must use `await import('@kodax-ai/kodax/...')` — see [
|
|
1449
|
+
> The SDK is **ESM-only**. CommonJS consumers (Electron main / Webpack CJS / `require()` callers) must use `await import('@kodax-ai/kodax/...')` — see [public_docs/sdk/embedder-guide.md §5](public_docs/sdk/embedder-guide.md#5-consuming-from-a-commonjs-context-electron-main-cjs-bundles).
|
|
1428
1450
|
|
|
1429
1451
|
### `@kodax-ai/kodax/llm` — LLM Abstraction
|
|
1430
1452
|
|
|
@@ -1575,7 +1597,7 @@ await runInkInteractiveMode({ provider: 'zhipu-coding', effort: 'auto' });
|
|
|
1575
1597
|
| Coding tasks | `@kodax-ai/kodax/coding` | Complete coding agent + tools |
|
|
1576
1598
|
| Terminal app | `@kodax-ai/kodax/repl` | Full interactive experience |
|
|
1577
1599
|
| Runtime host / daemon client | `@kodax-ai/kodax/runtime` | Sessions, runs, events, permissions, catalog, MCP, artifacts, diagnostics |
|
|
1578
|
-
| Experimental governed memory | `@kodax-ai/kodax/experimental-memory` |
|
|
1600
|
+
| Experimental governed memory | `@kodax-ai/kodax/experimental-memory` | Governed `MemoryAgent` list/remember/forget and scoped `MemorySession` recall/outcome contracts |
|
|
1579
1601
|
|
|
1580
1602
|
---
|
|
1581
1603
|
|
|
@@ -1859,7 +1881,7 @@ KodaX uses an **English-first** comment style with selective Chinese brief notes
|
|
|
1859
1881
|
## Documentation
|
|
1860
1882
|
|
|
1861
1883
|
- [README_CN.md](README_CN.md) - Chinese Documentation
|
|
1862
|
-
- [
|
|
1884
|
+
- [public_docs/sdk/embedder-guide.md](public_docs/sdk/embedder-guide.md) - SDK hosting, shared Runtime daemon, Auto Mode, v0.7.74 compaction/history recovery, Agent telemetry, and active-run input contracts
|
|
1863
1885
|
- [docs/release.md](docs/release.md) - Standalone binary build & release pipeline
|
|
1864
1886
|
- [docs/PRD.md](docs/PRD.md) - Product Requirements
|
|
1865
1887
|
- [docs/ADR.md](docs/ADR.md) - Architecture Decisions
|