opencode-cmd-provider 1.1.0 → 1.2.0
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 +38 -0
- package/README.md +75 -33
- package/dist/src/catalog/facts.d.ts +5 -3
- package/dist/src/catalog/facts.js +49 -4
- package/dist/src/catalog/snapshot.js +2 -1
- package/dist/src/deals/catalog.d.ts +55 -0
- package/dist/src/deals/catalog.js +76 -0
- package/dist/src/deals/enrichment.d.ts +4 -0
- package/dist/src/deals/enrichment.js +63 -0
- package/dist/src/deals/index.d.ts +5 -0
- package/dist/src/deals/index.js +16 -0
- package/dist/src/deals/plan-summary.d.ts +13 -0
- package/dist/src/deals/plan-summary.js +160 -0
- package/dist/src/deals/tui.d.ts +10 -0
- package/dist/src/deals/tui.js +104 -0
- package/dist/src/deals/vendor.d.ts +1 -0
- package/dist/src/deals/vendor.js +29 -0
- package/dist/src/plugin/index.js +5 -0
- package/dist/src/provider/command-code-model.js +2 -9
- package/dist/src/provider/cost.d.ts +7 -0
- package/dist/src/provider/cost.js +14 -0
- package/dist/src/provider/modalities.d.ts +2 -6
- package/dist/src/provider/modalities.js +4 -48
- package/dist/src/provider/reasoning.js +1 -0
- package/dist/src/provider/stream.js +3 -3
- package/dist/tui.js +180 -0
- package/package.json +13 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.2.0 - 2026-08-21
|
|
4
|
+
|
|
5
|
+
Feature: Deals intelligence — per-model pricing/allowance data in a sidebar panel and a plan-summary tool, delivered zero-step.
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- New Deals catalog (`src/deals/catalog.ts`): tier, benchmarks, deal discounts (`was`/`now` rates), peak/off-peak windows, and GOAT/Pro monthly allowances for every model, scraped from the Command Code docs.
|
|
10
|
+
- New `cmd_plan_summary` tool (plan-aware allowances and deal rates) and a TUI sidebar "Command Code" section for the selected model.
|
|
11
|
+
- Zero-step delivery: the package exports a `./tui` target (`dist/tui.js`), and `opencode plugin opencode-cmd-provider` writes both `opencode.json(c)` and `tui.json` from one command — no hand-written `tui.json` (fixes #39).
|
|
12
|
+
- Deals intelligence is an excisable slice (`src/deals/`); deleting it plus two lines in the plugin entry leaves Core (models, auth, streaming) unchanged.
|
|
13
|
+
- Visible degradation: when the Deals catalog is empty (scraping mitigated), the sidebar shows a "Deals unavailable" banner with placeholder rows and the tool reports no bundled data — Core is unaffected.
|
|
14
|
+
- `refresh:deals` no longer blocks a release: it falls back to fixtures or an empty catalog with a warning, and the Deals gate in the release workflow is non-blocking.
|
|
15
|
+
|
|
16
|
+
### Fixes
|
|
17
|
+
|
|
18
|
+
- Streaming usage now reports cache-inclusive input token totals (the AI SDK convention). OpenChamber showed context usage as low as ~0.1% instead of ~5% because the converter reported only non-cached input; `inputTokens.total` now includes cache read/write tokens (issue #36).
|
|
19
|
+
|
|
20
|
+
### Chores
|
|
21
|
+
|
|
22
|
+
- Catalog refresh to `command-code@1.31.0`, adding the free reasoning model `stealth/ox-alpha` (Ox Alpha).
|
|
23
|
+
- Docs: corrected the install command (`opencode plugin`, no `add`), simplified the README Install section, and added build/test/architecture guidance to `AGENTS.md`.
|
|
24
|
+
|
|
25
|
+
## 1.1.1 - 2026-08-20
|
|
26
|
+
|
|
27
|
+
Fix: generate image-input modalities from the Command Code CLI catalog.
|
|
28
|
+
|
|
29
|
+
- `MODEL_INPUT_MODALITIES` now comes from `inputModalities` fields in the
|
|
30
|
+
parsed `command-code` CLI bundle instead of a hand-maintained table.
|
|
31
|
+
- The release refresh validates that every API snapshot model is represented
|
|
32
|
+
in the CLI bundle and fails loudly on unsupported or conflicting modality
|
|
33
|
+
data.
|
|
34
|
+
- Added AST parser and offline coverage for reordered fields, duplicate model
|
|
35
|
+
entries, malformed bundles, and text-only fallback behavior.
|
|
36
|
+
- Docs: the release skill and facts-sync spec now describe the modality
|
|
37
|
+
refresh and the new release-gate failure mode.
|
|
38
|
+
- Thanks to @ericpastorm for #31, which auto-syncs the input-modality table
|
|
39
|
+
from the CLI catalog.
|
|
40
|
+
|
|
3
41
|
## 1.1.0 - 2026-08-20
|
|
4
42
|
|
|
5
43
|
Feature: complete capability metadata for every catalog model, with automatic sync of reasoning and pricing facts at release time.
|
package/README.md
CHANGED
|
@@ -9,7 +9,23 @@ A provider and plugin for [OpenCode](https://opencode.ai) that connects to the [
|
|
|
9
9
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
```sh
|
|
13
|
+
opencode plugin opencode-cmd-provider
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Update an existing install:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
opencode plugin opencode-cmd-provider --force
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Install globally (available in every project):
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
opencode plugin opencode-cmd-provider --global
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Manual config also works:
|
|
13
29
|
|
|
14
30
|
```jsonc
|
|
15
31
|
// opencode.json
|
|
@@ -19,28 +35,7 @@ Add the package to your OpenCode configuration:
|
|
|
19
35
|
}
|
|
20
36
|
```
|
|
21
37
|
|
|
22
|
-
|
|
23
|
-
auto-registers the `commandcode` provider — npm package, name, API key env var,
|
|
24
|
-
and every model — when OpenCode loads. No `provider.commandcode` block, no
|
|
25
|
-
`models` map, no network access needed. All Command Code models appear in
|
|
26
|
-
`/models` with the `[CMD]` display-name prefix (e.g. `[CMD] Claude Sonnet 5`) so
|
|
27
|
-
they aren't confused with same-named models from other providers.
|
|
28
|
-
|
|
29
|
-
You can still declare your own `provider.commandcode` entry to customize
|
|
30
|
-
behavior; your declarations always win and the snapshot fills in only what's
|
|
31
|
-
missing:
|
|
32
|
-
|
|
33
|
-
- Declared provider-level settings (`name`, `options`, `baseURL`, `env`) are
|
|
34
|
-
kept as you wrote them.
|
|
35
|
-
- Declared models stay exactly as you wrote them — the snapshot never modifies
|
|
36
|
-
or removes them, and models that left the catalog remain usable.
|
|
37
|
-
- `whitelist`/`blacklist` on a declared entry filter the auto-registered models
|
|
38
|
-
too, keeping the picker uncluttered.
|
|
39
|
-
|
|
40
|
-
The catalog snapshot is refreshed at every release; newly published Command
|
|
41
|
-
Code models appear after a plugin update.
|
|
42
|
-
|
|
43
|
-
Start or reload OpenCode, then authenticate:
|
|
38
|
+
Then authenticate:
|
|
44
39
|
|
|
45
40
|
```txt
|
|
46
41
|
/connect
|
|
@@ -101,24 +96,69 @@ Pick a model with `/models`, or run non-interactively:
|
|
|
101
96
|
opencode run --model commandcode/claude-sonnet-5 "hello"
|
|
102
97
|
```
|
|
103
98
|
|
|
99
|
+
## Deals intelligence
|
|
100
|
+
|
|
101
|
+
Every Command Code model ships with deal/allowance/benchmark intelligence
|
|
102
|
+
(bundled in `src/deals/catalog.ts`), scraped from the Command Code docs. It
|
|
103
|
+
surfaces in two places:
|
|
104
|
+
|
|
105
|
+
- **Sidebar** — in a session, the OpenCode sidebar (`ctrl+x b`) shows a
|
|
106
|
+
`Command Code` section for the selected model: tier, GOAT/Pro allowance,
|
|
107
|
+
benchmark (intelligence, tok/s), deal discounts (`was`/`now` rates), and
|
|
108
|
+
peak/off-peak windows.
|
|
109
|
+
- **`cmd_plan_summary` tool** — plan-aware allowances and deal rates, to
|
|
110
|
+
estimate monthly requests.
|
|
111
|
+
|
|
112
|
+
Delivery is zero-step: the package exports both a `server` and a `tui` target
|
|
113
|
+
(`exports["./tui"]` → `dist/tui.js`), and `opencode plugin
|
|
114
|
+
opencode-cmd-provider` writes both `opencode.json(c)` and `tui.json` from one
|
|
115
|
+
spec. The sidebar is a TUI plugin loaded from `tui.json` — which is why
|
|
116
|
+
installs made before the `./tui` export only wrote the server target and never
|
|
117
|
+
showed a sidebar. Re-run with `--force` to add `tui.json`.
|
|
118
|
+
|
|
119
|
+
When the Deals catalog is empty (scraping mitigated), the feature degrades
|
|
120
|
+
visibly rather than silently: the sidebar shows a `Deals unavailable` banner
|
|
121
|
+
with placeholder rows, and `cmd_plan_summary` reports that no deal data is
|
|
122
|
+
bundled. Core (models, auth, streaming) is unaffected.
|
|
123
|
+
|
|
104
124
|
## Model discovery and offline behavior
|
|
105
125
|
|
|
106
|
-
The plugin ships
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
126
|
+
The plugin ships two bundled catalogs and auto-registers every model into
|
|
127
|
+
OpenCode's config at startup, with the `[CMD]` display-name prefix (e.g.
|
|
128
|
+
`[CMD] Claude Sonnet 5`) so they aren't confused with same-named models from
|
|
129
|
+
other providers. Model availability changes when the package is updated. You
|
|
130
|
+
can still declare your own `provider.commandcode` entry; your declarations
|
|
131
|
+
always win and the snapshot fills in only what's missing (`whitelist`/
|
|
132
|
+
`blacklist` on a declared entry filter the auto-registered models too).
|
|
133
|
+
|
|
134
|
+
- Snapshot — `src/catalog/snapshot.ts` (model ids, names, context lengths) plus
|
|
135
|
+
`src/catalog/facts.ts` (reasoning efforts, per-1M-token rates, input
|
|
136
|
+
modalities). Regenerated from the live catalog via `npm run refresh:snapshot`.
|
|
137
|
+
- Deals — `src/deals/catalog.ts` (per-model tier, benchmarks, deal
|
|
138
|
+
discounts, `was`/`now` rates, peak/off-peak windows, and GOAT/Pro monthly
|
|
139
|
+
allowances for every model). Scraped from the Command Code docs
|
|
140
|
+
(`pricing-limits`, `plans/goat`, `plans/pro`; fixtures in
|
|
141
|
+
`tests/fixtures/*.html`) via `npm run refresh:deals` (add `-- --fixtures` to
|
|
142
|
+
regenerate offline from fixtures; without it, fetches live pages).
|
|
143
|
+
|
|
144
|
+
Run `npm run refresh` to regenerate both catalogs at once (offline from fixtures).
|
|
110
145
|
|
|
111
146
|
Auto-registration adds no network latency to OpenCode startup — the snapshot is
|
|
112
147
|
bundled, and the plugin never contacts the Command Code API to list models. The
|
|
113
148
|
plugin works fully offline; model availability never depends on the catalog
|
|
114
149
|
endpoint being reachable.
|
|
115
150
|
|
|
116
|
-
The following environment
|
|
151
|
+
The following environment variables are intended for tests, local mocks, and
|
|
117
152
|
compatible API endpoints:
|
|
118
153
|
|
|
119
|
-
| Variable
|
|
120
|
-
|
|
|
121
|
-
| `COMMANDCODE_API_BASE`
|
|
154
|
+
| Variable | Purpose |
|
|
155
|
+
| ------------------------------- | -------------------------------------- |
|
|
156
|
+
| `COMMANDCODE_API_BASE` | Override the Command Code API base URL |
|
|
157
|
+
| `COMMANDCODE_FACTS_URL` | Override the bundled `models.md` URL |
|
|
158
|
+
| `COMMANDCODE_MODALITIES_URL` | Override the CLI bundle URL |
|
|
159
|
+
| `COMMANDCODE_DEALS_PRICING_URL` | Override the `pricing-limits` docs URL |
|
|
160
|
+
| `COMMANDCODE_DEALS_GOAT_URL` | Override the `plans/goat` docs URL |
|
|
161
|
+
| `COMMANDCODE_DEALS_PRO_URL` | Override the `plans/pro` docs URL |
|
|
122
162
|
|
|
123
163
|
### Reasoning support
|
|
124
164
|
|
|
@@ -128,13 +168,13 @@ Reasoning blocks from completed assistant turns are not replayed to Command Code
|
|
|
128
168
|
|
|
129
169
|
## Image input
|
|
130
170
|
|
|
131
|
-
Image input is advertised only for models marked with the `image` input modality in the Command Code
|
|
171
|
+
Image input is advertised only for models marked with the `image` input modality in the Command Code CLI bundle. The release-time refresh generates this map into `src/catalog/facts.ts`; unknown models default to text-only until their upstream metadata is reviewed.
|
|
132
172
|
|
|
133
173
|
For vision-capable models, image blocks from user messages and tool results are forwarded in Command Code's data-URL wire format. Text-only models reject image content before making a network request instead of silently dropping it.
|
|
134
174
|
|
|
135
175
|
## Pricing display
|
|
136
176
|
|
|
137
|
-
The Command Code Provider API does not currently include prices in its model catalog. This provider
|
|
177
|
+
The Command Code Provider API does not currently include prices in its model catalog. This provider generates a table from the bundled `models.md` catalog so OpenCode can display estimated request costs.
|
|
138
178
|
|
|
139
179
|
Models missing from that table display zero cost in OpenCode. This does **not** mean Command Code will bill the request at zero. Check the current [Command Code pricing](https://commandcode.ai/docs/resources/pricing-limits) before relying on the displayed value.
|
|
140
180
|
|
|
@@ -153,6 +193,8 @@ npm test
|
|
|
153
193
|
npm run format:check
|
|
154
194
|
```
|
|
155
195
|
|
|
196
|
+
`npm run build` needs [bun](https://bun.sh) on PATH — it compiles `src/deals/tui.tsx` with the solid transform (`scripts/build-tui.ts`), so the TUI panel's JSX props are reactive and the sidebar repaints on mid-session model switches.
|
|
197
|
+
|
|
156
198
|
The headless end-to-end test runs the real OpenCode CLI against a mock Command Code server through the built package:
|
|
157
199
|
|
|
158
200
|
```sh
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export declare const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const
|
|
1
|
+
export declare const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.31.0/dist/bundled/command-code-knowledge/reference/models.md";
|
|
2
|
+
export declare const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.31.0/dist/cli.mjs";
|
|
3
|
+
export declare const FACTS_PACKAGE_VERSION = "1.31.0";
|
|
4
|
+
export declare const FACTS_LAST_REFRESHED = "2026-08-21";
|
|
4
5
|
export declare const MODEL_EFFORTS: Readonly<Record<string, readonly string[]>>;
|
|
5
6
|
export declare const MODEL_COSTS: Readonly<Record<string, {
|
|
6
7
|
input: number;
|
|
@@ -8,3 +9,4 @@ export declare const MODEL_COSTS: Readonly<Record<string, {
|
|
|
8
9
|
cacheRead: number;
|
|
9
10
|
cacheWrite: number;
|
|
10
11
|
}>>;
|
|
12
|
+
export declare const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly ("text" | "image")[]>>;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// src/catalog/facts.ts — GENERATED by scripts/refresh-snapshot.mjs. Do not edit.
|
|
2
2
|
//
|
|
3
3
|
// Capability facts (reasoning efforts + per-1M-token rates) parsed from the
|
|
4
|
-
// command-code npm package's bundled model catalog (models.md)
|
|
4
|
+
// command-code npm package's bundled model catalog (models.md), plus input
|
|
5
|
+
// modalities parsed from its CLI bundle (dist/cli.mjs). Regenerate
|
|
5
6
|
// with `npm run refresh:snapshot`.
|
|
6
|
-
export const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.
|
|
7
|
-
export const
|
|
8
|
-
export const
|
|
7
|
+
export const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.31.0/dist/bundled/command-code-knowledge/reference/models.md";
|
|
8
|
+
export const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.31.0/dist/cli.mjs";
|
|
9
|
+
export const FACTS_PACKAGE_VERSION = "1.31.0";
|
|
10
|
+
export const FACTS_LAST_REFRESHED = "2026-08-21";
|
|
9
11
|
export const MODEL_EFFORTS = {
|
|
10
12
|
"deepseek/deepseek-v4-pro": ["high", "max"],
|
|
11
13
|
"deepseek/deepseek-v4-flash": ["high", "max"],
|
|
@@ -67,6 +69,7 @@ export const MODEL_COSTS = {
|
|
|
67
69
|
"thinkingmachines/inkling": { input: 1, output: 4.05, cacheRead: 0.17, cacheWrite: 0 },
|
|
68
70
|
"thinkingmachines/inkling-small": { input: 0.5, output: 1.2, cacheRead: 0.1, cacheWrite: 0 },
|
|
69
71
|
"poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
72
|
+
"stealth/ox-alpha": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
70
73
|
"claude-sonnet-5": { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 },
|
|
71
74
|
"claude-sonnet-4-6": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
|
|
72
75
|
"claude-fable-5": { input: 10, output: 50, cacheRead: 1, cacheWrite: 12.5 },
|
|
@@ -93,3 +96,45 @@ export const MODEL_COSTS = {
|
|
|
93
96
|
"xai/grok-4.5": { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },
|
|
94
97
|
"xai/grok-4.6": { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },
|
|
95
98
|
};
|
|
99
|
+
export const MODEL_INPUT_MODALITIES = {
|
|
100
|
+
"MiniMaxAI/MiniMax-M3": ["text", "image"],
|
|
101
|
+
"Qwen/Qwen3.6-Plus": ["text", "image"],
|
|
102
|
+
"Qwen/Qwen3.7-Flash": ["text", "image"],
|
|
103
|
+
"Qwen/Qwen3.7-Plus": ["text", "image"],
|
|
104
|
+
"Qwen/Qwen3.8-27B": ["text", "image"],
|
|
105
|
+
"Qwen/Qwen3.8-Max": ["text", "image"],
|
|
106
|
+
"claude-fable-5": ["text", "image"],
|
|
107
|
+
"claude-haiku-4-5-20251001": ["text", "image"],
|
|
108
|
+
"claude-opus-4-7": ["text", "image"],
|
|
109
|
+
"claude-opus-4-8": ["text", "image"],
|
|
110
|
+
"claude-opus-5": ["text", "image"],
|
|
111
|
+
"claude-sonnet-4-6": ["text", "image"],
|
|
112
|
+
"claude-sonnet-5": ["text", "image"],
|
|
113
|
+
"google/gemini-3.1-flash-lite": ["text", "image"],
|
|
114
|
+
"google/gemini-3.5-flash": ["text", "image"],
|
|
115
|
+
"google/gemini-3.5-flash-lite": ["text", "image"],
|
|
116
|
+
"google/gemini-3.6-flash": ["text", "image"],
|
|
117
|
+
"google/gemini-3.7-flash": ["text", "image"],
|
|
118
|
+
"gpt-5.3-codex": ["text", "image"],
|
|
119
|
+
"gpt-5.4": ["text", "image"],
|
|
120
|
+
"gpt-5.4-mini": ["text", "image"],
|
|
121
|
+
"gpt-5.5": ["text", "image"],
|
|
122
|
+
"gpt-5.6-luna": ["text", "image"],
|
|
123
|
+
"gpt-5.6-sol": ["text", "image"],
|
|
124
|
+
"gpt-5.6-terra": ["text", "image"],
|
|
125
|
+
"meta/muse-spark-1.1": ["text", "image"],
|
|
126
|
+
"meta/muse-spark-1.2": ["text", "image"],
|
|
127
|
+
"meta/muse-spark-1.2-contributor": ["text", "image"],
|
|
128
|
+
"moonshotai/Kimi-K2.5": ["text", "image"],
|
|
129
|
+
"moonshotai/Kimi-K2.6": ["text", "image"],
|
|
130
|
+
"moonshotai/Kimi-K2.7-Code": ["text", "image"],
|
|
131
|
+
"moonshotai/Kimi-K2.7-Code-Highspeed": ["text", "image"],
|
|
132
|
+
"moonshotai/Kimi-K3": ["text", "image"],
|
|
133
|
+
"sakana/fugu-ultra": ["text", "image"],
|
|
134
|
+
"stealth/ox-alpha": ["text", "image"],
|
|
135
|
+
"stepfun/Step-3.7-Flash": ["text", "image"],
|
|
136
|
+
"thinkingmachines/inkling": ["text", "image"],
|
|
137
|
+
"thinkingmachines/inkling-small": ["text", "image"],
|
|
138
|
+
"xai/grok-4.5": ["text", "image"],
|
|
139
|
+
"xiaomi/mimo-v2.5": ["text", "image"],
|
|
140
|
+
};
|
|
@@ -14,7 +14,7 @@ export const MODEL_SNAPSHOT = [
|
|
|
14
14
|
{ id: "gpt-5.6-sol", name: "GPT-5.6 Sol", contextLength: 1050000 },
|
|
15
15
|
{ id: "gpt-5.6-terra", name: "GPT-5.6 Terra", contextLength: 1050000 },
|
|
16
16
|
{ id: "gpt-5.6-luna", name: "GPT-5.6 Luna", contextLength: 1050000 },
|
|
17
|
-
{ id: "gpt-5.5", name: "GPT-5.5", contextLength:
|
|
17
|
+
{ id: "gpt-5.5", name: "GPT-5.5", contextLength: 400000 },
|
|
18
18
|
{ id: "gpt-5.4", name: "GPT-5.4", contextLength: 400000 },
|
|
19
19
|
{ id: "gpt-5.3-codex", name: "GPT-5.3 Codex", contextLength: 400000 },
|
|
20
20
|
{ id: "gpt-5.4-mini", name: "GPT-5.4 Mini", contextLength: 400000 },
|
|
@@ -54,6 +54,7 @@ export const MODEL_SNAPSHOT = [
|
|
|
54
54
|
{ id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra", contextLength: 1000000 },
|
|
55
55
|
{ id: "thinkingmachines/inkling", name: "Inkling", contextLength: 256000 },
|
|
56
56
|
{ id: "thinkingmachines/inkling-small", name: "Inkling Small", contextLength: 1000000 },
|
|
57
|
+
{ id: "stealth/ox-alpha", name: "Ox Alpha", contextLength: 1048576 },
|
|
57
58
|
{ id: "poolside/laguna-s-2.1-free", name: "Laguna S 2.1", contextLength: 256000 },
|
|
58
59
|
{ id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", contextLength: 1048576 },
|
|
59
60
|
{ id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", contextLength: 1048576 },
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type PlanId = "go" | "goat" | "pro" | "max" | "max20" | "teampro" | "provider";
|
|
2
|
+
export interface DealRates {
|
|
3
|
+
input: number;
|
|
4
|
+
output: number;
|
|
5
|
+
cacheRead: number;
|
|
6
|
+
cacheWrite: number;
|
|
7
|
+
}
|
|
8
|
+
export interface PlanInfo {
|
|
9
|
+
price: number;
|
|
10
|
+
credits: number;
|
|
11
|
+
window5h: number;
|
|
12
|
+
windowWeek: number;
|
|
13
|
+
/** Human-facing plan name as shown on the Command Code pricing page. */
|
|
14
|
+
display: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ModelDeals {
|
|
17
|
+
/** $/month credit allowance per plan. Absent plan = no data. */
|
|
18
|
+
allowance?: Partial<Record<PlanId, number>>;
|
|
19
|
+
/** Deal metadata. endsAt: ISO date or "while capacity lasts". */
|
|
20
|
+
discount?: {
|
|
21
|
+
pct: number;
|
|
22
|
+
endsAt?: string;
|
|
23
|
+
};
|
|
24
|
+
/** Pre-deal list prices (for reference). */
|
|
25
|
+
was?: {
|
|
26
|
+
input: number;
|
|
27
|
+
output: number;
|
|
28
|
+
cacheRead: number;
|
|
29
|
+
};
|
|
30
|
+
/** Discounted deal prices (what you pay now). */
|
|
31
|
+
now?: {
|
|
32
|
+
input: number;
|
|
33
|
+
output: number;
|
|
34
|
+
cacheRead: number;
|
|
35
|
+
};
|
|
36
|
+
/** Time-varying rates (DeepSeek V4 peak/off-peak). */
|
|
37
|
+
peakOffPeak?: {
|
|
38
|
+
peak: DealRates;
|
|
39
|
+
offPeak: DealRates;
|
|
40
|
+
windows: string;
|
|
41
|
+
};
|
|
42
|
+
/** Higher-context tier rates (docs: MiniMax M3 >512K). */
|
|
43
|
+
overContext?: DealRates;
|
|
44
|
+
benchmark?: {
|
|
45
|
+
intelligence?: number;
|
|
46
|
+
tokPerSec?: number;
|
|
47
|
+
};
|
|
48
|
+
tier?: "opensource" | "premium";
|
|
49
|
+
free: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare const MODEL_DEALS: Readonly<Record<string, ModelDeals>>;
|
|
52
|
+
export declare const PLAN_CATALOG: Readonly<Record<PlanId, PlanInfo>>;
|
|
53
|
+
export declare const DEAL_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits";
|
|
54
|
+
export declare const DEAL_LAST_REFRESHED = "2026-08-21";
|
|
55
|
+
export declare const DEAL_PACKAGE_VERSION = "docs";
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// src/deals/catalog.ts — GENERATED by scripts/refresh-deals.mjs. Do not edit.
|
|
2
|
+
//
|
|
3
|
+
// Deal/allowance/benchmark intelligence parsed from the Command Code docs
|
|
4
|
+
// site (pricing-limits, plans/goat, plans/pro). Bundled so the plugin can
|
|
5
|
+
// enrich the model picker, the sidebar panel, and the plan summary tool
|
|
6
|
+
// without network access at runtime. Regenerate with `npm run refresh:deals`.
|
|
7
|
+
export const MODEL_DEALS = {
|
|
8
|
+
"claude-fable-5": { tier: "premium", benchmark: { "intelligence": 62.1, "tokPerSec": 67.5 }, free: false },
|
|
9
|
+
"claude-haiku-4-5-20251001": { tier: "premium", benchmark: { "intelligence": 24.1, "tokPerSec": 101.1 }, free: false, allowance: { "pro": 20 } },
|
|
10
|
+
"claude-opus-4-7": { tier: "premium", benchmark: { "intelligence": 55 }, free: false },
|
|
11
|
+
"claude-opus-4-8": { tier: "premium", benchmark: { "intelligence": 57.3 }, free: false },
|
|
12
|
+
"claude-opus-5": { tier: "premium", benchmark: { "intelligence": 63.1, "tokPerSec": 54.4 }, free: false },
|
|
13
|
+
"claude-sonnet-4-6": { tier: "premium", benchmark: { "intelligence": 48.4 }, free: false, allowance: { "pro": 20 } },
|
|
14
|
+
"claude-sonnet-5": { tier: "premium", benchmark: { "intelligence": 55.3, "tokPerSec": 81.9 }, free: false, allowance: { "pro": 20 } },
|
|
15
|
+
"deepseek/deepseek-v4-flash": { tier: "opensource", benchmark: { "intelligence": 51.8, "tokPerSec": 114.6 }, peakOffPeak: { "peak": { "input": 0.44, "output": 1.32, "cacheRead": 0.014, "cacheWrite": 0 }, "offPeak": { "input": 0.22, "output": 0.66, "cacheRead": 0.007, "cacheWrite": 0 }, "windows": "01–04 & 06–10 UTC" }, free: false, allowance: { "goat": 60, "pro": 70 } },
|
|
16
|
+
"deepseek/deepseek-v4-pro": { tier: "opensource", benchmark: { "intelligence": 53.2, "tokPerSec": 75.3 }, peakOffPeak: { "peak": { "input": 1.32, "output": 3.96, "cacheRead": 0.044, "cacheWrite": 0 }, "offPeak": { "input": 0.66, "output": 1.98, "cacheRead": 0.022, "cacheWrite": 0 }, "windows": "01–04 & 06–10 UTC" }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
17
|
+
"google/gemini-3.1-flash-lite": { tier: "premium", benchmark: { "intelligence": 25.6 }, free: false, allowance: { "pro": 20 } },
|
|
18
|
+
"google/gemini-3.5-flash": { tier: "premium", benchmark: { "intelligence": 52 }, free: false, allowance: { "pro": 20 } },
|
|
19
|
+
"google/gemini-3.5-flash-lite": { tier: "premium", benchmark: { "intelligence": 37.4, "tokPerSec": 361.2 }, free: false, allowance: { "pro": 20 } },
|
|
20
|
+
"google/gemini-3.6-flash": { tier: "premium", benchmark: { "intelligence": 51.6, "tokPerSec": 187.4 }, free: false, allowance: { "pro": 20 } },
|
|
21
|
+
"google/gemini-3.7-flash": { tier: "opensource", discount: { "pct": 50, "endsAt": "2026-12-31" }, was: { "input": 1.5, "output": 7.5, "cacheRead": 0.15 }, now: { "input": 0.75, "output": 3.75, "cacheRead": 0.075 }, benchmark: { "intelligence": 56, "tokPerSec": 339.4 }, free: false, allowance: { "goat": 40, "pro": 60 } },
|
|
22
|
+
"gpt-5.3-codex": { tier: "premium", benchmark: { "intelligence": 45.5, "tokPerSec": 132.3 }, free: false, allowance: { "pro": 20 } },
|
|
23
|
+
"gpt-5.4": { tier: "premium", benchmark: { "intelligence": 53.1 }, free: false, allowance: { "pro": 20 } },
|
|
24
|
+
"gpt-5.4-mini": { tier: "premium", benchmark: { "intelligence": 40.9 }, free: false, allowance: { "pro": 20 } },
|
|
25
|
+
"gpt-5.5": { tier: "premium", benchmark: { "intelligence": 56.3 }, free: false, allowance: { "pro": 20 } },
|
|
26
|
+
"gpt-5.6-luna": { tier: "opensource", benchmark: { "intelligence": 52.3, "tokPerSec": 165 }, overContext: { "input": 0.4, "output": 1.8, "cacheRead": 0.04, "cacheWrite": 0.5 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
27
|
+
"gpt-5.6-sol": { tier: "opensource", benchmark: { "intelligence": 60.9, "tokPerSec": 68.7 }, overContext: { "input": 10, "output": 45, "cacheRead": 1, "cacheWrite": 12.5 }, free: false, allowance: { "goat": 70, "pro": 80 } },
|
|
28
|
+
"gpt-5.6-terra": { tier: "premium", benchmark: { "intelligence": 56.6, "tokPerSec": 117.1 }, overContext: { "input": 4, "output": 18, "cacheRead": 0.4, "cacheWrite": 5 }, free: false, allowance: { "pro": 20 } },
|
|
29
|
+
"meta/muse-spark-1.1": { tier: "premium", benchmark: { "intelligence": 53.2 }, free: false, allowance: { "pro": 20 } },
|
|
30
|
+
"meta/muse-spark-1.2": { tier: "opensource", benchmark: { "intelligence": 56.8 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
31
|
+
"meta/muse-spark-1.2-contributor": { tier: "opensource", benchmark: { "intelligence": 56.8 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
32
|
+
"MiniMaxAI/MiniMax-M2.5": { tier: "opensource", benchmark: { "intelligence": 34.5 }, free: false },
|
|
33
|
+
"MiniMaxAI/MiniMax-M2.7": { tier: "opensource", benchmark: { "intelligence": 38.9 }, free: false },
|
|
34
|
+
"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": 104.4 }, free: false, allowance: { "goat": 47, "pro": 57 } },
|
|
35
|
+
"moonshotai/Kimi-K2.5": { tier: "opensource", benchmark: { "intelligence": 36 }, free: false },
|
|
36
|
+
"moonshotai/Kimi-K2.6": { tier: "opensource", benchmark: { "intelligence": 45.1 }, free: false },
|
|
37
|
+
"moonshotai/Kimi-K2.7-Code": { tier: "opensource", benchmark: { "intelligence": 43, "tokPerSec": 38.2 }, free: false, allowance: { "goat": 60, "pro": 70 } },
|
|
38
|
+
"moonshotai/Kimi-K2.7-Code-Highspeed": { tier: "opensource", free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
39
|
+
"moonshotai/Kimi-K3": { tier: "opensource", benchmark: { "intelligence": 59.7, "tokPerSec": 38.6 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
40
|
+
"nvidia/nemotron-3-ultra-550b-a55b": { tier: "opensource", benchmark: { "intelligence": 38.3, "tokPerSec": 135.8 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
41
|
+
"poolside/laguna-s-2.1-free": { tier: "opensource", free: true },
|
|
42
|
+
"Qwen/Qwen3.6-Max-Preview": { tier: "opensource", benchmark: { "intelligence": 41.1 }, free: false },
|
|
43
|
+
"Qwen/Qwen3.6-Plus": { tier: "opensource", benchmark: { "intelligence": 40.5 }, overContext: { "input": 2, "output": 6, "cacheRead": 0.2, "cacheWrite": 0 }, free: false, allowance: { "goat": 33, "pro": 43 } },
|
|
44
|
+
"Qwen/Qwen3.7-Flash": { tier: "opensource", overContext: { "input": 0.2, "output": 0.8, "cacheRead": 0.04, "cacheWrite": 0.25 }, free: false },
|
|
45
|
+
"Qwen/Qwen3.7-Max": { tier: "opensource", benchmark: { "intelligence": 46.7 }, free: false, allowance: { "goat": 33, "pro": 43 } },
|
|
46
|
+
"Qwen/Qwen3.7-Plus": { tier: "opensource", benchmark: { "intelligence": 39.4, "tokPerSec": 55.6 }, overContext: { "input": 1.2, "output": 4.8, "cacheRead": 0.24, "cacheWrite": 1.5 }, free: false, allowance: { "goat": 33, "pro": 43 } },
|
|
47
|
+
"Qwen/Qwen3.8-27B": { tier: "opensource", benchmark: { "intelligence": 52 }, free: false, allowance: { "goat": 70, "pro": 80 } },
|
|
48
|
+
"Qwen/Qwen3.8-Max": { tier: "opensource", benchmark: { "intelligence": 58.1, "tokPerSec": 46.7 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
49
|
+
"sakana/fugu-ultra": { tier: "premium", free: false },
|
|
50
|
+
"stepfun/Step-3.5-Flash": { tier: "opensource", benchmark: { "intelligence": 26.5 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
51
|
+
"stepfun/Step-3.7-Flash": { tier: "opensource", benchmark: { "intelligence": 30.9, "tokPerSec": 120.1 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
52
|
+
"tencent/hy3-paid": { tier: "opensource", benchmark: { "intelligence": 42.2, "tokPerSec": 74.8 }, free: false, allowance: { "goat": 70, "pro": 80 } },
|
|
53
|
+
"thinkingmachines/inkling": { tier: "opensource", benchmark: { "intelligence": 42.3, "tokPerSec": 69.8 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
54
|
+
"thinkingmachines/inkling-small": { tier: "opensource", benchmark: { "intelligence": 41.2, "tokPerSec": 61.3 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
55
|
+
"xai/grok-4.5": { tier: "opensource", benchmark: { "intelligence": 55.8, "tokPerSec": 51 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
56
|
+
"xai/grok-4.6": { tier: "opensource", benchmark: { "intelligence": 60.9, "tokPerSec": 66 }, overContext: { "input": 4, "output": 12, "cacheRead": 1, "cacheWrite": 0 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
57
|
+
"xiaomi/mimo-v2.5": { tier: "opensource", discount: { "pct": 98 }, was: { "input": 0.8, "output": 4, "cacheRead": 0.16 }, now: { "input": 0.14, "output": 0.28, "cacheRead": 0.0028 }, benchmark: { "intelligence": 38, "tokPerSec": 61.8 }, free: false, allowance: { "goat": 30, "pro": 40 } },
|
|
58
|
+
"xiaomi/mimo-v2.5-pro": { tier: "opensource", discount: { "pct": 99 }, was: { "input": 2, "output": 6, "cacheRead": 0.4 }, now: { "input": 0.435, "output": 0.87, "cacheRead": 0.0036 }, benchmark: { "intelligence": 42.9, "tokPerSec": 58.1 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
59
|
+
"zai-org/GLM-5": { tier: "opensource", benchmark: { "intelligence": 40.6 }, free: false },
|
|
60
|
+
"zai-org/GLM-5.1": { tier: "opensource", benchmark: { "intelligence": 41, "tokPerSec": 28.2 }, free: false },
|
|
61
|
+
"zai-org/GLM-5.2": { tier: "opensource", benchmark: { "intelligence": 52.6, "tokPerSec": 69 }, free: false, allowance: { "goat": 70, "pro": 80 } },
|
|
62
|
+
"zai-org/GLM-5.2-Fast": { tier: "opensource", free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
63
|
+
"zai-org/GLM-5.3": { tier: "opensource", benchmark: { "intelligence": 59.5, "tokPerSec": 79.6 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
64
|
+
};
|
|
65
|
+
export const PLAN_CATALOG = {
|
|
66
|
+
go: { price: 1, credits: 10, window5h: 3, windowWeek: 6, display: "Go" },
|
|
67
|
+
goat: { price: 10, credits: 70, window5h: 14, windowWeek: 35, display: "GOAT" },
|
|
68
|
+
pro: { price: 20, credits: 80, window5h: 16, windowWeek: 40, display: "Pro" },
|
|
69
|
+
max: { price: 100, credits: 150, window5h: 45, windowWeek: 90, display: "Max 10×" },
|
|
70
|
+
max20: { price: 200, credits: 300, window5h: 90, windowWeek: 180, display: "Max 20×" },
|
|
71
|
+
teampro: { price: 40, credits: 40, window5h: 12, windowWeek: 24, display: "Team Pro" },
|
|
72
|
+
provider: { price: 15, credits: 0, window5h: 0, windowWeek: 0, display: "Provider" },
|
|
73
|
+
};
|
|
74
|
+
export const DEAL_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits";
|
|
75
|
+
export const DEAL_LAST_REFRESHED = "2026-08-21";
|
|
76
|
+
export const DEAL_PACKAGE_VERSION = "docs";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Config } from "@opencode-ai/sdk/v2";
|
|
2
|
+
import { type ModelDeals } from "./catalog.js";
|
|
3
|
+
export declare function enrichCommandCodeModels(config: Config, deals?: Readonly<Record<string, ModelDeals>>): void;
|
|
4
|
+
export declare function buildCmdOptions(deals: ModelDeals): Record<string, unknown>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { MODEL_DEALS } from "./catalog.js";
|
|
2
|
+
import { vendorFamilyForModel } from "./vendor.js";
|
|
3
|
+
export function enrichCommandCodeModels(config, deals = MODEL_DEALS) {
|
|
4
|
+
const provider = config.provider?.["commandcode"];
|
|
5
|
+
if (!provider?.models)
|
|
6
|
+
return;
|
|
7
|
+
const isEmpty = Object.keys(deals).length === 0;
|
|
8
|
+
for (const [modelId, model] of Object.entries(provider.models)) {
|
|
9
|
+
if (!model)
|
|
10
|
+
continue;
|
|
11
|
+
if (model.family === undefined) {
|
|
12
|
+
const family = vendorFamilyForModel(modelId);
|
|
13
|
+
if (family !== undefined)
|
|
14
|
+
model.family = family;
|
|
15
|
+
}
|
|
16
|
+
const entry = deals[modelId];
|
|
17
|
+
if (!entry) {
|
|
18
|
+
if (isEmpty && model.options?.["cmd"] === undefined) {
|
|
19
|
+
model.options ??= {};
|
|
20
|
+
model.options["cmd"] = { unavailable: true };
|
|
21
|
+
}
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (model.options?.["cmd"] === undefined) {
|
|
25
|
+
model.options ??= {};
|
|
26
|
+
model.options["cmd"] = buildCmdOptions(entry);
|
|
27
|
+
}
|
|
28
|
+
if (entry.overContext && model.cost?.["context_over_200k"] === undefined) {
|
|
29
|
+
const c = entry.overContext;
|
|
30
|
+
// Only the higher-context tier is carried here; the SDK `cost` type
|
|
31
|
+
// requires base input/output, so the unset branch is cast.
|
|
32
|
+
model.cost ??= {};
|
|
33
|
+
model.cost["context_over_200k"] = {
|
|
34
|
+
input: c.input,
|
|
35
|
+
output: c.output,
|
|
36
|
+
cache_read: c.cacheRead,
|
|
37
|
+
cache_write: c.cacheWrite,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function buildCmdOptions(deals) {
|
|
43
|
+
const out = {};
|
|
44
|
+
if (deals.tier !== undefined)
|
|
45
|
+
out.tier = deals.tier;
|
|
46
|
+
if (deals.allowance !== undefined && Object.keys(deals.allowance).length > 0) {
|
|
47
|
+
out.allowance = deals.allowance;
|
|
48
|
+
}
|
|
49
|
+
if (deals.discount !== undefined)
|
|
50
|
+
out.discount = deals.discount;
|
|
51
|
+
if (deals.was !== undefined)
|
|
52
|
+
out.was = deals.was;
|
|
53
|
+
if (deals.now !== undefined)
|
|
54
|
+
out.now = deals.now;
|
|
55
|
+
if (deals.benchmark !== undefined)
|
|
56
|
+
out.benchmark = deals.benchmark;
|
|
57
|
+
if (deals.peakOffPeak !== undefined)
|
|
58
|
+
out.peakOffPeak = deals.peakOffPeak;
|
|
59
|
+
if (deals.overContext !== undefined)
|
|
60
|
+
out.overContext = deals.overContext;
|
|
61
|
+
out.free = deals.free;
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { MODEL_DEALS, PLAN_CATALOG, DEAL_SOURCE_URL, DEAL_LAST_REFRESHED, DEAL_PACKAGE_VERSION, } from "./catalog.js";
|
|
2
|
+
export type { ModelDeals, PlanId, PlanInfo, DealRates } from "./catalog.js";
|
|
3
|
+
export { vendorFamilyForModel } from "./vendor.js";
|
|
4
|
+
export { enrichCommandCodeModels, buildCmdOptions } from "./enrichment.js";
|
|
5
|
+
export { planSummaryTool, renderPlanSummary, resolvePlan, normalizePlan } from "./plan-summary.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// src/deals/index.ts — server-side public entry for Deals intelligence
|
|
2
|
+
// (catalog + enrichment + cmd_plan_summary tool). The TUI panel is a separate
|
|
3
|
+
// host and is reached via tui.ts → src/deals/tui.tsx, never from the server
|
|
4
|
+
// barrel, so the provider process does not load solid-js/@opentui. Deleting
|
|
5
|
+
// this folder plus the two registration lines in src/plugin/index.ts leaves
|
|
6
|
+
// Core (Snapshot, Auto-registration, provider/* streaming) byte-identical.
|
|
7
|
+
// Catalog
|
|
8
|
+
export { MODEL_DEALS, PLAN_CATALOG, DEAL_SOURCE_URL, DEAL_LAST_REFRESHED, DEAL_PACKAGE_VERSION, } from "./catalog.js";
|
|
9
|
+
// Vendor (used by enrichment, but exported for tests that import vendor directly
|
|
10
|
+
// from the deals deep module — keep as part of the slice so tests don't reach
|
|
11
|
+
// into src/plugin)
|
|
12
|
+
export { vendorFamilyForModel } from "./vendor.js";
|
|
13
|
+
// Enrichment (family + options.cmd + context_over_200k cost)
|
|
14
|
+
export { enrichCommandCodeModels, buildCmdOptions } from "./enrichment.js";
|
|
15
|
+
// Tool
|
|
16
|
+
export { planSummaryTool, renderPlanSummary, resolvePlan, normalizePlan } from "./plan-summary.js";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ModelDeals, type PlanId, type PlanInfo } from "./catalog.js";
|
|
2
|
+
export declare function normalizePlan(value: unknown): PlanId | undefined;
|
|
3
|
+
export declare function resolvePlan(planArg: string | undefined, env?: NodeJS.ProcessEnv): Promise<PlanId>;
|
|
4
|
+
export declare function renderPlanSummary(plan: PlanId, deals?: Readonly<Record<string, ModelDeals>>, catalog?: Readonly<Record<PlanId, PlanInfo>>): string;
|
|
5
|
+
export declare function planSummaryTool(): {
|
|
6
|
+
description: string;
|
|
7
|
+
args: {
|
|
8
|
+
plan: import("zod").ZodOptional<import("zod").ZodString>;
|
|
9
|
+
};
|
|
10
|
+
execute(args: {
|
|
11
|
+
plan?: string | undefined;
|
|
12
|
+
}, context: import("@opencode-ai/plugin").ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
|
|
13
|
+
};
|