@ashlr/hub 3.8.0 → 3.9.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 +201 -0
- package/dist/build-identity.json +2 -2
- package/dist/cli/resource-profile.js +95 -21
- package/dist/cli/resource-profile.js.map +1 -1
- package/dist/core/resources/native-profile.d.ts +56 -0
- package/dist/core/resources/native-profile.js +368 -6
- package/dist/core/resources/native-profile.js.map +1 -1
- package/dist/core/run/model-catalog.js +8 -1
- package/dist/core/run/model-catalog.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +9 -2
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +8 -1
- package/dist/core/verse/adapters/claude.d.ts +49 -2
- package/dist/core/verse/adapters/claude.js +317 -56
- package/dist/core/verse/adapters/claude.js.map +1 -1
- package/dist/core/verse/adapters/codex.d.ts +81 -5
- package/dist/core/verse/adapters/codex.js +409 -47
- package/dist/core/verse/adapters/codex.js.map +1 -1
- package/dist/core/verse/adapters/grok.d.ts +13 -1
- package/dist/core/verse/adapters/grok.js +28 -2
- package/dist/core/verse/adapters/grok.js.map +1 -1
- package/dist/core/verse/adapters/index.d.ts +32 -0
- package/dist/core/verse/adapters/index.js +2 -0
- package/dist/core/verse/adapters/index.js.map +1 -1
- package/dist/core/verse/codex-rollout.d.ts +284 -0
- package/dist/core/verse/codex-rollout.js +786 -0
- package/dist/core/verse/codex-rollout.js.map +1 -0
- package/dist/core/verse/context-fit.d.ts +63 -0
- package/dist/core/verse/context-fit.js +355 -0
- package/dist/core/verse/context-fit.js.map +1 -0
- package/dist/core/verse/context-math.d.ts +215 -0
- package/dist/core/verse/context-math.js +365 -0
- package/dist/core/verse/context-math.js.map +1 -0
- package/dist/core/verse/local-models.d.ts +137 -1
- package/dist/core/verse/local-models.js +209 -5
- package/dist/core/verse/local-models.js.map +1 -1
- package/dist/core/verse/model-windows.d.ts +217 -0
- package/dist/core/verse/model-windows.js +616 -0
- package/dist/core/verse/model-windows.js.map +1 -0
- package/dist/core/verse/preferences.d.ts +123 -0
- package/dist/core/verse/preferences.js +403 -0
- package/dist/core/verse/preferences.js.map +1 -0
- package/dist/core/verse/project-memory.d.ts +112 -0
- package/dist/core/verse/project-memory.js +295 -0
- package/dist/core/verse/project-memory.js.map +1 -0
- package/dist/core/verse/seats.d.ts +106 -4
- package/dist/core/verse/seats.js +291 -89
- package/dist/core/verse/seats.js.map +1 -1
- package/dist/core/verse/session-engine.d.ts +76 -2
- package/dist/core/verse/session-engine.js +684 -63
- package/dist/core/verse/session-engine.js.map +1 -1
- package/dist/core/verse/session-handoff.d.ts +94 -0
- package/dist/core/verse/session-handoff.js +551 -0
- package/dist/core/verse/session-handoff.js.map +1 -0
- package/dist/core/verse/session-search.d.ts +63 -0
- package/dist/core/verse/session-search.js +213 -0
- package/dist/core/verse/session-search.js.map +1 -0
- package/dist/core/verse/session-store.d.ts +16 -2
- package/dist/core/verse/session-store.js +80 -6
- package/dist/core/verse/session-store.js.map +1 -1
- package/dist/core/verse/types.d.ts +333 -1
- package/dist/core/verse/types.js +54 -2
- package/dist/core/verse/types.js.map +1 -1
- package/dist/core/verse/verse-api.d.ts +40 -5
- package/dist/core/verse/verse-api.js +724 -25
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/web/api.d.ts +14 -4
- package/dist/core/web/api.js +26 -11
- package/dist/core/web/api.js.map +1 -1
- package/dist/core/web/public/next/assets/{App-BsbJFA2j.js → App-XURmiAAp.js} +5 -5
- package/dist/core/web/public/next/assets/{App-BsbJFA2j.js.map → App-XURmiAAp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ApprovalsSection-2CCSoBTJ.js → ApprovalsSection-BriUzoZc.js} +2 -2
- package/dist/core/web/public/next/assets/{ApprovalsSection-2CCSoBTJ.js.map → ApprovalsSection-BriUzoZc.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-C4GBsQVc.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-yeNNUPur.js.map → AutonomySection-C4GBsQVc.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChatSection-BpOBOUvg.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-hlgPBRco.js +84 -0
- package/dist/core/web/public/next/assets/ChatSection-hlgPBRco.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-BdQYI-Ng.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-BdQYI-Ng.js.map +1 -0
- package/dist/core/web/public/next/assets/{Dialog-nK15L1M0.js → Dialog-BxdIfmFH.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-nK15L1M0.js.map → Dialog-BxdIfmFH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-D369eZe8.js → DiffViewer-DmeRWuc4.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-D369eZe8.js.map → DiffViewer-DmeRWuc4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{McpSection-DVgiSYG1.js → McpSection-q34T7Tho.js} +2 -2
- package/dist/core/web/public/next/assets/{McpSection-DVgiSYG1.js.map → McpSection-q34T7Tho.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MutationTokenDialog-B9I4PAcp.js → MutationTokenDialog-CFAkwOEt.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-B9I4PAcp.js.map → MutationTokenDialog-CFAkwOEt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-z6tJj3s9.js → ResourcePoolConsoleApp-DHc8GFOY.js} +4 -4
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-z6tJj3s9.js.map → ResourcePoolConsoleApp-DHc8GFOY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-OSajL45F.js → RouteErrorBoundary-ZL9F4qUn.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-OSajL45F.js.map → RouteErrorBoundary-ZL9F4qUn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-CLcr-4wS.css → Segmented-8cf0Fypn.css} +1 -1
- package/dist/core/web/public/next/assets/{Meter-Cmo1pLbk.js → Segmented-DbRjVye3.js} +2 -2
- package/dist/core/web/public/next/assets/Segmented-DbRjVye3.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-nJGGGYqv.js +2 -0
- package/dist/core/web/public/next/assets/{SettingsSection-B3YH2Npi.js.map → SettingsSection-nJGGGYqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-6GJydgo4.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-wEKIzl1M.js.map → UniverseConsoleApp-6GJydgo4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-CQVpJqqI.js → UniverseView-DLDtNYL8.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseView-CQVpJqqI.js.map → UniverseView-DLDtNYL8.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-Cf9d9iFH.js +2 -0
- package/dist/core/web/public/next/assets/UsageSection-Cf9d9iFH.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DsdKQoTH.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-y0uOHixd.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-y0uOHixd.js.map +1 -0
- package/dist/core/web/public/next/assets/{charts-BopViIha.js → charts-CVooqJWN.js} +2 -2
- package/dist/core/web/public/next/assets/{charts-BopViIha.js.map → charts-CVooqJWN.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-model-Bqv8DVuH.js +2 -0
- package/dist/core/web/public/next/assets/context-model-Bqv8DVuH.js.map +1 -0
- package/dist/core/web/public/next/assets/global-eaY9GyX3.js +2 -0
- package/dist/core/web/public/next/assets/global-eaY9GyX3.js.map +1 -0
- package/dist/core/web/public/next/assets/{icons-L06pQH6j.js → icons-vex8rclC.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-L06pQH6j.js.map → icons-vex8rclC.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-CXgVQHek.js → index-D2Eik-zt.js} +3 -3
- package/dist/core/web/public/next/assets/{index-CXgVQHek.js.map → index-D2Eik-zt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{queries-D3sSlan1.js → queries-bAYU0VNy.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-D3sSlan1.js.map → queries-bAYU0VNy.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-guarded-action-C7QrP7Yp.js +2 -0
- package/dist/core/web/public/next/assets/{use-guarded-action-BxfJ9E-n.js.map → use-guarded-action-C7QrP7Yp.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-TfDk9cky.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-TfDk9cky.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-v0a1gl-C.js → workspace-model-CHol5RVp.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-v0a1gl-C.js.map → workspace-model-CHol5RVp.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/README.md +1 -0
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-yeNNUPur.js +0 -2
- package/dist/core/web/public/next/assets/ChatSection-BfnLe5dT.css +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DwDDnCZQ.js +0 -80
- package/dist/core/web/public/next/assets/ChatSection-DwDDnCZQ.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-C363ty_c.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-C363ty_c.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-Cmo1pLbk.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-B3YH2Npi.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-wEKIzl1M.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-dToBThXe.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-dToBThXe.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-CMkCizvL.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DHU32JCQ.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-DHU32JCQ.js.map +0 -1
- package/dist/core/web/public/next/assets/global-DMWakEhP.js +0 -2
- package/dist/core/web/public/next/assets/global-DMWakEhP.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-BxfJ9E-n.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js.map +0 -1
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/verse/model-windows.ts — the per-model context budgets every seat is
|
|
3
|
+
* built from (Verse 3.9, owner U4). docs/VERSE-CONTEXT.md §1 is the prose
|
|
4
|
+
* authority; every number below was read from a CLI or a seat's own catalog on
|
|
5
|
+
* 2026-09-23, never recalled.
|
|
6
|
+
*
|
|
7
|
+
* WHY THIS MODULE EXISTS. Until 3.9 every model option carried one number, and
|
|
8
|
+
* for six of the eight Claude models it was wrong: they all inherited the
|
|
9
|
+
* CLI's 200k "unknown model" fallback while the CLI itself ran them at 1M.
|
|
10
|
+
* Codex showed its RAW 272k window while the CLI measures against 95% of it,
|
|
11
|
+
* and Grok showed 256k against a 500k window. So the meter under- or
|
|
12
|
+
* over-read on every native engine. This module is the single place a seat's
|
|
13
|
+
* model list — windows, compaction points, expansive budgets and the binary
|
|
14
|
+
* each model needs — is assembled, and it does the arithmetic ONLY through
|
|
15
|
+
* `context-math.ts`, so "compacts at 367k" can never mean two numbers.
|
|
16
|
+
*
|
|
17
|
+
* SOURCES, in the order a seat prefers them:
|
|
18
|
+
*
|
|
19
|
+
* Claude — the CLI's EMBEDDED catalog (`windowSource: 'cli-catalog'`). There
|
|
20
|
+
* is no per-seat file to read: the served catalog cache carries no windows
|
|
21
|
+
* (`max_input_tokens` absent on every row), so the binary is the authority.
|
|
22
|
+
* The table below is transcribed from the 2.1.257 and 2.1.280 binaries.
|
|
23
|
+
* Codex — the seat's OWN `native-state/models_cache.json`
|
|
24
|
+
* (`provider-catalog`). Catalogs differ per ACCOUNT (codex-b lacks the
|
|
25
|
+
* daybreak slug the global cache has) and per BINARY, so the unpinned
|
|
26
|
+
* `~/.codex` cache is never consulted. No catalog yet → a documented list.
|
|
27
|
+
* Grok — the seat's OWN `native-state/models_cache.json`, whose `.models`
|
|
28
|
+
* is a dict of `{info, api_key, env_key, api_base_url}`. ONLY `.info` is
|
|
29
|
+
* ever read: `api_key` is a credential slot and must not be touched, copied
|
|
30
|
+
* or returned, even though it is null today.
|
|
31
|
+
*
|
|
32
|
+
* Runtime readings (claude/grok `result.modelUsage`, codex rollouts) override
|
|
33
|
+
* all of this per turn — see the session engine. These are the STARTING
|
|
34
|
+
* budgets and the picker's promises, not the last word.
|
|
35
|
+
*
|
|
36
|
+
* Nothing here throws, spends, or reaches the network. File reads are
|
|
37
|
+
* size-capped, symlink-refusing and cached by path + mtime + size.
|
|
38
|
+
*/
|
|
39
|
+
import { closeSync, constants as fsConstants, fstatSync, openSync, readdirSync, readSync, statSync } from 'node:fs';
|
|
40
|
+
import { homedir } from 'node:os';
|
|
41
|
+
import { basename, dirname, join } from 'node:path';
|
|
42
|
+
import { CLAUDE_STANDARD_AUTOCOMPACT_WINDOW, canonicalModelId, claudeAutoCompactAt, codexAutoCompactAt, codexEffectiveWindow, grokAutoCompactAt, } from './context-math.js';
|
|
43
|
+
import { VERSE_DEFAULT_CONTEXT_WINDOWS, } from './types.js';
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Claude — transcribed from the CLI's embedded catalog
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Every Claude model a seat offers, in picker order (first runnable = default).
|
|
49
|
+
*
|
|
50
|
+
* Transcribed from the embedded catalog of Claude Code 2.1.257 and 2.1.280
|
|
51
|
+
* (`context.window`, `context.native_1m`, `max_output_tokens.default`):
|
|
52
|
+
*
|
|
53
|
+
* - `native1m` is the catalog's own `native_1m` flag: the CLI runs these at
|
|
54
|
+
* 1M with no `[1m]` suffix on a first-party seat. Never append `[1m]` to a
|
|
55
|
+
* 200k model — the CLI would then CLAIM 1M for a model that has 200k.
|
|
56
|
+
* - `maxOutputTokens` is the catalog DEFAULT, not the upper bound: it is the
|
|
57
|
+
* number Claude Code reserves from (capped at 20k) when it computes the
|
|
58
|
+
* compaction point, which is all Verse uses it for.
|
|
59
|
+
* - `minCliVersion` is set only where a binary genuinely lacks the id.
|
|
60
|
+
* `claude-opus-5-5` is absent from 2.1.257 (0 occurrences) and present in
|
|
61
|
+
* 2.1.280, and the served catalog cache says `min_claude_code_version:
|
|
62
|
+
* "2.1.280"`. An older binary does not reject it — its id normaliser falls
|
|
63
|
+
* back to `includes('claude-opus-5')` and silently runs Opus 5 — which is
|
|
64
|
+
* why a too-old seat lists it as UNAVAILABLE instead of offering it.
|
|
65
|
+
*
|
|
66
|
+
* The dotted `claude-opus-5.5` Verse once shipped is an ALIAS (context-math
|
|
67
|
+
* `VERSE_MODEL_ID_ALIASES`): on every binary it resolves to Opus 5. It is
|
|
68
|
+
* never offered; old records keep it and adapters send the canonical id.
|
|
69
|
+
*
|
|
70
|
+
* `claude-mythos-5` / `-5-1` are in the catalog too but are deliberately not
|
|
71
|
+
* offered: whether a subscription seat may use them is unverified, and a
|
|
72
|
+
* picker entry is a promise.
|
|
73
|
+
*/
|
|
74
|
+
export const VERSE_CLAUDE_MODEL_SPECS = [
|
|
75
|
+
{ id: 'claude-fable-5-1', label: 'Claude Fable 5.1', contextWindow: 1_000_000, maxOutputTokens: 64_000, minCliVersion: null, native1m: true },
|
|
76
|
+
{ id: 'claude-opus-5-5', label: 'Claude Opus 5.5', contextWindow: 1_000_000, maxOutputTokens: 128_000, minCliVersion: '2.1.280', native1m: true },
|
|
77
|
+
{ id: 'claude-fable-5', label: 'Claude Fable 5', contextWindow: 1_000_000, maxOutputTokens: 64_000, minCliVersion: null, native1m: true },
|
|
78
|
+
{ id: 'claude-opus-5', label: 'Claude Opus 5', contextWindow: 1_000_000, maxOutputTokens: 64_000, minCliVersion: null, native1m: true },
|
|
79
|
+
{ id: 'claude-opus-4-8', label: 'Claude Opus 4.8', contextWindow: 1_000_000, maxOutputTokens: 64_000, minCliVersion: null, native1m: true },
|
|
80
|
+
// 200k and NOT native_1m: no expansive mode, no --autocompact flag.
|
|
81
|
+
{ id: 'claude-opus-4-5', label: 'Claude Opus 4.5', contextWindow: 200_000, maxOutputTokens: 32_000, minCliVersion: null, native1m: false },
|
|
82
|
+
{ id: 'claude-sonnet-5', label: 'Claude Sonnet 5', contextWindow: 1_000_000, maxOutputTokens: 64_000, minCliVersion: null, native1m: true },
|
|
83
|
+
{ id: 'claude-haiku-4-5-20251001', label: 'Claude Haiku 4.5', contextWindow: 200_000, maxOutputTokens: 32_000, minCliVersion: null, native1m: false },
|
|
84
|
+
];
|
|
85
|
+
/**
|
|
86
|
+
* The spec for a model id, after alias canonicalisation — so an old session
|
|
87
|
+
* stored as `claude-opus-5.5` finds Opus 5.5's budget. A trailing `[1m]`
|
|
88
|
+
* (which the CLI strips from native-1M ids anyway) is tolerated. Null for an
|
|
89
|
+
* id this table does not know: the caller falls back to the seat, then to
|
|
90
|
+
* `VERSE_DEFAULT_CONTEXT_WINDOWS.claude` — never to a guess.
|
|
91
|
+
*/
|
|
92
|
+
export function claudeSpecFor(modelId) {
|
|
93
|
+
if (typeof modelId !== 'string' || modelId.length === 0)
|
|
94
|
+
return null;
|
|
95
|
+
const canonical = canonicalModelId(modelId.trim());
|
|
96
|
+
const bare = canonical.replace(/\[1m\]$/i, '');
|
|
97
|
+
return VERSE_CLAUDE_MODEL_SPECS.find((spec) => spec.id === canonical || spec.id === bare) ?? null;
|
|
98
|
+
}
|
|
99
|
+
/** "Claude Opus 5.5" → "Opus 5.5" — how the CLI and the seat notes name a model. */
|
|
100
|
+
function shortClaudeLabel(label) {
|
|
101
|
+
return label.replace(/^Claude\s+/, '');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* One Claude spec as a model option on a seat pinned to `cliVersion`.
|
|
105
|
+
*
|
|
106
|
+
* Standard budget: 1M-native models run at `--autocompact 400000` (compaction
|
|
107
|
+
* at 367k); 200k models compact natively (167k). Expansive exists only for
|
|
108
|
+
* 1M-native models: the CLI's `auto` window, compacting at 967k — the
|
|
109
|
+
* `pre_tokens` observed on real compactions.
|
|
110
|
+
*/
|
|
111
|
+
function claudeOption(spec, cliVersion) {
|
|
112
|
+
const window = spec.contextWindow;
|
|
113
|
+
const expansive = spec.native1m
|
|
114
|
+
? { contextWindow: window, autoCompactAt: claudeAutoCompactAt(window, spec.maxOutputTokens, null) }
|
|
115
|
+
: null;
|
|
116
|
+
const standardCap = spec.native1m && window > CLAUDE_STANDARD_AUTOCOMPACT_WINDOW
|
|
117
|
+
? CLAUDE_STANDARD_AUTOCOMPACT_WINDOW
|
|
118
|
+
: null;
|
|
119
|
+
const tooOld = spec.minCliVersion !== null
|
|
120
|
+
&& cliVersion !== null
|
|
121
|
+
&& compareCliVersions(cliVersion, spec.minCliVersion) < 0;
|
|
122
|
+
return {
|
|
123
|
+
id: spec.id,
|
|
124
|
+
label: spec.label,
|
|
125
|
+
contextWindow: window,
|
|
126
|
+
autoCompactAt: claudeAutoCompactAt(window, spec.maxOutputTokens, standardCap),
|
|
127
|
+
...(expansive ? { expansive } : {}),
|
|
128
|
+
maxOutputTokens: spec.maxOutputTokens,
|
|
129
|
+
windowSource: 'cli-catalog',
|
|
130
|
+
minCliVersion: spec.minCliVersion,
|
|
131
|
+
unavailableReason: tooOld
|
|
132
|
+
? `needs Claude Code ${spec.minCliVersion}; this seat runs ${cliVersion}`
|
|
133
|
+
: null,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The Claude model list for a seat pinned to `cliVersion`.
|
|
138
|
+
*
|
|
139
|
+
* `cliVersion === null` means UNKNOWN, and unknown is not "too old": no model
|
|
140
|
+
* is marked unavailable on a guess (the seat carries a note instead). Order is
|
|
141
|
+
* the table's; callers put runnable models first.
|
|
142
|
+
*/
|
|
143
|
+
export function claudeModelOptions(cliVersion) {
|
|
144
|
+
return VERSE_CLAUDE_MODEL_SPECS.map((spec) => claudeOption(spec, cliVersion));
|
|
145
|
+
}
|
|
146
|
+
/** Specs a binary of `cliVersion` is too old for (empty when the version is unknown). */
|
|
147
|
+
export function claudeModelsNeedingNewerCli(cliVersion) {
|
|
148
|
+
if (cliVersion === null)
|
|
149
|
+
return [];
|
|
150
|
+
return VERSE_CLAUDE_MODEL_SPECS.filter((spec) => spec.minCliVersion !== null && compareCliVersions(cliVersion, spec.minCliVersion) < 0);
|
|
151
|
+
}
|
|
152
|
+
/** Labels for a note: "Opus 5.5", "Opus 5.5 and Fable 6", "A, B and C". */
|
|
153
|
+
export function joinClaudeLabels(specs) {
|
|
154
|
+
const labels = specs.map((s) => shortClaudeLabel(s.label));
|
|
155
|
+
if (labels.length <= 1)
|
|
156
|
+
return labels[0] ?? '';
|
|
157
|
+
return `${labels.slice(0, -1).join(', ')} and ${labels[labels.length - 1]}`;
|
|
158
|
+
}
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// CLI versions
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
const VERSION_RE = /(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.]+))?/;
|
|
163
|
+
/**
|
|
164
|
+
* Compare two CLI versions: negative when `a` is older, 0 when equal, positive
|
|
165
|
+
* when newer. Numeric per segment (2.1.280 > 2.1.257 > 2.1.99), and a
|
|
166
|
+
* pre-release sorts before its release (0.155.0-alpha.9 < 0.155.0). Strings
|
|
167
|
+
* with no `x.y.z` in them compare equal to each other and older than any real
|
|
168
|
+
* version — an unparseable version is never allowed to unlock a model.
|
|
169
|
+
*/
|
|
170
|
+
export function compareCliVersions(a, b) {
|
|
171
|
+
const pa = VERSION_RE.exec(a);
|
|
172
|
+
const pb = VERSION_RE.exec(b);
|
|
173
|
+
if (!pa || !pb)
|
|
174
|
+
return (pa ? 1 : 0) - (pb ? 1 : 0);
|
|
175
|
+
for (let i = 1; i <= 3; i += 1) {
|
|
176
|
+
const d = Number(pa[i]) - Number(pb[i]);
|
|
177
|
+
if (d !== 0)
|
|
178
|
+
return d < 0 ? -1 : 1;
|
|
179
|
+
}
|
|
180
|
+
const preA = pa[4] ?? null;
|
|
181
|
+
const preB = pb[4] ?? null;
|
|
182
|
+
if (preA === preB)
|
|
183
|
+
return 0;
|
|
184
|
+
if (preA === null)
|
|
185
|
+
return 1;
|
|
186
|
+
if (preB === null)
|
|
187
|
+
return -1;
|
|
188
|
+
return preA.localeCompare(preB, 'en', { numeric: true }) < 0 ? -1 : 1;
|
|
189
|
+
}
|
|
190
|
+
const MAX_PACKAGE_JSON_BYTES = 64 * 1024;
|
|
191
|
+
/**
|
|
192
|
+
* The version of the CLI a native profile is pinned to, from the executable
|
|
193
|
+
* path its launcher execs. Never runs the binary (that would be a process
|
|
194
|
+
* spawn on the discovery path, and some CLIs phone home on `--version`).
|
|
195
|
+
*
|
|
196
|
+
* - Claude Code installs each version as a file NAMED by it:
|
|
197
|
+
* `~/.local/share/claude/versions/2.1.257` → `2.1.257`.
|
|
198
|
+
* - Grok's downloads embed it: `grok-0.2.118-macos-aarch64` → `0.2.118`.
|
|
199
|
+
* - The npm codex wrapper is `…/@openai/codex/bin/codex.js`; its version is
|
|
200
|
+
* the package's own `package.json`, read with a size cap.
|
|
201
|
+
*
|
|
202
|
+
* Anything else (e.g. the codex binary inside ChatGPT.app) is null: unknown,
|
|
203
|
+
* which is reported as unknown rather than guessed from a neighbour.
|
|
204
|
+
*/
|
|
205
|
+
export function cliVersionFromExecutable(executablePath) {
|
|
206
|
+
if (typeof executablePath !== 'string' || executablePath.length === 0)
|
|
207
|
+
return null;
|
|
208
|
+
const name = basename(executablePath);
|
|
209
|
+
// Only the X.Y.Z core from a file name: `grok-0.2.118-macos-aarch64` has a
|
|
210
|
+
// platform suffix that is not a pre-release tag.
|
|
211
|
+
const fromName = /(?:^|[^0-9.])(\d+\.\d+\.\d+)(?=$|[^0-9.])/.exec(`-${name}`);
|
|
212
|
+
if (fromName)
|
|
213
|
+
return fromName[1];
|
|
214
|
+
if (name === 'codex.js' || name === 'codex') {
|
|
215
|
+
const pkg = readCappedJson(join(dirname(dirname(executablePath)), 'package.json'), MAX_PACKAGE_JSON_BYTES);
|
|
216
|
+
if (isRecord(pkg) && typeof pkg['version'] === 'string' && VERSION_RE.test(pkg['version'])
|
|
217
|
+
&& (pkg['name'] === undefined || pkg['name'] === '@openai/codex')) {
|
|
218
|
+
return pkg['version'].slice(0, 64);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
/** Where Claude Code's installer keeps one file per installed version. */
|
|
224
|
+
export function defaultClaudeVersionsRoot(home = homedir()) {
|
|
225
|
+
return join(home, '.local', 'share', 'claude', 'versions');
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* The newest Claude Code version installed on this machine, or null. Only
|
|
229
|
+
* regular files named exactly `x.y.z` count — the installer's lock and
|
|
230
|
+
* partial-download files are skipped.
|
|
231
|
+
*/
|
|
232
|
+
export function newestInstalledClaudeVersion(root = defaultClaudeVersionsRoot()) {
|
|
233
|
+
let entries;
|
|
234
|
+
try {
|
|
235
|
+
entries = readdirSync(root);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
let best = null;
|
|
241
|
+
for (const name of entries.slice(0, 256)) {
|
|
242
|
+
if (!/^\d+\.\d+\.\d+$/.test(name))
|
|
243
|
+
continue;
|
|
244
|
+
try {
|
|
245
|
+
if (!statSync(join(root, name)).isFile())
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (best === null || compareCliVersions(name, best) > 0)
|
|
252
|
+
best = name;
|
|
253
|
+
}
|
|
254
|
+
return best;
|
|
255
|
+
}
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// Bounded, cached file reads
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
/** Every catalog read is capped here — codex's is ~350 KB today. */
|
|
260
|
+
export const VERSE_CATALOG_MAX_BYTES = 512 * 1024;
|
|
261
|
+
const MAX_CACHE_ENTRIES = 64;
|
|
262
|
+
const fileCache = new Map();
|
|
263
|
+
/** Test seam: forget every cached catalog read. */
|
|
264
|
+
export function resetModelWindowCaches() {
|
|
265
|
+
fileCache.clear();
|
|
266
|
+
}
|
|
267
|
+
function isRecord(value) {
|
|
268
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Read and parse a JSON file WITHOUT following a symlink at its final
|
|
272
|
+
* component, refusing anything that is not a regular file or is over
|
|
273
|
+
* `maxBytes`, and parsing it through `parse` exactly once per (path, mtime,
|
|
274
|
+
* size). The cached value is the PARSED result, so a 350 KB catalog is not
|
|
275
|
+
* re-parsed on every seat poll. Returns null on any failure.
|
|
276
|
+
*/
|
|
277
|
+
function readCachedFile(path, maxBytes, kind, parse) {
|
|
278
|
+
let fd = null;
|
|
279
|
+
try {
|
|
280
|
+
const noFollow = typeof fsConstants.O_NOFOLLOW === 'number' ? fsConstants.O_NOFOLLOW : 0;
|
|
281
|
+
fd = openSync(path, fsConstants.O_RDONLY | noFollow);
|
|
282
|
+
const st = fstatSync(fd);
|
|
283
|
+
if (!st.isFile() || st.size <= 0 || st.size > maxBytes)
|
|
284
|
+
return null;
|
|
285
|
+
const key = `${kind}\u0000${path}`;
|
|
286
|
+
const cached = fileCache.get(key);
|
|
287
|
+
if (cached && cached.mtimeMs === st.mtimeMs && cached.size === st.size)
|
|
288
|
+
return cached.value;
|
|
289
|
+
const buf = Buffer.alloc(st.size);
|
|
290
|
+
let read = 0;
|
|
291
|
+
while (read < st.size) {
|
|
292
|
+
const n = readSync(fd, buf, read, st.size - read, read);
|
|
293
|
+
if (n <= 0)
|
|
294
|
+
break;
|
|
295
|
+
read += n;
|
|
296
|
+
}
|
|
297
|
+
let raw;
|
|
298
|
+
try {
|
|
299
|
+
raw = JSON.parse(buf.subarray(0, read).toString('utf8'));
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
raw = undefined;
|
|
303
|
+
}
|
|
304
|
+
const value = raw === undefined ? null : parse(raw);
|
|
305
|
+
if (fileCache.size >= MAX_CACHE_ENTRIES)
|
|
306
|
+
fileCache.clear();
|
|
307
|
+
fileCache.set(key, { mtimeMs: st.mtimeMs, size: st.size, value });
|
|
308
|
+
return value;
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
finally {
|
|
314
|
+
if (fd !== null) {
|
|
315
|
+
try {
|
|
316
|
+
closeSync(fd);
|
|
317
|
+
}
|
|
318
|
+
catch { /* already closed */ }
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function readCappedJson(path, maxBytes) {
|
|
323
|
+
return readCachedFile(path, maxBytes, 'json', (raw) => raw);
|
|
324
|
+
}
|
|
325
|
+
function positiveInt(value) {
|
|
326
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? Math.floor(value) : null;
|
|
327
|
+
}
|
|
328
|
+
function percentOrNull(value) {
|
|
329
|
+
const n = positiveInt(value);
|
|
330
|
+
return n !== null && n <= 100 ? n : null;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* A model id that is safe to put on an argv as `--model <id>`: what every
|
|
334
|
+
* provider id looks like, and nothing that could read as a flag or carry
|
|
335
|
+
* whitespace. A catalog row with anything else is skipped, not sanitised.
|
|
336
|
+
*/
|
|
337
|
+
const MODEL_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/;
|
|
338
|
+
function labelOrNull(value) {
|
|
339
|
+
if (typeof value !== 'string')
|
|
340
|
+
return null;
|
|
341
|
+
const trimmed = value.replace(/\s+/g, ' ').trim();
|
|
342
|
+
return trimmed.length > 0 && trimmed.length <= 80 ? trimmed : null;
|
|
343
|
+
}
|
|
344
|
+
function parseCodexCatalog(raw) {
|
|
345
|
+
if (!isRecord(raw) || !Array.isArray(raw['models']))
|
|
346
|
+
return null;
|
|
347
|
+
const out = [];
|
|
348
|
+
const seen = new Set();
|
|
349
|
+
for (const row of raw['models'].slice(0, 256)) {
|
|
350
|
+
if (!isRecord(row))
|
|
351
|
+
continue;
|
|
352
|
+
const slug = row['slug'];
|
|
353
|
+
if (typeof slug !== 'string' || !MODEL_ID_RE.test(slug) || seen.has(slug))
|
|
354
|
+
continue;
|
|
355
|
+
const contextWindow = positiveInt(row['context_window']);
|
|
356
|
+
if (contextWindow === null)
|
|
357
|
+
continue;
|
|
358
|
+
seen.add(slug);
|
|
359
|
+
out.push({
|
|
360
|
+
slug,
|
|
361
|
+
displayName: labelOrNull(row['display_name']),
|
|
362
|
+
visibility: typeof row['visibility'] === 'string' ? row['visibility'] : null,
|
|
363
|
+
contextWindow,
|
|
364
|
+
maxContextWindow: positiveInt(row['max_context_window']),
|
|
365
|
+
effectiveContextWindowPercent: percentOrNull(row['effective_context_window_percent']),
|
|
366
|
+
autoCompactTokenLimit: positiveInt(row['auto_compact_token_limit']),
|
|
367
|
+
priority: typeof row['priority'] === 'number' && Number.isFinite(row['priority']) ? row['priority'] : null,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
return out.length > 0 ? out : null;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* The seat's own codex catalog, or null when it has none yet (a seat that has
|
|
374
|
+
* never run a turn has not fetched one) or it is unreadable. `nativeStatePath`
|
|
375
|
+
* is the seat profile's `CODEX_HOME` — NEVER the unpinned `~/.codex`, whose
|
|
376
|
+
* catalog belongs to a different account and binary.
|
|
377
|
+
*/
|
|
378
|
+
export function readCodexCatalog(nativeStatePath) {
|
|
379
|
+
if (typeof nativeStatePath !== 'string' || nativeStatePath.length === 0)
|
|
380
|
+
return null;
|
|
381
|
+
return readCachedFile(join(nativeStatePath, 'models_cache.json'), VERSE_CATALOG_MAX_BYTES, 'codex', parseCodexCatalog);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* The documented list a codex seat offers before its first turn fetches a
|
|
385
|
+
* catalog: the slugs every current codex catalog carries, with the windows
|
|
386
|
+
* those catalogs report (272k raw, 872k max, 95% effective; gpt-5.5 has no
|
|
387
|
+
* larger window). Hidden slugs (`gpt-reserve`, `codex-auto-review`) are not
|
|
388
|
+
* here — they are not offered even when a catalog lists them.
|
|
389
|
+
*/
|
|
390
|
+
const CODEX_DOCUMENTED_MODELS = [
|
|
391
|
+
['gpt-6-astra', 'GPT-6 Astra', 872_000],
|
|
392
|
+
['gpt-6-sol', 'GPT-6 Sol', 872_000],
|
|
393
|
+
['gpt-6-luna', 'GPT-6 Luna', 872_000],
|
|
394
|
+
['gpt-5.6-sol', 'GPT-5.6 Sol', 872_000],
|
|
395
|
+
['gpt-5.6-terra', 'GPT-5.6 Terra', 872_000],
|
|
396
|
+
['gpt-5.6-luna', 'GPT-5.6 Luna', 872_000],
|
|
397
|
+
['gpt-5.5', 'GPT-5.5', 272_000],
|
|
398
|
+
].map(([slug, displayName, max]) => ({
|
|
399
|
+
slug: slug,
|
|
400
|
+
displayName: displayName,
|
|
401
|
+
visibility: 'list',
|
|
402
|
+
contextWindow: 272_000,
|
|
403
|
+
maxContextWindow: max,
|
|
404
|
+
effectiveContextWindowPercent: 95,
|
|
405
|
+
autoCompactTokenLimit: null,
|
|
406
|
+
priority: null,
|
|
407
|
+
}));
|
|
408
|
+
function codexOption(entry, source) {
|
|
409
|
+
const pct = entry.effectiveContextWindowPercent;
|
|
410
|
+
const max = entry.maxContextWindow;
|
|
411
|
+
// Expansive only where the catalog offers a genuinely larger window. The
|
|
412
|
+
// adapter must pass BOTH `-c model_context_window=<providerWindow>` and
|
|
413
|
+
// `-c model_auto_compact_token_limit=<autoCompactAt>`: raising only the
|
|
414
|
+
// window breaks codex's auto-compaction (openai/codex#16068).
|
|
415
|
+
const expansive = max !== null && max > entry.contextWindow
|
|
416
|
+
? { contextWindow: codexEffectiveWindow(max, pct), autoCompactAt: codexAutoCompactAt(max), providerWindow: max }
|
|
417
|
+
: null;
|
|
418
|
+
return {
|
|
419
|
+
id: entry.slug,
|
|
420
|
+
label: entry.displayName ?? entry.slug,
|
|
421
|
+
// The EFFECTIVE window: what codex's own rollouts report as
|
|
422
|
+
// `model_context_window` (258_400 for every 272k model).
|
|
423
|
+
contextWindow: codexEffectiveWindow(entry.contextWindow, pct),
|
|
424
|
+
autoCompactAt: entry.autoCompactTokenLimit ?? codexAutoCompactAt(entry.contextWindow),
|
|
425
|
+
...(expansive ? { expansive } : {}),
|
|
426
|
+
windowSource: source,
|
|
427
|
+
minCliVersion: null,
|
|
428
|
+
unavailableReason: null,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
/** Catalog order is the provider's priority; ties and unranked rows keep file order. */
|
|
432
|
+
function byPriority(entries) {
|
|
433
|
+
return entries
|
|
434
|
+
.map((entry, index) => ({ entry, index }))
|
|
435
|
+
.sort((a, b) => {
|
|
436
|
+
const pa = a.entry.priority ?? Number.POSITIVE_INFINITY;
|
|
437
|
+
const pb = b.entry.priority ?? Number.POSITIVE_INFINITY;
|
|
438
|
+
return pa === pb ? a.index - b.index : pa - pb;
|
|
439
|
+
})
|
|
440
|
+
.map(({ entry }) => entry);
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* A codex seat's model list: every VISIBLE slug in its own catalog, in the
|
|
444
|
+
* provider's priority order, or the documented list (`windowSource:
|
|
445
|
+
* 'documented'`) when the seat has not fetched a catalog yet.
|
|
446
|
+
*/
|
|
447
|
+
export function codexModelOptions(catalog) {
|
|
448
|
+
const visible = (catalog ?? []).filter((entry) => entry.visibility !== 'hide');
|
|
449
|
+
if (visible.length === 0)
|
|
450
|
+
return CODEX_DOCUMENTED_MODELS.map((entry) => codexOption(entry, 'documented'));
|
|
451
|
+
return byPriority(visible).map((entry) => codexOption(entry, 'provider-catalog'));
|
|
452
|
+
}
|
|
453
|
+
function parseGrokCatalog(raw) {
|
|
454
|
+
if (!isRecord(raw) || !isRecord(raw['models']))
|
|
455
|
+
return null;
|
|
456
|
+
const out = [];
|
|
457
|
+
const seen = new Set();
|
|
458
|
+
for (const [key, entry] of Object.entries(raw['models']).slice(0, 256)) {
|
|
459
|
+
if (!isRecord(entry))
|
|
460
|
+
continue;
|
|
461
|
+
// `.info` ONLY. The sibling `api_key` / `env_key` slots are credential
|
|
462
|
+
// material and are never read, copied or compared — not even for null.
|
|
463
|
+
const info = entry['info'];
|
|
464
|
+
if (!isRecord(info))
|
|
465
|
+
continue;
|
|
466
|
+
const idRaw = typeof info['id'] === 'string' ? info['id'] : key;
|
|
467
|
+
if (!MODEL_ID_RE.test(idRaw) || seen.has(idRaw))
|
|
468
|
+
continue;
|
|
469
|
+
seen.add(idRaw);
|
|
470
|
+
out.push({
|
|
471
|
+
id: idRaw,
|
|
472
|
+
name: labelOrNull(info['name']),
|
|
473
|
+
contextWindow: positiveInt(info['context_window']),
|
|
474
|
+
autoCompactThresholdPercent: percentOrNull(info['auto_compact_threshold_percent']),
|
|
475
|
+
maxCompletionTokens: positiveInt(info['max_completion_tokens']),
|
|
476
|
+
hidden: info['hidden'] === true,
|
|
477
|
+
supportedInApi: info['supported_in_api'] !== false,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
return out.length > 0 ? out : null;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* The seat's own grok catalog (`<GROK_HOME>/models_cache.json`), or null. The
|
|
484
|
+
* unpinned `~/.grok` cache is stale on this machine (fetched weeks earlier,
|
|
485
|
+
* two models) and is never consulted.
|
|
486
|
+
*/
|
|
487
|
+
export function readGrokCatalog(nativeStatePath) {
|
|
488
|
+
if (typeof nativeStatePath !== 'string' || nativeStatePath.length === 0)
|
|
489
|
+
return null;
|
|
490
|
+
return readCachedFile(join(nativeStatePath, 'models_cache.json'), VERSE_CATALOG_MAX_BYTES, 'grok', parseGrokCatalog);
|
|
491
|
+
}
|
|
492
|
+
/** Grok 0.2.118's catalog, for a seat that has none yet. Names are the catalog's. */
|
|
493
|
+
const GROK_DOCUMENTED_MODELS = [
|
|
494
|
+
['grok-4.7', 'Grok 4.7'],
|
|
495
|
+
['grok-4.7-build-fast', 'Grok 4.7 Fast'],
|
|
496
|
+
['grok-4.6', 'Grok 4.6'],
|
|
497
|
+
['grok-4.5', 'Grok 4.5'],
|
|
498
|
+
].map(([id, name]) => ({
|
|
499
|
+
id: id,
|
|
500
|
+
name: name,
|
|
501
|
+
contextWindow: 500_000,
|
|
502
|
+
autoCompactThresholdPercent: 80,
|
|
503
|
+
maxCompletionTokens: null,
|
|
504
|
+
hidden: false,
|
|
505
|
+
supportedInApi: true,
|
|
506
|
+
}));
|
|
507
|
+
function grokOption(entry, source) {
|
|
508
|
+
const window = entry.contextWindow ?? VERSE_DEFAULT_CONTEXT_WINDOWS['grok'] ?? 500_000;
|
|
509
|
+
return {
|
|
510
|
+
id: entry.id,
|
|
511
|
+
label: entry.name ?? entry.id,
|
|
512
|
+
contextWindow: window,
|
|
513
|
+
autoCompactAt: grokAutoCompactAt(window, entry.autoCompactThresholdPercent),
|
|
514
|
+
...(entry.maxCompletionTokens !== null ? { maxOutputTokens: entry.maxCompletionTokens } : {}),
|
|
515
|
+
// A row without a window got the named default, and says so.
|
|
516
|
+
windowSource: entry.contextWindow === null ? 'fallback' : source,
|
|
517
|
+
minCliVersion: null,
|
|
518
|
+
unavailableReason: null,
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* A grok seat's model list: every entry that is not hidden and not flagged
|
|
523
|
+
* unsupported, in the catalog's own order (JSON object order is preserved and
|
|
524
|
+
* is the CLI's), or the documented list when the seat has no catalog. Grok has
|
|
525
|
+
* no expansive mode: its CLI cannot be told a larger budget per invocation.
|
|
526
|
+
*/
|
|
527
|
+
export function grokModelOptions(catalog) {
|
|
528
|
+
const offered = (catalog ?? []).filter((entry) => !entry.hidden && entry.supportedInApi);
|
|
529
|
+
if (offered.length === 0)
|
|
530
|
+
return GROK_DOCUMENTED_MODELS.map((entry) => grokOption(entry, 'documented'));
|
|
531
|
+
return offered.map((entry) => grokOption(entry, 'provider-catalog'));
|
|
532
|
+
}
|
|
533
|
+
// ---------------------------------------------------------------------------
|
|
534
|
+
// Local
|
|
535
|
+
// ---------------------------------------------------------------------------
|
|
536
|
+
/**
|
|
537
|
+
* A local (Ollama / llama-server) model option. Local turns run the Claude
|
|
538
|
+
* Code binary with `CLAUDE_CODE_MAX_CONTEXT_TOKENS=<window>`, so they compact
|
|
539
|
+
* by the Claude formula over the window Verse resolved; max output is unknown
|
|
540
|
+
* for a non-Claude id, which the formula treats as the 20k reserve cap. No
|
|
541
|
+
* expansive mode: the window IS the runtime's allocation.
|
|
542
|
+
*/
|
|
543
|
+
export function localModelOption(tag, label, window, source) {
|
|
544
|
+
// Below ~33k the formula reaches zero: the 20k reply reserve plus the 13k
|
|
545
|
+
// buffer swallow the whole window, so there is no meaningful point at which
|
|
546
|
+
// the CLI "will compact". Null (unknown) says that; a 0 would draw a tick at
|
|
547
|
+
// the left edge of the meter and claim every turn is past compaction.
|
|
548
|
+
const compactAt = claudeAutoCompactAt(window, null, null);
|
|
549
|
+
return {
|
|
550
|
+
id: tag,
|
|
551
|
+
label,
|
|
552
|
+
contextWindow: window,
|
|
553
|
+
autoCompactAt: compactAt > 0 ? compactAt : null,
|
|
554
|
+
windowSource: source,
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
// ---------------------------------------------------------------------------
|
|
558
|
+
// Launch snapshots written before 3.9
|
|
559
|
+
// ---------------------------------------------------------------------------
|
|
560
|
+
/** Whether an option was built by the V3.9 catalog (it states its budgets), rather than read from an older launch snapshot. */
|
|
561
|
+
function hasCatalogBudgets(option) {
|
|
562
|
+
return option.autoCompactAt !== undefined || option.expansive !== undefined || option.windowSource !== undefined;
|
|
563
|
+
}
|
|
564
|
+
/** The documented V3.9 option for a model id on an engine, or null when this module has none. */
|
|
565
|
+
function documentedOption(engine, model) {
|
|
566
|
+
const wanted = canonicalModelId(model);
|
|
567
|
+
switch (engine) {
|
|
568
|
+
case 'claude': {
|
|
569
|
+
const spec = claudeSpecFor(model);
|
|
570
|
+
return spec ? claudeOption(spec, null) : null;
|
|
571
|
+
}
|
|
572
|
+
case 'codex':
|
|
573
|
+
return codexModelOptions(null).find((m) => canonicalModelId(m.id) === wanted) ?? null;
|
|
574
|
+
case 'grok':
|
|
575
|
+
return grokModelOptions(null).find((m) => canonicalModelId(m.id) === wanted) ?? null;
|
|
576
|
+
default:
|
|
577
|
+
// Local windows are the runtime's allocation at discovery time, not a
|
|
578
|
+
// property of the tag; there is nothing documented to fall back to (the
|
|
579
|
+
// engine refreshes them from live discovery instead — `refreshLocalWindow`).
|
|
580
|
+
return null;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* The option whose budgets govern a session, given the option its PINNED
|
|
585
|
+
* launch snapshot lists (`snapshot`, null when the snapshot no longer lists
|
|
586
|
+
* the model).
|
|
587
|
+
*
|
|
588
|
+
* Normally the snapshot's own option. The exception is a snapshot written
|
|
589
|
+
* before 3.9: its options carry one flat window and no budgets (claude: the
|
|
590
|
+
* CLI's 200k fallback for every model; codex: the RAW 272k window, which the
|
|
591
|
+
* CLI measures against 95% of; grok: the 500k default), so it can state
|
|
592
|
+
* neither a compaction point nor an expansive budget. For those, the model's
|
|
593
|
+
* DOCUMENTED option from this module supplies the budgets — the same builders
|
|
594
|
+
* the live seat lists are made from, so the web UI (which reads the live seat)
|
|
595
|
+
* and the engine and adapters (which read the snapshot) can never disagree
|
|
596
|
+
* about whether a mode exists or what it costs. The snapshot keeps its identity
|
|
597
|
+
* (id, label); only budgets are borrowed.
|
|
598
|
+
*
|
|
599
|
+
* ONE helper, used by the engine (`effectiveModelOption`) and by every adapter
|
|
600
|
+
* that turns a budget into CLI flags (claude `--autocompact`, codex
|
|
601
|
+
* `-c model_context_window`), because two copies of this rule would drift and
|
|
602
|
+
* the flag the CLI is given must be the budget the meter shows.
|
|
603
|
+
*
|
|
604
|
+
* A model this module does not know keeps its snapshot option (and, lacking an
|
|
605
|
+
* expansive budget, gets no expansive mode — absent, never faked). Local is
|
|
606
|
+
* never substituted.
|
|
607
|
+
*/
|
|
608
|
+
export function legacyModelOptionFallback(engine, model, snapshot) {
|
|
609
|
+
if (snapshot && hasCatalogBudgets(snapshot))
|
|
610
|
+
return snapshot;
|
|
611
|
+
const known = documentedOption(engine, snapshot?.id ?? model);
|
|
612
|
+
if (!known)
|
|
613
|
+
return snapshot;
|
|
614
|
+
return { ...known, id: snapshot?.id ?? model, label: snapshot?.label ?? known.label, unavailableReason: null };
|
|
615
|
+
}
|
|
616
|
+
//# sourceMappingURL=model-windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-windows.js","sourceRoot":"","sources":["../../../src/core/verse/model-windows.ts"],"names":[],"mappings":"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"}
|