Commit graph

1587 commits

Author SHA1 Message Date
github-actions[bot]
9d07f634be
ci: release packages (#3913)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-19 20:06:44 +08:00
liruifengv
2e605b10be
chore: sync web dist from code-app (#3934)
* chore: sync web dist from code-app

code-app: 44d7281c7a63ee3c7a907f9406e490efdbec7411

* chore: collapse web dist sync changesets into one summary entry
2026-09-19 20:03:44 +08:00
liruifengv
97212596f7
fix(agent-core-v2): don't record turn.steer when an unconsumed steer seeds the next turn (#3933) 2026-09-19 19:21:03 +08:00
Haozhe
7568f3118c
chore: remove the tdd skill (#3932) 2026-09-19 19:03:48 +08:00
7Hanrui
6ffdf0d579
fix(agent-core-v2): remove the project-root assertion for cwd from the system prompt (#3929)
Co-authored-by: 7Sageer <7sageer@djwcb.cn>
2026-09-19 18:27:53 +08:00
Haozhe
9df7a9ccfb
fix: keep turn ids above the wire-wide max and fold cold transcripts over the active branch (#3922)
* fix(agent-core-v2): floor the human turn clock at the wire-wide max on engine journal reset

* fix(kap-server): fold the cold transcript snapshot over the restorable branch chain

* fix(agent-core-v2): advance the human turn clock when a turn starts

* fix(kap-server): split reused wire turn ids in the live transcript projector

* fix(kap-server): adopt the completed cold tip for mid-turn attach events

Continuation deltas after a lazy transcript attach belong on the last
cold turn, not a newly split export id.
2026-09-19 17:47:22 +08:00
liruifengv
7d3f88faa4
feat(oauth): parse goods_version from the managed /me profile payload (#3921)
Some checks are pending
CI / test-windows (push) Waiting to run
CI / lint (push) Waiting to run
CI / typecheck (push) Waiting to run
CI / test (3) (push) Waiting to run
CI / test (4) (push) Waiting to run
CI / test (5) (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-vscode-legacy (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 / Native release artifact (push) Blocked by required conditions
Release / Deploy docs (push) Blocked by required conditions
Release / Publish native release assets (push) Blocked by required conditions
Publish VS Code extension / Publish VSIX to marketplaces (push) Waiting to run
CI / build (push) Waiting to run
CI / test (1) (push) Waiting to run
CI / test (2) (push) Waiting to run
Release / Release (push) Waiting to run
2026-09-19 13:18:31 +08:00
Haozhe
2502d2157f
revert(kap-server): drop the flat entity message protocol (v3 WS + history API) (#3532) (#3920)
This reverts 64505e36e3.

The v1 WS + legacy REST + transcript surfaces are alive on main and remain
the single protocol surface; kimi-inspect returns to the transcript-based
data model (keeping #3747's removal of the prompt input, which adapted to
the agent-core-v2 prompt-queue fold).
2026-09-19 12:40:31 +08:00
liruifengv
2cedfaf125
fix(kap-server): deliver session-level interaction events past agent filters (#3901) 2026-09-19 12:05:34 +08:00
Grapedge
02d829e131
fix(vscode): ignore Enter during IME composition in question dialog (#3915)
Some checks are pending
CI / test-windows (push) Waiting to run
CI / lint (push) Waiting to run
CI / build (push) Waiting to run
CI / test (1) (push) Waiting to run
CI / test (2) (push) Waiting to run
CI / test (3) (push) Waiting to run
CI / test (4) (push) Waiting to run
CI / test (5) (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-vscode-legacy (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 / Native release artifact (push) Blocked by required conditions
Release / Deploy docs (push) Blocked by required conditions
Release / Publish native release assets (push) Blocked by required conditions
Publish VS Code extension / Publish VSIX to marketplaces (push) Waiting to run
2026-09-19 02:51:24 +08:00
Grapedge
88a7d932f1
fix(agent-core-v2): pre-shrink compaction history to the effective model window (#3911) 2026-09-18 21:45:56 +08:00
liruifengv
1815096590
docs(changelog): sync 2.0.1 from apps/kimi-code/CHANGELOG.md (#3912) 2026-09-18 21:41:35 +08:00
github-actions[bot]
caf7d4e2fe
ci: release packages (#3862)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-18 21:10:03 +08:00
Haozhe
7dc253c5ce
fix(agent-core-v2): restore thinking for the openrouter reasoning dialect (#3910)
Keep string reasoning fields when a reasoning_details array is present, stamp each think part by source, and replay those fields on the next request.
2026-09-18 21:06:08 +08:00
liruifengv
92c3c59b22
feat: expose resolved base_url on models.dev catalog provider items (#3909)
Some checks are pending
CI / build (push) Waiting to run
CI / test (1) (push) Waiting to run
CI / test (2) (push) Waiting to run
CI / test (3) (push) Waiting to run
CI / test (4) (push) Waiting to run
CI / test (5) (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-vscode-legacy (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 / Publish native release assets (push) Blocked by required conditions
Publish VS Code extension / Publish VSIX to marketplaces (push) Waiting to run
Release / Deploy docs (push) Blocked by required conditions
Release / Native release artifact (push) Blocked by required conditions
2026-09-18 20:43:06 +08:00
Grapedge
3cc6b2a330
feat(kimi-code): carry turn trace id and copilot stats in rating surveys (#3907) 2026-09-18 19:49:19 +08:00
Haozhe
60f2a63278
fix(agent-core-v2): reuse the queued prompt id for a single steer (#3906)
* fix(agent-core-v2): reuse the queued prompt id for a single steer

A follow-up sent during a turn minted a second context id, so cancel
while the model was still requesting could show the same text twice
and make the host prompt un-undoable. Reuse the queued prompt id when
one prompt is steered, mark that user as in-turn so undo targets the
host turn, and project it as a non-anchor origin for the client.

* fix(agent-core-v2): type in-turn steer origin on the human prompt

The human PromptOrigin type rejected the inTurn field, which failed
typecheck/build and left the generated state manifest stale.
2026-09-18 18:56:08 +08:00
7Sageer
b0d0a80c32
feat: add usage telemetry for swarm, tower, external hooks, and remote control (#3897)
* feat(agent-core-v2): add tower_mode_enter telemetry for tower mode entry

* feat(agent-core-v2): add swarm_mode_entered/exited telemetry

* feat(agent-core-v2): add external_hook_resolved telemetry

* feat(agent-core-v2): add tower_mode_exit telemetry

* feat(kap-server): add remote_control_toggle telemetry

* fix(agent-core-v2): exclude aborted hooks from failure count and track tower entry errors

* fix(agent-core-v2): keep decorated params contiguous in ExternalHooksRunnerService

* fix(kap-server): classify failed remote control disables in telemetry

* fix(kap-server): ignore stale tunnel errors when disabling an already-off remote control

* fix(kap-server): distinguish a failed concurrent startup from a disable failure

* refactor: slim telemetry event payloads and outcome branches

* refactor: inline remote-control tracking and drop redundant event properties

* refactor: tighten hook failure filter and remote-control test fake

* fix(agent-core-v2): count hook spawn and wait failures in failed_count
2026-09-18 18:36:02 +08:00
Haozhe
73ebe9ab2f
fix(transcript): attach promptIds to cold-folded steer frames (#3896)
* fix(transcript): attach promptIds to cold-folded steer frames

* chore(changeset): note cold-folded steer frames after reload
2026-09-18 16:37:33 +08:00
STAR-QUAKE
5acc863ae6
feat(agent-core-v2): make select_tools failures actionable (#3885)
Co-authored-by: starquakee <starquakee@users.noreply.github.com>
2026-09-18 16:27:23 +08:00
7Sageer
910aba273e
fix(agent-core-v2): drop literal decision clauses from system prompt and auto reminder (#3894) 2026-09-18 16:21:11 +08:00
Haozhe
53e5e3fca6
fix(agent-core-v2): pair steered follow-ups by reserved message id (#3891)
Reserve the context message id when a prompt is steered, emit turn.steer only after that message is appended, and join live/cold transcript plus fork by the id instead of content.
2026-09-18 16:05:27 +08:00
Haozhe
a80fe31cff
fix(agent-core-v2): stop workspace watchers from listing a flooded project root (#3892)
* fix(agent-core-v2): avoid root watch inventory and add a kill switch

Watch concrete candidate paths so a flooded project root cannot fill the V8 heap. Allow disabling every watcher with [watch] enabled or KIMI_CODE_WATCH.

* fix(agent-core-v2): stop watching the whole .kimi-code directory

Watch missing config files on the file path itself so session writes do not reload.
2026-09-18 15:24:05 +08:00
HydrogenE7
5108cad9b6
perf: speed up session resume and session index on large workspaces (#3889)
- engine: single-pass wire restore, deferred immer freeze during replay,
  concurrent task-file reads, O(1) token-counting/file-history folds
- sdk: windowed tail-read replay fold overlapped with engine restore
- kap-server: incremental wire cache for transcript reads, bounded-concurrent
  user-messages fan-out, search sync fingerprints and capped passes
- session index: O(1) by-id lookup, dir-mtime freshness signals,
  incremental cold prepare, session_index.jsonl compaction
- cli: deduplicate the user skills watcher
2026-09-18 15:05:23 +08:00
Kai
e3f48a225b
fix(agent-core-v2): keep session deletion from hanging (#3887)
* fix(agent-core-v2): keep session deletion from hanging

Deleting a live session closes it first, and three waits on that path
had no upper bound:

- AgentLifecycleService.remove() checked its 3s quiesce deadline only
  after awaiting loop.settled() and the compaction promise, so a loop
  that never settled after cancel() blocked agent removal, session
  close and delete forever. The settle wait now races the deadline and
  falls through to the existing forced-teardown path when it expires.
- HostProcess.kill() on Windows waited for taskkill to exit with no
  bound. It now stops waiting after 5s.
- setSessionArchived() awaited a pending resume inside its lifecycle
  critical section. A resume queued behind the archive then waited for
  the archive while the archive waited for it, wedging the session's
  lifecycle chain so that every later operation on the session,
  delete included, never started. The resume is now settled before
  the critical section is entered.

* fix(agent-core-v2): terminate a taskkill that outlives its timeout

When the 5s wait on taskkill timed out, kill() returned but the spawned
taskkill child stayed alive and referenced, so every hang leaked a
taskkill.exe process and its handle could keep the CLI or server
process from exiting. Keep the handle and, when the timeout wins, unref
it and terminate it.

* fix(agent-core-v2): never apply a compaction summary that arrives after abort

Cancelling a full compaction, or removing its agent, aborts the
compaction's signal, and the abort listener records the cancellation
and detaches the compaction right away. compactionRound() never checked
the signal again after the summary request returned, so a provider
request that finished despite the abort still went on to
applyCompaction(). That rewrote the context of a cancelled compaction,
and since agent removal now stops waiting for the compaction at its
quiesce deadline, it could also write records after the agent was torn
down and recreate files under a deleted session directory. Check the
signal after the last await and before applying the summary.
2026-09-18 14:44:38 +08:00
7Sageer
f233f9de04
fix(agent-core-v2): stop advertising unregistered tools and clarify Read media errors (#3878) 2026-09-18 13:30:07 +08:00
7Sageer
1fddc16e3e
fix(agent-core-v2): drop the outside-working-directory access ban from the system prompt (#3879)
Some checks are pending
CI / build (push) Waiting to run
CI / test (1) (push) Waiting to run
CI / test (2) (push) Waiting to run
CI / test (3) (push) Waiting to run
CI / test (4) (push) Waiting to run
CI / test (5) (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-vscode-legacy (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 / Publish native release assets (push) Blocked by required conditions
Release / Native release artifact (push) Blocked by required conditions
Release / Release (push) Waiting to run
Release / Deploy docs (push) Blocked by required conditions
Publish VS Code extension / Publish VSIX to marketplaces (push) Waiting to run
2026-09-18 00:55:12 +08:00
7Sageer
c1047a6bbe
fix(cli): keep print mode alive while a cron-steered turn is in flight (#3875)
The print background policy only watched goals, future cron fires, and
background tasks, so a turn steered by a cron fire was invisible to it:

- a fired one-shot task is deleted from the schedule at once, so the
  policy saw an empty schedule and returned; teardown then cancelled the
  steered turn mid-flight
- a recurring task whose fire comes due during a long turn keeps
  reporting the same past fire time (the tick waits for the loop to go
  idle), so the anti-spin guard misread a held fire as a wedged tick and
  gave up on cron

The policy now checks turnActive (the same loop-state predicate the cron
tick uses) at the top of every round and waits the in-flight turn out
before drawing any quiescence or wedge conclusion.
2026-09-17 23:52:20 +08:00
7Sageer
c5ad17f06a
feat(agent-core-v2): support api_key_env for provider credentials (#3762)
* feat(agent-core-v2): support api_key_env for provider credentials

Providers can declare api_key_env = "VAR" in config.toml to read their
Bearer token from an environment variable instead of storing it inline.
The value is resolved per request (rotation-friendly); an unset or empty
variable fails with config.invalid naming the provider and variable.
apiKey+apiKeyEnv and apiKeyEnv+oauth are rejected as conflicts.

The /models refresh path resolves the same chain (inline apiKey ->
apiKeyEnv -> env sub-table); a provider whose variable is unset lands in
failed[] without affecting others, and open-platform providers keep the
env declaration instead of persisting the resolved secret.

Custom registries: applyCustomRegistryProvider consumes the api.json env
field — imported providers get apiKeyEnv, the legacy inline apiKey is
dropped, and a hand-edited apiKeyEnv survives refreshes (tracked via
source.envKey). kimi provider add --api-key and the TUI registry token
field are now optional so public registries import without a key.

* docs: document api_key_env provider credentials

* fix(oauth): preserve hand-edited apiKeyEnv on registry refresh and address review nits

* fix(oauth): validate apiKeyEnv conflicts during refresh and address review nits

* fix(oauth): mirror apiKeyEnv in the klient provider contract and harden refresh validation

* fix(oauth): stop auto-binding registry env names to provider credentials

* fix(oauth): preserve hand-edited apiKeyEnv across registry re-imports

* fix(oauth): scope apiKeyEnv preservation to the owning registry

* fix(agent-core-v2): preserve apiKeyEnv across models.dev catalog re-imports

* fix(kap-server): drop apiKeyEnv when the provider update route receives a replacement key

* fix(agent-core-v2): replace provider credential fields on TOML writeback

* fix(kap-server): normalize whitespace-only api_key in the provider update route

* refactor(oauth): unify provider credential rules into shared primitives

A new provider-credential module in the oauth package owns the credential
precedence chain, the mutual-exclusion conflicts, the user-facing messages,
and the write-side tri-state reconciliation; the refresh orchestrator,
agent-core-v2 (model-auth, catalog, auth readiness), and the kap-server
provider routes compose it instead of re-deriving the rules per layer.

applyOpenPlatformConfig now takes credential: {apiKey}|{apiKeyEnv} and
merges onto the existing record, so open-platform refreshes no longer drop
hand-written fields (customHeaders, the env sub-table) on the inline-key
path either, and the refresh's write-then-undo block is gone.

Registry imports converge on removeCustomRegistryEntries +
applyCustomRegistryEntries (prior-snapshot provenance): the exported
capture/restore helpers are gone, the CLI persists a re-import with a
single setConfig instead of per-id removeProvider RPCs, and
default_model/default_provider survive a re-import whenever they still
resolve. kap-server's importCustomRegistry keeps the purge-then-rewrite
two-phase replace the config service's raw-merging writeback requires.

kap-server create/replace routes accept api_key_env (tri-state, mutually
exclusive with api_key), and GET /config plus the provider catalog item
expose the binding. A declared-but-unset api_key_env now fails readiness
checks with config.invalid (was auth.token_missing), matching request-time
behavior. Registry 401/403 without a key prints an authentication hint.

* fix(cli): persist registry re-import removals on both harness generations

The v2 harness's setConfig deep-merges per domain (retaining omitted keys
and skipping undefined defaults), so a shrunk re-import left removed
providers and aliases in config.toml and kept a cleared default dangling.
The CLI and TUI registry flows now share persistRegistryImport: on v2 the
removal phase and the rebuilt records go out as two atomic
replaceConfigSections writes (the writeback merges alias fields from raw
TOML, so the purge must be persisted first); on v1 the removeProvider RPC
cascades the removals before one merge write. defaultModel/defaultProvider
snapshots are captured before any removal so the restore works on both
paths.

* fix(oauth): reject oauth before the legacy env fallback and persist cleared thinking on re-import

refreshProviderModels' env sub-table fallback now throws the same
apiKey+oauth conflict the chat path rejects, instead of authenticating
with the fallback key and rewriting the provider to drop oauth.

persistRegistryImport writes the cleared thinking section through the
replacement payload, and drops the v1 fallback branch — registry imports
always persist through replaceConfigSections, so the removal phase no
longer needs per-id removeProvider RPCs.

* chore: consolidate provider credential changesets into one entry

* chore: trim changeset to the api_key_env entry

* fix: harden provider credential status and registry imports

* fix(oauth): expose browser-safe provider credential rules

* fix(node-sdk): replace serialized provider credentials

* fix(oauth): reject credential conflicts during refresh

* fix: harden custom registry re-imports

Reject reserved provider collisions and credential endpoint drift before mutation. Replace registry-owned sections atomically with compare-and-set guards, and carry the replacement contract through klient and node-sdk.

* refactor(registry): centralize custom registry import ownership

Route CLI and TUI imports through the engine via the typed SDK and Klient operation. Keep registry replacement policy inside the engine and preserve credential edits made while fetching the registry.

Cover the shared entry point with real configuration storage and memory/IPC transport tests.

* test: trim redundant api_key_env and registry-import coverage

* fix(cli): reuse the stored registry key on keyless re-import

Both first-party clients encoded "no key given" as an empty string, but
the engine's fallback chain (options.apiKey ?? registryKeyFromExisting)
only reuses the key parked in the provider's source blob when the option
is undefined. A keyless re-import of a private registry therefore went
out without an Authorization header and failed with 401 from the CLI
and the TUI dialog, while the kap-server REST route (which passes
undefined) reused the stored key fine.

Pass undefined from the CLI handler and the TUI import dialog instead
of normalizing to ''. The dialog's result type now marks apiKey
optional, matching the engine contract.

* test: pin CAS rejection and credential-conflict behavior

The coverage trim went past redundancy in three places, leaving the
PR's headline guards untested. Restore the compare-and-set rejection
path (guarded value changed on disk -> retry error, no write) and the
absent-section guard normalization in config.test.ts, the
apiKey+apiKeyEnv / apiKeyEnv+oauth conflict rejections at runtime
resolution (modelAuth) and at the refresh orchestrator (discovery,
with per-provider failure isolation), and the open-platform refresh
through api_key_env proving the resolved secret never lands in the
provider record. Also add the first direct unit tests for the shared
declaredProviderCredential / reconcileProviderCredentialUpdate
primitives.

* refactor(oauth): share reserved provider id rules between import and refresh

* Delete .changeset/registry-import-concurrent-credentials.md

Signed-off-by: 7Sageer <sag77r@hotmail.com>

* test: trim cross-layer duplicate registry and credential coverage

---------

Signed-off-by: 7Sageer <sag77r@hotmail.com>
2026-09-17 22:02:53 +08:00
Haozhe
86e08208e3
feat(agent-core-v2): approve unanalyzable bash commands in yolo permission mode (#3869)
Some checks are pending
CI / build (push) Waiting to run
CI / test (1) (push) Waiting to run
CI / test (2) (push) Waiting to run
CI / test (3) (push) Waiting to run
CI / test (4) (push) Waiting to run
CI / test (5) (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-vscode-legacy (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 / Publish native release assets (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
Publish VS Code extension / Publish VSIX to marketplaces (push) Waiting to run
2026-09-17 17:44:27 +08:00
qer
25dd4ce973
feat(cli): rename the install-app subcommand to install-desktop (#3864)
install-app stays registered as a hidden alias so existing usage keeps working.
2026-09-17 14:42:11 +08:00
liruifengv
00bd3c2268
docs(changelog): sync 2.0.0 from apps/kimi-code/CHANGELOG.md (#3861)
* docs(changelog): sync 2.0.0 from apps/kimi-code/CHANGELOG.md

* docs(changelog): trim /desktop entry in English page
2026-09-17 14:08:43 +08:00
Grapedge
bbcdde0b13
feat(vscode): wire the extension into the shared telemetry pipeline (#3852) 2026-09-17 13:45:59 +08:00
github-actions[bot]
1b89e4b039
ci: release packages (#3797)
* ci: release packages

* chore: bump kimi-code release version to 2.0.0

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: liruifengv <liruifeng1024@gmail.com>
2026-09-17 13:20:26 +08:00
Grapedge
faec32c7e7
feat(tui): render mermaid code blocks as diagrams in the terminal (#3851) 2026-09-17 12:56:40 +08:00
liruifengv
95d4a9d041
ci: sign Windows CLI binaries with Azure Artifact Signing (#3858)
* ci: sign Windows CLI binaries with Azure Artifact Signing

* fix: resolve signtool from Windows SDK when removing SEA binary signature
2026-09-17 12:42:59 +08:00
liruifengv
4e813cf71e
chore: sync web dist from code-app (#3859)
Some checks are pending
CI / build (push) Waiting to run
CI / test (1) (push) Waiting to run
CI / test (2) (push) Waiting to run
CI / test (3) (push) Waiting to run
CI / test (4) (push) Waiting to run
CI / test (5) (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-vscode-legacy (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 / Publish native release assets (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
Publish VS Code extension / Publish VSIX to marketplaces (push) Waiting to run
code-app: 3f3f3b2e52115eb0b79bc04ed4fcc2d45b30fe5d
2026-09-17 12:15:56 +08:00
7Sageer
31f1b6824d
fix(agent-core-v2): mark MCP servers needs-auth when a tool call returns 401 (#3846)
* fix(agent-core-v2): mark MCP servers needs-auth when a tool call returns 401

* fix(agent-core-v2): cover retried MCP calls with unauthorized handling and recheck entry after close

* fix(agent-core-v2): bind MCP unauthorized reports to the originating client

* fix(agent-core-v2): invalidate rejected MCP OAuth tokens when entering needs-auth

* fix(agent-core-v2): preserve concurrent MCP OAuth grants and recheck entry after credential awaits

* fix(agent-core-v2): flip MCP servers to needs-auth before invalidating rejected tokens

* fix(agent-core-v2): compare-and-clear rejected MCP OAuth tokens and tolerate cleanup failures

* refactor(agent-core-v2): move rejected-grant handling into the MCP OAuth service

* fix(agent-core-v2): compare MCP OAuth grant age with the scheduler clock

* fix(agent-core-v2): reject future timestamps from the concurrent MCP grant window

* fix(agent-core-v2): distinguish concurrent MCP grants from freshly rejected ones

* fix(agent-core-v2): ignore application-level MCP errors in the unauthorized sniff

* test(agent-core-v2): trim MCP unauthorized tests to the core contract

* Delete .changeset/mcp-oauth-clear-if-current.md

Signed-off-by: 7Sageer <sag77r@hotmail.com>

---------

Signed-off-by: 7Sageer <sag77r@hotmail.com>
2026-09-17 11:12:20 +08:00
qer
bd06178913
fix(kap-server): avoid duplicating steered prompt content (#3853)
Some checks are pending
CI / build (push) Waiting to run
CI / test (1) (push) Waiting to run
CI / test (2) (push) Waiting to run
CI / test (3) (push) Waiting to run
CI / test (4) (push) Waiting to run
CI / test (5) (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-vscode-legacy (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 / Native release artifact (push) Blocked by required conditions
Release / Publish native release assets (push) Blocked by required conditions
Release / Release (push) Waiting to run
Release / Deploy docs (push) Blocked by required conditions
Publish VS Code extension / Publish VSIX to marketplaces (push) Waiting to run
* fix(kap-server): rebuild chat transcript after undo

* test(kap-server): provide undo registry in broadcaster fixtures

* fix(kap-server): preserve non-anchor steers through undo

* fix(kap-server): rebuild undo transcript after persistence completes

* test: complete restored notification origin fixture

* fix(kap-server): keep original prompt when steering

* chore: add changeset for steered prompt content fix

* fix(kap-server): keep restored prompt content after late projector attach

* fix(kap-server): prefer store prompt content after transcript backfill
2026-09-17 01:14:35 +08:00
liruifengv
d9d1f59804
chore: sync web dist from code-app (#3850)
code-app: 3d1122617a5f16d96f4eb8308e76271e21f82c92
2026-09-16 22:12:28 +08:00
Grapedge
b4d0b8a388
fix(tui): recut live @ mention token when accepting stale completion (#3848) 2026-09-16 21:30:09 +08:00
qer
34ec5d2a17
feat(cli): add /desktop slash command and kimi install-app subcommand (#3849)
* feat(cli): add /desktop slash command and kimi install-app subcommand

Both entry points print the Kimi Code desktop app page
(https://www.kimi.com/code) and open it in the default browser:
the kimi install-app subcommand from the shell, and /desktop
(alias /install-desktop) from the TUI.

* fix(cli): derive the desktop app page from the active region

Replace the hardcoded .com URL with the existing region-aware
kimiCodeOfficialInstallUrl() resolved at invocation time, so
global-region users land on the .ai site and region changes are
respected.

* docs(cli): describe the desktop app page URL as region-dependent
2026-09-16 20:53:35 +08:00
Grapedge
0cf413f775
fix(kap-server): open a new turn for abort-reissued steers in cold transcripts (#3844) 2026-09-16 19:34:02 +08:00
7Sageer
da31c472a2
feat(agent-core-v2): add skill scopes and mark custom-theme as tui-only (#3843)
Some checks are pending
CI / build (push) Waiting to run
CI / test (1) (push) Waiting to run
CI / test (2) (push) Waiting to run
CI / test (3) (push) Waiting to run
CI / test (4) (push) Waiting to run
CI / test (5) (push) Waiting to run
CI / test-pi-tui (push) Waiting to run
CI / test-vscode-legacy (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 / Publish native release assets (push) Blocked by required conditions
Publish VS Code extension / Publish VSIX to marketplaces (push) Waiting to run
* feat(agent-core-v2): add skill scopes and mark custom-theme as tui-only

Builtin skills can now declare a scopes whitelist (tui | web); skills
without scopes stay visible everywhere. The value is carried through
SkillSummary, the klient RPC contract, and the kap-server REST wire,
and the TUI slash commands filter by it. HTTP clients (code-app) drop
skills whose scopes exclude their own UI mode, so TUI-only skills like
/custom-theme no longer leak into app/web.

* fix: filter scoped skills from the acp and vscode palettes

ACP slash commands and the VS Code GetSlashCommands handler also
project SkillSummary lists; both now drop skills that carry a scopes
restriction so tui-scoped skills stay out of non-tui clients.
2026-09-16 19:14:22 +08:00
Luyu Cheng
9c5e9b4863
fix(agent-core-v2): watch Windows 8.3 short paths through their long form (#3840)
* fix(agent-core-v2): watch Windows 8.3 short paths through their long form

Watching a directory given in 8.3 short form (for example
C:\Users\RUNNER~1\...) makes libuv's Windows file watcher abort the process
with "Assertion failed: !_wcsnicmp(filename, dir, dirlen)" in fs-event.c,
because change notifications arrive under the long path.

On Windows, resolve a watch root containing a short-name segment to its long
form (the nearest existing ancestor when the root does not exist yet) and map
reported changes and ignore checks back to the requested path, so callers that
compare change paths with their own keep working.

* test(agent-core-v2): keep watch tests portable to Windows runners

* test(agent-core-v2): show received events when the Windows short path watch test fails

* test(agent-core-v2): derive the Windows short path without cmd quoting

* chore: add changeset for the Windows short path watch fix

* fix(agent-core-v2): keep watch children whose names start with two dots inside the root

relative() returns "..cache/x" for a child named "..cache", which the
startsWith('..') check treated as a path outside the watched root. Mapped
change paths then kept the resolved long form, and native signal events for
such children skipped the ignore predicate. Only a bare ".." segment, ".."
followed by a separator, or an absolute result is outside the root.
2026-09-16 18:27:29 +08:00
Luyu Cheng
41eac5d2e7
feat(kap-server): keep client metadata on prompts and skill activations (#3764)
Store the optional metadata object on prompt submission and skill activation as opaque client metadata on the user or skill-activation origin, carry it through prompt events, the transcript projector, snapshots and history rebuilds, and echo it on prompt items without adding it to model content. Use display_text entries for session titles, undo labels and fork titles when every entry provides one. Project user turn payloads, live and rebuilt, through a path-free projection.
2026-09-16 17:56:43 +08:00
qer
cafd9b5a65
fix(kap-server): rebuild chat transcript after undo (#3837)
* fix(kap-server): rebuild chat transcript after undo

* test(kap-server): provide undo registry in broadcaster fixtures

* fix(kap-server): preserve non-anchor steers through undo

* fix(kap-server): rebuild undo transcript after persistence completes

* test: complete restored notification origin fixture
2026-09-16 17:15:35 +08:00
Luyu Cheng
1c7e996aa8
fix(kap-server): record user slash skill activations steered into a running turn (#3832)
Accept skill_activation origins with a user-slash trigger in onTurnSteered so a slash command sent while a turn is running gets a transcript frame, and keep those frames from draining a queued prompt's id. Project origin file attachments onto steered frames on both the immediate and deferred paths, matching onTurnStarted and the history rebuild.
2026-09-16 17:10:44 +08:00
Haozhe
f4e5822164
fix(agent-core-v2): stop aborted-operation errors from escaping to process crashes (#3838) 2026-09-16 16:41:13 +08:00
tpoisonooo
8660a07b3a
fix(tower): subagent cards still showing "completed" during rework (#3833)
Co-authored-by: konghuanjun <konghuanjun@moonshot.ai>
2026-09-16 16:20:24 +08:00