@sriinnu/kosha-discovery 1.13.0 → 1.15.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/README.md +88 -78
- package/dist/cli-cmd-doctor.d.ts.map +1 -1
- package/dist/cli-cmd-doctor.js +69 -18
- package/dist/cli-cmd-doctor.js.map +1 -1
- package/dist/cli-cmd-model.d.ts.map +1 -1
- package/dist/cli-cmd-model.js +18 -7
- package/dist/cli-cmd-model.js.map +1 -1
- package/dist/cli-cmd-query.d.ts.map +1 -1
- package/dist/cli-cmd-query.js +17 -0
- package/dist/cli-cmd-query.js.map +1 -1
- package/dist/cli-cmd-registry.d.ts +2 -1
- package/dist/cli-cmd-registry.d.ts.map +1 -1
- package/dist/cli-cmd-registry.js +30 -1
- package/dist/cli-cmd-registry.js.map +1 -1
- package/dist/cli-commands.d.ts +4 -0
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +43 -5
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +4 -1
- package/dist/cli-help.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/cost.d.ts +16 -1
- package/dist/cost.d.ts.map +1 -1
- package/dist/cost.js +73 -14
- package/dist/cost.js.map +1 -1
- package/dist/credentials/resolver.d.ts +0 -1
- package/dist/credentials/resolver.d.ts.map +1 -1
- package/dist/credentials/resolver.js +10 -46
- package/dist/credentials/resolver.js.map +1 -1
- package/dist/discovery/catalog-only.d.ts.map +1 -1
- package/dist/discovery/catalog-only.js +8 -1
- package/dist/discovery/catalog-only.js.map +1 -1
- package/dist/discovery/free-tier.d.ts +2 -0
- package/dist/discovery/free-tier.d.ts.map +1 -1
- package/dist/discovery/free-tier.js +4 -0
- package/dist/discovery/free-tier.js.map +1 -1
- package/dist/discovery/generic-openai.d.ts +27 -0
- package/dist/discovery/generic-openai.d.ts.map +1 -1
- package/dist/discovery/generic-openai.js +109 -5
- package/dist/discovery/generic-openai.js.map +1 -1
- package/dist/discovery/modelsdev-seed.d.ts.map +1 -1
- package/dist/discovery/modelsdev-seed.js +21 -6
- package/dist/discovery/modelsdev-seed.js.map +1 -1
- package/dist/discovery/openai-compatible.d.ts +2 -0
- package/dist/discovery/openai-compatible.d.ts.map +1 -1
- package/dist/discovery/openai-compatible.js +19 -11
- package/dist/discovery/openai-compatible.js.map +1 -1
- package/dist/discovery/snapshot-catalog.d.ts +18 -0
- package/dist/discovery/snapshot-catalog.d.ts.map +1 -1
- package/dist/discovery/snapshot-catalog.js +83 -3
- package/dist/discovery/snapshot-catalog.js.map +1 -1
- package/dist/discovery/vercel.d.ts.map +1 -1
- package/dist/discovery/vercel.js +19 -0
- package/dist/discovery/vercel.js.map +1 -1
- package/dist/discovery-contract.d.ts +8 -3
- package/dist/discovery-contract.d.ts.map +1 -1
- package/dist/discovery-contract.js.map +1 -1
- package/dist/enrichment/catalog.js +2 -2
- package/dist/enrichment/catalog.js.map +1 -1
- package/dist/enrichment/litellm.d.ts.map +1 -1
- package/dist/enrichment/litellm.js +18 -16
- package/dist/enrichment/litellm.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +13 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +19 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/mcp-server.d.ts +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +8 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/price-trust.d.ts +12 -0
- package/dist/price-trust.d.ts.map +1 -1
- package/dist/price-trust.js +72 -0
- package/dist/price-trust.js.map +1 -1
- package/dist/provider-catalog.d.ts +48 -0
- package/dist/provider-catalog.d.ts.map +1 -1
- package/dist/provider-catalog.js +114 -6
- package/dist/provider-catalog.js.map +1 -1
- package/dist/proxy.d.ts +9 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +196 -31
- package/dist/proxy.js.map +1 -1
- package/dist/registry-discovery.js +7 -1
- package/dist/registry-discovery.js.map +1 -1
- package/dist/registry-query.d.ts.map +1 -1
- package/dist/registry-query.js +20 -8
- package/dist/registry-query.js.map +1 -1
- package/dist/registry-routing.d.ts.map +1 -1
- package/dist/registry-routing.js +2 -1
- package/dist/registry-routing.js.map +1 -1
- package/dist/registry-runtime.d.ts +34 -2
- package/dist/registry-runtime.d.ts.map +1 -1
- package/dist/registry-runtime.js +499 -67
- package/dist/registry-runtime.js.map +1 -1
- package/dist/registry.d.ts +5 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +22 -4
- package/dist/registry.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +21 -6
- package/dist/server.js.map +1 -1
- package/dist/snapshot-gate.d.ts +50 -0
- package/dist/snapshot-gate.d.ts.map +1 -0
- package/dist/snapshot-gate.js +128 -0
- package/dist/snapshot-gate.js.map +1 -0
- package/dist/subscription-plans.d.ts +63 -0
- package/dist/subscription-plans.d.ts.map +1 -0
- package/dist/subscription-plans.js +261 -0
- package/dist/subscription-plans.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -8
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -6,24 +6,29 @@
|
|
|
6
6
|
|
|
7
7
|
**Tells your agent — or your code — which model to use and what it costs.**
|
|
8
8
|
|
|
9
|
+
**Website:** [kosha.srinivas.dev](https://kosha.srinivas.dev)
|
|
10
|
+
|
|
9
11
|
[](https://github.com/sponsors/sriinnu)
|
|
10
12
|
[](https://buymeacoffee.com/sriinnu)
|
|
11
13
|
|
|
12
|
-
kosha discovers models across 46 providers and local runtimes,
|
|
14
|
+
kosha discovers models across 46 providers and local runtimes, plus 22 subscription
|
|
15
|
+
plans (token and coding plans) when you hold a key for one. It finds your API keys
|
|
13
16
|
wherever they already live (env vars, Claude CLI, Codex, gcloud ADC, AWS SSO), fills
|
|
14
17
|
in pricing and context limits, and answers questions like *the cheapest model with
|
|
15
18
|
tool use and 128k context that I actually hold a key for*. It ships as a TypeScript
|
|
16
19
|
library, a CLI, an HTTP API, an OpenAI-compatible proxy with a spend ledger, and an
|
|
17
20
|
MCP server.
|
|
18
21
|
|
|
19
|
-
It works with no API keys at all
|
|
20
|
-
LiteLLM catalogs, so `kosha list` is useful on a fresh machine.
|
|
22
|
+
It works with no API keys at all: discovery falls back to the public models.dev and
|
|
23
|
+
LiteLLM catalogs, so `kosha list` is useful on a fresh machine. Pass `keyless: true`
|
|
24
|
+
to `createKosha()` to skip credential lookup entirely.
|
|
21
25
|
|
|
22
26
|
## Install
|
|
23
27
|
|
|
24
28
|
```bash
|
|
25
29
|
npm install @sriinnu/kosha-discovery # library / server
|
|
26
30
|
npm install -g @sriinnu/kosha-discovery # global `kosha` CLI
|
|
31
|
+
brew install sriinnu/tap/kosha # same CLI and MCP server, via Homebrew
|
|
27
32
|
```
|
|
28
33
|
|
|
29
34
|
Requires Node.js 22+.
|
|
@@ -40,26 +45,30 @@ const kosha = await createKosha();
|
|
|
40
45
|
const models = kosha.models(); // ModelCard[] across every provider
|
|
41
46
|
const cheapest = kosha.cheapestModels({ role: "image" }); // ranked by price, with missingCredentials
|
|
42
47
|
const sonnet = kosha.model("sonnet"); // alias → canonical ID; undefined if unknown
|
|
43
|
-
console.log(sonnet?.pricing); // { inputPerMillion
|
|
48
|
+
console.log(sonnet?.pricing); // { inputPerMillion, outputPerMillion, cacheReadPerMillion, ... } in USD per 1M tokens
|
|
44
49
|
```
|
|
45
50
|
|
|
46
51
|
### CLI
|
|
47
52
|
|
|
48
53
|
```bash
|
|
49
|
-
kosha discover # query every provider
|
|
54
|
+
kosha discover # load the 24 h cache, or query every provider when it's cold
|
|
50
55
|
kosha list --provider anthropic # read from the local cache
|
|
51
56
|
kosha model sonnet # one model, alias-aware
|
|
52
57
|
kosha routes claude-opus-5-5 # every serving route for a model (direct, OpenRouter, Bedrock, …)
|
|
53
58
|
kosha cheapest --role embeddings # rank by price for a role
|
|
54
59
|
kosha doctor --ci --model opus,gpt6 # fail CI if a model you pin is deprecated, retiring, or gone
|
|
55
60
|
kosha spend --since 2026-09-01 # roll up the proxy's spend ledger
|
|
56
|
-
kosha
|
|
61
|
+
kosha ranked --strategy fastest # routes in the order kosha:<strategy> tries them
|
|
62
|
+
kosha providers # every provider, with credential status
|
|
63
|
+
kosha refresh # bypass the cache and re-discover (alias: update)
|
|
64
|
+
kosha registry accept openai/gpt-6.1-sol # release a held price once you've checked it
|
|
65
|
+
kosha registry export --output catalog.json # the catalog as a file, for local mode
|
|
57
66
|
kosha serve --port 3000 # HTTP API + proxy; binds 127.0.0.1 (see Proxy below)
|
|
58
67
|
```
|
|
59
68
|
|
|
60
|
-
Every command takes `--json`. `kosha --help` lists the rest.
|
|
69
|
+
Every query command takes `--json`. `kosha --help` lists the rest.
|
|
61
70
|
|
|
62
|
-
After each discovery, a stable v1 manifest lands at `~/.kosha/registry.json`:
|
|
71
|
+
After each live discovery (not a cache hit), a stable v1 manifest lands at `~/.kosha/registry.json`:
|
|
63
72
|
|
|
64
73
|
```bash
|
|
65
74
|
jq '.models[] | select(.pricing.inputPerMillion < 0.1) | .modelId' ~/.kosha/registry.json
|
|
@@ -75,7 +84,7 @@ or listed by no provider any more:
|
|
|
75
84
|
with:
|
|
76
85
|
models: |
|
|
77
86
|
claude-opus-5-5
|
|
78
|
-
gpt-6-sol
|
|
87
|
+
gpt-6.1-sol
|
|
79
88
|
sonnet
|
|
80
89
|
```
|
|
81
90
|
|
|
@@ -89,6 +98,33 @@ model. A reseller retiring one of its routes is reported but does not fail the
|
|
|
89
98
|
build while the model's own provider still serves it; `deprecation-window`
|
|
90
99
|
(default 30 days) sets how far ahead a sunset counts.
|
|
91
100
|
|
|
101
|
+
### Why trust the prices
|
|
102
|
+
|
|
103
|
+
Prices come from the provider's own API where it publishes them, then models.dev
|
|
104
|
+
and LiteLLM, then kosha's weekly snapshot. `pricingSource` on each card says which.
|
|
105
|
+
Catalogs are sometimes wrong, so kosha doesn't take a new price on faith:
|
|
106
|
+
|
|
107
|
+
- A rate that moves 75% or more in one step is held at the old price and the row
|
|
108
|
+
is tagged `pricing_quarantined`. The new price is accepted after 1 to 7 days,
|
|
109
|
+
depending on whether its sources agree.
|
|
110
|
+
- A price under half, or over 4×, the highest price of the last 30 days is held
|
|
111
|
+
too, so it can't walk down in small steps.
|
|
112
|
+
- A billed rate that falls to `$0`, or under 1% of the last one, is never released
|
|
113
|
+
by waiting. A catalog `$0` is never ranked cheapest and is refused under a budget.
|
|
114
|
+
- While a price is held or its sources disagree, kosha routes and budgets on the
|
|
115
|
+
highest rate anyone reports, so a suspect rise applies at once and a cut waits.
|
|
116
|
+
- Negative, NaN and infinite rates are dropped.
|
|
117
|
+
|
|
118
|
+
Checked a held price against the provider's pricing page? Release it:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
kosha registry accept <provider>/<model>
|
|
122
|
+
kosha update
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The weekly snapshot gets the same gate. Details:
|
|
126
|
+
[docs/operations.md](docs/operations.md#clear-a-quarantined-price).
|
|
127
|
+
|
|
92
128
|
### Public snapshot
|
|
93
129
|
|
|
94
130
|
A weekly discovery run publishes a full snapshot — every provider, model, price
|
|
@@ -99,14 +135,11 @@ curl -sL https://github.com/sriinnu/kosha-discovery/releases/download/snapshot-l
|
|
|
99
135
|
| jq '.modelCount, .providerCount'
|
|
100
136
|
```
|
|
101
137
|
|
|
102
|
-
It
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
Each snapshot's release notes list what changed since the previous one — new
|
|
109
|
-
models, repricings, new deprecations, removals. The same diff runs locally with
|
|
138
|
+
It's signed: kosha checks `kosha-latest.json.sig` against a built-in key before
|
|
139
|
+
using it. Dated `snapshot-YYYY-MM-DD` pre-releases keep a short trail for diffing, pruned to
|
|
140
|
+
the two most recent. Each snapshot's release notes list what changed since the
|
|
141
|
+
previous one (new models, repricings, deprecations, removals) and any price the
|
|
142
|
+
gate is holding. The same diff runs locally with
|
|
110
143
|
`pnpm snapshot:diff old.json new.json`.
|
|
111
144
|
|
|
112
145
|
### HTTP API
|
|
@@ -137,7 +170,7 @@ import OpenAI from "openai";
|
|
|
137
170
|
|
|
138
171
|
const client = new OpenAI({
|
|
139
172
|
baseURL: "http://localhost:3000/proxy/v1",
|
|
140
|
-
apiKey: "not-used", //
|
|
173
|
+
apiKey: "not-used", // ignored on loopback; set it to KOSHA_PROXY_TOKEN when one is configured
|
|
141
174
|
});
|
|
142
175
|
|
|
143
176
|
// Use any canonical model ID or alias
|
|
@@ -169,18 +202,26 @@ const routed = await client.chat.completions.create({
|
|
|
169
202
|
|
|
170
203
|
`kosha:fastest`, `kosha:reliable`, and `kosha:balanced` take the same filters and rank on observed latency and circuit-breaker state instead of price.
|
|
171
204
|
|
|
172
|
-
Every response carries `x-kosha-model`, `x-kosha-provider`, `x-kosha-requested
|
|
205
|
+
Every response carries `x-kosha-model`, `x-kosha-provider`, `x-kosha-requested` and `x-kosha-attempt-chain`, plus `x-kosha-estimated-cost-usd` except on plan-billed routes. Non-streaming responses add `x-kosha-actual-cost-usd` when the upstream returned a usage block. The full list, including `x-kosha-usage-source` and `x-kosha-wire-notes`, is in [docs/operations.md](docs/operations.md).
|
|
173
206
|
|
|
174
207
|
What the proxy can forward:
|
|
175
208
|
|
|
176
209
|
| Upstream wire format | Providers | Support |
|
|
177
210
|
|---|---|---|
|
|
178
211
|
| OpenAI-compatible | OpenAI, Ollama, OpenRouter, Vercel, Groq, Together, Fireworks, DeepInfra, … | passthrough, streaming included |
|
|
179
|
-
| Anthropic Messages | Anthropic | translated: streaming, tools, `image_url`, `response_format`, `reasoning_effort`; audio input and non-function tools fail over to an OpenAI-compatible route for the same model |
|
|
212
|
+
| Anthropic Messages | Anthropic, MiniMax Token Plan | translated: streaming, tools, `image_url`, `response_format`, `reasoning_effort`; audio input and non-function tools fail over to an OpenAI-compatible route for the same model |
|
|
180
213
|
| Cloud SDKs | Google, Bedrock, Vertex | discovery only, not proxied yet |
|
|
181
214
|
| Non-chat / other wire | TypeSafe, Thinking Machines | discovery only — TypeSafe's System One endpoint is not a chat API, and Tinker's Anthropic-wire path differs from Anthropic's own |
|
|
182
215
|
|
|
183
|
-
Defaults that matter before you expose it:
|
|
216
|
+
Defaults that matter before you expose it:
|
|
217
|
+
|
|
218
|
+
- The server binds `127.0.0.1`. Pass `--host 0.0.0.0` (or `KOSHA_HOST`) to listen on a network interface.
|
|
219
|
+
- Set `KOSHA_PROXY_TOKEN` so `/proxy/*` and `POST /api/refresh` require `Authorization: Bearer <token>` or `x-kosha-token`.
|
|
220
|
+
- `/metrics` is open unless `KOSHA_METRICS_TOKEN` is set. `KOSHA_ALLOWED_HOSTS` restricts which `Host` names are answered.
|
|
221
|
+
- `KOSHA_MONTHLY_BUDGET_USD` caps spend per calendar month and `KOSHA_TENANT_BUDGET_USD` per tenant. `0` lets nothing paid through; a value that isn't a plain amount stops `kosha serve`.
|
|
222
|
+
- The proxy never forwards a Claude subscription OAuth token, and a key is only sent to the host it belongs to.
|
|
223
|
+
|
|
224
|
+
Reference: [docs/api.md](docs/api.md#openai-compatible-proxy), [docs/operations.md](docs/operations.md), [docs/security.md](docs/security.md).
|
|
184
225
|
|
|
185
226
|
### MCP server
|
|
186
227
|
|
|
@@ -194,17 +235,14 @@ It is published to the [MCP registry](https://github.com/modelcontextprotocol/re
|
|
|
194
235
|
as `io.github.sriinnu/kosha-discovery`, so clients that read the registry can
|
|
195
236
|
install it without a manual command. The manifest is [`server.json`](server.json).
|
|
196
237
|
|
|
197
|
-
Every provider key is optional. With no credentials at all the server still
|
|
198
|
-
answers from the public models.dev and LiteLLM catalogs plus a curated offline
|
|
199
|
-
list, so it is useful on a fresh machine.
|
|
200
|
-
|
|
201
238
|
Tools and protocol details: [docs/mcp.md](docs/mcp.md).
|
|
202
239
|
|
|
203
240
|
## Supported providers
|
|
204
241
|
|
|
205
|
-
46 providers
|
|
206
|
-
|
|
207
|
-
|
|
242
|
+
46 pay-as-you-go providers and local runtimes, plus 22 subscription plans generated
|
|
243
|
+
from `src/subscription-plans.ts`. Each has a descriptor in `src/provider-catalog.ts`;
|
|
244
|
+
most OpenAI-compatible ones are driven from `GENERIC_OPENAI_PROVIDERS` in
|
|
245
|
+
`src/discovery/generic-openai.ts` rather than a hand-written class.
|
|
208
246
|
|
|
209
247
|
| Provider | Discovery | Credential sources |
|
|
210
248
|
|----------|-----------|--------------------|
|
|
@@ -224,11 +262,20 @@ rather than a hand-written class.
|
|
|
224
262
|
| Alibaba Model Studio (Qwen), Volcengine Ark (Doubao), Inception (Mercury), AI21 (Jamba), Upstage (Solar), StepFun, Meta (Muse Spark) | OpenAI-compatible API | `DASHSCOPE_API_KEY`, `ARK_API_KEY`, `INCEPTION_API_KEY`, `AI21_API_KEY`, `UPSTAGE_API_KEY`, `STEPFUN_API_KEY`, `META_MODEL_API_KEY` |
|
|
225
263
|
| Baseten, Nebius Token Factory, Novita AI, SiliconFlow, Hugging Face, Ollama Cloud | OpenAI-compatible API | `<PROVIDER>_API_KEY`, `HF_TOKEN` |
|
|
226
264
|
|
|
265
|
+
### Subscription plans
|
|
266
|
+
|
|
267
|
+
A token or coding plan (MiniMax, Moonshot, GLM, Alibaba and others) is listed as
|
|
268
|
+
its own provider, but only when a key for it resolves. A plan route has no
|
|
269
|
+
per-token price: `kosha cheapest` shows it in an "Included in your plans" group
|
|
270
|
+
(`includedInPlans` in the library), and the proxy prefers a plan route you hold.
|
|
271
|
+
A plan can borrow the provider's pay-as-you-go key; `KOSHA_PLAN_KEY_PROBE=off`
|
|
272
|
+
keeps each plan to its own env vars.
|
|
273
|
+
|
|
227
274
|
### Regional pairs
|
|
228
275
|
|
|
229
276
|
Several providers run separate hosts for international and mainland-China
|
|
230
|
-
traffic, with separate keys and **separate price sheets
|
|
231
|
-
|
|
277
|
+
traffic, with separate keys and **separate price sheets**: the same model can
|
|
278
|
+
cost several times more on one host than the other. Merging them would make
|
|
232
279
|
a model's price depend on which host answered last, so each region is its own
|
|
233
280
|
provider:
|
|
234
281
|
|
|
@@ -244,7 +291,9 @@ provider:
|
|
|
244
291
|
`kosha routes <model>` lists every region a model is served from, so you can
|
|
245
292
|
compare prices across them directly.
|
|
246
293
|
|
|
247
|
-
Without a key, providers fall back to the public models.dev + LiteLLM catalog, then to kosha's own weekly [snapshot](#public-snapshot) if those are unreachable, then to a curated static list
|
|
294
|
+
Without a key, providers fall back to the public models.dev + LiteLLM catalog, then to kosha's own weekly [snapshot](#public-snapshot) if those are unreachable, then to a curated static list. The same fallback applies when a key is present but rejected: the provider stays listed from the public catalog, shows as unauthenticated, and the error is kept for `kosha doctor`. Exact env var names: [docs/credentials.md](docs/credentials.md).
|
|
295
|
+
|
|
296
|
+
Config lives in `~/.kosharc.json`, with a per-project `kosha.config.json`. The project file can only make kosha stricter, never point keys somewhere else. See [docs/configuration.md](docs/configuration.md).
|
|
248
297
|
|
|
249
298
|
To take models.dev and LiteLLM out of the loop, set `KOSHA_CATALOG_SOURCE=pinned` (kosha's snapshot only) or `local` (a file from `kosha registry export`, no network). See [Catalog Source](docs/configuration.md#catalog-source).
|
|
250
299
|
|
|
@@ -259,7 +308,7 @@ to one would be a category error.
|
|
|
259
308
|
|
|
260
309
|
```bash
|
|
261
310
|
kosha cheapest --role judgment # rank judgment models by price
|
|
262
|
-
kosha model jev # mode: judgment
|
|
311
|
+
kosha model jev # mode: judgment
|
|
263
312
|
```
|
|
264
313
|
|
|
265
314
|
## How it works
|
|
@@ -291,48 +340,7 @@ hand. `aliases:check` compares it against a snapshot, and the weekly snapshot
|
|
|
291
340
|
run annotates itself with the result, so a bare alias like `opus` falling behind
|
|
292
341
|
shows up there rather than in a bug report.
|
|
293
342
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
```
|
|
297
|
-
src/
|
|
298
|
-
cli.ts # CLI entry point and arg parsing
|
|
299
|
-
cli-commands.ts # command implementations (+ cli-cmd-*.ts for the larger ones)
|
|
300
|
-
registry.ts # ModelRegistry public API
|
|
301
|
-
registry-runtime.ts # discovery orchestration, enrichment, cache, manifest export
|
|
302
|
-
registry-query.ts # model / role / capability queries
|
|
303
|
-
registry-selection.ts # cheapest candidates, binding hints
|
|
304
|
-
registry-routing.ts # cheapest / fastest / reliable / balanced ranking
|
|
305
|
-
discovery/ # one discoverer per provider + static and public-seed catalogs
|
|
306
|
-
enrichment/ # models.dev + LiteLLM pricing enrichment
|
|
307
|
-
credentials/ # credential resolution (env, CLI files, ADC, OAuth)
|
|
308
|
-
provider-catalog.ts # provider descriptors: base URLs, transport, env var names
|
|
309
|
-
aliases.ts # built-in short names → canonical model IDs
|
|
310
|
-
claude-generation.ts # which Claude generation accepts which API parameters
|
|
311
|
-
model-features.ts # tool dialect / structured-output inference per model
|
|
312
|
-
proxy.ts # OpenAI-compatible proxy: routing, failover, ledger
|
|
313
|
-
wire-anthropic.ts # OpenAI ↔ Anthropic request / response / SSE translation
|
|
314
|
-
cost.ts # spend ledger, budget gates, usage reconciliation
|
|
315
|
-
tally.ts # zero-dependency token usage + USD tally (also exported as ./tally)
|
|
316
|
-
server.ts # Hono HTTP API + operator token gate
|
|
317
|
-
mcp-server.ts # MCP stdio server
|
|
318
|
-
types.ts # shared types
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
### Adding a provider
|
|
322
|
-
|
|
323
|
-
For an OpenAI-compatible provider — most of them — it is two table entries:
|
|
324
|
-
|
|
325
|
-
1. Add a descriptor to `PROVIDER_CATALOG` in `src/provider-catalog.ts` (id, base URL, transport, credential env vars).
|
|
326
|
-
2. Add a spec to `GENERIC_OPENAI_PROVIDERS` in `src/discovery/generic-openai.ts`. It registers its own discoverer, resolves credentials from the descriptor's `credentialEnvVars`, and falls back to the public catalog when there is no key.
|
|
327
|
-
3. Map the provider to its models.dev / LiteLLM slug in `src/discovery/modelsdev-seed.ts` and `litellm-seed.ts` so keyless discovery works. **Check the slug** — GLM is published as `zhipuai`, and a missing mapping means no keyless models at all.
|
|
328
|
-
4. Add a case to `test/discovery/generic-openai.test.ts` and document the env vars in `docs/credentials.md`.
|
|
329
|
-
|
|
330
|
-
Write a discoverer class only when classification genuinely needs code — per-route pricing (OpenRouter), a non-OpenAI response envelope (TypeSafe), or origin remapping (Vercel):
|
|
331
|
-
|
|
332
|
-
1. Create `src/discovery/<provider>.ts` extending `BaseDiscoverer` or `OpenAICompatibleDiscoverer`; `fetchJSON` and `makeCard` are provided.
|
|
333
|
-
2. Export it from `src/discovery/index.ts` and add a factory entry to `DISCOVERER_REGISTRY`.
|
|
334
|
-
3. Add a resolver branch in `src/credentials/resolver.ts` only for a bespoke search order (CLI files, OAuth, ADC, SSO). A plain API key in env vars needs no branch — the descriptor covers it.
|
|
335
|
-
4. Add `test/discovery/<provider>.test.ts` (mock `fetch`; see `typesafe.test.ts`).
|
|
343
|
+
Contributing, the project layout and adding a provider: [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
336
344
|
|
|
337
345
|
## Docs
|
|
338
346
|
|
|
@@ -346,19 +354,19 @@ Write a discoverer class only when classification genuinely needs code — per-r
|
|
|
346
354
|
| [Architecture](docs/architecture.md) | Discovery flow, module map, adding providers |
|
|
347
355
|
| [Resilience](docs/resilience.md) | Circuit breakers, stale cache, health |
|
|
348
356
|
| [Operations](docs/operations.md) | Deployment sizing, metrics, spend ledger, recovery recipes |
|
|
349
|
-
| [Security](docs/security.md) | Threat catalogue, runtime scanning, pre-commit hook |
|
|
357
|
+
| [Security](docs/security.md) | Threat catalogue, runtime scanning, pre-commit hook; report issues per [SECURITY.md](SECURITY.md) |
|
|
350
358
|
| [Discovery Plane v1](docs/discovery-plane-v1.md) | Stable daemon contract (deltas, SSE watch, binding hints) |
|
|
351
359
|
|
|
352
360
|
The same pages are mirrored to the [wiki](https://github.com/sriinnu/kosha-discovery/wiki), alongside guides that only live there (troubleshooting, the release runbook). `docs/` is the source: the mirror is regenerated on every push to `main`, so edit here, not there.
|
|
353
361
|
|
|
354
362
|
## Release
|
|
355
363
|
|
|
356
|
-
1. Bump
|
|
364
|
+
1. Bump the version in `package.json`, in `server.json` (twice: top level and `packages[0]`), and the `default` in `action.yml`. Date the `[Unreleased]` section in `CHANGELOG.md`, and merge that as a PR.
|
|
357
365
|
2. Tag and push:
|
|
358
366
|
|
|
359
367
|
```bash
|
|
360
368
|
git tag -s vX.Y.Z -m "vX.Y.Z" && git push origin vX.Y.Z
|
|
361
|
-
gh workflow run release-npm.yml --ref vX.Y.Z -f tag=vX.Y.Z
|
|
369
|
+
gh workflow run release-npm.yml --ref vX.Y.Z -f tag=vX.Y.Z -f publish_mcp=false
|
|
362
370
|
```
|
|
363
371
|
|
|
364
372
|
The workflow checks that the tag matches `package.json`, runs lint / build / test, stages the package on npm with provenance, and creates the GitHub Release. Staging authenticates through npm trusted publishing (OIDC); there is no npm token. The version goes live only after a maintainer approves it with 2FA:
|
|
@@ -366,9 +374,11 @@ The workflow checks that the tag matches `package.json`, runs lint / build / tes
|
|
|
366
374
|
```bash
|
|
367
375
|
npm stage list @sriinnu/kosha-discovery
|
|
368
376
|
npm stage approve <id>
|
|
369
|
-
gh workflow run release-npm.yml --ref vX.Y.Z -f tag=vX.Y.Z -f publish_npm=false -f create_github_release=false #
|
|
377
|
+
gh workflow run release-npm.yml --ref vX.Y.Z -f tag=vX.Y.Z -f publish_npm=false -f create_github_release=false # publish to the MCP registry once npm is live
|
|
370
378
|
```
|
|
371
379
|
|
|
380
|
+
Every step, with the parts that are easy to forget: the [release runbook](https://github.com/sriinnu/kosha-discovery/wiki/Release-Runbook).
|
|
381
|
+
|
|
372
382
|
## Support
|
|
373
383
|
|
|
374
384
|
kosha is free and open source. If it helps you pick cheaper models, consider sponsoring its upkeep:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-cmd-doctor.d.ts","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"cli-cmd-doctor.d.ts","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAmBnD,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,gFAAgF;AAChF,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAgCpD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD/G;AA8RD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzE"}
|
package/dist/cli-cmd-doctor.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* @module
|
|
10
10
|
*/
|
|
11
11
|
import { describeCatalog } from "./catalog-source.js";
|
|
12
|
+
import { degradedHint, truncateReason } from "./cli-commands.js";
|
|
12
13
|
import { CYAN, c, DIM, GREEN, RED, YELLOW } from "./cli-format.js";
|
|
13
14
|
import { extractOriginProvider, matchableModelId } from "./normalize.js";
|
|
14
15
|
/** Exit code `doctor` uses to fail a CI run without looking like a crash. */
|
|
@@ -40,11 +41,13 @@ export async function cmdDoctor(registry, flags) {
|
|
|
40
41
|
const healthFindings = providers
|
|
41
42
|
.map((providerId) => projectHealth(registry, providerId))
|
|
42
43
|
.filter((row) => row !== null);
|
|
44
|
+
const credentials = collectCredentialFindings(registry);
|
|
43
45
|
if (f.json) {
|
|
44
|
-
process.stdout.write(`${JSON.stringify({ catalog, deprecations, health: healthFindings }, null, 2)}\n`);
|
|
46
|
+
process.stdout.write(`${JSON.stringify({ catalog, credentials, deprecations, health: healthFindings }, null, 2)}\n`);
|
|
45
47
|
}
|
|
46
48
|
else {
|
|
47
49
|
renderCatalog(catalog);
|
|
50
|
+
renderCredentials(credentials);
|
|
48
51
|
renderDeprecations(deprecations);
|
|
49
52
|
renderHealth(healthFindings);
|
|
50
53
|
}
|
|
@@ -232,38 +235,78 @@ function projectHealth(registry, providerId) {
|
|
|
232
235
|
reliabilityScore: h.reliabilityScore,
|
|
233
236
|
p95LatencyMs: h.p95LatencyMs,
|
|
234
237
|
timeoutRate: h.timeoutRate,
|
|
238
|
+
samples: h.samples,
|
|
235
239
|
};
|
|
236
240
|
}
|
|
237
241
|
catch {
|
|
238
242
|
return null;
|
|
239
243
|
}
|
|
240
244
|
}
|
|
245
|
+
/**
|
|
246
|
+
* Providers the last discovery listed without a working live call. Read from
|
|
247
|
+
* the cached providers, so `doctor` reports it without calling anyone.
|
|
248
|
+
*/
|
|
249
|
+
function collectCredentialFindings(registry) {
|
|
250
|
+
return registry
|
|
251
|
+
.providers_list()
|
|
252
|
+
.filter((p) => typeof p.degradedReason === "string" && p.degradedReason.length > 0)
|
|
253
|
+
.map((p) => ({ providerId: p.id, name: p.name, reason: p.degradedReason, source: p.degradedSource }))
|
|
254
|
+
.sort((a, b) => a.providerId.localeCompare(b.providerId));
|
|
255
|
+
}
|
|
256
|
+
function renderCredentials(findings) {
|
|
257
|
+
process.stdout.write(`${c(CYAN, "Credentials")}\n`);
|
|
258
|
+
if (findings.length === 0) {
|
|
259
|
+
process.stdout.write(c(DIM, " Every provider with a key answered its live call.\n\n"));
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
for (const f of findings) {
|
|
263
|
+
process.stdout.write(` ${c(YELLOW, degradedHint(f.reason, f.source))} ${f.providerId}\n`);
|
|
264
|
+
process.stdout.write(`${c(DIM, ` ${truncateReason(f.reason)}`)}\n`);
|
|
265
|
+
}
|
|
266
|
+
process.stdout.write("\n");
|
|
267
|
+
}
|
|
268
|
+
/** Lifecycle rows shown before `doctor` summarises the rest. */
|
|
269
|
+
const LIFECYCLE_ROWS_SHOWN = 25;
|
|
270
|
+
function lifecycleTag(f) {
|
|
271
|
+
const days = f.daysUntilSunset;
|
|
272
|
+
if (f.status === "missing")
|
|
273
|
+
return { tag: c(RED, "missing"), rank: 0, kind: "missing" };
|
|
274
|
+
if (days !== null && days < 0)
|
|
275
|
+
return { tag: c(RED, `sunset ${-days}d ago`), rank: 1, kind: "past sunset" };
|
|
276
|
+
if (f.status === "retired")
|
|
277
|
+
return { tag: c(RED, "retired"), rank: 2, kind: "retired" };
|
|
278
|
+
if (days !== null && days <= 14)
|
|
279
|
+
return { tag: c(RED, `sunsets in ${days}d`), rank: 3, kind: "sunsetting" };
|
|
280
|
+
if (days !== null && days <= 60)
|
|
281
|
+
return { tag: c(YELLOW, `sunsets in ${days}d`), rank: 4, kind: "sunsetting" };
|
|
282
|
+
if (f.status === "deprecated")
|
|
283
|
+
return { tag: c(YELLOW, "deprecated"), rank: 5, kind: "deprecated" };
|
|
284
|
+
if (days !== null)
|
|
285
|
+
return { tag: c(DIM, `sunsets in ${days}d`), rank: 6, kind: "sunsetting" };
|
|
286
|
+
return { tag: c(DIM, f.status ?? "unknown"), rank: 7, kind: f.status ?? "unknown" };
|
|
287
|
+
}
|
|
241
288
|
function renderDeprecations(findings) {
|
|
242
289
|
process.stdout.write(`${c(CYAN, "Model lifecycle")}\n`);
|
|
243
290
|
if (findings.length === 0) {
|
|
244
291
|
process.stdout.write(c(DIM, " No deprecation signals from any provider catalogue.\n\n"));
|
|
245
292
|
return;
|
|
246
293
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
tag = c(YELLOW, `sunsets in ${days}d`);
|
|
258
|
-
else if (f.status === "deprecated")
|
|
259
|
-
tag = c(YELLOW, "deprecated");
|
|
260
|
-
else if (days !== null)
|
|
261
|
-
tag = c(DIM, `sunsets in ${days}d`);
|
|
262
|
-
else
|
|
263
|
-
tag = c(DIM, f.status ?? "unknown");
|
|
294
|
+
// Most urgent first, stable within a rank; a full catalog has hundreds of
|
|
295
|
+
// rows, so show the top ones and count the rest.
|
|
296
|
+
const rows = findings
|
|
297
|
+
.map((f, i) => ({ f, i, ...lifecycleTag(f) }))
|
|
298
|
+
.sort((a, b) => a.rank - b.rank || (a.f.daysUntilSunset ?? 0) - (b.f.daysUntilSunset ?? 0) || a.i - b.i);
|
|
299
|
+
const counts = new Map();
|
|
300
|
+
for (const row of rows)
|
|
301
|
+
counts.set(row.kind, (counts.get(row.kind) ?? 0) + 1);
|
|
302
|
+
process.stdout.write(c(DIM, ` ${[...counts].map(([kind, n]) => `${n} ${kind}`).join(", ")}\n`));
|
|
303
|
+
for (const { f, tag } of rows.slice(0, LIFECYCLE_ROWS_SHOWN)) {
|
|
264
304
|
const replacement = f.replacedBy ? c(DIM, ` -> ${f.replacedBy}`) : "";
|
|
265
305
|
process.stdout.write(` ${tag} ${f.provider}/${f.modelId}${replacement}\n`);
|
|
266
306
|
}
|
|
307
|
+
if (rows.length > LIFECYCLE_ROWS_SHOWN) {
|
|
308
|
+
process.stdout.write(c(DIM, ` …and ${rows.length - LIFECYCLE_ROWS_SHOWN} more; \`kosha doctor --json\` lists every one.\n`));
|
|
309
|
+
}
|
|
267
310
|
process.stdout.write("\n");
|
|
268
311
|
}
|
|
269
312
|
function renderHealth(findings) {
|
|
@@ -272,12 +315,20 @@ function renderHealth(findings) {
|
|
|
272
315
|
process.stdout.write(c(DIM, " No providers in the registry yet — run `kosha discover`.\n"));
|
|
273
316
|
return;
|
|
274
317
|
}
|
|
318
|
+
// A provider kosha has never called has no health to report; "ok, 100%"
|
|
319
|
+
// would be a claim with no data behind it.
|
|
320
|
+
const unused = findings.filter((h) => h.samples === 0 && h.available);
|
|
275
321
|
for (const h of findings) {
|
|
322
|
+
if (h.samples === 0 && h.available)
|
|
323
|
+
continue;
|
|
276
324
|
const tag = h.available ? (h.reliabilityScore >= 0.95 ? c(GREEN, "ok") : c(YELLOW, "degraded")) : c(RED, "open");
|
|
277
325
|
const p95 = h.p95LatencyMs !== null ? `${h.p95LatencyMs}ms` : "no samples";
|
|
278
326
|
const reliability = (h.reliabilityScore * 100).toFixed(0);
|
|
279
327
|
process.stdout.write(` ${tag} ${h.providerId.padEnd(14)} ${c(DIM, `reliability=${reliability}%`)} ${c(DIM, `p95=${p95}`)}\n`);
|
|
280
328
|
}
|
|
329
|
+
if (unused.length > 0) {
|
|
330
|
+
process.stdout.write(c(DIM, ` no calls yet (${unused.length}): ${unused.map((h) => h.providerId).join(", ")}\n`));
|
|
331
|
+
}
|
|
281
332
|
}
|
|
282
333
|
/**
|
|
283
334
|
* Whole days from `nowMs` to `isoDate`, counted on the UTC calendar.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-cmd-doctor.js","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli-cmd-doctor.js","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAsB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAoBzE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,gFAAgF;AAChF,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAgCpD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAuB,EAAE,KAAuC;IAC/F,MAAM,CAAC,GAAgB,KAAK,CAAC;IAE7B,qEAAqE;IACrE,4CAA4C;IAC5C,IAAI,CAAC;QACJ,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACR,sEAAsE;QACtE,iDAAiD;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC1E,MAAM,YAAY,GAAG,MAAM;QAC1B,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/B,wEAAwE;IACxE,wDAAwD;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1E,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,SAAS;SAC9B,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;SACxD,MAAM,CAAC,CAAC,GAAG,EAAwB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAEtD,MAAM,WAAW,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAExD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC9F,CAAC;IACH,CAAC;SAAM,CAAC;QACP,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC/B,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACjC,YAAY,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,mDAAmD;IACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,sBAAsB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CACZ,CAAC,CAAC,GAAG,EAAE,iBAAiB,UAAU,CAAC,MAAM,oDAAoD,UAAU,KAAK,CAAC,CAC7G,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;AACF,CAAC;AAED,4EAA4E;AAC5E,SAAS,aAAa,CAAC,MAAqB;IAC3C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,SAAS,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1F,OAAO;IACR,CAAC;IACD,MAAM,MAAM,GACX,MAAM,CAAC,IAAI,KAAK,WAAW;QAC1B,CAAC,CAAC,oCAAoC;QACtC,CAAC,CAAC;YACA,MAAM,CAAC,IAAI;YACX,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,oBAAoB;SAC1G;aACC,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,YAAY,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;AACxG,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,CAAc,EAAE,QAA8B;IACxE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,sBAAsB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACnE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,iFAAiF;AACjF,SAAS,SAAS,CAAC,CAAc;IAChC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,OAA2B,EAAE,UAAkB;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjH,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,IAAI,OAAO,CAAC,eAAe,IAAI,UAAU;QAAE,OAAO,IAAI,CAAC;IAC3F,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAAC,GAAiC;IAChE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACxD,OAAO,iCAAiC,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,iCAAiC,CAAC;IACrF,OAAO,MAAM,CAAC;AACf,CAAC;AAQD,+EAA+E;AAC/E,SAAS,eAAe,CAAC,GAAiC;IACzD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CACrB,IAAI,GAAG,CACN,GAAG;SACD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC,CACjB,CACD,CAAC;IACF,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,QAAuB,EAAE,MAAqB;IAClE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAa,CAAC;IAClC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,QAAuB,EAAE,KAAe;IAC7D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,MAAqB,EAAE,MAAmB;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,MAAM;SACX,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;SAChF,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAClC,OAAO,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,QAAQ,GAAG;QAC1E,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,QAA8B,EAAE,MAAmB;IACzE,MAAM,MAAM,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IACtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAW,EAAE,CAC9C,KAAK,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,cAAc,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,SAAS,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAElG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC9C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1G,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,SAAS,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;QACpC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC;QACtD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;QAE5C,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU;YAAE,SAAS;QACzD,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,eAAe;YAAE,SAAS;QAElF,QAAQ,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM;YACN,eAAe;YACf,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7E,UAAU;SACV,CAAC,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,0DAA0D;QAC1D,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC3D,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,GAAG,IAAI,CAAC;QACtC,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAmB;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,QAAuB,EAAE,UAAkB;IACjE,IAAI,CAAC;QACJ,MAAM,CAAC,GAAG,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO;YACN,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;SAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAAC,QAAuB;IACzD,OAAO,QAAQ;SACb,cAAc,EAAE;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;SAClF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,cAAwB,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;SAC9G,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,iBAAiB,CAAC,QAA6B;IACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,yDAAyD,CAAC,CAAC,CAAC;QACxF,OAAO;IACR,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;QAC5F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,gEAAgE;AAChE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,SAAS,YAAY,CAAC,CAAqB;IAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC;IAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACxF,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC5G,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACxF,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC5G,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC/G,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACpG,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9F,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;AACrF,CAAC;AAED,SAAS,kBAAkB,CAAC,QAA8B;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,2DAA2D,CAAC,CAAC,CAAC;QAC1F,OAAO;IACR,CAAC;IACD,0EAA0E;IAC1E,iDAAiD;IACjD,MAAM,IAAI,GAAG,QAAQ;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjG,KAAK,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,CAAC;QAC9D,MAAM,WAAW,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,GAAG,WAAW,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,CAAC,CAAC,GAAG,EAAE,UAAU,IAAI,CAAC,MAAM,GAAG,oBAAoB,mDAAmD,CAAC,CACvG,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,QAAyB;IAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,8DAA8D,CAAC,CAAC,CAAC;QAC7F,OAAO;IACR,CAAC;IACD,wEAAwE;IACxE,2CAA2C;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IACtE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS;YAAE,SAAS;QAC7C,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjH,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;QAC3E,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,KAAK,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,eAAe,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAC1G,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,mBAAmB,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpH,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,OAAe;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,OAAO;IACf,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-cmd-model.d.ts","sourceRoot":"","sources":["../src/cli-cmd-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"cli-cmd-model.d.ts","sourceRoot":"","sources":["../src/cli-cmd-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoBH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAC7B,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CA8Ff;AAID;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC/B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CAoEf;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC9B,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CA4Df"}
|
package/dist/cli-cmd-model.js
CHANGED
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module cli-cmd-model
|
|
11
11
|
*/
|
|
12
|
-
import { BOLD, CYAN, DIM, GREEN, RED, YELLOW, c, formatBatchDiscount, formatNumber, formatPrice, formatTimestamp, renderTable, } from "./cli-format.js";
|
|
13
12
|
import { ensureDiscovered } from "./cli-commands.js";
|
|
13
|
+
import { BOLD, CYAN, c, DIM, formatBatchDiscount, formatNumber, formatPrice, formatTimestamp, GREEN, RED, renderTable, YELLOW, } from "./cli-format.js";
|
|
14
|
+
import { isPlanBilled } from "./discovery/free-tier.js";
|
|
15
|
+
import { isRetired } from "./lifecycle.js";
|
|
14
16
|
// ── model (detail view) ─────────────────────────────────────────────────
|
|
15
17
|
/**
|
|
16
18
|
* Show detailed information for a single model identified by id or alias.
|
|
@@ -34,7 +36,9 @@ export async function cmdModel(registry, idOrAlias, flags) {
|
|
|
34
36
|
// Fuzzy fallback — substring match across id, name, and aliases so users
|
|
35
37
|
// can type fragments like "sonnet" without knowing the full canonical ID.
|
|
36
38
|
const needle = idOrAlias.toLowerCase();
|
|
37
|
-
const fuzzy = registry
|
|
39
|
+
const fuzzy = registry
|
|
40
|
+
.models()
|
|
41
|
+
.filter((m) => m.id.toLowerCase().includes(needle) ||
|
|
38
42
|
m.name.toLowerCase().includes(needle) ||
|
|
39
43
|
m.aliases.some((a) => a.toLowerCase().includes(needle)));
|
|
40
44
|
if (fuzzy.length === 1)
|
|
@@ -55,7 +59,9 @@ export async function cmdModel(registry, idOrAlias, flags) {
|
|
|
55
59
|
const providerName = registry.provider(model.provider)?.name ?? model.provider;
|
|
56
60
|
const pricingStr = model.pricing
|
|
57
61
|
? `${formatPrice(model.pricing.inputPerMillion)} / ${formatPrice(model.pricing.outputPerMillion)} per million tokens (in/out)`
|
|
58
|
-
:
|
|
62
|
+
: isPlanBilled(model)
|
|
63
|
+
? c(DIM, "included in the subscription plan (no per-token price)")
|
|
64
|
+
: c(DIM, "unknown");
|
|
59
65
|
// Cache pricing is optional — only displayed when the model has it
|
|
60
66
|
const cacheStr = model.pricing?.cacheReadPerMillion !== undefined
|
|
61
67
|
? `\nCache Pricing: ${formatPrice(model.pricing.cacheReadPerMillion)} read / ${formatPrice(model.pricing.cacheWritePerMillion)} write per million tokens`
|
|
@@ -71,10 +77,11 @@ export async function cmdModel(registry, idOrAlias, flags) {
|
|
|
71
77
|
: "";
|
|
72
78
|
const originPricingStr = model.originPricing
|
|
73
79
|
? `\nOrigin Pricing: ${formatPrice(model.originPricing.inputPerMillion)} / ${formatPrice(model.originPricing.outputPerMillion)} per million tokens (in/out)` +
|
|
74
|
-
(
|
|
80
|
+
(model.originPricing.reasoningInputPerMillion !== undefined ||
|
|
81
|
+
model.originPricing.reasoningOutputPerMillion !== undefined
|
|
75
82
|
? `\nOrigin Reasoning Pricing: ${formatPrice(model.originPricing.reasoningInputPerMillion)} in / ${formatPrice(model.originPricing.reasoningOutputPerMillion)} out per million tokens`
|
|
76
83
|
: "") +
|
|
77
|
-
(
|
|
84
|
+
(model.originPricing.batchInputPerMillion !== undefined || model.originPricing.batchOutputPerMillion !== undefined
|
|
78
85
|
? `\nOrigin Batch Pricing: ${formatPrice(model.originPricing.batchInputPerMillion)} in / ${formatPrice(model.originPricing.batchOutputPerMillion)} out per million tokens`
|
|
79
86
|
: "")
|
|
80
87
|
: "";
|
|
@@ -91,7 +98,7 @@ ${c(BOLD, "Name:")} ${model.name}
|
|
|
91
98
|
${c(BOLD, "Provider:")} ${providerName}${originLine}${regionLine}${projectLine}
|
|
92
99
|
${c(BOLD, "Mode:")} ${model.mode}
|
|
93
100
|
${c(BOLD, "Aliases:")} ${model.aliases.length > 0 ? model.aliases.join(", ") : c(DIM, "none")}
|
|
94
|
-
${c(BOLD, "Context Window:")} ${model.contextWindow > 0 ? formatNumber(model.contextWindow)
|
|
101
|
+
${c(BOLD, "Context Window:")} ${model.contextWindow > 0 ? `${formatNumber(model.contextWindow)} tokens` : c(DIM, model.source === "api" ? "unknown (the provider doesn't say, and no catalog lists it yet)" : "unknown")}
|
|
95
102
|
${c(BOLD, "Max Output:")} ${model.maxOutputTokens > 0 ? formatNumber(model.maxOutputTokens) + " tokens" : c(DIM, "unknown")}${model.dimensions ? `\n${c(BOLD, "Dimensions:")} ${formatNumber(model.dimensions)}` : ""}
|
|
96
103
|
${c(BOLD, "Capabilities:")} ${model.capabilities.join(", ")}
|
|
97
104
|
${c(BOLD, "Pricing:")} ${pricingStr}${cacheStr}${reasoningStr}${batchStr}${originPricingStr}
|
|
@@ -211,7 +218,7 @@ export async function cmdRoutes(registry, modelId, flags) {
|
|
|
211
218
|
{ header: "$/M out", width: 8, align: "right" },
|
|
212
219
|
];
|
|
213
220
|
const rows = routes.map((route) => [
|
|
214
|
-
route.isPreferred ? c(GREEN, "*") : route.isDirect ? c(CYAN, "\u00B7") : " ",
|
|
221
|
+
isRetired(route.model) ? c(RED, "x") : route.isPreferred ? c(GREEN, "*") : route.isDirect ? c(CYAN, "\u00B7") : " ",
|
|
215
222
|
c(CYAN, route.provider),
|
|
216
223
|
route.model.id,
|
|
217
224
|
route.model.region ?? c(DIM, "\u2014"),
|
|
@@ -227,5 +234,9 @@ export async function cmdRoutes(registry, modelId, flags) {
|
|
|
227
234
|
if (preferred) {
|
|
228
235
|
console.log(c(DIM, `\nPreferred route: ${preferred.provider} (${preferred.baseUrl ?? "base URL unknown"})`));
|
|
229
236
|
}
|
|
237
|
+
const retired = routes.filter((route) => isRetired(route.model)).length;
|
|
238
|
+
if (retired > 0) {
|
|
239
|
+
console.log(c(DIM, `${retired === routes.length ? "Every route" : `${retired} route(s)`} marked x is past its sunset and no longer served.`));
|
|
240
|
+
}
|
|
230
241
|
}
|
|
231
242
|
//# sourceMappingURL=cli-cmd-model.js.map
|