ftown 0.25.2 → 0.26.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/dist/command-rpc.d.ts +3 -0
- package/dist/command-rpc.js +41 -0
- package/dist/command-rpc.js.map +1 -1
- package/dist/coordination/board.d.ts +12 -0
- package/dist/coordination/board.js +240 -0
- package/dist/coordination/board.js.map +1 -0
- package/dist/coordination/card-store.d.ts +9 -0
- package/dist/coordination/card-store.js +188 -0
- package/dist/coordination/card-store.js.map +1 -0
- package/dist/coordination/contract.d.ts +236 -0
- package/dist/coordination/contract.js +63 -0
- package/dist/coordination/contract.js.map +1 -0
- package/dist/coordination/format.d.ts +5 -0
- package/dist/coordination/format.js +60 -0
- package/dist/coordination/format.js.map +1 -0
- package/dist/coordination/tree-events.d.ts +31 -0
- package/dist/coordination/tree-events.js +226 -0
- package/dist/coordination/tree-events.js.map +1 -0
- package/dist/coordination/wiring.d.ts +48 -0
- package/dist/coordination/wiring.js +143 -0
- package/dist/coordination/wiring.js.map +1 -0
- package/dist/coordination-cli.d.ts +34 -0
- package/dist/coordination-cli.js +460 -0
- package/dist/coordination-cli.js.map +1 -0
- package/dist/ftown-cli.js +12 -2
- package/dist/ftown-cli.js.map +1 -1
- package/dist/index.js +33 -7
- package/dist/index.js.map +1 -1
- package/dist/local-api-server.d.ts +6 -1
- package/dist/local-api-server.js +282 -5
- package/dist/local-api-server.js.map +1 -1
- package/dist/mail-delivery.d.ts +16 -2
- package/dist/mail-delivery.js +331 -77
- package/dist/mail-delivery.js.map +1 -1
- package/dist/mail-store.d.ts +7 -0
- package/dist/mail-store.js +71 -1
- package/dist/mail-store.js.map +1 -1
- package/dist/pull-request-events.d.ts +5 -0
- package/dist/pull-request-events.js +21 -1
- package/dist/pull-request-events.js.map +1 -1
- package/dist/quota/agy.d.ts +16 -0
- package/dist/quota/agy.js +287 -0
- package/dist/quota/agy.js.map +1 -0
- package/dist/quota/annotate.d.ts +5 -0
- package/dist/quota/annotate.js +56 -0
- package/dist/quota/annotate.js.map +1 -0
- package/dist/quota/claude.d.ts +27 -0
- package/dist/quota/claude.js +265 -0
- package/dist/quota/claude.js.map +1 -0
- package/dist/quota/codex.d.ts +25 -0
- package/dist/quota/codex.js +378 -0
- package/dist/quota/codex.js.map +1 -0
- package/dist/quota/format.d.ts +6 -0
- package/dist/quota/format.js +113 -0
- package/dist/quota/format.js.map +1 -0
- package/dist/quota/grok.d.ts +97 -0
- package/dist/quota/grok.js +563 -0
- package/dist/quota/grok.js.map +1 -0
- package/dist/quota/models-agy.d.ts +10 -0
- package/dist/quota/models-agy.js +144 -0
- package/dist/quota/models-agy.js.map +1 -0
- package/dist/quota/models-claude.d.ts +10 -0
- package/dist/quota/models-claude.js +227 -0
- package/dist/quota/models-claude.js.map +1 -0
- package/dist/quota/models-codex.d.ts +18 -0
- package/dist/quota/models-codex.js +305 -0
- package/dist/quota/models-codex.js.map +1 -0
- package/dist/quota/models-grok.d.ts +19 -0
- package/dist/quota/models-grok.js +272 -0
- package/dist/quota/models-grok.js.map +1 -0
- package/dist/quota/models-muse.d.ts +13 -0
- package/dist/quota/models-muse.js +200 -0
- package/dist/quota/models-muse.js.map +1 -0
- package/dist/quota/models-opencode.d.ts +51 -0
- package/dist/quota/models-opencode.js +400 -0
- package/dist/quota/models-opencode.js.map +1 -0
- package/dist/quota/muse.d.ts +38 -0
- package/dist/quota/muse.js +225 -0
- package/dist/quota/muse.js.map +1 -0
- package/dist/quota/opencode.d.ts +7 -0
- package/dist/quota/opencode.js +47 -0
- package/dist/quota/opencode.js.map +1 -0
- package/dist/quota/routing-config.d.ts +18 -0
- package/dist/quota/routing-config.js +438 -0
- package/dist/quota/routing-config.js.map +1 -0
- package/dist/quota/routing-service.d.ts +24 -0
- package/dist/quota/routing-service.js +118 -0
- package/dist/quota/routing-service.js.map +1 -0
- package/dist/quota/routing.d.ts +10 -0
- package/dist/quota/routing.js +180 -0
- package/dist/quota/routing.js.map +1 -0
- package/dist/quota/types.d.ts +304 -0
- package/dist/quota/types.js +45 -0
- package/dist/quota/types.js.map +1 -0
- package/dist/quota-cli.d.ts +80 -0
- package/dist/quota-cli.js +462 -0
- package/dist/quota-cli.js.map +1 -0
- package/dist/security/bridge/permissions.js +24 -2
- package/dist/security/bridge/permissions.js.map +1 -1
- package/dist/types.d.ts +7 -3
- package/dist/wire-types.d.ts +17 -1
- package/dist/wire-types.js +1 -1
- package/dist/wire-types.js.map +1 -1
- package/package.json +3 -2
- package/skills/ftown/SKILL.md +31 -5
- package/skills/ftown/references/orchestrator.md +17 -7
- package/skills/ftown/references/quota.md +177 -0
- package/skills/ftown/references/sessions.md +45 -3
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Codex (OpenAI Codex CLI) model list provider.
|
|
6
|
+
*
|
|
7
|
+
* Source: `codex debug models`, which prints the model catalogue as one JSON
|
|
8
|
+
* line and needs no network or model turn. Observed shape (codex-cli 0.167.2):
|
|
9
|
+
* { "models": [ { "slug", "display_name", "description",
|
|
10
|
+
* "default_reasoning_level", "supported_reasoning_levels": [{ "effort", "description" }],
|
|
11
|
+
* "visibility": "list" | "hide", "context_window", "max_context_window", ... } ] }
|
|
12
|
+
*
|
|
13
|
+
* The user's default model and reasoning effort come from the top-level
|
|
14
|
+
* `model` and `model_reasoning_effort` keys of `<homeDir>/.codex/config.toml`.
|
|
15
|
+
*/
|
|
16
|
+
const PROVIDER = 'codex';
|
|
17
|
+
const MODEL_FLAG = '-m <id>';
|
|
18
|
+
const EFFORT_FLAG = '-c model_reasoning_effort=<level>';
|
|
19
|
+
const MAX_BUFFER_BYTES = 32 * 1024 * 1024;
|
|
20
|
+
const NO_MODELS_MESSAGE = 'Codex returned no models';
|
|
21
|
+
const UNEXPECTED_DATA_MESSAGE = 'unexpected model data from Codex';
|
|
22
|
+
const NOT_FOUND_MESSAGE = 'codex CLI not found';
|
|
23
|
+
const TIMEOUT_MESSAGE = 'codex model listing timed out';
|
|
24
|
+
const OUTPUT_TOO_LARGE_MESSAGE = 'codex model listing output was too large';
|
|
25
|
+
const UNEXPECTED_OUTPUT_MESSAGE = 'unexpected output from `codex debug models`';
|
|
26
|
+
const START_FAILED_MESSAGE = 'codex model listing failed to start';
|
|
27
|
+
function isRecord(value) {
|
|
28
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
29
|
+
}
|
|
30
|
+
function nonEmptyString(value) {
|
|
31
|
+
return typeof value === 'string' && value.trim().length > 0 ? value : null;
|
|
32
|
+
}
|
|
33
|
+
function positiveFinite(value) {
|
|
34
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : null;
|
|
35
|
+
}
|
|
36
|
+
function listOf(data) {
|
|
37
|
+
if (Array.isArray(data))
|
|
38
|
+
return data;
|
|
39
|
+
if (!isRecord(data))
|
|
40
|
+
return null;
|
|
41
|
+
for (const key of ['models', 'data']) {
|
|
42
|
+
const list = data[key];
|
|
43
|
+
if (Array.isArray(list))
|
|
44
|
+
return list;
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
function isHidden(entry) {
|
|
49
|
+
if (entry.hidden === true)
|
|
50
|
+
return true;
|
|
51
|
+
return entry.visibility === 'hide' || entry.visibility === 'hidden';
|
|
52
|
+
}
|
|
53
|
+
function readEfforts(entry) {
|
|
54
|
+
const raw = entry.supportedReasoningEfforts ?? entry.supported_reasoning_levels;
|
|
55
|
+
if (!Array.isArray(raw))
|
|
56
|
+
return [];
|
|
57
|
+
const efforts = [];
|
|
58
|
+
for (const item of raw) {
|
|
59
|
+
const level = isRecord(item)
|
|
60
|
+
? nonEmptyString(item.reasoningEffort ?? item.reasoning_effort ?? item.effort)
|
|
61
|
+
: nonEmptyString(item);
|
|
62
|
+
if (level !== null && !efforts.includes(level))
|
|
63
|
+
efforts.push(level);
|
|
64
|
+
}
|
|
65
|
+
return efforts;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The model's usable context window: context_window, falling back to
|
|
69
|
+
* max_context_window only when context_window is missing or not a finite
|
|
70
|
+
* positive number. Null when neither is present.
|
|
71
|
+
*/
|
|
72
|
+
function readContextTokens(entry) {
|
|
73
|
+
return (positiveFinite(entry.contextWindow ?? entry.context_window) ??
|
|
74
|
+
positiveFinite(entry.maxContextWindow ?? entry.max_context_window));
|
|
75
|
+
}
|
|
76
|
+
function failure(status, message, observedAt) {
|
|
77
|
+
return {
|
|
78
|
+
provider: PROVIDER,
|
|
79
|
+
status,
|
|
80
|
+
models: [],
|
|
81
|
+
source: 'live',
|
|
82
|
+
observedAt,
|
|
83
|
+
message,
|
|
84
|
+
modelFlag: MODEL_FLAG,
|
|
85
|
+
effortFlag: EFFORT_FLAG,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Pure: maps the parsed model catalogue onto a ProviderModels. Accepts an
|
|
90
|
+
* array, or an object holding the array under `models` or `data`. Hidden
|
|
91
|
+
* entries are excluded. Never throws.
|
|
92
|
+
*/
|
|
93
|
+
export function parseCodexModels(data, configModel, configEffort, source, observedAt) {
|
|
94
|
+
const base = {
|
|
95
|
+
provider: PROVIDER,
|
|
96
|
+
source,
|
|
97
|
+
observedAt,
|
|
98
|
+
modelFlag: MODEL_FLAG,
|
|
99
|
+
effortFlag: EFFORT_FLAG,
|
|
100
|
+
};
|
|
101
|
+
const list = listOf(data);
|
|
102
|
+
if (list === null) {
|
|
103
|
+
return { ...base, status: 'error', models: [], message: UNEXPECTED_DATA_MESSAGE };
|
|
104
|
+
}
|
|
105
|
+
const visible = [];
|
|
106
|
+
for (const item of list) {
|
|
107
|
+
if (!isRecord(item) || isHidden(item))
|
|
108
|
+
continue;
|
|
109
|
+
const id = nonEmptyString(item.model) ?? nonEmptyString(item.id) ?? nonEmptyString(item.slug);
|
|
110
|
+
if (id === null)
|
|
111
|
+
continue;
|
|
112
|
+
visible.push({
|
|
113
|
+
id,
|
|
114
|
+
entry: item,
|
|
115
|
+
flaggedDefault: item.isDefault === true || item.is_default === true,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (visible.length === 0) {
|
|
119
|
+
return { ...base, status: 'error', models: [], message: NO_MODELS_MESSAGE };
|
|
120
|
+
}
|
|
121
|
+
let defaultIndex = visible.findIndex((v) => configModel !== null && v.id === configModel);
|
|
122
|
+
if (defaultIndex < 0)
|
|
123
|
+
defaultIndex = visible.findIndex((v) => v.flaggedDefault);
|
|
124
|
+
const models = visible.map((v, index) => {
|
|
125
|
+
const isDefault = index === defaultIndex;
|
|
126
|
+
const efforts = readEfforts(v.entry);
|
|
127
|
+
const ownDefault = nonEmptyString(v.entry.defaultReasoningEffort ?? v.entry.default_reasoning_level);
|
|
128
|
+
let defaultEffort = null;
|
|
129
|
+
if (isDefault && configEffort !== null && efforts.includes(configEffort)) {
|
|
130
|
+
defaultEffort = configEffort;
|
|
131
|
+
}
|
|
132
|
+
else if (ownDefault !== null && efforts.includes(ownDefault)) {
|
|
133
|
+
defaultEffort = ownDefault;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
id: v.id,
|
|
137
|
+
name: nonEmptyString(v.entry.displayName ?? v.entry.display_name),
|
|
138
|
+
isDefault,
|
|
139
|
+
description: nonEmptyString(v.entry.description),
|
|
140
|
+
contextTokens: readContextTokens(v.entry),
|
|
141
|
+
efforts,
|
|
142
|
+
defaultEffort,
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
return { ...base, status: 'ok', models, message: null };
|
|
146
|
+
}
|
|
147
|
+
function nonEmptyTrimmed(text) {
|
|
148
|
+
const trimmed = text.trim();
|
|
149
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Reads one TOML string value (the text after `key =`). Basic `"` strings
|
|
153
|
+
* honour \" and \\ escapes; literal `'` strings are taken as-is. Triple-quoted
|
|
154
|
+
* values are read only when they close on the same line. Returns null for
|
|
155
|
+
* anything else (unquoted, unterminated, empty).
|
|
156
|
+
*/
|
|
157
|
+
function readValue(text) {
|
|
158
|
+
const trimmed = text.trim();
|
|
159
|
+
if (trimmed.startsWith('"""') || trimmed.startsWith("'''")) {
|
|
160
|
+
const delimiter = trimmed.slice(0, 3);
|
|
161
|
+
const end = trimmed.indexOf(delimiter, 3);
|
|
162
|
+
return end < 0 ? null : nonEmptyTrimmed(trimmed.slice(3, end));
|
|
163
|
+
}
|
|
164
|
+
const quote = trimmed.charAt(0);
|
|
165
|
+
if (quote === "'") {
|
|
166
|
+
const end = trimmed.indexOf("'", 1);
|
|
167
|
+
return end < 0 ? null : nonEmptyTrimmed(trimmed.slice(1, end));
|
|
168
|
+
}
|
|
169
|
+
if (quote !== '"')
|
|
170
|
+
return null;
|
|
171
|
+
let out = '';
|
|
172
|
+
for (let i = 1; i < trimmed.length; i += 1) {
|
|
173
|
+
const ch = trimmed.charAt(i);
|
|
174
|
+
if (ch === '"')
|
|
175
|
+
return nonEmptyTrimmed(out);
|
|
176
|
+
if (ch === '\\') {
|
|
177
|
+
const next = trimmed.charAt(i + 1);
|
|
178
|
+
if (next === '"' || next === '\\') {
|
|
179
|
+
out += next;
|
|
180
|
+
i += 1;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
out += ch;
|
|
185
|
+
}
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Returns the triple-quote delimiter that opens a multi-line string on this
|
|
190
|
+
* value, or null when the value does not open one (none, or it closes on the
|
|
191
|
+
* same line).
|
|
192
|
+
*/
|
|
193
|
+
function openingMultilineDelimiter(valueText) {
|
|
194
|
+
for (const delimiter of ['"""', "'''"]) {
|
|
195
|
+
if (valueText.startsWith(delimiter) && valueText.indexOf(delimiter, 3) < 0) {
|
|
196
|
+
return delimiter;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Pure: reads the top-level `model` and `model_reasoning_effort` string values
|
|
203
|
+
* from a Codex config.toml. Stops at the first `[section]` header, so keys
|
|
204
|
+
* inside tables are ignored. Lines inside multi-line strings are skipped, so
|
|
205
|
+
* keys written there are not read. Missing or unquoted values yield null.
|
|
206
|
+
*/
|
|
207
|
+
export function parseCodexConfigDefaults(tomlText) {
|
|
208
|
+
let model = null;
|
|
209
|
+
let effort = null;
|
|
210
|
+
let openDelimiter = null;
|
|
211
|
+
for (const rawLine of tomlText.split(/\r?\n/)) {
|
|
212
|
+
if (openDelimiter !== null) {
|
|
213
|
+
if (rawLine.includes(openDelimiter))
|
|
214
|
+
openDelimiter = null;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const line = rawLine.trim();
|
|
218
|
+
if (line.startsWith('['))
|
|
219
|
+
break;
|
|
220
|
+
const match = /^([A-Za-z0-9_-]+)\s*=\s*(.*)$/.exec(line);
|
|
221
|
+
if (match === null)
|
|
222
|
+
continue;
|
|
223
|
+
const key = match[1] ?? '';
|
|
224
|
+
const rest = (match[2] ?? '').trim();
|
|
225
|
+
const delimiter = openingMultilineDelimiter(rest);
|
|
226
|
+
if (delimiter !== null) {
|
|
227
|
+
openDelimiter = delimiter;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (key === 'model') {
|
|
231
|
+
if (model === null)
|
|
232
|
+
model = readValue(rest);
|
|
233
|
+
}
|
|
234
|
+
else if (key === 'model_reasoning_effort' && effort === null) {
|
|
235
|
+
effort = readValue(rest);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return { model, effort };
|
|
239
|
+
}
|
|
240
|
+
async function readConfigText(homeDir) {
|
|
241
|
+
try {
|
|
242
|
+
return await readFile(join(homeDir, '.codex', 'config.toml'), 'utf8');
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return '';
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/** One execution of `codex debug models`. Never rejects; execFile reaps the child on every path. */
|
|
249
|
+
function runCodexDebugModels(timeoutMs) {
|
|
250
|
+
return new Promise((resolve) => {
|
|
251
|
+
try {
|
|
252
|
+
execFile('codex', ['debug', 'models'], { timeout: timeoutMs, encoding: 'utf8', maxBuffer: MAX_BUFFER_BYTES, windowsHide: true }, (error, stdout) => {
|
|
253
|
+
if (!error) {
|
|
254
|
+
resolve({ ok: true, stdout: String(stdout) });
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const code = error.code;
|
|
258
|
+
const killed = error.killed === true;
|
|
259
|
+
if (code === 'ENOENT') {
|
|
260
|
+
resolve({ ok: false, status: 'unavailable', message: NOT_FOUND_MESSAGE });
|
|
261
|
+
}
|
|
262
|
+
else if (code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER') {
|
|
263
|
+
resolve({ ok: false, status: 'error', message: OUTPUT_TOO_LARGE_MESSAGE });
|
|
264
|
+
}
|
|
265
|
+
else if (killed) {
|
|
266
|
+
resolve({ ok: false, status: 'error', message: TIMEOUT_MESSAGE });
|
|
267
|
+
}
|
|
268
|
+
else if (typeof code === 'number') {
|
|
269
|
+
resolve({
|
|
270
|
+
ok: false,
|
|
271
|
+
status: 'error',
|
|
272
|
+
message: `\`codex debug models\` failed (exit ${code})`,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
resolve({ ok: false, status: 'error', message: '`codex debug models` failed' });
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
resolve({ ok: false, status: 'error', message: START_FAILED_MESSAGE });
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
export const fetchCodexModels = async (options) => {
|
|
286
|
+
const observedAt = options.now().toISOString();
|
|
287
|
+
try {
|
|
288
|
+
const defaults = parseCodexConfigDefaults(await readConfigText(options.homeDir));
|
|
289
|
+
const listing = await runCodexDebugModels(options.timeoutMs);
|
|
290
|
+
if (!listing.ok)
|
|
291
|
+
return failure(listing.status, listing.message, observedAt);
|
|
292
|
+
let parsed;
|
|
293
|
+
try {
|
|
294
|
+
parsed = JSON.parse(listing.stdout.trim());
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
return failure('error', UNEXPECTED_OUTPUT_MESSAGE, observedAt);
|
|
298
|
+
}
|
|
299
|
+
return parseCodexModels(parsed, defaults.model, defaults.effort, 'live', observedAt);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return failure('error', UNEXPECTED_OUTPUT_MESSAGE, observedAt);
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
//# sourceMappingURL=models-codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-codex.js","sourceRoot":"","sources":["../../src/quota/models-codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ModelsFetcher, ProviderModels } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pure: maps the parsed JSON of `models_cache.json` onto a ProviderModels.
|
|
4
|
+
* `configDefaultModel` / `configDefaultEffort` come from parseGrokConfigDefaults.
|
|
5
|
+
* Never throws.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseGrokModelsCache(cacheJson: unknown, configDefaultModel: string | null, configDefaultEffort: string | null, fallbackObservedAt: string): ProviderModels;
|
|
8
|
+
/**
|
|
9
|
+
* Pure: reads `default` and `default_reasoning_effort` from the `[models]`
|
|
10
|
+
* section of a grok config.toml. Accepts quoted headers and keys, and the
|
|
11
|
+
* dotted top-level form `models.default = "x"`. Line-based, no TOML
|
|
12
|
+
* dependency; other sections are ignored. Never throws.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseGrokConfigDefaults(tomlText: string): {
|
|
15
|
+
model: string | null;
|
|
16
|
+
effort: string | null;
|
|
17
|
+
};
|
|
18
|
+
/** Reads the grok model list from the local cache. Never throws or rejects. */
|
|
19
|
+
export declare const fetchGrokModels: ModelsFetcher;
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Grok (xAI Grok Build CLI) model list.
|
|
5
|
+
*
|
|
6
|
+
* Sources, both local files the harness maintains:
|
|
7
|
+
* - `<homeDir>/.grok/models_cache.json`: the model catalogue, keyed by model id,
|
|
8
|
+
* each entry carrying an `info` object.
|
|
9
|
+
* - `<homeDir>/.grok/config.toml`: `[models]` holds the default model and the
|
|
10
|
+
* default reasoning effort.
|
|
11
|
+
*
|
|
12
|
+
* Never runs grok, never starts a model turn, never touches the network.
|
|
13
|
+
*/
|
|
14
|
+
const MODEL_FLAG = '-m <id>';
|
|
15
|
+
const EFFORT_FLAG = '--reasoning-effort <level>';
|
|
16
|
+
const UNRECOGNISED_MESSAGE = 'unrecognised grok model cache format';
|
|
17
|
+
const MISSING_CACHE_MESSAGE = 'grok model cache not found (open grok once to create it)';
|
|
18
|
+
const MODELS_SECTION = 'models';
|
|
19
|
+
/** Epoch values below this are read as seconds (1e11 ms is in 1973). */
|
|
20
|
+
const EPOCH_SECONDS_LIMIT = 1e11;
|
|
21
|
+
function isRecord(value) {
|
|
22
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
function errorCode(error) {
|
|
25
|
+
if (isRecord(error) && typeof error.code === 'string')
|
|
26
|
+
return error.code;
|
|
27
|
+
return 'unknown';
|
|
28
|
+
}
|
|
29
|
+
function emptyResult(status, observedAt, message) {
|
|
30
|
+
return {
|
|
31
|
+
provider: 'grok',
|
|
32
|
+
status,
|
|
33
|
+
models: [],
|
|
34
|
+
source: 'cached',
|
|
35
|
+
observedAt,
|
|
36
|
+
message,
|
|
37
|
+
modelFlag: MODEL_FLAG,
|
|
38
|
+
effortFlag: EFFORT_FLAG,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** ISO instant from an ISO string or an epoch in seconds or milliseconds, else null. */
|
|
42
|
+
function parseObservedAt(fetchedAt) {
|
|
43
|
+
if (typeof fetchedAt === 'string') {
|
|
44
|
+
const ms = Date.parse(fetchedAt);
|
|
45
|
+
return Number.isNaN(ms) ? null : new Date(ms).toISOString();
|
|
46
|
+
}
|
|
47
|
+
if (typeof fetchedAt === 'number' && Number.isFinite(fetchedAt) && fetchedAt > 0) {
|
|
48
|
+
const ms = fetchedAt < EPOCH_SECONDS_LIMIT ? fetchedAt * 1000 : fetchedAt;
|
|
49
|
+
const date = new Date(ms);
|
|
50
|
+
return Number.isNaN(date.getTime()) ? null : date.toISOString();
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
function readReasoningEfforts(info) {
|
|
55
|
+
const raw = info.reasoning_efforts;
|
|
56
|
+
if (!Array.isArray(raw))
|
|
57
|
+
return [];
|
|
58
|
+
const efforts = [];
|
|
59
|
+
for (const item of raw) {
|
|
60
|
+
if (isRecord(item) && typeof item.id === 'string' && item.id.length > 0) {
|
|
61
|
+
efforts.push({ id: item.id, isDefault: item.default === true });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return efforts;
|
|
65
|
+
}
|
|
66
|
+
function readContextTokens(info) {
|
|
67
|
+
const raw = info.context_windows;
|
|
68
|
+
if (!Array.isArray(raw))
|
|
69
|
+
return null;
|
|
70
|
+
let largest = null;
|
|
71
|
+
for (const size of raw) {
|
|
72
|
+
if (typeof size === 'number' && Number.isFinite(size) && (largest === null || size > largest)) {
|
|
73
|
+
largest = size;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return largest;
|
|
77
|
+
}
|
|
78
|
+
function readOptionalString(value) {
|
|
79
|
+
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Pure: maps the parsed JSON of `models_cache.json` onto a ProviderModels.
|
|
83
|
+
* `configDefaultModel` / `configDefaultEffort` come from parseGrokConfigDefaults.
|
|
84
|
+
* Never throws.
|
|
85
|
+
*/
|
|
86
|
+
export function parseGrokModelsCache(cacheJson, configDefaultModel, configDefaultEffort, fallbackObservedAt) {
|
|
87
|
+
const root = isRecord(cacheJson) ? cacheJson : null;
|
|
88
|
+
const observedAt = parseObservedAt(root?.fetched_at) ?? fallbackObservedAt;
|
|
89
|
+
const catalogue = root !== null && isRecord(root.models) ? Object.entries(root.models) : [];
|
|
90
|
+
const models = [];
|
|
91
|
+
for (const [key, entry] of catalogue) {
|
|
92
|
+
if (!isRecord(entry) || !isRecord(entry.info))
|
|
93
|
+
continue;
|
|
94
|
+
const info = entry.info;
|
|
95
|
+
if (info.hidden === true)
|
|
96
|
+
continue;
|
|
97
|
+
const id = readOptionalString(info.id) ?? key;
|
|
98
|
+
const efforts = readReasoningEfforts(info);
|
|
99
|
+
const supportedEfforts = info.supports_reasoning_effort === false ? [] : efforts.map((effort) => effort.id);
|
|
100
|
+
const flagged = efforts.find((effort) => effort.isDefault)?.id ?? null;
|
|
101
|
+
const infoEffort = readOptionalString(info.reasoning_effort);
|
|
102
|
+
const isDefault = configDefaultModel !== null && id === configDefaultModel;
|
|
103
|
+
let defaultEffort = null;
|
|
104
|
+
if (flagged !== null && supportedEfforts.includes(flagged)) {
|
|
105
|
+
defaultEffort = flagged;
|
|
106
|
+
}
|
|
107
|
+
else if (infoEffort !== null && supportedEfforts.includes(infoEffort)) {
|
|
108
|
+
defaultEffort = infoEffort;
|
|
109
|
+
}
|
|
110
|
+
if (isDefault &&
|
|
111
|
+
configDefaultEffort !== null &&
|
|
112
|
+
supportedEfforts.includes(configDefaultEffort)) {
|
|
113
|
+
defaultEffort = configDefaultEffort;
|
|
114
|
+
}
|
|
115
|
+
models.push({
|
|
116
|
+
id,
|
|
117
|
+
name: readOptionalString(info.name),
|
|
118
|
+
isDefault,
|
|
119
|
+
description: readOptionalString(info.description),
|
|
120
|
+
contextTokens: readContextTokens(info),
|
|
121
|
+
efforts: supportedEfforts,
|
|
122
|
+
defaultEffort,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (models.length === 0) {
|
|
126
|
+
return emptyResult('error', observedAt, UNRECOGNISED_MESSAGE);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
provider: 'grok',
|
|
130
|
+
status: 'ok',
|
|
131
|
+
models,
|
|
132
|
+
source: 'cached',
|
|
133
|
+
observedAt,
|
|
134
|
+
message: null,
|
|
135
|
+
modelFlag: MODEL_FLAG,
|
|
136
|
+
effortFlag: EFFORT_FLAG,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function stripTomlComment(line) {
|
|
140
|
+
let quote = null;
|
|
141
|
+
for (let i = 0; i < line.length; i += 1) {
|
|
142
|
+
const ch = line.charAt(i);
|
|
143
|
+
if (quote === '"' && ch === '\\') {
|
|
144
|
+
i += 1;
|
|
145
|
+
}
|
|
146
|
+
else if (quote !== null) {
|
|
147
|
+
if (ch === quote)
|
|
148
|
+
quote = null;
|
|
149
|
+
}
|
|
150
|
+
else if (ch === '"' || ch === "'") {
|
|
151
|
+
quote = ch;
|
|
152
|
+
}
|
|
153
|
+
else if (ch === '#') {
|
|
154
|
+
return line.slice(0, i);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return line;
|
|
158
|
+
}
|
|
159
|
+
/** A TOML basic ("...") or literal ('...') string value, else null. */
|
|
160
|
+
function parseTomlString(raw) {
|
|
161
|
+
const value = raw.trim();
|
|
162
|
+
const basic = /^"((?:[^"\\]|\\.)*)"$/.exec(value);
|
|
163
|
+
if (basic) {
|
|
164
|
+
const inner = (basic[1] ?? '').replace(/\\(["\\])/g, '$1');
|
|
165
|
+
return inner.length > 0 ? inner : null;
|
|
166
|
+
}
|
|
167
|
+
const literal = /^'([^']*)'$/.exec(value);
|
|
168
|
+
if (literal)
|
|
169
|
+
return readOptionalString(literal[1]);
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
/** Strips one pair of matching TOML quotes from a bare key or header name. */
|
|
173
|
+
function unquoteTomlKey(raw) {
|
|
174
|
+
const value = raw.trim();
|
|
175
|
+
const basic = /^"((?:[^"\\]|\\.)*)"$/.exec(value);
|
|
176
|
+
if (basic)
|
|
177
|
+
return (basic[1] ?? '').replace(/\\(["\\])/g, '$1');
|
|
178
|
+
const literal = /^'([^']*)'$/.exec(value);
|
|
179
|
+
if (literal)
|
|
180
|
+
return literal[1] ?? '';
|
|
181
|
+
return value;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Pure: reads `default` and `default_reasoning_effort` from the `[models]`
|
|
185
|
+
* section of a grok config.toml. Accepts quoted headers and keys, and the
|
|
186
|
+
* dotted top-level form `models.default = "x"`. Line-based, no TOML
|
|
187
|
+
* dependency; other sections are ignored. Never throws.
|
|
188
|
+
*/
|
|
189
|
+
export function parseGrokConfigDefaults(tomlText) {
|
|
190
|
+
let section = '';
|
|
191
|
+
let model = null;
|
|
192
|
+
let effort = null;
|
|
193
|
+
for (const rawLine of tomlText.split(/\r?\n/)) {
|
|
194
|
+
const line = stripTomlComment(rawLine).trim();
|
|
195
|
+
if (line.length === 0)
|
|
196
|
+
continue;
|
|
197
|
+
if (line.startsWith('[')) {
|
|
198
|
+
if (line.startsWith('[[')) {
|
|
199
|
+
section = '';
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const header = /^\[\s*(.+?)\s*\]$/.exec(line)?.[1] ?? '';
|
|
203
|
+
section = unquoteTomlKey(header);
|
|
204
|
+
}
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
const pair = /^("(?:[^"\\]|\\.)*"|'[^']*'|[A-Za-z0-9_.-]+)\s*=\s*(.+)$/.exec(line);
|
|
208
|
+
if (!pair)
|
|
209
|
+
continue;
|
|
210
|
+
const segments = (pair[1] ?? '').split('.').map(unquoteTomlKey);
|
|
211
|
+
const value = pair[2] ?? '';
|
|
212
|
+
// Dotted top-level form: `models.default = "x"` is the same as a [models] key.
|
|
213
|
+
let keySection = section;
|
|
214
|
+
if (section === '' && segments.length === 2) {
|
|
215
|
+
keySection = segments[0] ?? '';
|
|
216
|
+
}
|
|
217
|
+
else if (segments.length !== 1) {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (keySection !== MODELS_SECTION)
|
|
221
|
+
continue;
|
|
222
|
+
const key = segments[segments.length - 1] ?? '';
|
|
223
|
+
if (key === 'default' && model === null) {
|
|
224
|
+
model = parseTomlString(value);
|
|
225
|
+
}
|
|
226
|
+
else if (key === 'default_reasoning_effort' && effort === null) {
|
|
227
|
+
effort = parseTomlString(value);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return { model, effort };
|
|
231
|
+
}
|
|
232
|
+
async function readConfigDefaults(path) {
|
|
233
|
+
try {
|
|
234
|
+
return parseGrokConfigDefaults(await readFile(path, 'utf8'));
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return { model: null, effort: null };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** Reads the grok model list from the local cache. Never throws or rejects. */
|
|
241
|
+
export const fetchGrokModels = async (options) => {
|
|
242
|
+
let nowIso = new Date(0).toISOString();
|
|
243
|
+
try {
|
|
244
|
+
nowIso = options.now().toISOString();
|
|
245
|
+
const cachePath = join(options.homeDir, '.grok', 'models_cache.json');
|
|
246
|
+
let cacheText;
|
|
247
|
+
let mtimeIso;
|
|
248
|
+
try {
|
|
249
|
+
mtimeIso = (await stat(cachePath)).mtime.toISOString();
|
|
250
|
+
cacheText = await readFile(cachePath, 'utf8');
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (errorCode(error) === 'ENOENT') {
|
|
254
|
+
return emptyResult('unavailable', nowIso, MISSING_CACHE_MESSAGE);
|
|
255
|
+
}
|
|
256
|
+
return emptyResult('error', nowIso, `grok model cache could not be read (${errorCode(error)})`);
|
|
257
|
+
}
|
|
258
|
+
const defaults = await readConfigDefaults(join(options.homeDir, '.grok', 'config.toml'));
|
|
259
|
+
let parsed = null;
|
|
260
|
+
try {
|
|
261
|
+
parsed = JSON.parse(cacheText);
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
parsed = null;
|
|
265
|
+
}
|
|
266
|
+
return parseGrokModelsCache(parsed, defaults.model, defaults.effort, mtimeIso);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
return emptyResult('error', nowIso, `grok model list failed (${errorCode(error)})`);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
//# sourceMappingURL=models-grok.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-grok.js","sourceRoot":"","sources":["../../src/quota/models-grok.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ModelsFetcher, ProviderModels } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pure: maps the parsed JSON of a muse model catalogue file onto a ProviderModels.
|
|
4
|
+
* Only visible rows are listed (a missing `visibility` counts as visible), in
|
|
5
|
+
* the catalogue's order. The default is the row named by `settingsModel`, or the
|
|
6
|
+
* row flagged `is_default` when that id is null or not a visible row. Never throws.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseMuseModelCatalog(catalogJson: unknown, settingsModel: string | null, settingsEffort: string | null, observedAt: string): ProviderModels;
|
|
9
|
+
/**
|
|
10
|
+
* Reads the newest muse catalogue file under `homeDir` and the user's selection
|
|
11
|
+
* from settings.json. Never throws or rejects.
|
|
12
|
+
*/
|
|
13
|
+
export declare const fetchMuseModels: ModelsFetcher;
|