kimi-code/packages/node-sdk/test
STAR-QUAKE f0896a53b0
Some checks are pending
CI / build (push) Waiting to run
CI / test (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-windows (push) Waiting to run
CI / lint (push) Waiting to run
CI / typecheck (push) Waiting to run
Nix Build / Check flake.nix workspace sync (push) Waiting to run
Nix Build / nix build .#kimi-code (push) Blocked by required conditions
Release / Release (push) Waiting to run
Release / Deploy docs (push) Blocked by required conditions
Release / Native release artifact (push) Blocked by required conditions
Release / Desktop release artifact (push) Blocked by required conditions
Release / Publish native release assets (push) Blocked by required conditions
feat(agent-core): progressive tool disclosure via select_tools (#1369)
* feat(agent-core): progressive tool disclosure via select_tools

Keep MCP tool schemas out of the immutable top-level tools[] and let the
model load them on demand, preserving the provider prompt cache:

- kosong: Message.tools (append-only load primitive, serialized as Kimi
  messages[].tools with type:function wrapping and no content),
  Tool.deferred (stripped once in generate() so loaded tools stay
  executable without re-entering the top level), select_tools capability
  bit (UNKNOWN/catalog default false).
- select_tools builtin: load-by-exact-name, three-branch semantics
  settled per name (Loaded / Already available / Unknown), schemas read
  from the live registry, injection-origin schema messages survive undo.
- ToolsDiffInjector: <tools_added>/<tools_removed> announcements at turn
  boundaries and post-compaction, folded from history (undo/compaction/
  resume self-heal), appended only when the loadable set changes.
- Loaded-tools ledger = history scan + defer-window pending set (cleared
  on /clear); loop re-reads the executable table per step so a selected
  tool dispatches on the next step of the same turn; preflight
  distinguishes not-loaded from loaded-but-disconnected.
- Cross-cuts: projection strips protocol context for non-select_tools
  models (lossless mid-session model switch both ways), compaction
  filters it from the summarizer input and rebuilds loaded schemas
  keep-all after folding, token estimation counts message.tools, request
  logging reflects the post-strip wire tools.
- Three-condition gate: capability.select_tools x capability.tool_use x
  tool-select experimental flag (KIMI_CODE_EXPERIMENTAL_TOOL_SELECT).
  Any gate closed reproduces the inline request byte-for-byte; all
  current models keep the capability off, so behavior is unchanged
  until a supporting model is catalogued. The SDK catalog-to-alias
  mapping forwards the capability so catalog-driven setups can enable it.

* feat(kosong): skip tool-declaration-only messages in non-Kimi providers

Message-level tool declarations (messages[].tools) are a Kimi wire
feature. The other providers' explicit field construction already keeps
the tools field off the wire, but the content-free leftover message
would be rejected (OpenAI: system message without content) or serialize
as a garbage <system></system> turn (Anthropic/Google system-to-user
wrapping). Skip such messages entirely via a shared predicate; a message
that also carries content only loses the tools field, as before.

Unreachable in kimi-code (the projection gate strips dynamic-tool
context for models without the select_tools capability before any
provider sees it) — defense-in-depth for direct kosong consumers.

* fix(agent-core): survive runtime flag flips and align tool table with post-compaction state

Two fixes from PR review:

- Register select_tools unconditionally and gate only its exposure in
  loopTools. The tool-select flag can flip at runtime (config reload
  calls setConfigOverrides on the live resolver) without
  initializeBuiltinTools re-running; previously the disclosure shape
  activated while the tool itself was unregistered, cutting the session
  off from MCP entirely until a model/cwd change rebuilt the builtins.
  A profile listing the name explicitly still never surfaces it in
  inline mode, and execution guards the flip race defensively.

- Resolve the per-step tool table AFTER beforeStep, next to
  buildMessages. beforeStep can run full compaction, which trims loaded
  schemas and rewrites the ledger; a table captured before it could
  still dispatch a tool whose schema the model no longer has. The
  executable table and the request messages now always reflect the same
  state, so a trimmed tool is rejected with select guidance instead of
  executed.

* fix(agent-core): drop unused Tool import in dynamic-tools

* fix(agent-core): baseline compaction guard after post-compaction reinjection

The reinjected reminders (loadable-tools manifest, goal) are re-appended
after every compaction, but the nothing-new-since-compaction baseline was
captured before injectAfterCompaction. With a large manifest the guard
could re-trigger auto-compaction against a floor that cannot shrink.
Raise the baseline to the true post-compaction floor once reinjection
completes; the earlier capture stays as a fallback when reinjection
throws.

---------

Co-authored-by: fengchenchen <fengchenchen@moonshot.ai>
2026-07-06 15:51:08 +08:00
..
auth-facade.test.ts feat(feedback): support attaching logs and codebase (#1120) 2026-06-26 16:15:08 +08:00
catalog.test.ts refactor!: overhaul thinking config and effort resolution (#1132) 2026-06-30 22:34:13 +08:00
config.test.ts feat(agent-core): progressive tool disclosure via select_tools (#1369) 2026-07-06 15:51:08 +08:00
create-session-transport.test.ts refactor!: overhaul thinking config and effort resolution (#1132) 2026-06-30 22:34:13 +08:00
export-session.test.ts ci: run unit tests on windows (#1037) 2026-06-26 11:56:41 +08:00
kimi-code-model-provider.test.ts fix: classify OAuth token refresh errors by cause (#838) 2026-06-17 18:34:42 +08:00
list-sessions.test.ts ci: run unit tests on windows (#1037) 2026-06-26 11:56:41 +08:00
local-logging.test.ts refactor: split SDK RPC client (#339) 2026-06-03 15:30:38 +08:00
rename-session.test.ts refactor: split SDK RPC client (#339) 2026-06-03 15:30:38 +08:00
runtime-provider-identity.test.ts feat(managed-kimi-code): route anthropic protocol via beta api (#1186) 2026-06-29 14:24:01 +08:00
runtime-provider-oauth.test.ts refactor(agent-core): make Agent constructable and consolidate provider-manager (#161) 2026-05-28 20:33:10 +08:00
session-approval-handler.test.ts refactor: split SDK RPC client (#339) 2026-06-03 15:30:38 +08:00
session-background-tasks.test.ts refactor: split SDK RPC client (#339) 2026-06-03 15:30:38 +08:00
session-cancel.test.ts feat(protocol): extract shared protocol package from agent-core (#612) 2026-06-10 14:03:38 +08:00
session-event-types.test.ts feat: support plugin slash commands (#1204) 2026-06-30 19:38:01 +08:00
session-goal.test.ts fix: restore goal resume state from agent records (#552) 2026-06-09 10:02:19 +08:00
session-plan-compact-usage-resume.test.ts ci: run unit tests on windows (#1037) 2026-06-26 11:56:41 +08:00
session-prompt-events.test.ts fix: scope interactive agent requests (#648) 2026-06-11 15:37:09 +08:00
session-prompt-input.test.ts fix: scope interactive agent requests (#648) 2026-06-11 15:37:09 +08:00
session-question-handler.test.ts refactor: split SDK RPC client (#339) 2026-06-03 15:30:38 +08:00
session-runtime-helpers.ts Kimi For Coding 2026-05-22 15:54:50 +08:00
session-set-model.test.ts refactor: split SDK RPC client (#339) 2026-06-03 15:30:38 +08:00
session-set-permission.test.ts refactor: split SDK RPC client (#339) 2026-06-03 15:30:38 +08:00
session-set-thinking.test.ts refactor!: overhaul thinking config and effort resolution (#1132) 2026-06-30 22:34:13 +08:00
session-skills.test.ts ci: run unit tests on windows (#1037) 2026-06-26 11:56:41 +08:00
session-steer.test.ts refactor: split SDK RPC client (#339) 2026-06-03 15:30:38 +08:00
telemetry.ts Kimi For Coding 2026-05-22 15:54:50 +08:00
test-identity.ts Kimi For Coding 2026-05-22 15:54:50 +08:00