Commit graph

126 commits

Author SHA1 Message Date
liruifengv
e2ce6b9687
docs(changelog): sync 0.7.0 from apps/kimi-code/CHANGELOG.md (#298) 2026-06-02 11:31:20 +08:00
Yifan Song
4c7b173c12
docs: add Ctrl-J as newline alternative in keyboard shortcuts (#288)
Co-authored-by: liruifengv <liruifeng1024@gmail.com>
2026-06-02 11:24:22 +08:00
Haozhe
42bb9141d8
feat(tui): add /provider command, custom registry import, and tabbed model selector (#264)
* feat(tui): add /provider command, custom registry import, and tabbed model selector

- add "/provider" slash command for managing AI providers with CRUD UI
- add custom registry import via api.json URL and Bearer token
- introduce tabbed model selector grouped by provider
- add fetchCustomRegistry and applyCustomRegistryProvider in oauth package
- replace deprecated "/connect" command with unified "/provider" flow
- update provider and slash-command documentation

* feat(tui): background provider model refresh at startup

- add `refreshAllProviderModels` utility supporting managed OAuth, open platforms and custom registries
- wire background refresh into `KimiTUI` startup via `AuthFlowController`
- add `providerSwitchHint` option to `ModelSelector` and enable it in `TabbedModelSelector`
- update `TabbedModelSelector` hint wording from "switch" to "provider"
2026-06-01 18:46:40 +08:00
qer
a1dfbfeb16
fix: clarify Kimi Platform login copy (#274) 2026-06-01 18:43:01 +08:00
Kai
a24bfb1df3
feat: force adaptive thinking via KIMI_MODEL_ADAPTIVE_THINKING (#232)
* feat: force adaptive thinking via KIMI_MODEL_ADAPTIVE_THINKING

Add the KIMI_MODEL_ADAPTIVE_THINKING env var and a matching
adaptive_thinking model-alias field that force adaptive thinking
(thinking: { type: 'adaptive' }) on or off, overriding the Anthropic
model-name version inference.

This lets custom-named staff endpoints that back an adaptive-capable
model opt in even when the model name does not encode a parseable Claude
version (which would otherwise fall back to budget-based thinking).

The kosong AnthropicChatProvider resolves the adaptive decision once in
withThinking() as `_adaptiveThinking ?? supportsAdaptiveThinking(model)`
and threads it through clampEffort/supportsEffortParam so forced adaptive
also unlocks the max effort level.

* fix: make adaptive_thinking imply the thinking capability

A model alias that sets adaptive_thinking=true (or env
KIMI_MODEL_ADAPTIVE_THINKING=true) without listing a thinking
capability previously resolved to thinking=false for custom-named
endpoints not in the capability catalog. The model picker then
classified the alias as "thinking unsupported" and forced thinking
off (persisting default_thinking=false).

Treat a forced adaptive flag as advertising the thinking capability
in resolveModelCapabilities, so the config.toml one-field opt-in
agrees with the KIMI_MODEL_* env path (which already defaults
capabilities to include thinking).

* fix: honor adaptiveThinking in the model picker, not the capability resolver

The earlier resolveModelCapabilities change had no observable effect:
modelCapabilities.thinking is consumed only for completion-budget and
media gating, never to decide whether thinking is dispatched or whether
the model picker offers a thinking toggle.

The mechanism that actually forced thinking off for an adaptive_thinking
alias is the TUI model picker, which reads ModelAlias.capabilities
directly (availableModels comes straight from config.models). Revert the
resolver change and instead make thinkingAvailability() treat
adaptiveThinking=true as a thinking toggle, so a custom-named config.toml
alias configured with only `adaptive_thinking = true` is no longer
classified "unsupported" (which forced thinking off and persisted
default_thinking=false on select). The KIMI_MODEL_* env path was already
covered by DEFAULT_CAPABILITIES.
2026-05-30 09:49:08 +08:00
liruifengv
2752bd9330
docs(changelog): sync 0.6.0 from apps/kimi-code/CHANGELOG.md (#227) 2026-05-29 22:58:42 +08:00
qer
bab2da7b1c
feat(plugin): install plugins from a GitHub repository URL (#221)
* feat(plugin): install plugins from a GitHub repository URL

Allow `/plugins install <github-url>` (and marketplace `source` entries) to
take a GitHub repo URL directly. A new `github` source kind joins the
existing `local-path` and `zip-url` kinds.

Recognized URL forms (parsing in source.ts):

- `https://github.com/<o>/<r>`                       — bare; resolves to latest
                                                       release tag, falling back
                                                       to default branch HEAD.
- `https://github.com/<o>/<r>/tree/<ref>`            — branch / tag / SHA;
                                                       value passed to codeload
                                                       in its short form so the
                                                       backend resolves either.
- `https://github.com/<o>/<r>/releases/tag/<tag>`    — explicit tag, uses
                                                       refs/tags/<tag> to avoid
                                                       same-named-branch ambiguity.
- `https://github.com/<o>/<r>/commit/<sha>`          — explicit commit SHA.

The resolver deliberately avoids `api.github.com`: its 60/hour anonymous
quota is shared with every other tool on the egress IP (browser, gh CLI,
IDE integrations) and a first-time install failing because some other tool
ate the budget is unacceptable UX. Instead we:

- GET `github.com/<o>/<r>/releases/latest` with manual redirect and parse
  the `Location` header (302 → tag URL; 404 → no own release).
- Fall back to `codeload.github.com/<o>/<r>/zip/HEAD` for repos with no
  releases (or for forks that inherit upstream tags but have no own release
  page, which redirect to bare `/releases`).
- Only treat the explicit 404 from `/releases/latest` as "no release" — 5xx,
  403, 429, and any other non-2xx status surface a hard error rather than
  silently installing the default branch, so the user knows when transient
  GitHub issues changed the install path.

UI changes in the TUI:

- `/plugins install` now shows a live Braille spinner while resolving and
  downloading, then flips to a final status that distinguishes Installed
  (fresh) vs Updated (same repo identity, new version) vs Migrated (source
  changed, e.g. CDN zip-url → GitHub).
- `/plugins list`, the `/plugins` overview, and `/plugins info` show the
  install provenance inline. `zip-url` installs now display the URL host
  (e.g. `via code.kimi.com`, `via 127.0.0.1:port`) instead of the opaque
  `zip-url` literal. GitHub installs show `github <owner>/<repo>@<ref>`.
- Three-tier trust badge driven by the marketplace context recorded at
  install time: `official` (green) for `tier: official`, `curated` (blue) for
  `tier: curated`, `third-party` (muted) for anything not installed through
  the marketplace selector. CLI `/plugins install <url>` always records as
  third-party; the marketplace selector passes the tier through. A
  re-install replaces the marketplace context: switching to a third-party
  source clears the badge, which matches the underlying trust change.

`installed.json` gains optional `github` and `marketplace` fields
(back-compatible). PluginSummary surfaces `source`, `originalSource`,
`github`, and `marketplace` so the TUI can label installs without an extra
round trip to PluginInfo. The SDK's `session.installPlugin(source)` gains
an optional `{ marketplace }` second argument so the marketplace selector
can forward `{ id, tier }` through RPC; the CLI install path omits it.

Tests: 112 plugin-suite tests (URL parser, resolver, store round-trip,
manager integration). The manager integration tests assert codeload URLs
shape (short form for `/tree/<ref>`, explicit `refs/tags/` for
`/releases/tag/`) and verify marketplace context is persisted across
reloads and cleared on a third-party re-install.

* chore(changeset): plugin install from GitHub

* docs(plugins): document GitHub install URLs and trust badges

* fix(plugin): preserve URL-encoded characters in GitHub ref names

Git permits ref characters that have special meaning in URLs — most
notably `#`, which is a valid tag character (e.g. `release#1`) but the URL
fragment delimiter. The resolver decoded the tag from GitHub's
`/releases/latest` 302 redirect Location header and then interpolated the
raw value into the codeload URL. The literal `#1` became a fragment and
the HTTP request reached the server as `…/refs/tags/release` — a wrong or
truncated ref, leading to install failure for a release whose URL was
otherwise valid.

Two symmetric changes:

- The codeload URL builder now splits the ref on `/` (so multi-segment
  refs like `feat/foo` keep their path separators) and percent-encodes
  each segment.
- The GitHub URL parser now percent-decodes each segment from the URL's
  pathname when extracting `/tree/<ref>`, `/releases/tag/<tag>`, and
  `/commit/<sha>`. Storage and display see the human-readable Git ref
  name; the resolver re-encodes on the way out.

Malformed `%xx` sequences in user-typed URLs are tolerated: we keep the
raw segment so the caller surfaces a normal "ref not found" error
downstream instead of crashing during parse.

* fix: restrict plugin trust badges

* chore: remove fetch when show plugin list

---------

Co-authored-by: qer <Anna_Knapprfr@mail.com>
2026-05-29 22:18:16 +08:00
Kai
2bbea75ee4
feat: define model via KIMI_MODEL_* environment variables (#212)
* feat: define model via KIMI_MODEL_* environment variables

Add a KIMI_MODEL_* environment-variable channel that synthesizes a
provider (__kimi_env__) and model alias (__kimi_env_model__) in memory
and selects it as the default model, without editing config.toml.
Supports provider type (kimi/anthropic/openai), base URL, API key,
context size, capabilities, anthropic max_output_size, openai
reasoning_key, and full thinking settings.

Runtime config reads go through a new loadRuntimeConfig wrapper; the
config.toml write-back paths keep using readConfigFile so the
synthesized model is never persisted back to disk.

* feat: env-model defaults and friendly welcome model name

- KIMI_MODEL_MAX_CONTEXT_SIZE defaults to 262144 (256K) when unset
- KIMI_MODEL_CAPABILITIES defaults to image_in,thinking when unset
- TUI welcome banner shows the model display name / id instead of the
  internal __kimi_env_model__ alias key

* fix: never persist env model to config.toml; validate default_thinking

- Strip the synthesized __kimi_env__ provider / __kimi_env_model__ model
  (and a default_model pointing at it) in writeConfigFile, so the env model
  and its shell API key cannot be persisted via a getConfig -> setConfig
  patch round-trip (e.g. running /login or /connect in env-model mode).
- Reject a non-empty but unparseable KIMI_MODEL_DEFAULT_THINKING value
  (fail-fast) instead of silently keeping config.toml's existing default.

* fix: preserve on-disk default_model when stripping env model; fix thinking docs

- stripEnvModelConfig restores config.toml's default_model from raw instead of
  erasing it when the runtime default points at the env alias, so a real
  default_model survives a getConfig -> setConfig round-trip.
- Correct KIMI_MODEL_DEFAULT_THINKING docs: unset follows the global default
  (Thinking on), not Off.

* fix: restore env-injected fields to on-disk values in stripEnvModelConfig; update tests for thinking behavior
2026-05-29 21:40:56 +08:00
_Kerman
3a0e06031a
fix: project persisted context messages (#195) 2026-05-29 14:43:17 +08:00
_Kerman
8de720434f
chore: add docs to pnpm-workspace (#196) 2026-05-29 14:34:05 +08:00
_Kerman
537cf20d18
feat: remove default per-turn step limit of 1000 (#186) 2026-05-29 13:11:45 +08:00
qer
68df4b8b84
docs: simplify plugins documentation (#169)
* docs: simplify plugins documentation

* docs: restore plugin caveats lost during simplification

Re-add three behaviors that were dropped from the simplified plugins
docs: the stdio MCP `cwd` must start with `./`, local-path installs run
from the managed copy (so editing the source after install requires a
reinstall), and `/plugins remove` only deletes the install record while
leaving files on disk. Mirror the changes in both en and zh.
2026-05-29 02:21:19 +08:00
liruifengv
681ccc5b85
chore(changelog): sync 0.5.0 and reword 'assistant' to 'agent' (#171) 2026-05-28 22:46:50 +08:00
liruifengv
850aad461b
docs: document scheduled task tools (#168) 2026-05-28 22:12:54 +08:00
liruifengv
07dd604c3c
feat: add /auto slash command and --auto CLI flag (#163)
* feat: add /auto slash command and --auto CLI flag

* feat: add /auto slash command and --auto CLI flag
2026-05-28 20:24:50 +08:00
liruifengv
16e881ed64
docs(changelog): sync 0.4.0 from apps/kimi-code/CHANGELOG.md (#125) 2026-05-27 23:31:03 +08:00
qer
ebf6e8181e
feat: add plugin manager and official plugins (#119)
* feat: add plugin manager and official plugins

* fix(agent-core): honor plugin capability overrides

* fix: restrict plugin zip root detection

* Update apps/kimi-code/src/constant/app.ts

Co-authored-by: liruifengv <liruifeng1024@gmail.com>
Signed-off-by: qer <wbxl2000@outlook.com>

---------

Signed-off-by: qer <wbxl2000@outlook.com>
Co-authored-by: liruifengv <liruifeng1024@gmail.com>
2026-05-27 22:47:33 +08:00
_Kerman
2b74025302
feat: rework permission decision policies (#26) 2026-05-27 20:07:24 +08:00
liruifengv
b7e7404d90
docs: document /export-md and /export-debug-zip slash commands (#114)
Add reference table entries for the new in-TUI export commands, and
extend the Sessions guide so users can discover them alongside the
existing `kimi export` CLI subcommand. Mirrored across en and zh.
2026-05-27 19:15:14 +08:00
liruifengv
49ca317326
docs(changelog): sync 0.3.0 from apps/kimi-code/CHANGELOG.md (#100)
* Update SKILL.md

* docs(changelog): sync 0.3.0 from apps/kimi-code/CHANGELOG.md
2026-05-27 12:24:45 +08:00
7Sageer
61f7d0e7a2
fix(kosong): make OpenAI-compatible thinking work without reasoning_key (#78)
* fix(kosong): make OpenAI-compatible thinking work without reasoning_key

Reasoning field names (reasoning_content / reasoning_details / reasoning)
are protocol facts, not user preferences. Treating reasoning_key as a
required user-set field meant any path that didn't go through the catalog
— hand-written config.toml in particular — silently lost thinking content
and broke strict gateways like DeepSeek.

Demote reasoning_key to an internal protocol constant with an explicit
override:

- Inbound (stream + non-stream): scan reasoning_content,
  reasoning_details, reasoning in order; first string value wins. An
  explicit reasoning_key restricts the scan to that one field.
- Outbound: serialize ThinkPart back as reasoning_content by default.
  An explicit reasoning_key writes to that field instead.
- reasoning_effort auto-injection no longer requires reasoning_key;
  presence of ThinkPart in history is enough.

Catalog plumbing is unchanged — explicit values from the catalog still
win, the default just stops being undefined.

Manually verified end-to-end against the real DeepSeek API with a
hand-written config.toml that does not set reasoning_key: thinking
content renders, no 400, multi-turn conversations work.

* fix(kosong): normalize blank reasoning_key to unset

ModelAliasSchema accepts `reasoning_key = ""` (z.string().optional()).
A blank value used to disable the default field scan and route both
inbound reads and outbound writes through an empty property name.
Trim and treat empty as undefined at the provider boundary so the
default protocol behavior applies.

* fix(kosong): preserve caller-pinned reasoning_effort during auto-inject

When the history contains ThinkPart, generate() injects
reasoning_effort='medium' and then assigns it onto createParams,
which used to silently overwrite a value the caller set via
withGenerationKwargs({ reasoning_effort: 'high' }). Skip auto-inject
when an explicit reasoning_effort already lives in kwargs.
2026-05-26 19:28:25 +08:00
liruifengv
bddc60f0e9
fix(tui): block model and session commands while busy (#73) 2026-05-26 17:44:14 +08:00
liruifengv
0bcbf167fe
docs(changelog): sync 0.2.0 from apps/kimi-code/CHANGELOG.md (#61) 2026-05-26 15:27:13 +08:00
7Sageer
cf5270ce6a
docs: document /connect and trim its changeset wording (#48)
* docs: document /connect command and model catalog

Add a /connect row to the slash-commands reference (English and Chinese)
and a new "/connect and the model catalog" section in providers.md that
covers the bundled catalog, --refresh, --url, and the relationship with
hand-written config.toml entries.

* chore(changeset): trim /connect changesets to user-facing wording

Drop internal phrasing (pruned snapshot, "not gated by models.dev",
fallback mechanics, and the Anthropic catalog base URL path fix that
landed alongside the initial /connect implementation) so the release
notes describe behavior users can observe, not implementation details.

* docs(zh): translate "catalog/flag/endpoint" in /connect section

Rework the Chinese wording for the /connect docs: render "model catalog"
as "模型目录" (with the English term in parentheses on first use), drop
the leftover English "flag"/"endpoint" usage, and smooth out the
translationese in the surrounding sentences.

Update the cross-link anchor in slash-commands.md to match the new
Chinese heading.

* docs(en): tighten /connect wording

Fix the subject/verb mismatch in the /connect step description (the
sentence switched subjects mid-list), replace "endpoint" with the more
accurate "URL" since the catalog source is a static JSON file, and
clarify that /connect is limited to the provider types in the table
above rather than to whatever the catalog happens to cover.

* chore(changeset): keep connect-model-catalog changelog to one line

Defer --refresh, --url, and metadata details to the new docs section
(`/connect` and the model catalog in configuration/providers.md). The
changelog now just announces the command exists.
2026-05-26 14:19:44 +08:00
qer
bfbd522a71
fix: widen Kimi completion budget (#17) 2026-05-25 18:41:59 +08:00
Kaiyi
842e699a64 Kimi For Coding 2026-05-22 15:54:50 +08:00