Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e4e446fe4 | ||
|
|
008b6623f6 | ||
|
|
f8cd33d19d | ||
|
|
2e40ebb08b | ||
|
|
fcb7588312 | ||
|
|
9ab038f573 | ||
|
|
dd5711f24f | ||
|
|
a690987ea2 | ||
|
|
95d4f19650 | ||
|
|
99e09cfaf5 | ||
|
|
0c580afb5f | ||
|
|
c61977cb70 |
No files matched your search
@@ -116,6 +116,24 @@ a design against the 0.1.15 teardown), MCP servers on protocol 2026-07-28
|
||||
- Graph node worktrees are removed right after a successful merge-back;
|
||||
only FAILED nodes keep theirs for postmortem.
|
||||
|
||||
## Terminal keyboard
|
||||
|
||||
`Shift+Enter` inserts a newline in the prompt wherever the terminal can
|
||||
report the modifier, and `kitty_skip_reason` decides where that is —
|
||||
`shift_enter_unavailable` matches on it rather than keeping a second brand
|
||||
list, because the two drifted once and the UI advertised a chord that never
|
||||
arrived. Two skips still deliver the modifier: Apple Terminal, where
|
||||
`route_enter` polls CoreGraphics, and Windows Terminal, where the console
|
||||
key record carries SHIFT with no protocol at all (a bare ConHost is only
|
||||
optimistically refined to Windows Terminal, so it keeps advertising
|
||||
Alt+Enter). Everywhere else — VTE, xterm.js, JediTerm, screen, tmux below
|
||||
3.3, tmux with `extended-keys off` — the byte on the wire is a plain CR and
|
||||
no client-side trick recovers it: crossterm 0.28 parses kitty `CSI 13;2u`
|
||||
but not xterm's `CSI 27;2;13~`, so `modifyOtherKeys` buys nothing. NO VTE
|
||||
release carries the protocol (checked at tag 0.82.0:
|
||||
`_vte_keymap_GDK_Return` encodes only Alt); a version cutoff for it is a
|
||||
bug, not a feature. `/terminal-setup` owns the per-terminal recipe.
|
||||
|
||||
## Test seams
|
||||
|
||||
Cross-crate test hooks are behind the `test-support` cargo feature
|
||||
@@ -385,11 +403,15 @@ client-side, no backend surface.
|
||||
carries the thinking level. NO websocket, NO base_instructions.
|
||||
CATALOG is HARDCODED (`PlatformId::hardcoded_catalog` →
|
||||
`openai_codex_wire_models`, mapped through the SAME
|
||||
`platform_wire_model_to_entry` output): exactly the 4 `visibility=list` &&
|
||||
`supported_in_api=true` models (`gpt-5.6-sol/terra/luna`, `gpt-5.5`, ctx
|
||||
272000, per-model efforts) — NO live `/models` fetch, NO codex-CLI /
|
||||
`~/.codex` dependency; `gpt-5.3-codex-spark` (api=false) and
|
||||
`gpt-5.4`/`gpt-5.4-mini`/`codex-auto-review` (hidden) are EXCLUDED.
|
||||
`platform_wire_model_to_entry` output): the 5 `visibility=list` &&
|
||||
`supported_in_api=true` models the backend served on 2026-09-21
|
||||
(`gpt-6-astra`, `gpt-5.6-sol/terra/luna`, `gpt-5.5`, ctx 272000,
|
||||
per-model efforts) — NO live `/models` fetch, NO codex-CLI / `~/.codex`
|
||||
dependency; the hidden `gpt-reserve` and `codex-auto-review` are
|
||||
EXCLUDED. Refresh the table by reading
|
||||
`GET {base}/models?client_version=<a current codex release>` with a
|
||||
ChatGPT bearer: an old `client_version` is answered with a truncated
|
||||
list, so a stale version reads as "the model does not exist".
|
||||
- `OAuthFlow::GithubDeviceCopilot` → `auth::github_copilot` (TWO-STAGE).
|
||||
Provider: `github-copilot` (`scope_key oauth/github-copilot`, base
|
||||
`api.individual.githubcopilot.com`, ChatCompletions wire). Stage 1 is an
|
||||
@@ -532,9 +554,10 @@ client-side, no backend surface.
|
||||
`~/.kigi/models_dev_cache.json`). Wire values always win; enrichment
|
||||
never invents model availability. Canonical reasoning efforts:
|
||||
none/minimal/low/medium/high/xhigh/max (`max` split from `xhigh` 2026-07;
|
||||
`ultra` was dropped the same month, no backend accepts it; Kimi wire
|
||||
spells its top tier `max`, kimi_compat renames). config.toml accepts any
|
||||
letter case: `ReasoningEffort` deserializes through `FromStr`.
|
||||
the Codex backend advertises an `ultra` tier above `max` that kigi has no
|
||||
level for; Kimi wire spells its top tier `max`, kimi_compat renames).
|
||||
config.toml accepts any letter case: `ReasoningEffort` deserializes
|
||||
through `FromStr`.
|
||||
|
||||
## Milestones (PRD §8.3)
|
||||
|
||||
|
||||
Generated
+62
-62
@@ -5442,7 +5442,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-acp-lib"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"agent-client-protocol",
|
||||
"async-trait",
|
||||
@@ -5456,7 +5456,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-agent"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"dirs 6.0.0",
|
||||
@@ -5486,7 +5486,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-agent-lifecycle"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"tokio",
|
||||
@@ -5495,7 +5495,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-auth"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"http 1.4.2",
|
||||
@@ -5508,7 +5508,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-bin"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
@@ -5543,7 +5543,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-chat-state"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"kigi-compaction",
|
||||
@@ -5560,7 +5560,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-codebase-graph"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"clap",
|
||||
@@ -5596,7 +5596,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-compaction"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -5609,7 +5609,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-config"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"blake3",
|
||||
@@ -5632,7 +5632,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-config-types"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"agent-client-protocol",
|
||||
"indexmap",
|
||||
@@ -5646,7 +5646,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-crash-handler"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"libc",
|
||||
@@ -5657,7 +5657,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-env"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"tracing",
|
||||
"url",
|
||||
@@ -5665,7 +5665,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-fast-worktree"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bytes",
|
||||
@@ -5697,7 +5697,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-file-utils"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"aws-config",
|
||||
@@ -5721,7 +5721,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-fsnotify"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"criterion",
|
||||
"dunce",
|
||||
@@ -5742,7 +5742,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-gix-status"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"gix",
|
||||
"kigi-test-utils",
|
||||
@@ -5752,7 +5752,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-hooks"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"kigi-config",
|
||||
@@ -5771,7 +5771,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-hooks-plugins-types"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -5779,7 +5779,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-http"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"kigi-auth",
|
||||
"kigi-log",
|
||||
@@ -5794,7 +5794,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-hunk-tracker"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"dunce",
|
||||
@@ -5815,14 +5815,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-interjection-core"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kigi-log"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -5840,7 +5840,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-markdown"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"anstyle-lossy",
|
||||
@@ -5864,14 +5864,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-markdown-core"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"pulldown-cmark",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kigi-mcp"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"agent-client-protocol",
|
||||
"async-trait",
|
||||
@@ -5908,7 +5908,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-memory"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"arc-swap",
|
||||
@@ -5942,7 +5942,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-mermaid"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"fontdb",
|
||||
"image",
|
||||
@@ -5960,7 +5960,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-models"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"kigi-env",
|
||||
"serde",
|
||||
@@ -5970,7 +5970,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-pager-minimal"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"crossterm",
|
||||
@@ -5987,7 +5987,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-pager-pty-harness"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"alacritty_terminal",
|
||||
"anyhow",
|
||||
@@ -6012,7 +6012,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-pager-render"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"agent-client-protocol",
|
||||
"anstyle",
|
||||
@@ -6064,7 +6064,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-paths"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"camino",
|
||||
"serde",
|
||||
@@ -6074,7 +6074,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-prompt-queue"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -6082,7 +6082,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-proto-build"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"pbjson-build",
|
||||
@@ -6093,7 +6093,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-ratatui-inline"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"ansi-width",
|
||||
"anstyle-parse 0.2.7",
|
||||
@@ -6110,7 +6110,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-ratatui-textarea"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"arboard",
|
||||
"chrono",
|
||||
@@ -6131,7 +6131,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-sampler"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"async-openai",
|
||||
"async-stream",
|
||||
@@ -6155,7 +6155,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-sampling-types"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"assert_matches",
|
||||
"async-openai",
|
||||
@@ -6172,7 +6172,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-sandbox"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -6194,7 +6194,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-secrets"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"regex",
|
||||
"serde_json",
|
||||
@@ -6232,7 +6232,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-shell"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"agent-client-protocol",
|
||||
"anyhow",
|
||||
@@ -6370,7 +6370,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-shell-base"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -6395,7 +6395,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-sqlite-journal"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"rusqlite",
|
||||
@@ -6406,7 +6406,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-subagent-resolution"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"kigi-sampling-types",
|
||||
"kigi-tool-types",
|
||||
@@ -6421,7 +6421,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-system-power"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
"zbus",
|
||||
@@ -6429,7 +6429,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-test-support"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"agent-client-protocol",
|
||||
"anyhow",
|
||||
@@ -6451,7 +6451,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-test-utils"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"runfiles",
|
||||
"tracing",
|
||||
@@ -6460,11 +6460,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-token-estimation"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
|
||||
[[package]]
|
||||
name = "kigi-tool-protocol"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"kigi-tool-types",
|
||||
"serde",
|
||||
@@ -6475,7 +6475,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-tool-runtime"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -6493,7 +6493,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-tool-types"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"minijinja",
|
||||
"schemars 1.2.1",
|
||||
@@ -6503,7 +6503,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-tools"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"arc-swap",
|
||||
@@ -6580,7 +6580,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-tools-api"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"kigi-proto-build",
|
||||
"kigi-tool-protocol",
|
||||
@@ -6593,11 +6593,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-tracing-macros"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
|
||||
[[package]]
|
||||
name = "kigi-tty-utils"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"nix 0.30.1",
|
||||
@@ -6607,7 +6607,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-tui"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"agent-client-protocol",
|
||||
"ansi-to-tui",
|
||||
@@ -6694,7 +6694,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-update"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"dunce",
|
||||
@@ -6723,14 +6723,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-version"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kigi-workspace"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"agent-client-protocol",
|
||||
"anyhow",
|
||||
@@ -6809,7 +6809,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kigi-workspace-types"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"chrono",
|
||||
@@ -8843,7 +8843,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ptyctl"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"alacritty_terminal",
|
||||
"anyhow",
|
||||
@@ -8861,7 +8861,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ptyctl-cli"
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"axum",
|
||||
|
||||
+1
-1
@@ -76,7 +76,7 @@ members = [
|
||||
]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.1.16"
|
||||
version = "0.1.17"
|
||||
edition = "2024"
|
||||
license = "Apache-2.0"
|
||||
|
||||
|
||||
+62
-62
@@ -16436,68 +16436,68 @@ limitations under the License.
|
||||
|
||||
Applies to:
|
||||
|
||||
- [kigi-proto-build 0.1.16](https://crates.io/crates/kigi-proto-build)
|
||||
- [kigi-acp-lib 0.1.16](https://crates.io/crates/kigi-acp-lib)
|
||||
- [kigi-agent 0.1.16](https://crates.io/crates/kigi-agent)
|
||||
- [kigi-agent-lifecycle 0.1.16](https://crates.io/crates/kigi-agent-lifecycle)
|
||||
- [kigi-auth 0.1.16](https://crates.io/crates/kigi-auth)
|
||||
- [kigi-bin 0.1.16](https://crates.io/crates/kigi-bin)
|
||||
- [kigi-chat-state 0.1.16](https://crates.io/crates/kigi-chat-state)
|
||||
- [kigi-codebase-graph 0.1.16](https://crates.io/crates/kigi-codebase-graph)
|
||||
- [kigi-config 0.1.16](https://crates.io/crates/kigi-config)
|
||||
- [kigi-config-types 0.1.16](https://crates.io/crates/kigi-config-types)
|
||||
- [kigi-crash-handler 0.1.16](https://crates.io/crates/kigi-crash-handler)
|
||||
- [kigi-env 0.1.16](https://crates.io/crates/kigi-env)
|
||||
- [kigi-fast-worktree 0.1.16](https://crates.io/crates/kigi-fast-worktree)
|
||||
- [kigi-file-utils 0.1.16](https://crates.io/crates/kigi-file-utils)
|
||||
- [kigi-fsnotify 0.1.16](https://crates.io/crates/kigi-fsnotify)
|
||||
- [kigi-gix-status 0.1.16](https://crates.io/crates/kigi-gix-status)
|
||||
- [kigi-hooks 0.1.16](https://crates.io/crates/kigi-hooks)
|
||||
- [kigi-hooks-plugins-types 0.1.16](https://crates.io/crates/kigi-hooks-plugins-types)
|
||||
- [kigi-http 0.1.16](https://crates.io/crates/kigi-http)
|
||||
- [kigi-hunk-tracker 0.1.16](https://crates.io/crates/kigi-hunk-tracker)
|
||||
- [kigi-log 0.1.16](https://crates.io/crates/kigi-log)
|
||||
- [kigi-markdown 0.1.16](https://crates.io/crates/kigi-markdown)
|
||||
- [kigi-markdown-core 0.1.16](https://crates.io/crates/kigi-markdown-core)
|
||||
- [kigi-mcp 0.1.16](https://crates.io/crates/kigi-mcp)
|
||||
- [kigi-memory 0.1.16](https://crates.io/crates/kigi-memory)
|
||||
- [kigi-models 0.1.16](https://crates.io/crates/kigi-models)
|
||||
- [kigi-pager-minimal 0.1.16](https://crates.io/crates/kigi-pager-minimal)
|
||||
- [kigi-pager-pty-harness 0.1.16](https://crates.io/crates/kigi-pager-pty-harness)
|
||||
- [kigi-pager-render 0.1.16](https://crates.io/crates/kigi-pager-render)
|
||||
- [kigi-paths 0.1.16](https://crates.io/crates/kigi-paths)
|
||||
- [kigi-prompt-queue 0.1.16](https://crates.io/crates/kigi-prompt-queue)
|
||||
- [kigi-ratatui-inline 0.1.16](https://crates.io/crates/kigi-ratatui-inline)
|
||||
- [kigi-ratatui-textarea 0.1.16](https://crates.io/crates/kigi-ratatui-textarea)
|
||||
- [kigi-sampler 0.1.16](https://crates.io/crates/kigi-sampler)
|
||||
- [kigi-sampling-types 0.1.16](https://crates.io/crates/kigi-sampling-types)
|
||||
- [kigi-sandbox 0.1.16](https://crates.io/crates/kigi-sandbox)
|
||||
- [kigi-secrets 0.1.16](https://crates.io/crates/kigi-secrets)
|
||||
- [kigi-proto-build 0.1.17](https://crates.io/crates/kigi-proto-build)
|
||||
- [kigi-acp-lib 0.1.17](https://crates.io/crates/kigi-acp-lib)
|
||||
- [kigi-agent 0.1.17](https://crates.io/crates/kigi-agent)
|
||||
- [kigi-agent-lifecycle 0.1.17](https://crates.io/crates/kigi-agent-lifecycle)
|
||||
- [kigi-auth 0.1.17](https://crates.io/crates/kigi-auth)
|
||||
- [kigi-bin 0.1.17](https://crates.io/crates/kigi-bin)
|
||||
- [kigi-chat-state 0.1.17](https://crates.io/crates/kigi-chat-state)
|
||||
- [kigi-codebase-graph 0.1.17](https://crates.io/crates/kigi-codebase-graph)
|
||||
- [kigi-config 0.1.17](https://crates.io/crates/kigi-config)
|
||||
- [kigi-config-types 0.1.17](https://crates.io/crates/kigi-config-types)
|
||||
- [kigi-crash-handler 0.1.17](https://crates.io/crates/kigi-crash-handler)
|
||||
- [kigi-env 0.1.17](https://crates.io/crates/kigi-env)
|
||||
- [kigi-fast-worktree 0.1.17](https://crates.io/crates/kigi-fast-worktree)
|
||||
- [kigi-file-utils 0.1.17](https://crates.io/crates/kigi-file-utils)
|
||||
- [kigi-fsnotify 0.1.17](https://crates.io/crates/kigi-fsnotify)
|
||||
- [kigi-gix-status 0.1.17](https://crates.io/crates/kigi-gix-status)
|
||||
- [kigi-hooks 0.1.17](https://crates.io/crates/kigi-hooks)
|
||||
- [kigi-hooks-plugins-types 0.1.17](https://crates.io/crates/kigi-hooks-plugins-types)
|
||||
- [kigi-http 0.1.17](https://crates.io/crates/kigi-http)
|
||||
- [kigi-hunk-tracker 0.1.17](https://crates.io/crates/kigi-hunk-tracker)
|
||||
- [kigi-log 0.1.17](https://crates.io/crates/kigi-log)
|
||||
- [kigi-markdown 0.1.17](https://crates.io/crates/kigi-markdown)
|
||||
- [kigi-markdown-core 0.1.17](https://crates.io/crates/kigi-markdown-core)
|
||||
- [kigi-mcp 0.1.17](https://crates.io/crates/kigi-mcp)
|
||||
- [kigi-memory 0.1.17](https://crates.io/crates/kigi-memory)
|
||||
- [kigi-models 0.1.17](https://crates.io/crates/kigi-models)
|
||||
- [kigi-pager-minimal 0.1.17](https://crates.io/crates/kigi-pager-minimal)
|
||||
- [kigi-pager-pty-harness 0.1.17](https://crates.io/crates/kigi-pager-pty-harness)
|
||||
- [kigi-pager-render 0.1.17](https://crates.io/crates/kigi-pager-render)
|
||||
- [kigi-paths 0.1.17](https://crates.io/crates/kigi-paths)
|
||||
- [kigi-prompt-queue 0.1.17](https://crates.io/crates/kigi-prompt-queue)
|
||||
- [kigi-ratatui-inline 0.1.17](https://crates.io/crates/kigi-ratatui-inline)
|
||||
- [kigi-ratatui-textarea 0.1.17](https://crates.io/crates/kigi-ratatui-textarea)
|
||||
- [kigi-sampler 0.1.17](https://crates.io/crates/kigi-sampler)
|
||||
- [kigi-sampling-types 0.1.17](https://crates.io/crates/kigi-sampling-types)
|
||||
- [kigi-sandbox 0.1.17](https://crates.io/crates/kigi-sandbox)
|
||||
- [kigi-secrets 0.1.17](https://crates.io/crates/kigi-secrets)
|
||||
- [kigi-shared 0.0.0](https://crates.io/crates/kigi-shared)
|
||||
- [kigi-shell 0.1.16](https://crates.io/crates/kigi-shell)
|
||||
- [kigi-shell-base 0.1.16](https://crates.io/crates/kigi-shell-base)
|
||||
- [kigi-sqlite-journal 0.1.16](https://crates.io/crates/kigi-sqlite-journal)
|
||||
- [kigi-subagent-resolution 0.1.16](https://crates.io/crates/kigi-subagent-resolution)
|
||||
- [kigi-system-power 0.1.16](https://crates.io/crates/kigi-system-power)
|
||||
- [kigi-test-support 0.1.16](https://crates.io/crates/kigi-test-support)
|
||||
- [kigi-token-estimation 0.1.16](https://crates.io/crates/kigi-token-estimation)
|
||||
- [kigi-tools 0.1.16](https://crates.io/crates/kigi-tools)
|
||||
- [kigi-tools-api 0.1.16](https://crates.io/crates/kigi-tools-api)
|
||||
- [kigi-tracing-macros 0.1.16](https://crates.io/crates/kigi-tracing-macros)
|
||||
- [kigi-tty-utils 0.1.16](https://crates.io/crates/kigi-tty-utils)
|
||||
- [kigi-tui 0.1.16](https://crates.io/crates/kigi-tui)
|
||||
- [kigi-update 0.1.16](https://crates.io/crates/kigi-update)
|
||||
- [kigi-version 0.1.16](https://crates.io/crates/kigi-version)
|
||||
- [kigi-workspace 0.1.16](https://crates.io/crates/kigi-workspace)
|
||||
- [kigi-workspace-types 0.1.16](https://crates.io/crates/kigi-workspace-types)
|
||||
- [ptyctl 0.1.16](https://crates.io/crates/ptyctl)
|
||||
- [ptyctl-cli 0.1.16](https://crates.io/crates/ptyctl-cli)
|
||||
- [kigi-compaction 0.1.16](https://crates.io/crates/kigi-compaction)
|
||||
- [kigi-interjection-core 0.1.16](https://crates.io/crates/kigi-interjection-core)
|
||||
- [kigi-test-utils 0.1.16](https://crates.io/crates/kigi-test-utils)
|
||||
- [kigi-tool-protocol 0.1.16](https://crates.io/crates/kigi-tool-protocol)
|
||||
- [kigi-tool-runtime 0.1.16](https://crates.io/crates/kigi-tool-runtime)
|
||||
- [kigi-tool-types 0.1.16](https://crates.io/crates/kigi-tool-types)
|
||||
- [kigi-shell 0.1.17](https://crates.io/crates/kigi-shell)
|
||||
- [kigi-shell-base 0.1.17](https://crates.io/crates/kigi-shell-base)
|
||||
- [kigi-sqlite-journal 0.1.17](https://crates.io/crates/kigi-sqlite-journal)
|
||||
- [kigi-subagent-resolution 0.1.17](https://crates.io/crates/kigi-subagent-resolution)
|
||||
- [kigi-system-power 0.1.17](https://crates.io/crates/kigi-system-power)
|
||||
- [kigi-test-support 0.1.17](https://crates.io/crates/kigi-test-support)
|
||||
- [kigi-token-estimation 0.1.17](https://crates.io/crates/kigi-token-estimation)
|
||||
- [kigi-tools 0.1.17](https://crates.io/crates/kigi-tools)
|
||||
- [kigi-tools-api 0.1.17](https://crates.io/crates/kigi-tools-api)
|
||||
- [kigi-tracing-macros 0.1.17](https://crates.io/crates/kigi-tracing-macros)
|
||||
- [kigi-tty-utils 0.1.17](https://crates.io/crates/kigi-tty-utils)
|
||||
- [kigi-tui 0.1.17](https://crates.io/crates/kigi-tui)
|
||||
- [kigi-update 0.1.17](https://crates.io/crates/kigi-update)
|
||||
- [kigi-version 0.1.17](https://crates.io/crates/kigi-version)
|
||||
- [kigi-workspace 0.1.17](https://crates.io/crates/kigi-workspace)
|
||||
- [kigi-workspace-types 0.1.17](https://crates.io/crates/kigi-workspace-types)
|
||||
- [ptyctl 0.1.17](https://crates.io/crates/ptyctl)
|
||||
- [ptyctl-cli 0.1.17](https://crates.io/crates/ptyctl-cli)
|
||||
- [kigi-compaction 0.1.17](https://crates.io/crates/kigi-compaction)
|
||||
- [kigi-interjection-core 0.1.17](https://crates.io/crates/kigi-interjection-core)
|
||||
- [kigi-test-utils 0.1.17](https://crates.io/crates/kigi-test-utils)
|
||||
- [kigi-tool-protocol 0.1.17](https://crates.io/crates/kigi-tool-protocol)
|
||||
- [kigi-tool-runtime 0.1.17](https://crates.io/crates/kigi-tool-runtime)
|
||||
- [kigi-tool-types 0.1.17](https://crates.io/crates/kigi-tool-types)
|
||||
- [agent-client-protocol 0.10.4](https://github.com/agentclientprotocol/rust-sdk)
|
||||
- [allocator-api2 0.2.21](https://github.com/zakarumych/allocator-api2)
|
||||
- [anes 0.1.6](https://github.com/zrzka/anes-rs)
|
||||
@@ -16772,7 +16772,7 @@ limitations under the License.
|
||||
|
||||
Applies to:
|
||||
|
||||
- [kigi-mermaid 0.1.16](https://crates.io/crates/kigi-mermaid)
|
||||
- [kigi-mermaid 0.1.17](https://crates.io/crates/kigi-mermaid)
|
||||
|
||||
```
|
||||
Roboto-Regular.ttf
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"_meta":{"note":"filtered snapshot for kigi model-metadata enrichment; regenerate via scripts/gen_enrichment_snapshot.py","source":"https://models.dev/api.json (github.com/sst/models.dev, MIT)"},"alibaba-token-plan":{"models":{"MiniMax-M2.5":{"limit":{"context":196608,"input":196601,"output":24576},"modalities":{"input":["text"],"output":["text"]},"name":"MiniMax-M2.5","reasoning":true,"reasoning_options":[],"tool_call":true},"deepseek-v3.2":{"limit":{"context":131072,"output":65536},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V3.2","reasoning":true,"reasoning_options":[{"type":"toggle"}],"tool_call":true},"deepseek-v4-flash":{"limit":{"context":1000000,"output":384000},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V4 Flash","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"effort","values":["high","max"]}],"tool_call":true},"deepseek-v4-pro":{"limit":{"context":1000000,"output":384000},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V4 Pro","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"effort","values":["high","max"]}],"tool_call":true},"glm-5":{"limit":{"context":202752,"output":16384},"modalities":{"input":["text"],"output":["text"]},"name":"GLM-5","reasoning":true,"reasoning_options":[{"type":"toggle"}],"tool_call":true},"glm-5.1":{"limit":{"context":202752,"output":128000},"modalities":{"input":["text"],"output":["text"]},"name":"GLM-5.1","reasoning":true,"reasoning_options":[{"type":"toggle"}],"tool_call":true},"glm-5.2":{"limit":{"context":1000000,"output":131072},"modalities":{"input":["text"],"output":["text"]},"name":"GLM-5.2","reasoning":true,"reasoning_options":[{"type":"effort","values":["high","max"]}],"tool_call":true},"kimi-k2.5":{"limit":{"context":262144,"output":32768},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Kimi K2.5","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"budget_tokens"}],"tool_call":true},"kimi-k2.6":{"limit":{"context":262144,"output":16384},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Kimi K2.6","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"budget_tokens"}],"tool_call":true},"kimi-k2.7-code":{"limit":{"context":262144,"output":262144},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Kimi K2.7 Code","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"budget_tokens"}],"tool_call":true},"qwen-image-2.0":{"limit":{"context":8192,"output":0},"modalities":{"input":["text"],"output":["image"]},"name":"Qwen Image 2.0","reasoning":false,"tool_call":false},"qwen-image-2.0-pro":{"limit":{"context":8192,"output":0},"modalities":{"input":["text"],"output":["image"]},"name":"Qwen Image 2.0 Pro","reasoning":false,"tool_call":false},"qwen3.6-flash":{"limit":{"context":1000000,"output":65536},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Qwen3.6 Flash","reasoning":true,"reasoning_options":[{"type":"toggle"},{"max":81920,"type":"budget_tokens"}],"tool_call":true},"qwen3.6-plus":{"limit":{"context":1000000,"output":65536},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Qwen3.6 Plus","reasoning":true,"reasoning_options":[{"type":"toggle"},{"max":81920,"type":"budget_tokens"}],"tool_call":true},"qwen3.7-max":{"limit":{"context":1000000,"output":65536},"modalities":{"input":["text"],"output":["text"]},"name":"Qwen3.7 Max","reasoning":true,"reasoning_options":[{"type":"toggle"},{"max":262144,"type":"budget_tokens"}],"tool_call":true},"qwen3.7-plus":{"limit":{"context":1000000,"output":64000},"modalities":{"input":["text","image"],"output":["text"]},"name":"Qwen3.7 Plus","reasoning":true,"reasoning_options":[{"type":"toggle"},{"max":262144,"type":"budget_tokens"}],"tool_call":true},"qwen3.8-max-preview":{"limit":{"context":1000000,"output":131072},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Qwen3.8 Max Preview","reasoning":true,"reasoning_options":[{"type":"effort","values":["low","medium","xhigh"]},{"max":262144,"min":0,"type":"budget_tokens"}],"tool_call":true},"wan2.7-image":{"limit":{"context":8192,"output":0},"modalities":{"input":["text"],"output":["image"]},"name":"Wan2.7 Image","reasoning":false,"tool_call":false},"wan2.7-image-pro":{"limit":{"context":8192,"output":0},"modalities":{"input":["text"],"output":["image"]},"name":"Wan2.7 Image Pro","reasoning":false,"tool_call":false}}},"alibaba-token-plan-cn":{"models":{"MiniMax-M2.5":{"limit":{"context":196608,"input":196601,"output":24576},"modalities":{"input":["text"],"output":["text"]},"name":"MiniMax-M2.5","reasoning":true,"reasoning_options":[],"tool_call":true},"deepseek-v3.2":{"limit":{"context":131072,"output":65536},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V3.2","reasoning":true,"reasoning_options":[{"type":"toggle"}],"tool_call":true},"deepseek-v4-flash":{"limit":{"context":1000000,"output":3Line truncated
|
||||
{"_meta":{"note":"filtered snapshot for kigi model-metadata enrichment; regenerate via scripts/gen_enrichment_snapshot.py","source":"https://models.dev/api.json (github.com/sst/models.dev, MIT)"},"alibaba-token-plan":{"models":{"MiniMax-M2.5":{"limit":{"context":196608,"input":196601,"output":32768},"modalities":{"input":["text"],"output":["text"]},"name":"MiniMax-M2.5","reasoning":true,"reasoning_options":[],"tool_call":true},"deepseek-v3.2":{"limit":{"context":131072,"output":65536},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V3.2","reasoning":true,"reasoning_options":[{"type":"toggle"}],"tool_call":true},"deepseek-v4-flash":{"limit":{"context":1000000,"output":384000},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V4 Flash","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"effort","values":["high","max"]}],"tool_call":true},"deepseek-v4-flash-0731":{"limit":{"context":1000000,"output":384000},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V4 Flash 0731","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"effort","values":["high","max"]}],"tool_call":true},"deepseek-v4-pro":{"limit":{"context":1000000,"output":384000},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V4 Pro","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"effort","values":["high","max"]}],"tool_call":true},"deepseek-v4-pro-0813":{"limit":{"context":1000000,"output":384000},"modalities":{"input":["text"],"output":["text"]},"name":"DeepSeek V4 Pro 0813","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"effort","values":["high","max"]}],"tool_call":true},"deepseek-v4.1-flash":{"limit":{"context":1000000,"output":384000},"modalities":{"input":["text","image"],"output":["text"]},"name":"DeepSeek V4.1 Flash","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"effort","values":["low","high","max"]}],"tool_call":true},"glm-5":{"limit":{"context":202752,"output":16384},"modalities":{"input":["text"],"output":["text"]},"name":"GLM-5","reasoning":true,"reasoning_options":[{"type":"toggle"}],"tool_call":true},"glm-5.1":{"limit":{"context":202752,"output":128000},"modalities":{"input":["text"],"output":["text"]},"name":"GLM-5.1","reasoning":true,"reasoning_options":[{"type":"toggle"}],"tool_call":true},"glm-5.2":{"limit":{"context":1000000,"output":131072},"modalities":{"input":["text"],"output":["text"]},"name":"GLM-5.2","reasoning":true,"reasoning_options":[{"type":"effort","values":["high","max"]}],"tool_call":true},"glm-5.3":{"limit":{"context":1000000,"output":131072},"modalities":{"input":["text"],"output":["text"]},"name":"GLM-5.3","reasoning":true,"reasoning_options":[{"type":"effort","values":["low","high","max"]}],"tool_call":true},"happyhorse-1.1-i2v":{"limit":{"context":0,"output":0},"modalities":{"input":["image","text"],"output":["video"]},"name":"HappyHorse 1.1 Image-to-Video","reasoning":false,"tool_call":false},"happyhorse-1.1-r2v":{"limit":{"context":0,"output":0},"modalities":{"input":["image","text"],"output":["video"]},"name":"HappyHorse 1.1 Reference-to-Video","reasoning":false,"tool_call":false},"happyhorse-1.1-t2v":{"limit":{"context":0,"output":0},"modalities":{"input":["text"],"output":["video"]},"name":"HappyHorse 1.1 Text-to-Video","reasoning":false,"tool_call":false},"kimi-k2.5":{"limit":{"context":262144,"output":98304},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Kimi K2.5","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"budget_tokens"}],"tool_call":true},"kimi-k2.6":{"limit":{"context":262144,"output":262144},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Kimi K2.6","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"budget_tokens"}],"tool_call":true},"kimi-k2.7-code":{"limit":{"context":262144,"output":262144},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Kimi K2.7 Code","reasoning":true,"reasoning_options":[{"type":"toggle"},{"type":"budget_tokens"}],"tool_call":true},"qwen-image-2.0":{"limit":{"context":8192,"output":0},"modalities":{"input":["text"],"output":["image"]},"name":"Qwen Image 2.0","reasoning":false,"tool_call":false},"qwen-image-2.0-pro":{"limit":{"context":8192,"output":0},"modalities":{"input":["text"],"output":["image"]},"name":"Qwen Image 2.0 Pro","reasoning":false,"tool_call":false},"qwen3.6-flash":{"limit":{"context":1000000,"output":65536},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Qwen3.6 Flash","reasoning":true,"reasoning_options":[{"type":"toggle"},{"max":131072,"type":"budget_tokens"}],"tool_call":true},"qwen3.6-plus":{"limit":{"context":1000000,"output":65536},"modalities":{"input":["text","image","video"],"output":["text"]},"name":"Qwen3.6 Plus","reasoning":true,"reasoning_options":[{"type":"toggle"},{"max":131072,"type":"budget_tokens"}],"tool_call":true},"qwen3.7-max":{"limit":{"context":1000000,Line truncated
|
||||
@@ -223,7 +223,7 @@ mod tests {
|
||||
"snapshot lost providers: {}",
|
||||
catalog.len()
|
||||
);
|
||||
let k3 = lookup(catalog, "kimi-for-coding", "k3").expect("k3 present");
|
||||
let k3 = lookup(catalog, "kimi-code-plan-cn", "k3").expect("k3 present");
|
||||
assert_eq!(k3.context, 1_048_576, "k3 context must match the live wire");
|
||||
assert_eq!(k3.efforts, ["low", "high", "max"]);
|
||||
assert!(k3.reasoning);
|
||||
@@ -232,6 +232,21 @@ mod tests {
|
||||
assert_eq!(opus.efforts, ["low", "medium", "high", "xhigh", "max"]);
|
||||
}
|
||||
|
||||
/// `restrict_to_enriched` drops a live listing id the enrichment catalog
|
||||
/// does not know, so the bundled snapshot must admit the current flagship
|
||||
/// models offline: grok-4.7 on xai (the `xai`/`xai-grok` rows) and
|
||||
/// gpt-6-astra on the API-key `openai` row.
|
||||
#[test]
|
||||
fn bundled_snapshot_admits_the_current_flagship_models() {
|
||||
let catalog = bundled_enrichment();
|
||||
let grok = lookup(catalog, "xai", "grok-4.7").expect("grok-4.7 present");
|
||||
assert!(grok.tool_call, "a non-tool-calling model is dropped");
|
||||
assert_eq!(grok.context, 500_000);
|
||||
let astra = lookup(catalog, "openai", "gpt-6-astra").expect("gpt-6-astra present");
|
||||
assert!(astra.tool_call);
|
||||
assert_eq!(astra.context, 1_050_000);
|
||||
}
|
||||
|
||||
/// Wire-served fields are never overwritten; absent fields are filled.
|
||||
#[test]
|
||||
fn enrich_fills_gaps_and_never_overwrites_wire() {
|
||||
|
||||
@@ -400,7 +400,7 @@ const KIMI_CODE_SPEC: PlatformSpec = PlatformSpec {
|
||||
vendor: "Kimi",
|
||||
console_host: None,
|
||||
login_label: None,
|
||||
models_dev_id: Some("kimi-for-coding"),
|
||||
models_dev_id: Some("kimi-code-plan-cn"),
|
||||
wire_serves_metadata: true,
|
||||
wire_api: PlatformWireApi::ChatCompletions,
|
||||
listing: ListingDialect::OpenAi,
|
||||
@@ -987,7 +987,7 @@ const KIMI_CODING_SPEC: PlatformSpec = PlatformSpec {
|
||||
vendor: "Kimi",
|
||||
console_host: Some("www.kimi.com"),
|
||||
login_label: Some("Kimi For Coding (API key)"),
|
||||
models_dev_id: Some("kimi-for-coding"),
|
||||
models_dev_id: Some("kimi-code-plan-cn"),
|
||||
wire_serves_metadata: true,
|
||||
wire_api: PlatformWireApi::ChatCompletions,
|
||||
listing: ListingDialect::OpenAi,
|
||||
@@ -1570,9 +1570,10 @@ impl PlatformId {
|
||||
/// The compiled-in catalog for a platform that serves NO live `/models`
|
||||
/// listing (openai-codex), or `None` when the catalog comes from the wire.
|
||||
///
|
||||
/// openai-codex's 4 models are HARDCODED (read from the official Codex CLI's
|
||||
/// `models_cache.json`, the `visibility=="list"` AND `supported_in_api==true`
|
||||
/// set) because OpenAI exposes no stable public models endpoint for the
|
||||
/// openai-codex's 5 models are HARDCODED (read from the Codex backend
|
||||
/// catalog on 2026-09-21, the `visibility=="list"` AND
|
||||
/// `supported_in_api==true` set) because OpenAI exposes no stable public
|
||||
/// models endpoint for the
|
||||
/// ChatGPT Codex backend. Each entry carries context window + per-model
|
||||
/// selectable reasoning efforts (incl. the codex-only `xhigh`/`max`
|
||||
/// tiers), so the fetch path maps them through the SAME
|
||||
@@ -1606,14 +1607,21 @@ fn codex_wire_model(slug: &str, display_name: &str, efforts: &[&str], default: &
|
||||
}
|
||||
}
|
||||
|
||||
/// The HARDCODED openai-codex catalog: exactly the 4 `visibility=="list"` AND
|
||||
/// `supported_in_api==true` models from the Codex CLI model cache. The
|
||||
/// `gpt-5.3-codex-spark` (supported_in_api=false → not served by /responses),
|
||||
/// `gpt-5.4`, `gpt-5.4-mini`, and `codex-auto-review` (visibility="hide") models
|
||||
/// are deliberately EXCLUDED — they would list-but-not-work or are not
|
||||
/// user-facing (fail-fast: never advertise a model the backend rejects).
|
||||
/// The HARDCODED openai-codex catalog: exactly the 5 `visibility=="list"` AND
|
||||
/// `supported_in_api==true` models the Codex backend served on 2026-09-21, in
|
||||
/// its own priority order. `gpt-reserve` and `codex-auto-review`
|
||||
/// (visibility="hide") are deliberately EXCLUDED — they are not user-facing
|
||||
/// (fail-fast: never advertise a model the backend rejects). `gpt-6-astra`
|
||||
/// also advertises an `ultra` tier above `max`; kigi has no such level, so it
|
||||
/// is not listed here.
|
||||
fn openai_codex_wire_models() -> Vec<WireModel> {
|
||||
vec![
|
||||
codex_wire_model(
|
||||
"gpt-6-astra",
|
||||
"GPT-6-Astra",
|
||||
&["low", "medium", "high", "xhigh", "max"],
|
||||
"medium",
|
||||
),
|
||||
codex_wire_model(
|
||||
"gpt-5.6-sol",
|
||||
"GPT-5.6-Sol",
|
||||
@@ -2653,29 +2661,30 @@ mod tests {
|
||||
assert_eq!(c.base_url(), "https://mock.codex/codex");
|
||||
}
|
||||
|
||||
/// The HARDCODED openai-codex catalog is exactly the 4 supported+listed
|
||||
/// The HARDCODED openai-codex catalog is exactly the 5 supported+listed
|
||||
/// models, keyed by slug, ctx 272000, each exposing its exact supported
|
||||
/// efforts (incl. the codex-only `xhigh`/`max` tiers). The
|
||||
/// list-but-broken / hidden models are absent. Every other platform serves
|
||||
/// NO hardcoded catalog (its models come from the live wire).
|
||||
/// efforts (incl. the codex-only `xhigh`/`max` tiers). The hidden models
|
||||
/// are absent. Every other platform serves NO hardcoded catalog (its
|
||||
/// models come from the live wire).
|
||||
#[test]
|
||||
fn openai_codex_hardcoded_catalog_is_the_four_supported_models() {
|
||||
fn openai_codex_hardcoded_catalog_is_the_five_supported_models() {
|
||||
let catalog = PlatformId::OpenaiCodex
|
||||
.hardcoded_catalog()
|
||||
.expect("openai-codex serves a hardcoded catalog");
|
||||
let ids: Vec<&str> = catalog.iter().map(|m| m.id.as_str()).collect();
|
||||
assert_eq!(
|
||||
ids,
|
||||
vec!["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.5"],
|
||||
"exactly the 4 visibility=list AND supported_in_api=true models"
|
||||
vec![
|
||||
"gpt-6-astra",
|
||||
"gpt-5.6-sol",
|
||||
"gpt-5.6-terra",
|
||||
"gpt-5.6-luna",
|
||||
"gpt-5.5"
|
||||
],
|
||||
"exactly the 5 visibility=list AND supported_in_api=true models"
|
||||
);
|
||||
// Excluded: list-but-not-served + hidden models never appear.
|
||||
for absent in [
|
||||
"gpt-5.3-codex-spark",
|
||||
"gpt-5.4",
|
||||
"gpt-5.4-mini",
|
||||
"codex-auto-review",
|
||||
] {
|
||||
// Excluded: hidden models never appear.
|
||||
for absent in ["gpt-reserve", "codex-auto-review"] {
|
||||
assert!(
|
||||
!ids.contains(&absent),
|
||||
"{absent} must be excluded from the hardcoded catalog"
|
||||
@@ -2700,6 +2709,11 @@ mod tests {
|
||||
.valid_efforts
|
||||
.clone()
|
||||
};
|
||||
assert_eq!(
|
||||
efforts("gpt-6-astra"),
|
||||
["low", "medium", "high", "xhigh", "max"],
|
||||
"`ultra` is advertised above `max` but kigi has no such level"
|
||||
);
|
||||
assert_eq!(
|
||||
efforts("gpt-5.6-sol"),
|
||||
["low", "medium", "high", "xhigh", "max"]
|
||||
@@ -2725,6 +2739,7 @@ mod tests {
|
||||
.default_effort
|
||||
.clone()
|
||||
};
|
||||
assert_eq!(default("gpt-6-astra").as_deref(), Some("medium"));
|
||||
assert_eq!(default("gpt-5.6-sol").as_deref(), Some("low"));
|
||||
assert_eq!(default("gpt-5.6-terra").as_deref(), Some("medium"));
|
||||
// Only openai-codex has a hardcoded catalog; every wire platform is None.
|
||||
|
||||
@@ -375,7 +375,6 @@ impl TerminalContext {
|
||||
return Some("apple_terminal");
|
||||
}
|
||||
if self.is_vte_based() {
|
||||
// WHY: central helper replaces VTE duplication
|
||||
return Some("vte");
|
||||
}
|
||||
if self.brand == TerminalName::WindowsTerminal {
|
||||
@@ -429,74 +428,29 @@ impl TerminalContext {
|
||||
}
|
||||
|
||||
/// Whether the running terminal cannot distinguish `Shift+Enter` from
|
||||
/// bare `Enter` at the byte level, so the UI should advertise
|
||||
/// `Alt+Enter` for newline insertion instead.
|
||||
/// bare `Enter`, so the UI should advertise `Alt+Enter` (delivered as
|
||||
/// `ESC`+`CR`) for newline insertion instead.
|
||||
///
|
||||
/// Distinguishing `Shift+Enter` requires the Kitty keyboard protocol
|
||||
/// (KKP) to be negotiated. This returns `true` for the environments
|
||||
/// where the pager cannot rely on KKP for a usable `Shift+Enter`:
|
||||
/// Follows [`Self::kitty_skip_reason`] rather than a second brand list:
|
||||
/// when the protocol is not negotiated the modifier is lost, and the two
|
||||
/// drifted once already (VTE advertised a chord that never arrived — its
|
||||
/// `Return` keymap encodes only Alt, through 0.82.0 at least, and no VTE
|
||||
/// release carries the protocol). Two skips still deliver it — Apple
|
||||
/// Terminal drops the flags but `route_enter` polls CoreGraphics, and
|
||||
/// Windows console key records carry SHIFT with no protocol at all.
|
||||
///
|
||||
/// 1. **Legacy VTE** (GNOME Terminal, Ptyxis, kgx, Tilix, etc.) whose
|
||||
/// `VTE_VERSION` is below `8200` (VTE 0.82.0, the first release with
|
||||
/// KKP, merged in
|
||||
/// [MR !14](https://gitlab.gnome.org/GNOME/vte/-/merge_requests/14)).
|
||||
/// Also true when the brand is detected as VTE but `VTE_VERSION` is
|
||||
/// missing or unparseable — we conservatively assume old.
|
||||
/// 2. **VS Code's integrated terminal (xterm.js) and VS Code-family /
|
||||
/// xterm.js IDE forks**. xterm.js only partially implements KKP —
|
||||
/// it mis-encodes shifted printable keys — so the pager deliberately
|
||||
/// never negotiates KKP for them (see [`Self::kitty_skip_reason`]
|
||||
/// `== "vscode"` and [xterm.js#5823](https://github.com/xtermjs/xterm.js/issues/5823)).
|
||||
/// Without KKP, xterm.js sends a bare `CR` for `Shift+Enter`,
|
||||
/// byte-for-byte identical to `Enter`.
|
||||
/// 3. **Unidentified terminals with no multiplexer**, where the pager
|
||||
/// also skips KKP (no positive evidence of support — typically
|
||||
/// VS Code's xterm.js reached over SSH, where `TERM_PROGRAM` isn't
|
||||
/// forwarded and the brand falls back to `Unknown`).
|
||||
///
|
||||
/// In every case `Alt+Enter` (delivered as `ESC`+`CR`) is the reliable
|
||||
/// newline chord and is what the UI advertises.
|
||||
/// KNOWN GAP: WezTerm inside screen or an old tmux gets Alt+Enter as the
|
||||
/// advice while its own default binding spends that chord on
|
||||
/// ToggleFullScreen. Neither chord reaches kigi there; the multiplexer
|
||||
/// warning carries the real fix, and `\`+Enter still inserts a newline.
|
||||
pub fn shift_enter_unavailable(&self) -> bool {
|
||||
// WHY: central helper + version gating
|
||||
let is_vte = self.is_vte_based();
|
||||
if is_vte {
|
||||
return match self
|
||||
.vte_version
|
||||
.as_deref()
|
||||
.and_then(|v| v.parse::<u32>().ok())
|
||||
{
|
||||
Some(ver) => ver < 8200,
|
||||
// Brand=Vte but no parseable version — conservative: assume old.
|
||||
None => true,
|
||||
};
|
||||
match self.kitty_skip_reason() {
|
||||
None | Some("apple_terminal") => false,
|
||||
// A bare ConHost is only optimistically refined to Windows
|
||||
// Terminal; it still advertises Alt+Enter.
|
||||
Some("windows_terminal") => self.env_brand.is_capability_unclassified(),
|
||||
Some(_) => true,
|
||||
}
|
||||
|
||||
// VS Code / xterm.js and its forks: KKP is never negotiated, so
|
||||
// Shift+Enter arrives as a bare CR indistinguishable from Enter.
|
||||
if matches!(
|
||||
self.brand,
|
||||
TerminalName::VsCode
|
||||
| TerminalName::Cursor
|
||||
| TerminalName::Windsurf
|
||||
| TerminalName::Zed
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Unidentified / unclassified brand with no multiplexer: KKP is
|
||||
// skipped (see `kitty_skip_reason`). This is the common
|
||||
// VS Code-over-SSH shape (brand falls back to Unknown). On native
|
||||
// Windows the effective `brand` is refined to WindowsTerminal, so
|
||||
// consult `env_brand` — a bare ConHost is still env-Unknown and
|
||||
// must advertise Alt+Enter even though we optimistically treat it
|
||||
// as WT for capabilities.
|
||||
if self.env_brand.is_capability_unclassified()
|
||||
&& self.multiplexer == MultiplexerKind::Undetected
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
false
|
||||
}
|
||||
|
||||
/// True when `Ctrl+.` cannot be delivered reliably as a shortcuts primary.
|
||||
|
||||
@@ -1443,7 +1443,7 @@ fn kitty_skip_vscode_over_tmux() {
|
||||
|
||||
#[test]
|
||||
fn kitty_skip_vte_version() {
|
||||
// VTE does not support Kitty keyboard protocol and crossterm's probe
|
||||
// No VTE release has the Kitty keyboard protocol and crossterm's probe
|
||||
// can false-positive on it. https://gitlab.gnome.org/GNOME/vte/-/issues/2601
|
||||
let ctx = TerminalContext {
|
||||
vte_version: Some("7402".to_owned()),
|
||||
@@ -1461,73 +1461,68 @@ fn kitty_skip_vte_brand() {
|
||||
assert_eq!(ctx.kitty_skip_reason(), Some("vte"));
|
||||
}
|
||||
|
||||
// shift_enter_unavailable: VTE version gating for Shift+Enter
|
||||
// shift_enter_unavailable: VTE never delivers Shift+Enter
|
||||
//
|
||||
// VTE 0.82.0 (= VTE_VERSION 8200) is the first release containing the
|
||||
// Kitty keyboard protocol; earlier versions cannot distinguish
|
||||
// Shift+Enter from bare Enter, so the UI should advertise Alt+Enter
|
||||
// for newline insertion instead.
|
||||
// No VTE release carries the Kitty keyboard protocol: at 0.82.0 the word
|
||||
// "kitty" appears nowhere in the parser or widget, and
|
||||
// `_vte_keymap_GDK_Return` encodes only Alt (`ESC CR`), so Shift+Enter is
|
||||
// the same bare CR as Enter. The UI advertises Alt+Enter instead.
|
||||
|
||||
#[test]
|
||||
fn shift_enter_unavailable_legacy_vte_version() {
|
||||
// VTE 0.64.2 (real user report) — well below the KKP cutoff.
|
||||
let ctx = TerminalContext {
|
||||
vte_version: Some("6402".to_owned()),
|
||||
..Default::default()
|
||||
};
|
||||
assert!(ctx.shift_enter_unavailable());
|
||||
fn shift_enter_unavailable_on_every_vte() {
|
||||
for version in [Some("6402"), Some("8200"), Some("8401"), None] {
|
||||
let ctx = TerminalContext {
|
||||
brand: TerminalName::Vte,
|
||||
env_brand: TerminalName::Vte,
|
||||
vte_version: version.map(str::to_owned),
|
||||
..Default::default()
|
||||
};
|
||||
assert_eq!(ctx.kitty_skip_reason(), Some("vte"), "VTE {version:?}");
|
||||
assert!(ctx.shift_enter_unavailable(), "VTE {version:?}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn shift_enter_unavailable_just_below_cutoff() {
|
||||
// VTE 0.81.99 — anything below 8200 must return true.
|
||||
let ctx = TerminalContext {
|
||||
vte_version: Some("8199".to_owned()),
|
||||
..Default::default()
|
||||
};
|
||||
assert!(ctx.shift_enter_unavailable());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn shift_enter_available_modern_vte() {
|
||||
// VTE 0.82.0 — first release with KKP.
|
||||
let ctx = TerminalContext {
|
||||
vte_version: Some("8200".to_owned()),
|
||||
..Default::default()
|
||||
};
|
||||
assert!(!ctx.shift_enter_unavailable());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn shift_enter_available_future_vte() {
|
||||
// VTE 0.84.1 — well above the cutoff.
|
||||
let ctx = TerminalContext {
|
||||
vte_version: Some("8401".to_owned()),
|
||||
..Default::default()
|
||||
};
|
||||
assert!(!ctx.shift_enter_unavailable());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn shift_enter_unavailable_vte_brand_no_version() {
|
||||
// Brand detected as VTE but VTE_VERSION missing — conservative: old.
|
||||
let ctx = TerminalContext {
|
||||
brand: TerminalName::Vte,
|
||||
vte_version: None,
|
||||
..Default::default()
|
||||
};
|
||||
assert!(ctx.shift_enter_unavailable());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn shift_enter_unavailable_unparseable_version() {
|
||||
// Garbage in VTE_VERSION — conservative: old.
|
||||
let ctx = TerminalContext {
|
||||
brand: TerminalName::Vte,
|
||||
vte_version: Some("not-a-number".to_owned()),
|
||||
..Default::default()
|
||||
};
|
||||
assert!(ctx.shift_enter_unavailable());
|
||||
fn shift_enter_unavailable_follows_every_kitty_skip() {
|
||||
// A skipped protocol means the modifier never arrives, whatever the
|
||||
// reason — JediTerm, screen and a multiplexer that eats extended keys
|
||||
// included. Apple Terminal and Windows Terminal are the two skips with
|
||||
// another way in.
|
||||
for ctx in [
|
||||
TerminalContext {
|
||||
brand: TerminalName::JetBrains,
|
||||
env_brand: TerminalName::JetBrains,
|
||||
..Default::default()
|
||||
},
|
||||
TerminalContext {
|
||||
brand: TerminalName::Kitty,
|
||||
env_brand: TerminalName::Kitty,
|
||||
multiplexer: MultiplexerKind::Screen,
|
||||
..Default::default()
|
||||
},
|
||||
TerminalContext {
|
||||
brand: TerminalName::Kitty,
|
||||
env_brand: TerminalName::Kitty,
|
||||
multiplexer: MultiplexerKind::Tmux,
|
||||
tmux_version: Some("3.2".to_owned()),
|
||||
..Default::default()
|
||||
},
|
||||
// A VTE carrying a recent VTE_VERSION is no different.
|
||||
TerminalContext {
|
||||
brand: TerminalName::Vte,
|
||||
env_brand: TerminalName::Vte,
|
||||
vte_version: Some("8200".to_owned()),
|
||||
multiplexer: MultiplexerKind::Screen,
|
||||
..Default::default()
|
||||
},
|
||||
] {
|
||||
assert!(ctx.kitty_skip_reason().is_some());
|
||||
assert!(
|
||||
ctx.shift_enter_unavailable(),
|
||||
"{:?} skips the protocol, so Shift+Enter cannot arrive",
|
||||
ctx.brand
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -367,7 +367,7 @@ mod tests {
|
||||
let _url = EnvGuard::set(MODELS_DEV_URL_ENV, "http://127.0.0.1:1/api.json");
|
||||
let catalog = load_enrichment_catalog_at(&path);
|
||||
assert!(
|
||||
kigi_models::enrichment::lookup(&catalog, "kimi-for-coding", "k3").is_some(),
|
||||
kigi_models::enrichment::lookup(&catalog, "kimi-code-plan-cn", "k3").is_some(),
|
||||
"bundled snapshot must back a total refresh failure"
|
||||
);
|
||||
assert!(!path.exists(), "failed refresh must not write a cache");
|
||||
@@ -385,7 +385,7 @@ mod tests {
|
||||
let _url = EnvGuard::set(MODELS_DEV_URL_ENV, token);
|
||||
assert!(refresh_url().is_none(), "token {token:?} must disable");
|
||||
let catalog = load_enrichment_catalog_at(&path);
|
||||
assert!(kigi_models::enrichment::lookup(&catalog, "kimi-for-coding", "k3").is_some());
|
||||
assert!(kigi_models::enrichment::lookup(&catalog, "kimi-code-plan-cn", "k3").is_some());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1473,7 +1473,7 @@ mod tests {
|
||||
|
||||
/// openai-codex fetch: the catalog is HARDCODED, so the fetch path
|
||||
/// short-circuits BEFORE any HTTP — there is NO mock `/models` server, yet
|
||||
/// the fetch returns exactly the 4 compiled-in models keyed
|
||||
/// the fetch returns exactly the 5 compiled-in models keyed
|
||||
/// `openai-codex/<slug>` on the Responses backend, ctx 272000, each exposing
|
||||
/// its exact reasoning efforts (incl. the codex-only `xhigh`/`max`).
|
||||
/// A BOGUS base URL confirms no live `/models` request is attempted (it would
|
||||
@@ -1510,20 +1510,16 @@ mod tests {
|
||||
.map(|m| m.id.as_deref().unwrap_or_default())
|
||||
.collect::<Vec<_>>(),
|
||||
vec![
|
||||
"openai-codex/gpt-6-astra",
|
||||
"openai-codex/gpt-5.6-sol",
|
||||
"openai-codex/gpt-5.6-terra",
|
||||
"openai-codex/gpt-5.6-luna",
|
||||
"openai-codex/gpt-5.5",
|
||||
],
|
||||
"exactly the 4 hardcoded models, keyed openai-codex/<slug>"
|
||||
"exactly the 5 hardcoded models, keyed openai-codex/<slug>"
|
||||
);
|
||||
// Excluded models never appear.
|
||||
for absent in [
|
||||
"openai-codex/gpt-5.3-codex-spark",
|
||||
"openai-codex/gpt-5.4",
|
||||
"openai-codex/gpt-5.4-mini",
|
||||
"openai-codex/codex-auto-review",
|
||||
] {
|
||||
for absent in ["openai-codex/gpt-reserve", "openai-codex/codex-auto-review"] {
|
||||
assert!(
|
||||
!result
|
||||
.models
|
||||
@@ -1532,7 +1528,14 @@ mod tests {
|
||||
"{absent} must be absent from the hardcoded catalog"
|
||||
);
|
||||
}
|
||||
let sol = &result.models[0];
|
||||
let astra = &result.models[0];
|
||||
assert_eq!(astra.name.as_deref(), Some("GPT-6-Astra"));
|
||||
assert_eq!(astra.context_window.get(), 272_000);
|
||||
let sol = result
|
||||
.models
|
||||
.iter()
|
||||
.find(|m| m.id.as_deref() == Some("openai-codex/gpt-5.6-sol"))
|
||||
.unwrap();
|
||||
assert_eq!(
|
||||
sol.api_backend,
|
||||
crate::sampling::ApiBackend::Responses,
|
||||
|
||||
@@ -96,16 +96,15 @@ impl SlashCommand for TerminalSetupCommand {
|
||||
|
||||
// Some terminals can't distinguish Shift+Enter from bare Enter at
|
||||
// the byte level because the Kitty keyboard protocol isn't
|
||||
// negotiated (VTE < 0.82, or VS Code's xterm.js which mis-encodes
|
||||
// shifted keys). Point users at Alt+Enter, which is reliably
|
||||
// delivered as ESC+CR. Suppressed when the WezTerm warning fired:
|
||||
// stock WezTerm binds Alt+Enter to ToggleFullScreen, so advertising
|
||||
// it would contradict that warning's `\`+Enter guidance.
|
||||
if ctx.shift_enter_unavailable() && !wezterm_kkp_off {
|
||||
// negotiated (VTE, VS Code's xterm.js, a multiplexer that eats
|
||||
// extended keys). Point users at Alt+Enter, which is reliably
|
||||
// delivered as ESC+CR. Never for WezTerm: it binds Alt+Enter to
|
||||
// ToggleFullScreen, so its own warning's `\`+Enter guidance stands.
|
||||
if ctx.shift_enter_unavailable() && !wezterm_kkp_off && ctx.brand != TerminalName::WezTerm {
|
||||
let detail = if ctx.vte_version.is_some() || ctx.brand == TerminalName::Vte {
|
||||
match ctx.vte_version.as_deref() {
|
||||
Some(v) => format!("VTE {v}; need >= 8200 for Shift+Enter"),
|
||||
None => "legacy VTE; need VTE >= 0.82 for Shift+Enter".to_owned(),
|
||||
Some(v) => format!("VTE {v}: no Kitty keyboard protocol"),
|
||||
None => "VTE: no Kitty keyboard protocol".to_owned(),
|
||||
}
|
||||
} else if matches!(
|
||||
ctx.brand,
|
||||
|
||||
@@ -24,7 +24,7 @@ TARGETS = [
|
||||
"anthropic", "azure", "openai", "deepseek", "nvidia", "google",
|
||||
"amazon-bedrock", "mistral", "groq", "cerebras", "cloudflare-ai-gateway",
|
||||
"xai", "togetherai", "fireworks-ai", "opencode", "opencode-go",
|
||||
"kimi-for-coding", "moonshotai", "moonshotai-cn", "minimax", "minimax-cn",
|
||||
"kimi-code-plan-cn", "moonshotai", "moonshotai-cn", "minimax", "minimax-cn",
|
||||
"alibaba-token-plan", "alibaba-token-plan-cn", "xiaomi",
|
||||
"xiaomi-token-plan-cn", "zai-coding-plan", "zhipuai-coding-plan",
|
||||
"github-copilot", "vercel",
|
||||
|
||||
Reference in new issue
Block a user