opencode-cmd-provider 1.6.2 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,39 @@
1
- # Changelog
1
+ ## 1.6.3 - 2026-09-02
2
+
3
+ ### Model catalog
4
+
5
+ ## Model catalog
6
+
7
+ - **FACTS_LAST_REFRESHED**: `2026-09-01` → `2026-09-01`
8
+
9
+ No changes.
10
+
11
+ ### Reasoning classification
12
+
13
+ ## Reasoning classification
14
+
15
+ - **CLASSIFICATION_LAST_REFRESHED**: `` → `2026-09-02`
16
+
17
+ _first refresh — no classification data on the before side._
18
+
19
+ ### Deals intelligence
20
+
21
+ ## Deals intelligence
22
+
23
+ - **DEAL_LAST_REFRESHED**: `2026-09-01` → `2026-09-01`
24
+
25
+ No changes.
26
+
27
+ ### Full changeset
28
+
29
+ The generated-catalog diff above is only the data layer (the new classification module — first refresh). This PR carries the whole derived-classification implementation (#109–#116): the shared RSC record source (scripts/rsc-source.mjs), the classification generator in the refresh ladder, the derived runtime (src/provider/reasoning.ts), the semantic diff sections + classificationChanged boolean, the meaningful-change drift detection (date-only churn opens no PR), ADR-0006/0007 + glossary + docs, and the auto-release workflow. npm test green on the head commit; per-ticket summary in the commit trail.
30
+
31
+ ### Maintainer actions before merge (ADR-0007)
32
+
33
+ 1. Add the RELEASE_PUSH_TOKEN secret (fine-grained PAT, this repo only, Contents: Read and write) so the tag push triggers the release pipeline — a default-token push does not start other workflows.
34
+ 2. Branch protection is currently off, so the bot push lands freely; when you enable it, add a bypass for the pushing identity (ruleset bypass list).
35
+
36
+ _Opened from `catalog-refresh/2026-09-02` so merging exercises the new merge-to-release path: the auto-release workflow cuts `chore(release): 1.6.3` + tags v1.6.3, and release.yml publishes._
2
37
 
3
38
  ## 1.6.2 - 2026-09-01
4
39
 
package/README.md CHANGED
@@ -161,6 +161,11 @@ auto-registered models only.
161
161
  - Snapshot — `src/catalog/snapshot.ts` (model ids, names, context lengths) plus
162
162
  `src/catalog/facts.ts` (reasoning efforts, per-1M-token rates, input
163
163
  modalities). Regenerated from the live catalog via `npm run refresh:snapshot`.
164
+ - Classification — `src/catalog/classification.ts` (per-model reasoning
165
+ capability, derived from the `reasoning` flag on the docs' RSC slug
166
+ records; ADR-0006). Regenerated via `npm run refresh:classification`; the
167
+ runtime derives its reasoning metadata from this module, so upstream
168
+ classification changes land as data, never as hand edits.
164
169
  - Deals — `src/deals/catalog.ts` (per-model tier, benchmarks, deal
165
170
  discounts, `was`/`now` rates, peak/off-peak windows, and GOAT/Pro monthly
166
171
  allowances for every model). Extracted from the Command Code docs' RSC
@@ -173,12 +178,16 @@ auto-registered models only.
173
178
  Run `npm run refresh` to regenerate everything at once: the snapshot and
174
179
  facts come from the live Command Code catalog, the RSC fixtures are
175
180
  re-captured from the live docs pages (`npm run refresh:fixtures`), and the
176
- deals catalog is regenerated from the fresh fixtures — so fixtures, catalog,
177
- and tests stay in lockstep. A daily GitHub Actions cron
181
+ classification module and deals catalog are regenerated from the fresh
182
+ fixtures — so fixtures, catalogs, and tests stay in lockstep. A daily GitHub
183
+ Actions cron
178
184
  (`.github/workflows/catalog-refresh.yml`, 06:00 UTC, also manually
179
185
  triggerable via `workflow_dispatch`) runs the same pipeline: when upstream
180
186
  moved it opens a `chore: catalog refresh` PR whose body is the human-readable
181
- diff from `scripts/diff-catalog.mjs`; when nothing drifted it exits silently.
187
+ diff from `scripts/diff-catalog.mjs` model catalog, reasoning
188
+ classification (flips, new reasoning models, retirements, active overrides),
189
+ and deals sections; when nothing meaningful drifted it exits silently (a
190
+ run whose only change is the refreshed-date stamps opens no PR).
182
191
 
183
192
  Auto-registration adds no network latency to OpenCode startup — the snapshot is
184
193
  bundled, and the plugin never contacts the Command Code API to list models. The
@@ -199,7 +208,13 @@ compatible API endpoints:
199
208
 
200
209
  ### Reasoning support
201
210
 
202
- Reasoning metadata is enriched only for models whose Command Code effort support is known. Supported levels are sent as the documented `reasoning_effort` request field; `off`, unsupported levels, and newly discovered models without metadata do not add reasoning fields to the request. No prompt instructions are injected.
211
+ Reasoning metadata is derived from the generated catalogs (ADR-0006): models
212
+ upstream flags as reasoning-capable advertise `reasoning: true`
213
+ automatically — with explicit effort variants when the generated facts list
214
+ effort levels, and without variants otherwise. Supported levels are sent as
215
+ the documented `reasoning_effort` request field; `off`, unsupported levels,
216
+ and newly discovered models without metadata do not add reasoning fields to
217
+ the request. No prompt instructions are injected.
203
218
 
204
219
  Reasoning blocks from completed assistant turns are not replayed to Command Code in later requests; only the user-visible text and completed tool calls are sent back as history. This prevents prior private reasoning traces from interfering with reasoning on follow-up turns.
205
220
 
@@ -0,0 +1,7 @@
1
+ export declare const CLASSIFICATION_SOURCE_URLS: ReadonlyArray<string>;
2
+ export declare const CLASSIFICATION_LAST_REFRESHED = "2026-09-02";
3
+ export declare const CLASSIFICATION_OVERRIDES: Readonly<Record<string, {
4
+ capability: boolean;
5
+ justification: string;
6
+ }>>;
7
+ export declare const MODEL_REASONING_CAPABILITY: Readonly<Record<string, boolean>>;
@@ -0,0 +1,89 @@
1
+ // src/catalog/classification.ts — GENERATED by scripts/refresh-classification.mjs. Do not edit.
2
+ //
3
+ // Per-model reasoning capability, derived from the `reasoning` flag on
4
+ // the Command Code docs' RSC slug records (plans/goat + plans/pro,
5
+ // slug-id aliasing applied, keyed by snapshot id) — the same
6
+ // snapshot-keyed records the Deals catalog consumes. Classification is
7
+ // upstream-managed and derived, never hand-maintained; the only human
8
+ // seam is CLASSIFICATION_OVERRIDES, whose entries each carry a written
9
+ // justification naming the upstream disagreement (see ADR-0006).
10
+ // Regenerate with `npm run refresh` (offline:
11
+ // `npm run refresh:classification -- --fixtures`).
12
+ export const CLASSIFICATION_SOURCE_URLS = [
13
+ "https://commandcode.ai/docs/plans/goat",
14
+ "https://commandcode.ai/docs/plans/pro",
15
+ ];
16
+ export const CLASSIFICATION_LAST_REFRESHED = "2026-09-02";
17
+ // Active capability overrides. Empty = upstream data is truth.
18
+ // Every entry requires a written justification naming the upstream
19
+ // disagreement; entries are rendered into the refresh PR body.
20
+ export const CLASSIFICATION_OVERRIDES = {};
21
+ export const MODEL_REASONING_CAPABILITY = {
22
+ "claude-fable-5": true,
23
+ "claude-fable-5-1": true,
24
+ "claude-haiku-4-5-20251001": false,
25
+ "claude-opus-4-7": true,
26
+ "claude-opus-4-8": true,
27
+ "claude-opus-5": true,
28
+ "claude-sonnet-4-6": true,
29
+ "claude-sonnet-5": true,
30
+ "deepseek/deepseek-v4-flash": true,
31
+ "deepseek/deepseek-v4-flash-fast": true,
32
+ "deepseek/deepseek-v4-flash-vision-exp": true,
33
+ "deepseek/deepseek-v4-pro": true,
34
+ "google/gemini-3.1-flash-lite": true,
35
+ "google/gemini-3.5-flash": true,
36
+ "google/gemini-3.5-flash-lite": true,
37
+ "google/gemini-3.6-flash": true,
38
+ "google/gemini-3.7-flash": true,
39
+ "google/gemini-3.8-flash": true,
40
+ "gpt-5.3-codex": true,
41
+ "gpt-5.4": true,
42
+ "gpt-5.4-mini": true,
43
+ "gpt-5.5": true,
44
+ "gpt-5.6-luna": true,
45
+ "gpt-5.6-sol": true,
46
+ "gpt-5.6-terra": true,
47
+ "meituan/LongCat-2.0:free": true,
48
+ "meta/muse-spark-1.1": true,
49
+ "meta/muse-spark-1.2": true,
50
+ "meta/muse-spark-1.2-contributor": true,
51
+ "meta/muse-spark-1.3": true,
52
+ "meta/muse-spark-1.3-contributor": true,
53
+ "MiniMaxAI/MiniMax-M2.5": false,
54
+ "MiniMaxAI/MiniMax-M2.7": false,
55
+ "MiniMaxAI/MiniMax-M3": true,
56
+ "moonshotai/Kimi-K2.5": false,
57
+ "moonshotai/Kimi-K2.6": false,
58
+ "moonshotai/Kimi-K2.7-Code": true,
59
+ "moonshotai/Kimi-K2.7-Code-Highspeed": true,
60
+ "moonshotai/Kimi-K3": true,
61
+ "nvidia/nemotron-3-ultra-550b-a55b": true,
62
+ "poolside/laguna-s-2.1-free": true,
63
+ "Qwen/Qwen3.6-Max-Preview": true,
64
+ "Qwen/Qwen3.6-Plus": true,
65
+ "Qwen/Qwen3.7-Flash": true,
66
+ "Qwen/Qwen3.7-Max": true,
67
+ "Qwen/Qwen3.7-Plus": true,
68
+ "Qwen/Qwen3.8-27B": true,
69
+ "Qwen/Qwen3.8-Flash": true,
70
+ "Qwen/Qwen3.8-Max": true,
71
+ "Qwen/Qwen3.8-Max-0902": true,
72
+ "sakana/fugu-ultra": true,
73
+ "stepfun/Step-3.5-Flash": true,
74
+ "stepfun/Step-3.7-Flash": true,
75
+ "tencent/hy3-paid": true,
76
+ "tencent/hy4-preview": true,
77
+ "thinkingmachines/inkling": true,
78
+ "thinkingmachines/inkling-small": true,
79
+ "xai/grok-4.5": true,
80
+ "xai/grok-4.6": true,
81
+ "xiaomi/mimo-v2.5": false,
82
+ "xiaomi/mimo-v2.5-pro": false,
83
+ "z-ai/glm-5.3-flash": true,
84
+ "zai-org/GLM-5": false,
85
+ "zai-org/GLM-5.1": false,
86
+ "zai-org/GLM-5.2": true,
87
+ "zai-org/GLM-5.2-Fast": false,
88
+ "zai-org/GLM-5.3": true,
89
+ };
@@ -1,7 +1,7 @@
1
- export declare const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.39.2/dist/bundled/command-code-knowledge/reference/models.md";
2
- export declare const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.39.2/dist/cli.mjs";
3
- export declare const FACTS_PACKAGE_VERSION = "1.39.2";
4
- export declare const FACTS_LAST_REFRESHED = "2026-09-01";
1
+ export declare const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.44.0/dist/bundled/command-code-knowledge/reference/models.md";
2
+ export declare const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.44.0/dist/cli.mjs";
3
+ export declare const FACTS_PACKAGE_VERSION = "1.44.0";
4
+ export declare const FACTS_LAST_REFRESHED = "2026-09-02";
5
5
  export declare const MODEL_EFFORTS: Readonly<Record<string, readonly string[]>>;
6
6
  export declare const MODEL_COSTS: Readonly<Record<string, {
7
7
  input: number;
@@ -4,24 +4,27 @@
4
4
  // command-code npm package's bundled model catalog (models.md), plus input
5
5
  // modalities parsed from its CLI bundle (dist/cli.mjs). Regenerate
6
6
  // with `npm run refresh:snapshot`.
7
- export const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.39.2/dist/bundled/command-code-knowledge/reference/models.md";
8
- export const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.39.2/dist/cli.mjs";
9
- export const FACTS_PACKAGE_VERSION = "1.39.2";
10
- export const FACTS_LAST_REFRESHED = "2026-09-01";
7
+ export const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.44.0/dist/bundled/command-code-knowledge/reference/models.md";
8
+ export const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.44.0/dist/cli.mjs";
9
+ export const FACTS_PACKAGE_VERSION = "1.44.0";
10
+ export const FACTS_LAST_REFRESHED = "2026-09-02";
11
11
  export const MODEL_EFFORTS = {
12
12
  "deepseek/deepseek-v4-pro": ["high", "max"],
13
13
  "deepseek/deepseek-v4-flash": ["high", "max"],
14
14
  "deepseek/deepseek-v4-flash-vision-exp": ["high", "max"],
15
15
  "deepseek/deepseek-v4-flash-fast": ["low", "high", "max"],
16
+ "moonshotai/Kimi-K3": ["low", "high", "max"],
16
17
  "z-ai/glm-5.3-flash": ["low", "high", "max"],
17
18
  "zai-org/GLM-5.3": ["low", "high", "max"],
18
19
  "zai-org/GLM-5.2": ["high", "max"],
20
+ "Qwen/Qwen3.8-Max-0902": ["low", "medium", "xhigh"],
19
21
  "Qwen/Qwen3.8-Max": ["low", "medium", "xhigh"],
20
22
  "Qwen/Qwen3.8-27B": ["low", "medium", "xhigh"],
21
23
  "Qwen/Qwen3.8-Flash": ["low", "medium", "xhigh"],
22
24
  "tencent/hy4-preview": ["low", "medium", "high"],
23
25
  "claude-sonnet-5": ["low", "medium", "high", "xhigh", "max"],
24
26
  "claude-sonnet-4-6": ["low", "medium", "high", "xhigh", "max"],
27
+ "claude-fable-5-1": ["low", "medium", "high", "xhigh", "max"],
25
28
  "claude-fable-5": ["low", "medium", "high", "xhigh", "max"],
26
29
  "claude-opus-5": ["low", "medium", "high", "xhigh", "max"],
27
30
  "claude-opus-4-8": ["low", "medium", "high", "xhigh", "max"],
@@ -33,6 +36,7 @@ export const MODEL_EFFORTS = {
33
36
  "gpt-5.4": ["low", "medium", "high", "xhigh"],
34
37
  "gpt-5.3-codex": ["low", "medium", "high", "xhigh"],
35
38
  "gpt-5.4-mini": ["low", "medium", "high"],
39
+ "google/gemini-3.8-flash": ["low", "medium", "high"],
36
40
  "google/gemini-3.7-flash": ["low", "medium", "high"],
37
41
  "google/gemini-3.6-flash": ["low", "medium", "high"],
38
42
  "google/gemini-3.5-flash": ["low", "medium", "high"],
@@ -63,6 +67,7 @@ export const MODEL_COSTS = {
63
67
  "MiniMaxAI/MiniMax-M2.5": { input: 0.3, output: 1.2, cacheRead: 0.03, cacheWrite: 0 },
64
68
  "xiaomi/mimo-v2.5-pro": { input: 0.435, output: 0.87, cacheRead: 0.0036, cacheWrite: 0 },
65
69
  "xiaomi/mimo-v2.5": { input: 0.14, output: 0.28, cacheRead: 0.0028, cacheWrite: 0 },
70
+ "Qwen/Qwen3.8-Max-0902": { input: 2, output: 6, cacheRead: 0.25, cacheWrite: 0 },
66
71
  "Qwen/Qwen3.8-Max": { input: 2, output: 6, cacheRead: 0.25, cacheWrite: 2.5 },
67
72
  "Qwen/Qwen3.8-27B": { input: 0.4, output: 3, cacheRead: 0.04, cacheWrite: 0 },
68
73
  "Qwen/Qwen3.8-Flash": { input: 0.16, output: 0.47, cacheRead: 0.016, cacheWrite: 0 },
@@ -71,6 +76,7 @@ export const MODEL_COSTS = {
71
76
  "Qwen/Qwen3.7-Flash": { input: 0.03, output: 0.13, cacheRead: 0.006, cacheWrite: 0.038 },
72
77
  "Qwen/Qwen3.6-Max-Preview": { input: 1.3, output: 7.8, cacheRead: 0.26, cacheWrite: 1.63 },
73
78
  "Qwen/Qwen3.6-Plus": { input: 0.5, output: 3, cacheRead: 0.1, cacheWrite: 0 },
79
+ "meituan/LongCat-2.0:free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
74
80
  "stepfun/Step-3.7-Flash": { input: 0.2, output: 1.15, cacheRead: 0.04, cacheWrite: 0 },
75
81
  "stepfun/Step-3.5-Flash": { input: 0.1, output: 0.3, cacheRead: 0.02, cacheWrite: 0 },
76
82
  "tencent/hy3-paid": { input: 0.14, output: 0.58, cacheRead: 0.035, cacheWrite: 0 },
@@ -81,6 +87,7 @@ export const MODEL_COSTS = {
81
87
  "poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
82
88
  "claude-sonnet-5": { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 },
83
89
  "claude-sonnet-4-6": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
90
+ "claude-fable-5-1": { input: 10, output: 50, cacheRead: 0.25, cacheWrite: 12.5 },
84
91
  "claude-fable-5": { input: 10, output: 50, cacheRead: 1, cacheWrite: 12.5 },
85
92
  "claude-opus-5": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
86
93
  "claude-opus-4-8": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
@@ -93,6 +100,7 @@ export const MODEL_COSTS = {
93
100
  "gpt-5.4": { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 },
94
101
  "gpt-5.3-codex": { input: 2, output: 8, cacheRead: 0.5, cacheWrite: 0 },
95
102
  "gpt-5.4-mini": { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 },
103
+ "google/gemini-3.8-flash": { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0 },
96
104
  "google/gemini-3.7-flash": { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0.08334 },
97
105
  "google/gemini-3.6-flash": { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0 },
98
106
  "google/gemini-3.5-flash": { input: 1.5, output: 9, cacheRead: 0.15, cacheWrite: 0 },
@@ -102,6 +110,8 @@ export const MODEL_COSTS = {
102
110
  "meta/muse-spark-1.1": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 },
103
111
  "meta/muse-spark-1.2": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 },
104
112
  "meta/muse-spark-1.2-contributor": { input: 0.1, output: 0.2, cacheRead: 0.002, cacheWrite: 0 },
113
+ "meta/muse-spark-1.3": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 },
114
+ "meta/muse-spark-1.3-contributor": { input: 0.1, output: 0.2, cacheRead: 0.002, cacheWrite: 0 },
105
115
  "xai/grok-4.5": { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },
106
116
  "xai/grok-4.6": { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },
107
117
  };
@@ -113,7 +123,9 @@ export const MODEL_INPUT_MODALITIES = {
113
123
  "Qwen/Qwen3.8-27B": ["text", "image"],
114
124
  "Qwen/Qwen3.8-Flash": ["text", "image"],
115
125
  "Qwen/Qwen3.8-Max": ["text", "image"],
126
+ "Qwen/Qwen3.8-Max-0902": ["text", "image"],
116
127
  "claude-fable-5": ["text", "image"],
128
+ "claude-fable-5-1": ["text", "image"],
117
129
  "claude-haiku-4-5-20251001": ["text", "image"],
118
130
  "claude-opus-4-7": ["text", "image"],
119
131
  "claude-opus-4-8": ["text", "image"],
@@ -126,6 +138,7 @@ export const MODEL_INPUT_MODALITIES = {
126
138
  "google/gemini-3.5-flash-lite": ["text", "image"],
127
139
  "google/gemini-3.6-flash": ["text", "image"],
128
140
  "google/gemini-3.7-flash": ["text", "image"],
141
+ "google/gemini-3.8-flash": ["text", "image"],
129
142
  "gpt-5.3-codex": ["text", "image"],
130
143
  "gpt-5.4": ["text", "image"],
131
144
  "gpt-5.4-mini": ["text", "image"],
@@ -136,6 +149,8 @@ export const MODEL_INPUT_MODALITIES = {
136
149
  "meta/muse-spark-1.1": ["text", "image"],
137
150
  "meta/muse-spark-1.2": ["text", "image"],
138
151
  "meta/muse-spark-1.2-contributor": ["text", "image"],
152
+ "meta/muse-spark-1.3": ["text", "image"],
153
+ "meta/muse-spark-1.3-contributor": ["text", "image"],
139
154
  "moonshotai/Kimi-K2.5": ["text", "image"],
140
155
  "moonshotai/Kimi-K2.6": ["text", "image"],
141
156
  "moonshotai/Kimi-K2.7-Code": ["text", "image"],
@@ -6,6 +6,7 @@
6
6
  export const MODEL_SNAPSHOT = [
7
7
  { id: "claude-sonnet-5", name: "Claude Sonnet 5", contextLength: 1000000 },
8
8
  { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", contextLength: 1000000 },
9
+ { id: "claude-fable-5-1", name: "Claude Fable 5.1", contextLength: 1000000 },
9
10
  { id: "claude-fable-5", name: "Claude Fable 5", contextLength: 1000000 },
10
11
  { id: "claude-opus-5", name: "Claude Opus 5", contextLength: 1000000 },
11
12
  { id: "claude-opus-4-8", name: "Claude Opus 4.8", contextLength: 1000000 },
@@ -38,6 +39,7 @@ export const MODEL_SNAPSHOT = [
38
39
  { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", contextLength: 200000 },
39
40
  { id: "xiaomi/mimo-v2.5-pro", name: "MiMo V2.5 Pro", contextLength: 1000000 },
40
41
  { id: "xiaomi/mimo-v2.5", name: "MiMo V2.5", contextLength: 1000000 },
42
+ { id: "Qwen/Qwen3.8-Max-0902", name: "Qwen 3.8 Max 0902", contextLength: 1000000 },
41
43
  { id: "Qwen/Qwen3.8-Max", name: "Qwen 3.8 Max", contextLength: 1000000 },
42
44
  { id: "Qwen/Qwen3.8-27B", name: "Qwen 3.8 27B", contextLength: 262144 },
43
45
  { id: "Qwen/Qwen3.8-Flash", name: "Qwen 3.8 Flash", contextLength: 1000000 },
@@ -46,10 +48,12 @@ export const MODEL_SNAPSHOT = [
46
48
  { id: "Qwen/Qwen3.7-Flash", name: "Qwen 3.7 Flash", contextLength: 1000000 },
47
49
  { id: "Qwen/Qwen3.6-Max-Preview", name: "Qwen 3.6 Max Preview", contextLength: 200000 },
48
50
  { id: "Qwen/Qwen3.6-Plus", name: "Qwen 3.6 Plus", contextLength: 200000 },
51
+ { id: "meituan/LongCat-2.0:free", name: "LongCat 2.0", contextLength: 1048576 },
49
52
  { id: "stepfun/Step-3.7-Flash", name: "Step 3.7 Flash", contextLength: 256000 },
50
53
  { id: "stepfun/Step-3.5-Flash", name: "Step 3.5 Flash", contextLength: 1000000 },
51
54
  { id: "tencent/hy3-paid", name: "Tencent Hy3", contextLength: 262144 },
52
55
  { id: "tencent/hy4-preview", name: "Tencent Hy4 Preview", contextLength: 1048576 },
56
+ { id: "google/gemini-3.8-flash", name: "Gemini 3.8 Flash", contextLength: 1000000 },
53
57
  { id: "google/gemini-3.7-flash", name: "Gemini 3.7 Flash", contextLength: 1048576 },
54
58
  { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", contextLength: 1000000 },
55
59
  { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", contextLength: 1000000 },
@@ -63,6 +67,8 @@ export const MODEL_SNAPSHOT = [
63
67
  { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", contextLength: 1048576 },
64
68
  { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", contextLength: 1048576 },
65
69
  { id: "meta/muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", contextLength: 1048576 },
70
+ { id: "meta/muse-spark-1.3", name: "Muse Spark 1.3", contextLength: 1048576 },
71
+ { id: "meta/muse-spark-1.3-contributor", name: "Muse Spark 1.3 Contributor", contextLength: 1048576 },
66
72
  { id: "xai/grok-4.5", name: "Grok 4.5", contextLength: 500000 },
67
73
  { id: "xai/grok-4.6", name: "Grok 4.6", contextLength: 500000 },
68
74
  ];
@@ -51,5 +51,5 @@ export interface ModelDeals {
51
51
  export declare const MODEL_DEALS: Readonly<Record<string, ModelDeals>>;
52
52
  export declare const PLAN_CATALOG: Readonly<Record<PlanId, PlanInfo>>;
53
53
  export declare const DEAL_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits";
54
- export declare const DEAL_LAST_REFRESHED = "2026-09-01";
54
+ export declare const DEAL_LAST_REFRESHED = "2026-09-02";
55
55
  export declare const DEAL_PACKAGE_VERSION = "docs";
@@ -6,6 +6,7 @@
6
6
  // without network access at runtime. Regenerate with `npm run refresh:deals`.
7
7
  export const MODEL_DEALS = {
8
8
  "claude-fable-5": { tier: "premium", benchmark: { "intelligence": 62.1, "tokPerSec": 67.8 }, free: false, allowance: { "goat": 20, "pro": 20 } },
9
+ "claude-fable-5-1": { tier: "premium", free: false, allowance: { "goat": 20, "pro": 20 } },
9
10
  "claude-haiku-4-5-20251001": { tier: "premium", benchmark: { "intelligence": 24.1, "tokPerSec": 103.9 }, free: false, allowance: { "goat": 20, "pro": 20 } },
10
11
  "claude-opus-4-7": { tier: "premium", benchmark: { "intelligence": 55 }, free: false, allowance: { "goat": 20, "pro": 20 } },
11
12
  "claude-opus-4-8": { tier: "premium", benchmark: { "intelligence": 57.3 }, free: false, allowance: { "goat": 20, "pro": 20 } },
@@ -21,6 +22,7 @@ export const MODEL_DEALS = {
21
22
  "google/gemini-3.5-flash-lite": { tier: "premium", benchmark: { "intelligence": 37.4, "tokPerSec": 368.8 }, free: false, allowance: { "goat": 20, "pro": 20 } },
22
23
  "google/gemini-3.6-flash": { tier: "premium", benchmark: { "intelligence": 51.6, "tokPerSec": 197.3 }, free: false, allowance: { "goat": 20, "pro": 20 } },
23
24
  "google/gemini-3.7-flash": { tier: "opensource", benchmark: { "intelligence": 56, "tokPerSec": 365.9 }, free: false, allowance: { "goat": 40, "pro": 50 } },
25
+ "google/gemini-3.8-flash": { tier: "premium", free: false, allowance: { "goat": 40, "pro": 50 } },
24
26
  "gpt-5.3-codex": { tier: "premium", benchmark: { "intelligence": 45.5, "tokPerSec": 121.4 }, free: false, allowance: { "goat": 20, "pro": 20 } },
25
27
  "gpt-5.4": { tier: "premium", benchmark: { "intelligence": 53.1 }, free: false, allowance: { "goat": 20, "pro": 20 } },
26
28
  "gpt-5.4-mini": { tier: "premium", benchmark: { "intelligence": 40.9 }, free: false, allowance: { "goat": 20, "pro": 20 } },
@@ -28,9 +30,12 @@ export const MODEL_DEALS = {
28
30
  "gpt-5.6-luna": { tier: "opensource", benchmark: { "intelligence": 52.3, "tokPerSec": 124.1 }, overContext: { "input": 0.4, "output": 1.8, "cacheRead": 0.04, "cacheWrite": 0.5 }, free: false, allowance: { "goat": 20, "pro": 30 } },
29
31
  "gpt-5.6-sol": { tier: "opensource", benchmark: { "intelligence": 60.9, "tokPerSec": 69.6 }, overContext: { "input": 10, "output": 45, "cacheRead": 1, "cacheWrite": 12.5 }, free: false, allowance: { "goat": 70, "pro": 80 } },
30
32
  "gpt-5.6-terra": { tier: "premium", benchmark: { "intelligence": 56.6, "tokPerSec": 112.8 }, overContext: { "input": 4, "output": 18, "cacheRead": 0.4, "cacheWrite": 5 }, free: false, allowance: { "goat": 20, "pro": 20 } },
33
+ "meituan/LongCat-2.0:free": { tier: "opensource", free: true },
31
34
  "meta/muse-spark-1.1": { tier: "premium", benchmark: { "intelligence": 53.2 }, free: false, allowance: { "goat": 20, "pro": 20 } },
32
35
  "meta/muse-spark-1.2": { tier: "opensource", benchmark: { "intelligence": 56.8 }, free: false, allowance: { "goat": 20, "pro": 30 } },
33
36
  "meta/muse-spark-1.2-contributor": { tier: "opensource", benchmark: { "intelligence": 56.8 }, free: false, allowance: { "goat": 20, "pro": 30 } },
37
+ "meta/muse-spark-1.3": { tier: "premium", free: false, allowance: { "goat": 20, "pro": 30 } },
38
+ "meta/muse-spark-1.3-contributor": { tier: "premium", free: false, allowance: { "goat": 20, "pro": 30 } },
34
39
  "MiniMaxAI/MiniMax-M2.5": { tier: "opensource", benchmark: { "intelligence": 34.5 }, free: false, allowance: { "goat": 20, "pro": 30 } },
35
40
  "MiniMaxAI/MiniMax-M2.7": { tier: "opensource", benchmark: { "intelligence": 38.9 }, free: false, allowance: { "goat": 20, "pro": 30 } },
36
41
  "MiniMaxAI/MiniMax-M3": { tier: "opensource", discount: { "pct": 50 }, was: { "input": 0.6, "output": 2.4, "cacheRead": 0.12 }, now: { "input": 0.3, "output": 1.2, "cacheRead": 0.06 }, benchmark: { "intelligence": 45.4, "tokPerSec": 111.3 }, free: false, allowance: { "goat": 47, "pro": 57 } },
@@ -49,6 +54,7 @@ export const MODEL_DEALS = {
49
54
  "Qwen/Qwen3.8-27B": { tier: "opensource", benchmark: { "intelligence": 52, "tokPerSec": 50.5 }, free: false, allowance: { "goat": 70, "pro": 80 } },
50
55
  "Qwen/Qwen3.8-Flash": { tier: "opensource", free: false, allowance: { "goat": 20, "pro": 30 } },
51
56
  "Qwen/Qwen3.8-Max": { tier: "opensource", benchmark: { "intelligence": 58.1, "tokPerSec": 23.6 }, free: false, allowance: { "goat": 20, "pro": 30 } },
57
+ "Qwen/Qwen3.8-Max-0902": { tier: "opensource", free: false, allowance: { "goat": 20, "pro": 30 } },
52
58
  "sakana/fugu-ultra": { tier: "premium", free: false, allowance: { "goat": 20, "pro": 20 } },
53
59
  "stepfun/Step-3.5-Flash": { tier: "opensource", benchmark: { "intelligence": 26.5 }, free: false, allowance: { "goat": 20, "pro": 30 } },
54
60
  "stepfun/Step-3.7-Flash": { tier: "opensource", benchmark: { "intelligence": 30.9, "tokPerSec": 94.1 }, free: false, allowance: { "goat": 20, "pro": 30 } },
@@ -77,5 +83,5 @@ export const PLAN_CATALOG = {
77
83
  provider: { price: 15, credits: 0, window5h: 0, windowWeek: 0, display: "Provider" },
78
84
  };
79
85
  export const DEAL_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits";
80
- export const DEAL_LAST_REFRESHED = "2026-09-01";
86
+ export const DEAL_LAST_REFRESHED = "2026-09-02";
81
87
  export const DEAL_PACKAGE_VERSION = "docs";
@@ -4,10 +4,25 @@
4
4
  export declare const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasoningEffort[]>>;
5
5
  export type PiThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
6
6
  type CommandCodeReasoningEffort = Exclude<PiThinkingLevel, "off">;
7
+ /**
8
+ * Derives the reasoning-without-efforts set from a capability map and an
9
+ * efforts table: a model is reasoning-capable without explicit efforts
10
+ * when upstream's capability flag is true AND the facts carry no efforts
11
+ * entry for it. Efforts precedence holds by construction — an efforts
12
+ * model never appears in this set, so the "a model is classified exactly
13
+ * once" invariant is true by construction rather than asserted after
14
+ * regeneration (spec #108 / issue #111). Exported for the derivation
15
+ * checks; the runtime consumes the derived REASONING_MODELS below.
16
+ */
17
+ export declare function deriveReasoningWithoutEfforts(capability: Readonly<Record<string, boolean>>, efforts: Readonly<Record<string, readonly string[]>>): ReadonlySet<string>;
7
18
  /**
8
19
  * Models Command Code advertises as reasoning-capable without exposing
9
20
  * explicit effort levels (Command Code chooses the reasoning depth). These
10
21
  * advertise `reasoning: true` in opencode but never generate `variants`.
22
+ *
23
+ * Derived from the generated classification module + the generated efforts
24
+ * facts — upstream data is the source of truth, so upstream classification
25
+ * changes land on the next catalog refresh with zero human edits.
11
26
  */
12
27
  export declare const REASONING_MODELS: ReadonlySet<string>;
13
28
  export interface ThinkingMetadata {
@@ -19,6 +34,11 @@ export interface ThinkingMetadata {
19
34
  };
20
35
  }
21
36
  export declare function thinkingMetadataForModel(modelId: string): ThinkingMetadata | undefined;
37
+ /**
38
+ * A model is reasoning-capable when it has an explicit efforts entry OR
39
+ * upstream's capability flag is true. Derived entirely from the generated
40
+ * catalogs — no hand-maintained set remains.
41
+ */
22
42
  export declare function isReasoningModel(modelId: string): boolean;
23
43
  /**
24
44
  * opencode model `variants` for the Command Code model: one entry per supported
@@ -1,8 +1,15 @@
1
1
  // src/provider/reasoning.ts — reasoning-effort metadata tables (PLAN #5 Part A,
2
- // port of pi's models.ts:67-150). Reasoning metadata now comes from the
3
- // generated catalog facts (`src/catalog/facts.ts`), with hand-maintained
4
- // classification sets (`REASONING_MODELS`) layered on top.
2
+ // port of pi's models.ts:67-150). Reasoning metadata comes from the
3
+ // generated catalog facts (`src/catalog/facts.ts`, the efforts table) and
4
+ // the generated classification module (`src/catalog/classification.ts`,
5
+ // the per-model capability flag the docs' RSC records carry). There is no
6
+ // hand-maintained reasoning set: classification is **derived** (ADR-0006) —
7
+ // reasoning-without-efforts = capability flag true AND no efforts entry;
8
+ // isReasoningModel = has an efforts entry OR capability flag true.
9
+ // The only human seam is the classification override map baked into the
10
+ // generated module at refresh time.
5
11
  import { MODEL_EFFORTS as GENERATED_MODEL_EFFORTS } from "../catalog/facts.js";
12
+ import { MODEL_REASONING_CAPABILITY } from "../catalog/classification.js";
6
13
  /**
7
14
  * Models omitted here let Command Code choose their reasoning depth.
8
15
  */
@@ -14,38 +21,31 @@ import { MODEL_EFFORTS as GENERATED_MODEL_EFFORTS } from "../catalog/facts.js";
14
21
  // column is constrained to those levels; the release gate catches drift). Do
15
22
  // NOT "simplify" this back to a direct re-export — it breaks the build.
16
23
  export const MODEL_EFFORTS = GENERATED_MODEL_EFFORTS;
24
+ /**
25
+ * Derives the reasoning-without-efforts set from a capability map and an
26
+ * efforts table: a model is reasoning-capable without explicit efforts
27
+ * when upstream's capability flag is true AND the facts carry no efforts
28
+ * entry for it. Efforts precedence holds by construction — an efforts
29
+ * model never appears in this set, so the "a model is classified exactly
30
+ * once" invariant is true by construction rather than asserted after
31
+ * regeneration (spec #108 / issue #111). Exported for the derivation
32
+ * checks; the runtime consumes the derived REASONING_MODELS below.
33
+ */
34
+ export function deriveReasoningWithoutEfforts(capability, efforts) {
35
+ return new Set(Object.entries(capability)
36
+ .filter(([id, flag]) => flag === true && efforts[id] === undefined)
37
+ .map(([id]) => id));
38
+ }
17
39
  /**
18
40
  * Models Command Code advertises as reasoning-capable without exposing
19
41
  * explicit effort levels (Command Code chooses the reasoning depth). These
20
42
  * advertise `reasoning: true` in opencode but never generate `variants`.
43
+ *
44
+ * Derived from the generated classification module + the generated efforts
45
+ * facts — upstream data is the source of truth, so upstream classification
46
+ * changes land on the next catalog refresh with zero human edits.
21
47
  */
22
- export const REASONING_MODELS = new Set([
23
- "MiniMaxAI/MiniMax-M3",
24
- "Qwen/Qwen3.6-Max-Preview",
25
- "Qwen/Qwen3.6-Plus",
26
- "Qwen/Qwen3.7-Flash",
27
- "Qwen/Qwen3.7-Max",
28
- "Qwen/Qwen3.7-Plus",
29
- "meta/muse-spark-1.1",
30
- "meta/muse-spark-1.2",
31
- "meta/muse-spark-1.2-contributor",
32
- "moonshotai/Kimi-K2.7-Code",
33
- "moonshotai/Kimi-K2.7-Code-Highspeed",
34
- "moonshotai/Kimi-K3",
35
- "nvidia/nemotron-3-ultra-550b-a55b",
36
- "poolside/laguna-s-2.1-free",
37
- "stepfun/Step-3.7-Flash",
38
- "tencent/hy3-paid",
39
- // tencent/hy4-preview is reasoning-capable with explicit efforts
40
- // (models.md lists `low, medium, high` since command-code@1.38.0,
41
- // 2026-08-28) — it belongs in MODEL_EFFORTS, not here. Keeping it here
42
- // would leave a snapshot model classified in both REASONING_MODELS and
43
- // MODEL_EFFORTS, which breaks the dedicated
44
- // `tencent/hy4-preview is an efforts model` pin in
45
- // tests/catalog-metadata.test.ts.
46
- "thinkingmachines/inkling",
47
- "thinkingmachines/inkling-small",
48
- ]);
48
+ export const REASONING_MODELS = deriveReasoningWithoutEfforts(MODEL_REASONING_CAPABILITY, GENERATED_MODEL_EFFORTS);
49
49
  const PI_THINKING_LEVELS = [
50
50
  "off",
51
51
  "minimal",
@@ -74,6 +74,11 @@ export function thinkingMetadataForModel(modelId) {
74
74
  },
75
75
  };
76
76
  }
77
+ /**
78
+ * A model is reasoning-capable when it has an explicit efforts entry OR
79
+ * upstream's capability flag is true. Derived entirely from the generated
80
+ * catalogs — no hand-maintained set remains.
81
+ */
77
82
  export function isReasoningModel(modelId) {
78
83
  return MODEL_EFFORTS[modelId] !== undefined || REASONING_MODELS.has(modelId);
79
84
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-cmd-provider",
3
- "version": "1.6.2",
3
+ "version": "1.6.3",
4
4
  "description": "Command Code provider + plugin for opencode",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -20,9 +20,10 @@
20
20
  "typecheck": "tsc --noEmit",
21
21
  "refresh:snapshot": "node scripts/refresh-snapshot.mjs",
22
22
  "refresh:deals": "node scripts/refresh-deals.mjs",
23
- "refresh": "npm run refresh:snapshot && npm run refresh:fixtures && npm run refresh:deals -- --fixtures",
23
+ "refresh:classification": "node scripts/refresh-classification.mjs",
24
+ "refresh": "npm run refresh:snapshot && npm run refresh:fixtures && npm run refresh:classification -- --fixtures && npm run refresh:deals -- --fixtures",
24
25
  "test": "npm run typecheck && npm run test:unit && npm run test:integration && npm run test:contract && npm run format:check",
25
- "test:unit": "tsx tests/env.test.ts && tsx tests/auth-key.test.ts && tsx tests/converters.test.ts && tsx tests/stream.test.ts && tsx tests/provider-codecs.test.ts && tsx tests/provider-transport.test.ts && tsx tests/provider-parity.test.ts && tsx tests/provider-upgrade-fallback.test.ts && tsx tests/provider-zdr.test.ts && tsx tests/redact.test.ts && tsx tests/cost.test.ts && tsx tests/retry.test.ts && tsx tests/reasoning.test.ts && tsx tests/modalities.test.ts && tsx tests/snapshot.test.ts && tsx tests/refresh-snapshot.test.ts && tsx tests/oauth.test.ts && tsx tests/auth-mirror.test.ts && tsx tests/parse-facts.test.ts && tsx tests/parse-modalities.test.ts && tsx tests/catalog-metadata.test.ts && tsx tests/plugin-models.test.ts && tsx tests/vendor.test.ts && tsx tests/deals-enrichment.test.ts && tsx tests/deals-coverage.test.ts && tsx tests/plan-summary.test.ts && tsx tests/html-tables.test.ts && tsx tests/parse-docs.test.ts && tsx tests/parse-rsc.test.ts && tsx tests/mock-cc-rsc.test.ts && tsx tests/capture-rsc-fixtures.test.ts && tsx tests/refresh-deals.test.ts && tsx tests/refresh-deals-rsc.test.ts && tsx tests/tier-overrides.test.ts && tsx tests/tui-deals-panel.test.ts && tsx tests/diff-catalog.test.ts && tsx tests/catalog-refresh-extract.test.ts && tsx tests/catalog-refresh-push.test.ts && tsx tests/plugin-install.test.ts",
26
+ "test:unit": "tsx tests/env.test.ts && tsx tests/auth-key.test.ts && tsx tests/converters.test.ts && tsx tests/stream.test.ts && tsx tests/provider-codecs.test.ts && tsx tests/provider-transport.test.ts && tsx tests/provider-parity.test.ts && tsx tests/provider-upgrade-fallback.test.ts && tsx tests/provider-zdr.test.ts && tsx tests/redact.test.ts && tsx tests/cost.test.ts && tsx tests/retry.test.ts && tsx tests/reasoning.test.ts && tsx tests/modalities.test.ts && tsx tests/snapshot.test.ts && tsx tests/refresh-snapshot.test.ts && tsx tests/oauth.test.ts && tsx tests/auth-mirror.test.ts && tsx tests/parse-facts.test.ts && tsx tests/parse-modalities.test.ts && tsx tests/catalog-metadata.test.ts && tsx tests/plugin-models.test.ts && tsx tests/vendor.test.ts && tsx tests/deals-enrichment.test.ts && tsx tests/deals-coverage.test.ts && tsx tests/plan-summary.test.ts && tsx tests/html-tables.test.ts && tsx tests/parse-docs.test.ts && tsx tests/parse-rsc.test.ts && tsx tests/rsc-source.test.ts && tsx tests/classification-overrides.test.ts && tsx tests/refresh-classification.test.ts && tsx tests/classification.test.ts && tsx tests/mock-cc-rsc.test.ts && tsx tests/capture-rsc-fixtures.test.ts && tsx tests/refresh-deals.test.ts && tsx tests/refresh-deals-rsc.test.ts && tsx tests/tier-overrides.test.ts && tsx tests/tui-deals-panel.test.ts && tsx tests/diff-catalog.test.ts && tsx tests/catalog-refresh-extract.test.ts && tsx tests/catalog-refresh-drift.test.ts && tsx tests/catalog-refresh-push.test.ts && tsx tests/auto-release.test.ts && tsx tests/replay-verification.test.ts && tsx tests/plugin-install.test.ts",
26
27
  "test:integration": "tsx tests/integration-do-stream.test.ts && tsx tests/integration-do-generate.test.ts",
27
28
  "test:contract": "tsx tests/contract.test.ts",
28
29
  "test:e2e": "node tests/e2e-opencode.mjs",