tickmarkr 1.86.0 → 1.87.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/adapters/catalog.d.ts +12 -0
- package/dist/adapters/catalog.js +14 -1
- package/dist/adapters/registry.d.ts +10 -2
- package/dist/adapters/registry.js +50 -10
- package/dist/cli/commands/plan.js +11 -1
- package/dist/cli/commands/resume.js +7 -1
- package/dist/compile/native.js +7 -0
- package/dist/gates/run-gates.d.ts +1 -0
- package/dist/gates/run-gates.js +21 -2
- package/dist/route/preference.d.ts +1 -1
- package/dist/route/preference.js +8 -1
- package/dist/run/consult.js +14 -1
- package/dist/run/daemon.js +10 -5
- package/fixtures/gateway-models.json +1 -0
- package/package.json +1 -1
- package/skills/tickmarkr-overseer/SKILL.md +110 -0
- package/skills/tickmarkr-overseer/scripts/watch-artifacts.sh +16 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { WorkerAdapter } from "./types.js";
|
|
3
3
|
export declare const CLI_NAME_RE: RegExp;
|
|
4
|
+
export declare const MODEL_ID_FIELDS: readonly ["id", "selector", "model"];
|
|
5
|
+
export type ModelIdField = (typeof MODEL_ID_FIELDS)[number];
|
|
4
6
|
export declare const CliDriveSchema: z.ZodObject<{
|
|
5
7
|
headless: z.ZodString;
|
|
6
8
|
interactive: z.ZodNullable<z.ZodString>;
|
|
@@ -12,6 +14,11 @@ export declare const CliDriveSchema: z.ZodObject<{
|
|
|
12
14
|
json: "json";
|
|
13
15
|
}>;
|
|
14
16
|
path: z.ZodOptional<z.ZodString>;
|
|
17
|
+
field: z.ZodOptional<z.ZodEnum<{
|
|
18
|
+
id: "id";
|
|
19
|
+
model: "model";
|
|
20
|
+
selector: "selector";
|
|
21
|
+
}>>;
|
|
15
22
|
}, z.core.$strict>>;
|
|
16
23
|
}, z.core.$strict>;
|
|
17
24
|
declare const CliEntryBaseSchema: z.ZodObject<{
|
|
@@ -36,6 +43,11 @@ export declare const CliEntrySchema: z.ZodObject<{
|
|
|
36
43
|
json: "json";
|
|
37
44
|
}>;
|
|
38
45
|
path: z.ZodOptional<z.ZodString>;
|
|
46
|
+
field: z.ZodOptional<z.ZodEnum<{
|
|
47
|
+
id: "id";
|
|
48
|
+
model: "model";
|
|
49
|
+
selector: "selector";
|
|
50
|
+
}>>;
|
|
39
51
|
}, z.core.$strict>>;
|
|
40
52
|
}, z.core.$strict>>;
|
|
41
53
|
}, z.core.$strict>;
|
package/dist/adapters/catalog.js
CHANGED
|
@@ -11,11 +11,24 @@ import { kimi } from "./kimi.js";
|
|
|
11
11
|
import { opencode } from "./opencode.js";
|
|
12
12
|
import { pi } from "./pi.js";
|
|
13
13
|
export const CLI_NAME_RE = /^[a-z0-9-]+$/;
|
|
14
|
+
// `field` names the ONE key projected out of an array of objects — a model id and nothing else.
|
|
15
|
+
// `{"models":[{…}]}` is the normal shape of a modern CLI's --json output, and without a selector the
|
|
16
|
+
// json parser only reads the rarer array-of-bare-strings. The allowlist is the rule, not a comment:
|
|
17
|
+
// `cost` (prices have one authority, catalog-remote.ts) and `provider` (vendor landing is a separate
|
|
18
|
+
// decision) are not id keys, so no config can name them and no parser call can be typed with them —
|
|
19
|
+
// a schema that took any string would let either be harvested as a second source of truth.
|
|
20
|
+
export const MODEL_ID_FIELDS = ["id", "selector", "model"];
|
|
14
21
|
const ListModelsSchema = z.object({
|
|
15
22
|
argv: z.array(z.string()).min(1),
|
|
16
23
|
parser: z.enum(["lines", "pi-table", "json"]),
|
|
17
24
|
path: z.string().min(1).optional(),
|
|
18
|
-
|
|
25
|
+
field: z.enum(MODEL_ID_FIELDS).optional(),
|
|
26
|
+
}).strict().superRefine((listModels, ctx) => {
|
|
27
|
+
// A selector the parser would silently ignore is the same silence this contract exists to end.
|
|
28
|
+
if (listModels.field !== undefined && listModels.parser !== "json") {
|
|
29
|
+
ctx.addIssue({ code: "custom", path: ["field"], message: "field is only read by the json parser" });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
19
32
|
export const CliDriveSchema = z.object({
|
|
20
33
|
headless: z.string().min(1),
|
|
21
34
|
interactive: z.string().min(1).nullable(),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type TickmarkrConfig } from "../config/config.js";
|
|
2
|
-
import { type
|
|
2
|
+
import { type PreferenceRole } from "../route/preference.js";
|
|
3
|
+
import { type CatalogEntriesOptions, type CliEntry, type ModelIdField } from "./catalog.js";
|
|
3
4
|
import { type AuthHealth, type BillingChannel, type WorkerAdapter } from "./types.js";
|
|
4
5
|
export declare const CANDIDATE_CLI_CATALOG: readonly string[];
|
|
5
6
|
export declare function registeredAdapterBinaries(adapters?: WorkerAdapter[]): string[];
|
|
@@ -46,6 +47,11 @@ export declare function formatCandidateCliRow({ binary, path }: CandidateCliDete
|
|
|
46
47
|
export declare function probeHelpText(bin: string): string | undefined;
|
|
47
48
|
export declare function missingDeclaredFlags(helpText: string, flags: string[]): string[];
|
|
48
49
|
export declare function flagDriftWarnings(adapters: WorkerAdapter[], health: Record<string, AuthHealth>, helpOf?: (bin: string) => string | undefined): string[];
|
|
50
|
+
export interface DeclaredModels {
|
|
51
|
+
models: string[];
|
|
52
|
+
reason?: string;
|
|
53
|
+
}
|
|
54
|
+
export declare function parseDeclaredModels(raw: string, parser: "lines" | "pi-table" | "json", path?: string, field?: ModelIdField): DeclaredModels;
|
|
49
55
|
export declare function adaptersFromCliEntries(entries: readonly CliEntry[]): WorkerAdapter[];
|
|
50
56
|
export interface AllAdaptersOptions {
|
|
51
57
|
fakeScriptPath?: string;
|
|
@@ -63,7 +69,9 @@ export type ProbeModelProgress = (adapter: string, model: string, status: ProbeM
|
|
|
63
69
|
export declare function probeModels(cfg: TickmarkrConfig, repoRoot: string, adapters: WorkerAdapter[], health: Record<string, AuthHealth>, onProgress?: ProbeModelProgress): Promise<void>;
|
|
64
70
|
export declare function writeDoctor(repoRoot: string, health: Record<string, AuthHealth>): void;
|
|
65
71
|
export declare function readDoctor(repoRoot: string): Record<string, AuthHealth> | null;
|
|
66
|
-
export declare function discoverChannels(cfg: TickmarkrConfig, adapters: WorkerAdapter[], health: Record<string, AuthHealth
|
|
72
|
+
export declare function discoverChannels(cfg: TickmarkrConfig, adapters: WorkerAdapter[], health: Record<string, AuthHealth>, role?: PreferenceRole): BillingChannel[];
|
|
73
|
+
export declare const PREFERENCE_ROLES: readonly ["worker", "judge", "review", "consult"];
|
|
74
|
+
export declare function rolePools(cfg: TickmarkrConfig, adapters: WorkerAdapter[], health: Record<string, AuthHealth>): Record<PreferenceRole, BillingChannel[]>;
|
|
67
75
|
export declare function servableExclusions(cfg: TickmarkrConfig, adapters: WorkerAdapter[], health: Record<string, AuthHealth>): {
|
|
68
76
|
key: string;
|
|
69
77
|
adapter: string;
|
|
@@ -208,15 +208,34 @@ function valueAtPath(value, path) {
|
|
|
208
208
|
return cursor[part];
|
|
209
209
|
}, value);
|
|
210
210
|
}
|
|
211
|
-
function parseDeclaredModels(raw, parser, path) {
|
|
211
|
+
export function parseDeclaredModels(raw, parser, path, field) {
|
|
212
212
|
let values;
|
|
213
213
|
if (parser === "json") {
|
|
214
|
+
let root;
|
|
214
215
|
try {
|
|
215
|
-
|
|
216
|
-
values = Array.isArray(selected) ? selected : [];
|
|
216
|
+
root = JSON.parse(raw);
|
|
217
217
|
}
|
|
218
218
|
catch {
|
|
219
|
-
return [];
|
|
219
|
+
return { models: [], reason: "malformed JSON: the output did not parse" };
|
|
220
|
+
}
|
|
221
|
+
const selected = valueAtPath(root, path);
|
|
222
|
+
if (!Array.isArray(selected)) {
|
|
223
|
+
return { models: [], reason: `no array at ${path ? `path "${path}"` : "the JSON root"}` };
|
|
224
|
+
}
|
|
225
|
+
// One key per entry, and only the configured one — and `ModelIdField` is an id-key allowlist, so
|
|
226
|
+
// `cost` and `provider` are not spellable here: no price, no vendor, no whole object.
|
|
227
|
+
values = field === undefined
|
|
228
|
+
? selected
|
|
229
|
+
: selected.map((entry) => entry && typeof entry === "object" && !Array.isArray(entry)
|
|
230
|
+
? entry[field]
|
|
231
|
+
: undefined);
|
|
232
|
+
if (selected.length > 0 && !values.some((value) => typeof value === "string")) {
|
|
233
|
+
return {
|
|
234
|
+
models: [],
|
|
235
|
+
reason: field === undefined
|
|
236
|
+
? `${selected.length} entries are not id strings and no field is configured`
|
|
237
|
+
: `no string field "${field}" on any of the ${selected.length} entries`,
|
|
238
|
+
};
|
|
220
239
|
}
|
|
221
240
|
}
|
|
222
241
|
else if (parser === "pi-table") {
|
|
@@ -230,7 +249,14 @@ function parseDeclaredModels(raw, parser, path) {
|
|
|
230
249
|
else {
|
|
231
250
|
values = raw.split("\n").map((line) => line.trim());
|
|
232
251
|
}
|
|
233
|
-
|
|
252
|
+
// Blanks are structural padding in every parser (trailing newline, headerless table row), never a
|
|
253
|
+
// rejected id — counting them would make "all values rejected" fire on a healthy list.
|
|
254
|
+
const candidates = values.filter((value) => typeof value === "string" && value.length > 0);
|
|
255
|
+
const models = [...new Set(candidates.filter((value) => MODEL_ID_RE.test(value)))];
|
|
256
|
+
if (models.length === 0 && candidates.length > 0) {
|
|
257
|
+
return { models, reason: `all ${candidates.length} listed values were rejected by the model-id format` };
|
|
258
|
+
}
|
|
259
|
+
return { models };
|
|
234
260
|
}
|
|
235
261
|
function declarativeAdapter(entry) {
|
|
236
262
|
const drive = entry.drive;
|
|
@@ -270,9 +296,13 @@ function declarativeAdapter(entry) {
|
|
|
270
296
|
return [];
|
|
271
297
|
const cmd = [shq(resolved), ...drive.listModels.argv.map(shq)].join(" ");
|
|
272
298
|
const result = shellSpawnSync(cmd, process.cwd(), 15000);
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
299
|
+
if (result.code !== 0)
|
|
300
|
+
return [];
|
|
301
|
+
const { models, reason } = parseDeclaredModels(result.stdout, drive.listModels.parser, drive.listModels.path, drive.listModels.field);
|
|
302
|
+
// Listing stays advisory (fail-open to []), but never silently: an empty projection names why.
|
|
303
|
+
if (models.length === 0 && reason)
|
|
304
|
+
console.warn(`tickmarkr: ${entry.id} listed no models — ${reason}`);
|
|
305
|
+
return models;
|
|
276
306
|
},
|
|
277
307
|
} : {}),
|
|
278
308
|
};
|
|
@@ -468,7 +498,11 @@ export function readDoctor(repoRoot) {
|
|
|
468
498
|
const { autoPrefer: _, ...health } = raw;
|
|
469
499
|
return health;
|
|
470
500
|
}
|
|
471
|
-
|
|
501
|
+
// v1.87 T2: `role` is optional and defaults to "worker", so every pre-existing two/three-argument
|
|
502
|
+
// call keeps its exact present behaviour — the worker pool. A non-worker role reads the SAME fleet
|
|
503
|
+
// through its own deny scope: a worker-only deny (routing.deny.workers) benches a channel for
|
|
504
|
+
// dispatch while leaving it eligible to judge, review or consult the work.
|
|
505
|
+
export function discoverChannels(cfg, adapters, health, role = "worker") {
|
|
472
506
|
const base = adapters
|
|
473
507
|
.filter((a) => health[a.id]?.installed && health[a.id]?.authed)
|
|
474
508
|
.flatMap((a) => {
|
|
@@ -483,7 +517,13 @@ export function discoverChannels(cfg, adapters, health) {
|
|
|
483
517
|
});
|
|
484
518
|
if (!cfg.routing.allow && !cfg.routing.deny)
|
|
485
519
|
return base;
|
|
486
|
-
return base.filter((c) => disallowedBy(c, cfg.routing) === null);
|
|
520
|
+
return base.filter((c) => disallowedBy(c, cfg.routing, role) === null);
|
|
521
|
+
}
|
|
522
|
+
// v1.87 T2: the role-scoped pool builder. One doctor probe, one discovery pass per role — so the
|
|
523
|
+
// daemon hands each seat the pool its own policy allows instead of handing everyone the worker list.
|
|
524
|
+
export const PREFERENCE_ROLES = ["worker", "judge", "review", "consult"];
|
|
525
|
+
export function rolePools(cfg, adapters, health) {
|
|
526
|
+
return Object.fromEntries(PREFERENCE_ROLES.map((role) => [role, discoverChannels(cfg, adapters, health, role)]));
|
|
487
527
|
}
|
|
488
528
|
// HYG-07(a): the channels discoverChannels silently dropped because their model isn't in the adapter's
|
|
489
529
|
// served list (the HYG-05 filter above). Computed from the SAME inputs as the drop (a.channels(cfg), not
|
|
@@ -127,7 +127,17 @@ export async function plan(argv, cwd = process.cwd(), adapters = allAdapters())
|
|
|
127
127
|
lints.push(...modelLints(cfg, health, adapters, { tty: ttyVisual() })); // health may be pre-v1.5/probeAll-fallback — no-detection branch covers both
|
|
128
128
|
// v1.54 T3: dead-steering sweep — advisory only, renders with the routing lints, never alters routing.
|
|
129
129
|
lints.push(...preferEntryLints(cfg, health, overlayPreferShapes(cwd)));
|
|
130
|
-
|
|
130
|
+
// The guard here was `channels.length && !fleetCanCrossVendorReview(channels)`, so the review lint went
|
|
131
|
+
// SILENT at zero channels — the first-run state, where review.required is set and nothing can route at all.
|
|
132
|
+
// Deleting that clause outright is worse than the silence: it fires "no cross-vendor reviewer pair in fleet"
|
|
133
|
+
// when there IS no fleet. An empty fleet and a single-vendor fleet are different faults with different
|
|
134
|
+
// repairs — install or auth ANY adapter vs. add a second VENDOR — so they are two lints, not one clause.
|
|
135
|
+
// The pair text stays byte-identical: tests/fixtures/brand-surfaces/plan-lints.txt pins it and this task
|
|
136
|
+
// does not own that fixture, so the pair lint keeps naming the waiver as the repair it can offer inline.
|
|
137
|
+
if (cfg.review.required && channels.length === 0) {
|
|
138
|
+
lints.push("review: review.required is set but no channel can route — the fleet is empty; install or authenticate an adapter");
|
|
139
|
+
}
|
|
140
|
+
else if (cfg.review.required && !fleetCanCrossVendorReview(channels)) {
|
|
131
141
|
lints.push("review: no cross-vendor reviewer pair in fleet — set review.required: false to waive");
|
|
132
142
|
}
|
|
133
143
|
let cost = 0;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { loadConfig } from "../../config/config.js";
|
|
2
2
|
import { pickDriver } from "../../drivers/index.js";
|
|
3
|
+
import { loadGraph } from "../../graph/graph.js";
|
|
3
4
|
import { formatSummary, runDaemon } from "../../run/daemon.js";
|
|
4
5
|
import { formatJournalNarration } from "../../run/journal.js";
|
|
5
6
|
import { denyPreferCollisionLine, denyPreferCollisions } from "../../route/preference.js";
|
|
@@ -15,7 +16,12 @@ export async function resume(argv, cwd = process.cwd()) {
|
|
|
15
16
|
const graphChanged = argv.includes("--graph-changed");
|
|
16
17
|
const retryFailed = argv.includes("--retry-failed");
|
|
17
18
|
const cfg = loadConfig(cwd);
|
|
18
|
-
|
|
19
|
+
// v1.87 T3 (OBS-162, twice-carried workaround): the preflight runs AFTER the graph is read and
|
|
20
|
+
// sees only the shapes the resumed graph carries. A deny∩prefer collision on a shape no resumed
|
|
21
|
+
// task uses is a config fact the run would never resolve — it must not refuse the only
|
|
22
|
+
// crash-recovery path. doctor still walks the whole map.
|
|
23
|
+
const graph = loadGraph(cwd);
|
|
24
|
+
const collisions = denyPreferCollisions(cfg, graph.tasks.map((t) => t.shape));
|
|
19
25
|
if (collisions.length) {
|
|
20
26
|
throw new Error(collisions.map(denyPreferCollisionLine).join("; "));
|
|
21
27
|
}
|
package/dist/compile/native.js
CHANGED
|
@@ -457,6 +457,13 @@ acceptance is required on every task (a nested list of observable outcomes).
|
|
|
457
457
|
task that owns both the thing it checks and the fixture it checks against.
|
|
458
458
|
- A source-only obligation (a comment or doc that a change makes false) has no lawful "test:" — verify
|
|
459
459
|
it with "judge:", which reads the DIFF and must cite a changed line in a file the task owns.
|
|
460
|
+
- A criterion that pins the SHAPE of a fix must also pin the CONDITIONS under which it runs, or a
|
|
461
|
+
correctly-shaped fix that runs SOMETIMES satisfies it. "cleanup is try/finally at all four sites"
|
|
462
|
+
is satisfied by \`finally { if (cond) cleanup() }\` — the shape is present and the fix is inert in
|
|
463
|
+
production. Say UNCONDITIONAL, or name the branch that may not exist.
|
|
464
|
+
- Enumerating one axis exhaustively is what hides the others. A spec that guards PARTIAL coverage
|
|
465
|
+
site-by-site, member-by-member, can be defeated wholesale by CONDITIONAL coverage, which leaves
|
|
466
|
+
every enumeration satisfied. After you enumerate, ask what a single flag would do to the whole set.
|
|
460
467
|
|
|
461
468
|
ORDERING AND OWNERSHIP:
|
|
462
469
|
- Every path has exactly ONE owning task. Two tasks writing one file must be ORDERED by deps, or the
|
package/dist/gates/run-gates.js
CHANGED
|
@@ -8,6 +8,7 @@ import { acceptanceGate } from "./acceptance.js";
|
|
|
8
8
|
import { compareToBaseline } from "./baseline.js";
|
|
9
9
|
import { evidenceGate } from "./evidence.js";
|
|
10
10
|
import { captureLlmOutput } from "./llm.js";
|
|
11
|
+
import { disallowedBy } from "../route/preference.js";
|
|
11
12
|
import { marginalCostRank } from "../route/router.js";
|
|
12
13
|
import { reviewGate } from "./review.js";
|
|
13
14
|
import { scopeGate } from "./scope.js";
|
|
@@ -233,6 +234,21 @@ export async function runGates(task, ctx) {
|
|
|
233
234
|
};
|
|
234
235
|
// acceptance judge — LLM spend, so everything deterministic has already passed when this runs
|
|
235
236
|
const runAcceptance = async () => {
|
|
237
|
+
// v1.87 T2: the judge is a configured seat like any other — check it against the operator's
|
|
238
|
+
// policy BEFORE spending a dispatch on it. disallowedBy carries the whole deny grammar (adapter,
|
|
239
|
+
// model, or adapter:model), so a model-scoped deny cannot slip past an adapter-id-only read.
|
|
240
|
+
const judgeDenied = disallowedBy({ adapter: ctx.cfg.judge.adapter, model: ctx.cfg.judge.model }, ctx.cfg.routing, "judge");
|
|
241
|
+
if (judgeDenied) {
|
|
242
|
+
return {
|
|
243
|
+
result: {
|
|
244
|
+
gate: "acceptance",
|
|
245
|
+
pass: false,
|
|
246
|
+
details: `judge ${channelKey({ adapter: ctx.cfg.judge.adapter, model: ctx.cfg.judge.model })} is disallowed by routing.${judgeDenied.by} (${judgeDenied.entry}) — remove the ${judgeDenied.by} entry or re-point cfg.judge at an allowed channel`,
|
|
247
|
+
meta: { judgeDisallowed: { by: judgeDenied.by, entry: judgeDenied.entry } },
|
|
248
|
+
},
|
|
249
|
+
invocations: [],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
236
252
|
const judgeAdapter = getAdapter(ctx.cfg.judge.adapter, ctx.adapters);
|
|
237
253
|
const jvia = ctx.via
|
|
238
254
|
? { driver: ctx.via.driver, keep: ctx.via.keep, onSlot: ctx.via.onSlot, name: ctx.via.nameFor("judge", judgeAdapter.id), label: ctx.via.labelFor("judge") }
|
|
@@ -280,8 +296,11 @@ export async function runGates(task, ctx) {
|
|
|
280
296
|
// pickReviewer's sort (review.ts:37): TIER_RANK desc, marginalCostRank asc — proven ordering; both
|
|
281
297
|
// symbols already imported by a sibling gate file.
|
|
282
298
|
.sort((x, y) => TIER_RANK[y.tier] - TIER_RANK[x.tier] || marginalCostRank(x) - marginalCostRank(y))[0];
|
|
283
|
-
|
|
284
|
-
|
|
299
|
+
// v1.87 T2: the failover seat obeys the same policy the primary judge just passed — a denied
|
|
300
|
+
// channel is refused here too, never reached by falling through the exclusion arms below.
|
|
301
|
+
const judgePool = (ctx.judgeChannels ?? ctx.channels).filter((c) => disallowedBy(c, ctx.cfg.routing, "judge") === null);
|
|
302
|
+
const crossAdapter = pick(judgePool.filter((c) => c.adapter !== flakedAdapter));
|
|
303
|
+
const sameAdapter = pick(judgePool.filter((c) => c.adapter === flakedAdapter && channelKey(c) !== flakedKey));
|
|
285
304
|
// Prefer a different adapter; if the fleet only has one adapter, retry on a different channel of
|
|
286
305
|
// that adapter; if the fleet has only one channel, fall back to the original judge config.
|
|
287
306
|
const retry = crossAdapter ?? sameAdapter ?? { adapter: ctx.cfg.judge.adapter, model: ctx.cfg.judge.model };
|
|
@@ -33,5 +33,5 @@ export interface DenyPreferCollision {
|
|
|
33
33
|
disallowed: Disallowed;
|
|
34
34
|
}
|
|
35
35
|
export declare function preferEntryDenied(p: string, cfg: TickmarkrConfig): Disallowed | null;
|
|
36
|
-
export declare function denyPreferCollisions(cfg: TickmarkrConfig): DenyPreferCollision[];
|
|
36
|
+
export declare function denyPreferCollisions(cfg: TickmarkrConfig, shapes?: Iterable<string>): DenyPreferCollision[];
|
|
37
37
|
export declare function denyPreferCollisionLine({ kind, shape, detail, disallowed }: DenyPreferCollision): string;
|
package/dist/route/preference.js
CHANGED
|
@@ -81,11 +81,18 @@ export function preferEntryDenied(p, cfg) {
|
|
|
81
81
|
throw e;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
|
|
84
|
+
// v1.87 T3 (OBS-162): graph-aware walk. `shapes` narrows it to the shapes the caller will actually
|
|
85
|
+
// route — resume hands it the loaded graph's shape set, so a collision on a shape no resumed task
|
|
86
|
+
// uses can no longer refuse the only crash-recovery path. Omitted ⇒ the whole routing map: doctor
|
|
87
|
+
// audits the config itself, which has no graph to be scoped by.
|
|
88
|
+
export function denyPreferCollisions(cfg, shapes) {
|
|
85
89
|
if (!cfg.routing.allow && !cfg.routing.deny)
|
|
86
90
|
return [];
|
|
91
|
+
const inGraph = shapes === undefined ? undefined : new Set(shapes);
|
|
87
92
|
const out = [];
|
|
88
93
|
for (const [shape, entry] of Object.entries(cfg.routing.map)) {
|
|
94
|
+
if (inGraph && !inGraph.has(shape))
|
|
95
|
+
continue;
|
|
89
96
|
if (entry.pin) {
|
|
90
97
|
const d = disallowedBy({ adapter: entry.pin.via, model: entry.pin.model }, cfg.routing);
|
|
91
98
|
if (d) {
|
package/dist/run/consult.js
CHANGED
|
@@ -4,6 +4,7 @@ import { getAdapter } from "../adapters/registry.js";
|
|
|
4
4
|
import { bannerShell, paneDispatchCommand } from "../brand.js";
|
|
5
5
|
import { extractVerdictJson, gateExitTrailer, gatePaneName, generateVerdictNonce, verdictNonceLine } from "../gates/llm.js";
|
|
6
6
|
import { classifyVerdictCause } from "../gates/verdict-cause.js";
|
|
7
|
+
import { disallowedBy } from "../route/preference.js";
|
|
7
8
|
import { sh } from "./git.js";
|
|
8
9
|
import { redactSecrets } from "./redact.js";
|
|
9
10
|
import { filterLlmTranscript } from "./stall.js";
|
|
@@ -184,7 +185,19 @@ opts = {}) {
|
|
|
184
185
|
.map((entry) => ({ adapter: entry.slice(0, entry.indexOf(":")), model: entry.slice(entry.indexOf(":") + 1) }))
|
|
185
186
|
.filter((s) => live.has(s.adapter));
|
|
186
187
|
seats.push({ adapter: cfg.consult.adapter, model: cfg.consult.model });
|
|
187
|
-
|
|
188
|
+
// v1.87 T2: a consult seat reads the code, so it passes through the operator's policy exactly like
|
|
189
|
+
// a worker does. The filter runs AFTER the pin is pushed, so the final pinned seat is checked by
|
|
190
|
+
// the same rule as every prefer entry — and disallowedBy carries the full deny grammar (adapter,
|
|
191
|
+
// model, or adapter:model), so a model-scoped deny cannot slip past an adapter-id-only read.
|
|
192
|
+
const allowedSeats = seats.filter((s) => disallowedBy(s, cfg.routing, "consult") === null);
|
|
193
|
+
if (!allowedSeats.length) {
|
|
194
|
+
const d = disallowedBy(seats[seats.length - 1], cfg.routing, "consult");
|
|
195
|
+
return {
|
|
196
|
+
action: "human",
|
|
197
|
+
notes: `every consult seat is disallowed by routing.${d.by} (${d.entry}) — failing safe to human`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
for (const [i, seat] of allowedSeats.entries()) {
|
|
188
201
|
try {
|
|
189
202
|
const parsed = await invokeSeat(seat.adapter, seat.model, i);
|
|
190
203
|
if (parsed.verdict)
|
package/dist/run/daemon.js
CHANGED
|
@@ -5,7 +5,7 @@ import { tmpdir } from "node:os";
|
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { stringify } from "yaml";
|
|
7
7
|
import { classifyDeadChannel, NO_TRAILER_SUMMARY, trailerPattern, UNPARSEABLE_TRAILER_SUMMARY, writePrompt } from "../adapters/prompt.js";
|
|
8
|
-
import { allAdapters,
|
|
8
|
+
import { allAdapters, getAdapter, probeAll, readDoctor, rolePools } from "../adapters/registry.js";
|
|
9
9
|
import { addUsage, channelKey, matchesTrustDialog, QUOTA_RE } from "../adapters/types.js";
|
|
10
10
|
import { bannerShell, paneDispatchCommand } from "../brand.js";
|
|
11
11
|
import { DEFAULT_DIFF_CAP, globalConfigDir, loadConfigWithMode, readOverlayFile, repoOverlayPath, } from "../config/config.js";
|
|
@@ -729,7 +729,12 @@ export async function runDaemon(repoRoot, opts = {}) {
|
|
|
729
729
|
// v1.51 T4: every dispatch provenance line begins with the mode and its source; when a pin won
|
|
730
730
|
// the route (the final "→ " segment is a pin, not a degraded-to-auto tail) it names the mode it bypassed.
|
|
731
731
|
const dispatchProvenance = (p) => `mode ${rm.mode.mode} (${rm.source})${p.split("→ ").pop().startsWith("pin ") ? ` — pin bypasses mode ${rm.mode.mode}` : ""} · ${p}`;
|
|
732
|
-
|
|
732
|
+
// v1.87 T2: one pool per seat role, built once. `channels` stays the WORKER pool — every routing
|
|
733
|
+
// call below reads it exactly as before — while the judge, review and consult seats each receive
|
|
734
|
+
// the pool their own deny scope allows, so routing.deny.workers benches a channel for dispatch
|
|
735
|
+
// without also removing it from the seats that verify the work.
|
|
736
|
+
const pools = rolePools(cfg, adapters, health);
|
|
737
|
+
const channels = pools.worker;
|
|
733
738
|
// v1.6 ROUTE-06: build the learned profile ONCE at startup (never per task, never in the comparator).
|
|
734
739
|
// No preview — the daemon honors routing.learned:off and gets undefined; this snapshot is immutable
|
|
735
740
|
// for the run, so this run's own telemetry never feeds back into its own routing.
|
|
@@ -1200,7 +1205,7 @@ export async function runDaemon(repoRoot, opts = {}) {
|
|
|
1200
1205
|
// D-07: consult panes self-clean when the verdict is read (keepLlm) — only "forever" keeps them.
|
|
1201
1206
|
// v1.54 T1: channels = this run's doctor-filtered live list — consult.prefer seat liveness
|
|
1202
1207
|
// is judged against it, never rebuilt from config (installed-but-unauthed seats would stall).
|
|
1203
|
-
{ keep: keepLlm, onSlot: keepLlm ? (s) => keptSlots.push(s) : undefined, runId, channels });
|
|
1208
|
+
{ keep: keepLlm, onSlot: keepLlm ? (s) => keptSlots.push(s) : undefined, runId, channels: pools.consult });
|
|
1204
1209
|
};
|
|
1205
1210
|
// returns true → continue attempting, false → task is terminal (parked)
|
|
1206
1211
|
// trigger (why the consult ran) is threaded in so the decompose/human park keeps its cause —
|
|
@@ -1346,7 +1351,7 @@ export async function runDaemon(repoRoot, opts = {}) {
|
|
|
1346
1351
|
journal.phaseStart(t.id, "gates");
|
|
1347
1352
|
const { results } = await runGates(resumedTask, {
|
|
1348
1353
|
worktree: wt, baseRef: taskBase, result: priorResult, author: gateAuthor,
|
|
1349
|
-
commands, baseline, channels, adapters, cfg, artifactDir: journal.dir,
|
|
1354
|
+
commands, baseline, channels: pools.review, judgeChannels: pools.judge, adapters, cfg, artifactDir: journal.dir,
|
|
1350
1355
|
// a recheck re-verifies a human's release: it never selects tests down, it runs the suite.
|
|
1351
1356
|
pipeline: "v185",
|
|
1352
1357
|
via: cfg.visibility.llm === "pane"
|
|
@@ -2506,7 +2511,7 @@ export async function runDaemon(repoRoot, opts = {}) {
|
|
|
2506
2511
|
journal.phaseStart(t.id, "gates");
|
|
2507
2512
|
({ results, commits } = await runGates(t, {
|
|
2508
2513
|
worktree: wt, baseRef: taskBase, result, author: assignment,
|
|
2509
|
-
commands, baseline, channels, adapters, cfg, artifactDir: journal.dir,
|
|
2514
|
+
commands, baseline, channels: pools.review, judgeChannels: pools.judge, adapters, cfg, artifactDir: journal.dir,
|
|
2510
2515
|
pipeline: "v185", selectTests: !testGateFailed,
|
|
2511
2516
|
via: cfg.visibility.llm === "pane"
|
|
2512
2517
|
? {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"models":[{"provider":"anthropic","id":"claude-3-5-sonnet-20240620","selector":"anthropic/claude-3-5-sonnet-20240620","name":"Claude Sonnet 3.5","contextWindow":200000,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"anthropic","id":"claude-3-5-sonnet-20241022","selector":"anthropic/claude-3-5-sonnet-20241022","name":"Claude Sonnet 3.5 v2","contextWindow":200000,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"anthropic","id":"claude-3-7-sonnet-20250219","selector":"anthropic/claude-3-7-sonnet-20250219","name":"Claude Sonnet 3.7","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"anthropic","id":"claude-3-haiku-20240307","selector":"anthropic/claude-3-haiku-20240307","name":"Claude Haiku 3","contextWindow":200000,"maxTokens":4096,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0.25,"output":1.25,"cacheRead":0.03,"cacheWrite":0.3}},{"provider":"anthropic","id":"claude-3-opus-20240229","selector":"anthropic/claude-3-opus-20240229","name":"Claude Opus 3","contextWindow":200000,"maxTokens":4096,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":15,"output":75,"cacheRead":1.5,"cacheWrite":18.75}},{"provider":"anthropic","id":"claude-3-sonnet-20240229","selector":"anthropic/claude-3-sonnet-20240229","name":"Claude Sonnet 3","contextWindow":200000,"maxTokens":4096,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0.3}},{"provider":"anthropic","id":"claude-fable-5","selector":"anthropic/claude-fable-5","name":"Claude Fable 5","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":10,"output":50,"cacheRead":1,"cacheWrite":12.5}},{"provider":"anthropic","id":"claude-haiku-4-5","selector":"anthropic/claude-haiku-4-5","name":"Claude Haiku 4.5","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1,"output":5,"cacheRead":0.1,"cacheWrite":1.25}},{"provider":"anthropic","id":"claude-haiku-4-5-20251001","selector":"anthropic/claude-haiku-4-5-20251001","name":"Claude Haiku 4.5","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1,"output":5,"cacheRead":0.1,"cacheWrite":1.25}},{"provider":"anthropic","id":"claude-mythos-5","selector":"anthropic/claude-mythos-5","name":"Claude Mythos 5","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":10,"output":50,"cacheRead":1,"cacheWrite":12.5}},{"provider":"anthropic","id":"claude-opus-4-0","selector":"anthropic/claude-opus-4-0","name":"Claude Opus 4","contextWindow":200000,"maxTokens":32000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":15,"output":75,"cacheRead":1.5,"cacheWrite":18.75}},{"provider":"anthropic","id":"claude-opus-4-1","selector":"anthropic/claude-opus-4-1","name":"Claude Opus 4.1","contextWindow":200000,"maxTokens":32000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":15,"output":75,"cacheRead":1.5,"cacheWrite":18.75}},{"provider":"anthropic","id":"claude-opus-4-1-20250805","selector":"anthropic/claude-opus-4-1-20250805","name":"Claude Opus 4.1","contextWindow":200000,"maxTokens":32000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":15,"output":75,"cacheRead":1.5,"cacheWrite":18.75}},{"provider":"anthropic","id":"claude-opus-4-20250514","selector":"anthropic/claude-opus-4-20250514","name":"Claude 4 Opus","contextWindow":200000,"maxTokens":32000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":15,"output":75,"cacheRead":1.5,"cacheWrite":18.75}},{"provider":"anthropic","id":"claude-opus-4-5","selector":"anthropic/claude-opus-4-5","name":"Claude Opus 4.5","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":5,"output":25,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"anthropic","id":"claude-opus-4-5-20251101","selector":"anthropic/claude-opus-4-5-20251101","name":"Claude Opus 4.5","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":5,"output":25,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"anthropic","id":"claude-opus-4-6","selector":"anthropic/claude-opus-4-6","name":"Claude Opus 4.6","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","max"],"input":["text","image"],"cost":{"input":5,"output":25,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"anthropic","id":"claude-opus-4-7","selector":"anthropic/claude-opus-4-7","name":"Claude Opus 4.7","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":5,"output":25,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"anthropic","id":"claude-opus-4-8","selector":"anthropic/claude-opus-4-8","name":"Claude Opus 4.8","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":5,"output":25,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"anthropic","id":"claude-opus-5","selector":"anthropic/claude-opus-5","name":"Claude Opus 5","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":5,"output":25,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"anthropic","id":"claude-sonnet-4-0","selector":"anthropic/claude-sonnet-4-0","name":"Claude Sonnet 4","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"anthropic","id":"claude-sonnet-4-20250514","selector":"anthropic/claude-sonnet-4-20250514","name":"Claude 4 Sonnet","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"anthropic","id":"claude-sonnet-4-5","selector":"anthropic/claude-sonnet-4-5","name":"Claude Sonnet 4.5","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"anthropic","id":"claude-sonnet-4-5-20250929","selector":"anthropic/claude-sonnet-4-5-20250929","name":"Claude Sonnet 4.5","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"anthropic","id":"claude-sonnet-4-6","selector":"anthropic/claude-sonnet-4-6","name":"Claude Sonnet 4.6","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high"],"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"anthropic","id":"claude-sonnet-5","selector":"anthropic/claude-sonnet-5","name":"Claude Sonnet 5","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":2,"output":10,"cacheRead":0.2,"cacheWrite":2.5}},{"provider":"cursor","id":"claude-4-sonnet","selector":"cursor/claude-4-sonnet","name":"Sonnet 4","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-4.5-opus-high","selector":"cursor/claude-4.5-opus-high","name":"Opus 4.5","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-4.5-sonnet","selector":"cursor/claude-4.5-sonnet","name":"Sonnet 4.5","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-4.6-opus-high","selector":"cursor/claude-4.6-opus-high","name":"Opus 4.6 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-4.6-opus-max","selector":"cursor/claude-4.6-opus-max","name":"Opus 4.6 1M Max","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-4.6-sonnet-medium","selector":"cursor/claude-4.6-sonnet-medium","name":"Sonnet 4.6 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-fable-5-high","selector":"cursor/claude-fable-5-high","name":"Fable 5 1M (NO ZDR)","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-fable-5-low","selector":"cursor/claude-fable-5-low","name":"Fable 5 1M Low (NO ZDR)","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-fable-5-max","selector":"cursor/claude-fable-5-max","name":"Fable 5 1M Max (NO ZDR)","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-fable-5-medium","selector":"cursor/claude-fable-5-medium","name":"Fable 5 1M Medium (NO ZDR)","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-fable-5-xhigh","selector":"cursor/claude-fable-5-xhigh","name":"Fable 5 1M Extra High (NO ZDR)","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-high","selector":"cursor/claude-opus-4-7-high","name":"Opus 4.7 1M High","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-high-fast","selector":"cursor/claude-opus-4-7-high-fast","name":"Opus 4.7 1M High Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-low","selector":"cursor/claude-opus-4-7-low","name":"Opus 4.7 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-low-fast","selector":"cursor/claude-opus-4-7-low-fast","name":"Opus 4.7 1M Low Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-max","selector":"cursor/claude-opus-4-7-max","name":"Opus 4.7 1M Max","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-max-fast","selector":"cursor/claude-opus-4-7-max-fast","name":"Opus 4.7 1M Max Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-medium","selector":"cursor/claude-opus-4-7-medium","name":"Opus 4.7 1M Medium","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-medium-fast","selector":"cursor/claude-opus-4-7-medium-fast","name":"Opus 4.7 1M Medium Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-xhigh","selector":"cursor/claude-opus-4-7-xhigh","name":"Opus 4.7 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-7-xhigh-fast","selector":"cursor/claude-opus-4-7-xhigh-fast","name":"Opus 4.7 1M Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-high","selector":"cursor/claude-opus-4-8-high","name":"Opus 4.8 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-high-fast","selector":"cursor/claude-opus-4-8-high-fast","name":"Opus 4.8 1M Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-low","selector":"cursor/claude-opus-4-8-low","name":"Opus 4.8 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-low-fast","selector":"cursor/claude-opus-4-8-low-fast","name":"Opus 4.8 1M Low Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-max","selector":"cursor/claude-opus-4-8-max","name":"Opus 4.8 1M Max","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-max-fast","selector":"cursor/claude-opus-4-8-max-fast","name":"Opus 4.8 1M Max Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-medium","selector":"cursor/claude-opus-4-8-medium","name":"Opus 4.8 1M Medium","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-medium-fast","selector":"cursor/claude-opus-4-8-medium-fast","name":"Opus 4.8 1M Medium Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-xhigh","selector":"cursor/claude-opus-4-8-xhigh","name":"Opus 4.8 1M Extra High","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-4-8-xhigh-fast","selector":"cursor/claude-opus-4-8-xhigh-fast","name":"Opus 4.8 1M Extra High Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-high","selector":"cursor/claude-opus-5-high","name":"Opus 5 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-high-fast","selector":"cursor/claude-opus-5-high-fast","name":"Opus 5 1M Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-low","selector":"cursor/claude-opus-5-low","name":"Opus 5 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-low-fast","selector":"cursor/claude-opus-5-low-fast","name":"Opus 5 1M Low Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-medium","selector":"cursor/claude-opus-5-medium","name":"Opus 5 1M Medium","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-medium-fast","selector":"cursor/claude-opus-5-medium-fast","name":"Opus 5 1M Medium Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-thinking-max","selector":"cursor/claude-opus-5-thinking-max","name":"Opus 5 1M Max Thinking","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-thinking-max-fast","selector":"cursor/claude-opus-5-thinking-max-fast","name":"Opus 5 1M Max Thinking Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-thinking-xhigh","selector":"cursor/claude-opus-5-thinking-xhigh","name":"Opus 5 1M Extra High Thinking","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-opus-5-thinking-xhigh-fast","selector":"cursor/claude-opus-5-thinking-xhigh-fast","name":"Opus 5 1M Extra High Thinking Fast","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-sonnet-5-high","selector":"cursor/claude-sonnet-5-high","name":"Sonnet 5 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-sonnet-5-low","selector":"cursor/claude-sonnet-5-low","name":"Sonnet 5 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-sonnet-5-max","selector":"cursor/claude-sonnet-5-max","name":"Sonnet 5 1M Max","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-sonnet-5-medium","selector":"cursor/claude-sonnet-5-medium","name":"Sonnet 5 1M Medium","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"claude-sonnet-5-xhigh","selector":"cursor/claude-sonnet-5-xhigh","name":"Sonnet 5 1M Extra High","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"composer-1","selector":"cursor/composer-1","name":"Composer 1","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"composer-1.5","selector":"cursor/composer-1.5","name":"Composer 1.5","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"composer-2.5","selector":"cursor/composer-2.5","name":"Composer 2.5","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"composer-2.5-fast","selector":"cursor/composer-2.5-fast","name":"Composer 2.5 Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"cursor-grok-4.5-high","selector":"cursor/cursor-grok-4.5-high","name":"Cursor Grok 4.5","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"cursor-grok-4.5-high-fast","selector":"cursor/cursor-grok-4.5-high-fast","name":"Cursor Grok 4.5 Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"cursor-grok-4.5-low","selector":"cursor/cursor-grok-4.5-low","name":"Cursor Grok 4.5 Low","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"cursor-grok-4.5-low-fast","selector":"cursor/cursor-grok-4.5-low-fast","name":"Cursor Grok 4.5 Low Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"cursor-grok-4.5-medium","selector":"cursor/cursor-grok-4.5-medium","name":"Cursor Grok 4.5 Medium","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"cursor-grok-4.5-medium-fast","selector":"cursor/cursor-grok-4.5-medium-fast","name":"Cursor Grok 4.5 Medium Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"default","selector":"cursor/default","name":"Auto","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gemini-3-flash","selector":"cursor/gemini-3-flash","name":"Gemini 3 Flash","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gemini-3-pro","selector":"cursor/gemini-3-pro","name":"Gemini 3 Pro","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gemini-3.1-pro","selector":"cursor/gemini-3.1-pro","name":"Gemini 3.1 Pro","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gemini-3.5-flash","selector":"cursor/gemini-3.5-flash","name":"Gemini 3.5 Flash","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gemini-3.6-flash-high","selector":"cursor/gemini-3.6-flash-high","name":"Gemini 3.6 Flash","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gemini-3.6-flash-low","selector":"cursor/gemini-3.6-flash-low","name":"Gemini 3.6 Flash Low","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gemini-3.6-flash-medium","selector":"cursor/gemini-3.6-flash-medium","name":"Gemini 3.6 Flash Medium","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gemini-3.6-flash-minimal","selector":"cursor/gemini-3.6-flash-minimal","name":"Gemini 3.6 Flash Minimal","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"glm-5.2-high","selector":"cursor/glm-5.2-high","name":"GLM 5.2","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"glm-5.2-max","selector":"cursor/glm-5.2-max","name":"GLM 5.2 Max","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5-mini","selector":"cursor/gpt-5-mini","name":"GPT-5 Mini","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.1","selector":"cursor/gpt-5.1","name":"GPT-5.1","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.1-codex-max","selector":"cursor/gpt-5.1-codex-max","name":"GPT-5.1 Codex Max","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.1-codex-max-high","selector":"cursor/gpt-5.1-codex-max-high","name":"GPT-5.1 Codex Max High","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.1-codex-mini","selector":"cursor/gpt-5.1-codex-mini","name":"GPT-5.1 Codex Mini","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.1-high","selector":"cursor/gpt-5.1-high","name":"GPT-5.1 High","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.1-low","selector":"cursor/gpt-5.1-low","name":"GPT-5.1 Low","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2","selector":"cursor/gpt-5.2","name":"GPT-5.2","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-codex","selector":"cursor/gpt-5.2-codex","name":"GPT-5.2 Codex","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-codex-fast","selector":"cursor/gpt-5.2-codex-fast","name":"GPT-5.2 Codex Fast","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-codex-high","selector":"cursor/gpt-5.2-codex-high","name":"GPT-5.2 Codex High","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-codex-high-fast","selector":"cursor/gpt-5.2-codex-high-fast","name":"GPT-5.2 Codex High Fast","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-codex-low","selector":"cursor/gpt-5.2-codex-low","name":"GPT-5.2 Codex Low","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-codex-low-fast","selector":"cursor/gpt-5.2-codex-low-fast","name":"GPT-5.2 Codex Low Fast","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-codex-xhigh","selector":"cursor/gpt-5.2-codex-xhigh","name":"GPT-5.2 Codex Extra High","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-codex-xhigh-fast","selector":"cursor/gpt-5.2-codex-xhigh-fast","name":"GPT-5.2 Codex Extra High Fast","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-fast","selector":"cursor/gpt-5.2-fast","name":"GPT-5.2 Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-high","selector":"cursor/gpt-5.2-high","name":"GPT-5.2 High","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-high-fast","selector":"cursor/gpt-5.2-high-fast","name":"GPT-5.2 High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-low","selector":"cursor/gpt-5.2-low","name":"GPT-5.2 Low","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-low-fast","selector":"cursor/gpt-5.2-low-fast","name":"GPT-5.2 Low Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-xhigh","selector":"cursor/gpt-5.2-xhigh","name":"GPT-5.2 Extra High","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.2-xhigh-fast","selector":"cursor/gpt-5.2-xhigh-fast","name":"GPT-5.2 Extra High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex","selector":"cursor/gpt-5.3-codex","name":"Codex 5.3","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex-fast","selector":"cursor/gpt-5.3-codex-fast","name":"Codex 5.3 Fast","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex-high","selector":"cursor/gpt-5.3-codex-high","name":"Codex 5.3 High","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex-high-fast","selector":"cursor/gpt-5.3-codex-high-fast","name":"Codex 5.3 High Fast","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex-low","selector":"cursor/gpt-5.3-codex-low","name":"Codex 5.3 Low","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex-low-fast","selector":"cursor/gpt-5.3-codex-low-fast","name":"Codex 5.3 Low Fast","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex-spark-preview","selector":"cursor/gpt-5.3-codex-spark-preview","name":"GPT-5.3 Codex Spark","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex-xhigh","selector":"cursor/gpt-5.3-codex-xhigh","name":"Codex 5.3 Extra High","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.3-codex-xhigh-fast","selector":"cursor/gpt-5.3-codex-xhigh-fast","name":"Codex 5.3 Extra High Fast","contextWindow":272000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-high","selector":"cursor/gpt-5.4-high","name":"GPT-5.4 1M High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-high-fast","selector":"cursor/gpt-5.4-high-fast","name":"GPT-5.4 High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-low","selector":"cursor/gpt-5.4-low","name":"GPT-5.4 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-medium","selector":"cursor/gpt-5.4-medium","name":"GPT-5.4 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-medium-fast","selector":"cursor/gpt-5.4-medium-fast","name":"GPT-5.4 Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-mini-high","selector":"cursor/gpt-5.4-mini-high","name":"GPT-5.4 Mini High","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-mini-low","selector":"cursor/gpt-5.4-mini-low","name":"GPT-5.4 Mini Low","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-mini-medium","selector":"cursor/gpt-5.4-mini-medium","name":"GPT-5.4 Mini","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-mini-none","selector":"cursor/gpt-5.4-mini-none","name":"GPT-5.4 Mini None","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-mini-xhigh","selector":"cursor/gpt-5.4-mini-xhigh","name":"GPT-5.4 Mini Extra High","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-nano-high","selector":"cursor/gpt-5.4-nano-high","name":"GPT-5.4 Nano High","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-nano-low","selector":"cursor/gpt-5.4-nano-low","name":"GPT-5.4 Nano Low","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-nano-medium","selector":"cursor/gpt-5.4-nano-medium","name":"GPT-5.4 Nano","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-nano-none","selector":"cursor/gpt-5.4-nano-none","name":"GPT-5.4 Nano None","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-nano-xhigh","selector":"cursor/gpt-5.4-nano-xhigh","name":"GPT-5.4 Nano Extra High","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-xhigh","selector":"cursor/gpt-5.4-xhigh","name":"GPT-5.4 1M Extra High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.4-xhigh-fast","selector":"cursor/gpt-5.4-xhigh-fast","name":"GPT-5.4 Extra High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-extra-high","selector":"cursor/gpt-5.5-extra-high","name":"GPT-5.5 1M Extra High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-extra-high-fast","selector":"cursor/gpt-5.5-extra-high-fast","name":"GPT-5.5 Extra High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-high","selector":"cursor/gpt-5.5-high","name":"GPT-5.5 1M High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-high-fast","selector":"cursor/gpt-5.5-high-fast","name":"GPT-5.5 High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-low","selector":"cursor/gpt-5.5-low","name":"GPT-5.5 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-low-fast","selector":"cursor/gpt-5.5-low-fast","name":"GPT-5.5 Low Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-medium","selector":"cursor/gpt-5.5-medium","name":"GPT-5.5 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-medium-fast","selector":"cursor/gpt-5.5-medium-fast","name":"GPT-5.5 Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-none","selector":"cursor/gpt-5.5-none","name":"GPT-5.5 1M None","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.5-none-fast","selector":"cursor/gpt-5.5-none-fast","name":"GPT-5.5 None Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-high","selector":"cursor/gpt-5.6-luna-high","name":"GPT-5.6 Luna 1M High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-high-fast","selector":"cursor/gpt-5.6-luna-high-fast","name":"GPT-5.6 Luna High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-low","selector":"cursor/gpt-5.6-luna-low","name":"GPT-5.6 Luna 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-low-fast","selector":"cursor/gpt-5.6-luna-low-fast","name":"GPT-5.6 Luna Low Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-max","selector":"cursor/gpt-5.6-luna-max","name":"GPT-5.6 Luna 1M Max","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-max-fast","selector":"cursor/gpt-5.6-luna-max-fast","name":"GPT-5.6 Luna Max Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-medium","selector":"cursor/gpt-5.6-luna-medium","name":"GPT-5.6 Luna 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-medium-fast","selector":"cursor/gpt-5.6-luna-medium-fast","name":"GPT-5.6 Luna Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-none","selector":"cursor/gpt-5.6-luna-none","name":"GPT-5.6 Luna 1M None","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-none-fast","selector":"cursor/gpt-5.6-luna-none-fast","name":"GPT-5.6 Luna None Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-xhigh","selector":"cursor/gpt-5.6-luna-xhigh","name":"GPT-5.6 Luna 1M Extra High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-luna-xhigh-fast","selector":"cursor/gpt-5.6-luna-xhigh-fast","name":"GPT-5.6 Luna Extra High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-high","selector":"cursor/gpt-5.6-sol-high","name":"GPT-5.6 Sol 1M High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-high-fast","selector":"cursor/gpt-5.6-sol-high-fast","name":"GPT-5.6 Sol High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-low","selector":"cursor/gpt-5.6-sol-low","name":"GPT-5.6 Sol 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-low-fast","selector":"cursor/gpt-5.6-sol-low-fast","name":"GPT-5.6 Sol Low Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-max","selector":"cursor/gpt-5.6-sol-max","name":"GPT-5.6 Sol 1M Max","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-max-fast","selector":"cursor/gpt-5.6-sol-max-fast","name":"GPT-5.6 Sol Max Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-medium","selector":"cursor/gpt-5.6-sol-medium","name":"GPT-5.6 Sol 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-medium-fast","selector":"cursor/gpt-5.6-sol-medium-fast","name":"GPT-5.6 Sol Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-none","selector":"cursor/gpt-5.6-sol-none","name":"GPT-5.6 Sol 1M None","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-none-fast","selector":"cursor/gpt-5.6-sol-none-fast","name":"GPT-5.6 Sol None Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-xhigh","selector":"cursor/gpt-5.6-sol-xhigh","name":"GPT-5.6 Sol 1M Extra High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-sol-xhigh-fast","selector":"cursor/gpt-5.6-sol-xhigh-fast","name":"GPT-5.6 Sol Extra High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-high","selector":"cursor/gpt-5.6-terra-high","name":"GPT-5.6 Terra 1M High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-high-fast","selector":"cursor/gpt-5.6-terra-high-fast","name":"GPT-5.6 Terra High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-low","selector":"cursor/gpt-5.6-terra-low","name":"GPT-5.6 Terra 1M Low","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-low-fast","selector":"cursor/gpt-5.6-terra-low-fast","name":"GPT-5.6 Terra Low Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-max","selector":"cursor/gpt-5.6-terra-max","name":"GPT-5.6 Terra 1M Max","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-max-fast","selector":"cursor/gpt-5.6-terra-max-fast","name":"GPT-5.6 Terra Max Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-medium","selector":"cursor/gpt-5.6-terra-medium","name":"GPT-5.6 Terra 1M","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-medium-fast","selector":"cursor/gpt-5.6-terra-medium-fast","name":"GPT-5.6 Terra Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-none","selector":"cursor/gpt-5.6-terra-none","name":"GPT-5.6 Terra 1M None","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-none-fast","selector":"cursor/gpt-5.6-terra-none-fast","name":"GPT-5.6 Terra None Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-xhigh","selector":"cursor/gpt-5.6-terra-xhigh","name":"GPT-5.6 Terra 1M Extra High","contextWindow":1000000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"gpt-5.6-terra-xhigh-fast","selector":"cursor/gpt-5.6-terra-xhigh-fast","name":"GPT-5.6 Terra Extra High Fast","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"grok-code-fast-1","selector":"cursor/grok-code-fast-1","name":"Grok Code Fast 1","contextWindow":256000,"maxTokens":10000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"kimi-k2.5","selector":"cursor/kimi-k2.5","name":"Kimi K2.5","contextWindow":262144,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"kimi-k2.7-code","selector":"cursor/kimi-k2.7-code","name":"Kimi K2.7 Code","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"kimi-k3-high","selector":"cursor/kimi-k3-high","name":"Kimi K3 High","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["low","high","max"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"kimi-k3-low","selector":"cursor/kimi-k3-low","name":"Kimi K3 Low","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["low","high","max"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"cursor","id":"kimi-k3-max","selector":"cursor/kimi-k3-max","name":"Kimi K3","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["low","high","max"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"antigravity-preview-05-2026","selector":"google/antigravity-preview-05-2026","name":"Antigravity Agent Preview","contextWindow":131072,"maxTokens":65536,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"deep-research-max-preview-04-2026","selector":"google/deep-research-max-preview-04-2026","name":"Deep Research Max Preview (Apr-21-2026)","contextWindow":131072,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":0}},{"provider":"google","id":"deep-research-preview-04-2026","selector":"google/deep-research-preview-04-2026","name":"Deep Research Preview (Apr-21-2026)","contextWindow":131072,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":0}},{"provider":"google","id":"deep-research-pro-preview-12-2025","selector":"google/deep-research-pro-preview-12-2025","name":"Deep Research Pro Preview (Dec-12-2025)","contextWindow":131072,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-1.5-flash","selector":"google/gemini-1.5-flash","name":"Gemini 1.5 Flash","contextWindow":1000000,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0.075,"output":0.3,"cacheRead":0.01875,"cacheWrite":0}},{"provider":"google","id":"gemini-1.5-flash-8b","selector":"google/gemini-1.5-flash-8b","name":"Gemini 1.5 Flash-8B","contextWindow":1000000,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0.0375,"output":0.15,"cacheRead":0.01,"cacheWrite":0}},{"provider":"google","id":"gemini-1.5-pro","selector":"google/gemini-1.5-pro","name":"Gemini 1.5 Pro","contextWindow":1000000,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":1.25,"output":5,"cacheRead":0.3125,"cacheWrite":0}},{"provider":"google","id":"gemini-2.0-flash","selector":"google/gemini-2.0-flash","name":"Gemini 2.0 Flash","contextWindow":1048576,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0.1,"output":0.4,"cacheRead":0.025,"cacheWrite":0}},{"provider":"google","id":"gemini-2.0-flash-001","selector":"google/gemini-2.0-flash-001","name":"Gemini 2.0 Flash 001","contextWindow":1048576,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-2.0-flash-lite","selector":"google/gemini-2.0-flash-lite","name":"Gemini 2.0 Flash-Lite","contextWindow":1048576,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0.075,"output":0.3,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-2.0-flash-lite-001","selector":"google/gemini-2.0-flash-lite-001","name":"Gemini 2.0 Flash-Lite 001","contextWindow":1048576,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-computer-use-preview-10-2025","selector":"google/gemini-2.5-computer-use-preview-10-2025","name":"Gemini 2.5 Computer Use Preview 10-2025","contextWindow":131072,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash","selector":"google/gemini-2.5-flash","name":"Gemini 2.5 Flash","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.3,"output":2.5,"cacheRead":0.03,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash-image","selector":"google/gemini-2.5-flash-image","name":"Nano Banana","contextWindow":32768,"maxTokens":32768,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash-lite","selector":"google/gemini-2.5-flash-lite","name":"Gemini 2.5 Flash-Lite","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.1,"output":0.4,"cacheRead":0.01,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash-lite-preview-06-17","selector":"google/gemini-2.5-flash-lite-preview-06-17","name":"Gemini 2.5 Flash Lite Preview 06-17","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.1,"output":0.4,"cacheRead":0.025,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash-lite-preview-09-2025","selector":"google/gemini-2.5-flash-lite-preview-09-2025","name":"Gemini 2.5 Flash Lite Preview (09/2025)","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.1,"output":0.4,"cacheRead":0.025,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash-preview-04-17","selector":"google/gemini-2.5-flash-preview-04-17","name":"Gemini 2.5 Flash Preview 04-17","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.15,"output":0.6,"cacheRead":0.0375,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash-preview-05-20","selector":"google/gemini-2.5-flash-preview-05-20","name":"Gemini 2.5 Flash Preview 05-20","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.15,"output":0.6,"cacheRead":0.0375,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash-preview-09-2025","selector":"google/gemini-2.5-flash-preview-09-2025","name":"Gemini 2.5 Flash Preview (09/2025)","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.3,"output":2.5,"cacheRead":0.075,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-flash-preview-tts","selector":"google/gemini-2.5-flash-preview-tts","name":"Gemini 2.5 Flash Preview TTS","contextWindow":8192,"maxTokens":16384,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-pro","selector":"google/gemini-2.5-pro","name":"Gemini 2.5 Pro","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-pro-preview-05-06","selector":"google/gemini-2.5-pro-preview-05-06","name":"Gemini 2.5 Pro Preview 05-06","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.31,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-pro-preview-06-05","selector":"google/gemini-2.5-pro-preview-06-05","name":"Gemini 2.5 Pro Preview 06-05","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.31,"cacheWrite":0}},{"provider":"google","id":"gemini-2.5-pro-preview-tts","selector":"google/gemini-2.5-pro-preview-tts","name":"Gemini 2.5 Pro Preview TTS","contextWindow":8192,"maxTokens":16384,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-3-flash-preview","selector":"google/gemini-3-flash-preview","name":"Gemini 3 Flash Preview","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.5,"output":3,"cacheRead":0.05,"cacheWrite":0}},{"provider":"google","id":"gemini-3-pro-image","selector":"google/gemini-3-pro-image","name":"Nano Banana Pro","contextWindow":131072,"maxTokens":32768,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-3-pro-image-preview","selector":"google/gemini-3-pro-image-preview","name":"Nano Banana Pro","contextWindow":131072,"maxTokens":32768,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-3-pro-preview","selector":"google/gemini-3-pro-preview","name":"Gemini 3 Pro Preview","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-flash-image","selector":"google/gemini-3.1-flash-image","name":"Nano Banana 2","contextWindow":65536,"maxTokens":65536,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-flash-image-preview","selector":"google/gemini-3.1-flash-image-preview","name":"Nano Banana 2","contextWindow":65536,"maxTokens":65536,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-flash-lite","selector":"google/gemini-3.1-flash-lite","name":"Gemini 3.1 Flash Lite","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.25,"output":1.5,"cacheRead":0.025,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-flash-lite-image","selector":"google/gemini-3.1-flash-lite-image","name":"Nano Banana 2 Lite","contextWindow":65536,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.25,"output":30,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-flash-lite-preview","selector":"google/gemini-3.1-flash-lite-preview","name":"Gemini 3.1 Flash Lite Preview","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.25,"output":1.5,"cacheRead":0.025,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-flash-live-preview","selector":"google/gemini-3.1-flash-live-preview","name":"Gemini 3.1 Flash Live Preview","contextWindow":131072,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.75,"output":4.5,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-flash-tts-preview","selector":"google/gemini-3.1-flash-tts-preview","name":"Gemini 3.1 Flash TTS Preview","contextWindow":8192,"maxTokens":16384,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-pro-preview","selector":"google/gemini-3.1-pro-preview","name":"Gemini 3.1 Pro Preview","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":0}},{"provider":"google","id":"gemini-3.1-pro-preview-customtools","selector":"google/gemini-3.1-pro-preview-customtools","name":"Gemini 3.1 Pro Preview Custom Tools","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":0}},{"provider":"google","id":"gemini-3.5-flash","selector":"google/gemini-3.5-flash","name":"Gemini 3.5 Flash","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.5,"output":9,"cacheRead":0.15,"cacheWrite":0}},{"provider":"google","id":"gemini-3.5-flash-lite","selector":"google/gemini-3.5-flash-lite","name":"Gemini 3.5 Flash Lite","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.3,"output":2.5,"cacheRead":0.03,"cacheWrite":0}},{"provider":"google","id":"gemini-3.6-flash","selector":"google/gemini-3.6-flash","name":"Gemini 3.6 Flash","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.5,"output":7.5,"cacheRead":0.15,"cacheWrite":0}},{"provider":"google","id":"gemini-flash-latest","selector":"google/gemini-flash-latest","name":"Gemini Flash Latest","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.5,"output":9,"cacheRead":0.15,"cacheWrite":0}},{"provider":"google","id":"gemini-flash-lite-latest","selector":"google/gemini-flash-lite-latest","name":"Gemini Flash-Lite Latest","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.25,"output":1.5,"cacheRead":0.025,"cacheWrite":0}},{"provider":"google","id":"gemini-live-2.5-flash","selector":"google/gemini-live-2.5-flash","name":"Gemini Live 2.5 Flash","contextWindow":128000,"maxTokens":8000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.5,"output":2,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-live-2.5-flash-preview-native-audio","selector":"google/gemini-live-2.5-flash-preview-native-audio","name":"Gemini Live 2.5 Flash Preview Native Audio","contextWindow":131072,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text"],"cost":{"input":0.5,"output":2,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-omni-flash-preview","selector":"google/gemini-omni-flash-preview","name":"Gemini Omni Flash Preview","contextWindow":131072,"maxTokens":65536,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-pro-latest","selector":"google/gemini-pro-latest","name":"Gemini Pro Latest","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-robotics-er-1.5-preview","selector":"google/gemini-robotics-er-1.5-preview","name":"Gemini Robotics-ER 1.5 Preview","contextWindow":1048576,"maxTokens":65536,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-robotics-er-1.6-preview","selector":"google/gemini-robotics-er-1.6-preview","name":"Gemini Robotics-ER 1.6 Preview","contextWindow":131072,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1,"output":5,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemini-robotics-er-2-preview","selector":"google/gemini-robotics-er-2-preview","name":"Gemini Robotics-ER 2 Preview","contextWindow":131072,"maxTokens":65536,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemma-3-27b-it","selector":"google/gemma-3-27b-it","name":"Gemma 3 27B","contextWindow":131072,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemma-4-26b","selector":"google/gemma-4-26b","name":"Gemma 4 26B","contextWindow":256000,"maxTokens":8192,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemma-4-26b-a4b-it","selector":"google/gemma-4-26b-a4b-it","name":"Gemma 4 26B A4B IT","contextWindow":262144,"maxTokens":32768,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemma-4-26b-it","selector":"google/gemma-4-26b-it","name":"Gemma 4 26B","contextWindow":256000,"maxTokens":8192,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemma-4-31b","selector":"google/gemma-4-31b","name":"Gemma 4 31B IT","contextWindow":256000,"maxTokens":8192,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemma-4-31b-it","selector":"google/gemma-4-31b-it","name":"Gemma 4 31B IT","contextWindow":262144,"maxTokens":32768,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemma-4-E2B-it","selector":"google/gemma-4-E2B-it","name":"Gemma 4 E2B IT","contextWindow":131072,"maxTokens":8192,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"gemma-4-E4B-it","selector":"google/gemma-4-E4B-it","name":"Gemma 4 E4B IT","contextWindow":131072,"maxTokens":8192,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"lyria-3-clip-preview","selector":"google/lyria-3-clip-preview","name":"Lyria 3 Clip Preview","contextWindow":1048576,"maxTokens":65536,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"lyria-3-pro-preview","selector":"google/lyria-3-pro-preview","name":"Lyria 3 Pro Preview","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google","id":"nano-banana-pro-preview","selector":"google/nano-banana-pro-preview","name":"Nano Banana Pro","contextWindow":131072,"maxTokens":32768,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google-antigravity","id":"claude-opus-4-5","selector":"google-antigravity/claude-opus-4-5","name":"Claude Opus 4.5","contextWindow":200000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":5,"output":25,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"google-antigravity","id":"claude-opus-4-6","selector":"google-antigravity/claude-opus-4-6","name":"Claude Opus 4.6","contextWindow":250000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":5,"output":25,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"google-antigravity","id":"claude-sonnet-4-5","selector":"google-antigravity/claude-sonnet-4-5","name":"Claude Sonnet 4.5","contextWindow":1000000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"google-antigravity","id":"claude-sonnet-4-6","selector":"google-antigravity/claude-sonnet-4-6","name":"Claude Sonnet 4.6","contextWindow":250000,"maxTokens":64000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":3.75}},{"provider":"google-antigravity","id":"gemini-2.5-flash","selector":"google-antigravity/gemini-2.5-flash","name":"Gemini 2.5 Flash","contextWindow":1048576,"maxTokens":65535,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.3,"output":2.5,"cacheRead":0.03,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-2.5-flash-lite","selector":"google-antigravity/gemini-2.5-flash-lite","name":"Gemini 3.1 Flash Lite","contextWindow":1048576,"maxTokens":65535,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.1,"output":0.4,"cacheRead":0.01,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-2.5-pro","selector":"google-antigravity/gemini-2.5-pro","name":"Gemini 2.5 Pro","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-3-flash","selector":"google-antigravity/gemini-3-flash","name":"Gemini 3 Flash","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.5,"output":3,"cacheRead":0.05,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-3-pro","selector":"google-antigravity/gemini-3-pro","name":"Gemini 3 Pro","contextWindow":1048576,"maxTokens":65535,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-3.1-flash-image","selector":"google-antigravity/gemini-3.1-flash-image","name":"Gemini 3.1 Flash Image","contextWindow":200000,"maxTokens":64000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-3.1-flash-lite","selector":"google-antigravity/gemini-3.1-flash-lite","name":"Gemini 3.1 Flash Lite","contextWindow":1048576,"maxTokens":65535,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.25,"output":1.5,"cacheRead":0.025,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-3.1-pro","selector":"google-antigravity/gemini-3.1-pro","name":"Gemini 3.1 Pro","contextWindow":1048576,"maxTokens":65535,"reasoning":true,"thinking":["low","high"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-3.5-flash","selector":"google-antigravity/gemini-3.5-flash","name":"Gemini 3.5 Flash","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.5,"output":9,"cacheRead":0.15,"cacheWrite":0}},{"provider":"google-antigravity","id":"gemini-3.6-flash","selector":"google-antigravity/gemini-3.6-flash","name":"Gemini 3.6 Flash","contextWindow":1048576,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.5,"output":7.5,"cacheRead":0.15,"cacheWrite":0}},{"provider":"google-antigravity","id":"gpt-oss-120b","selector":"google-antigravity/gpt-oss-120b","name":"GPT-OSS 120B","contextWindow":131072,"maxTokens":32768,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google-antigravity","id":"tab_flash_lite_preview","selector":"google-antigravity/tab_flash_lite_preview","name":"tab_flash_lite_preview","contextWindow":16384,"maxTokens":4096,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"google-antigravity","id":"tab_jump_flash_lite_preview","selector":"google-antigravity/tab_jump_flash_lite_preview","name":"tab_jump_flash_lite_preview","contextWindow":16384,"maxTokens":4096,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"kimi-code","id":"k3","selector":"kimi-code/k3","name":"K3","contextWindow":1048576,"maxTokens":131072,"reasoning":true,"thinking":["low","high","max"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"kimi-code","id":"k3-256k","selector":"kimi-code/k3-256k","name":"K3-256k","contextWindow":262144,"maxTokens":131072,"reasoning":true,"thinking":["low","high","max"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"kimi-code","id":"kimi-for-coding","selector":"kimi-code/kimi-for-coding","name":"K2.7 Coding","contextWindow":262144,"maxTokens":32768,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"kimi-code","id":"kimi-for-coding-highspeed","selector":"kimi-code/kimi-for-coding-highspeed","name":"K2.7 Coding Highspeed","contextWindow":262144,"maxTokens":32768,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"kimi-code","id":"kimi-k2","selector":"kimi-code/kimi-k2","name":"Kimi K2","contextWindow":262144,"maxTokens":262144,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"kimi-code","id":"kimi-k2-turbo-preview","selector":"kimi-code/kimi-k2-turbo-preview","name":"Kimi K2 Turbo","contextWindow":262144,"maxTokens":32000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"kimi-code","id":"kimi-k2.5","selector":"kimi-code/kimi-k2.5","name":"Kimi K2.5","contextWindow":262144,"maxTokens":65536,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"gemma4:12b","selector":"ollama/gemma4:12b","name":"gemma4:12b","contextWindow":262144,"maxTokens":32768,"reasoning":true,"thinking":["low","medium","high","max"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"gpt-oss:20b","selector":"ollama/gpt-oss:20b","name":"gpt-oss:20b","contextWindow":128000,"maxTokens":32768,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"llama3.2:latest","selector":"ollama/llama3.2:latest","name":"llama3.2:latest","contextWindow":131072,"maxTokens":32768,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"mistral:latest","selector":"ollama/mistral:latest","name":"mistral:latest","contextWindow":32768,"maxTokens":32768,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"nomic-embed-text:latest","selector":"ollama/nomic-embed-text:latest","name":"nomic-embed-text:latest","contextWindow":8192,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"orpheus-arabic:latest","selector":"ollama/orpheus-arabic:latest","name":"orpheus-arabic:latest","contextWindow":131072,"maxTokens":32768,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"qwen2.5:3b","selector":"ollama/qwen2.5:3b","name":"qwen2.5:3b","contextWindow":32768,"maxTokens":32768,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"qwen3-vl:8b","selector":"ollama/qwen3-vl:8b","name":"qwen3-vl:8b","contextWindow":262144,"maxTokens":32768,"reasoning":true,"thinking":["low","medium","high","max"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"qwen3:30b","selector":"ollama/qwen3:30b","name":"qwen3:30b","contextWindow":262144,"maxTokens":32768,"reasoning":true,"thinking":["low","medium","high","max"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"qwen3:4b","selector":"ollama/qwen3:4b","name":"qwen3:4b","contextWindow":40960,"maxTokens":32768,"reasoning":true,"thinking":["low","medium","high","max"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"ollama","id":"tinyllama:latest","selector":"ollama/tinyllama:latest","name":"tinyllama:latest","contextWindow":2048,"maxTokens":2048,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"codex-mini-latest","selector":"openai/codex-mini-latest","name":"Codex Mini","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":1.5,"output":6,"cacheRead":0.375,"cacheWrite":0}},{"provider":"openai","id":"gpt-4","selector":"openai/gpt-4","name":"GPT-4","contextWindow":8192,"maxTokens":8192,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":30,"output":60,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"gpt-4-turbo","selector":"openai/gpt-4-turbo","name":"GPT-4 Turbo","contextWindow":128000,"maxTokens":4096,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":10,"output":30,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"gpt-4.1","selector":"openai/gpt-4.1","name":"GPT-4.1","contextWindow":1047576,"maxTokens":32768,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":2,"output":8,"cacheRead":0.5,"cacheWrite":0}},{"provider":"openai","id":"gpt-4.1-mini","selector":"openai/gpt-4.1-mini","name":"GPT-4.1 mini","contextWindow":1047576,"maxTokens":32768,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0.4,"output":1.6,"cacheRead":0.1,"cacheWrite":0}},{"provider":"openai","id":"gpt-4.1-nano","selector":"openai/gpt-4.1-nano","name":"GPT-4.1 nano","contextWindow":1047576,"maxTokens":32768,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0.1,"output":0.4,"cacheRead":0.025,"cacheWrite":0}},{"provider":"openai","id":"gpt-4o","selector":"openai/gpt-4o","name":"GPT-4o","contextWindow":128000,"maxTokens":16384,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":2.5,"output":10,"cacheRead":1.25,"cacheWrite":0}},{"provider":"openai","id":"gpt-4o-2024-05-13","selector":"openai/gpt-4o-2024-05-13","name":"GPT-4o (2024-05-13)","contextWindow":128000,"maxTokens":4096,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":5,"output":15,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"gpt-4o-2024-08-06","selector":"openai/gpt-4o-2024-08-06","name":"GPT-4o (2024-08-06)","contextWindow":128000,"maxTokens":16384,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":2.5,"output":10,"cacheRead":1.25,"cacheWrite":0}},{"provider":"openai","id":"gpt-4o-2024-11-20","selector":"openai/gpt-4o-2024-11-20","name":"GPT-4o (2024-11-20)","contextWindow":128000,"maxTokens":16384,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":2.5,"output":10,"cacheRead":1.25,"cacheWrite":0}},{"provider":"openai","id":"gpt-4o-mini","selector":"openai/gpt-4o-mini","name":"GPT-4o mini","contextWindow":128000,"maxTokens":16384,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0.15,"output":0.6,"cacheRead":0.075,"cacheWrite":0}},{"provider":"openai","id":"gpt-5","selector":"openai/gpt-5","name":"GPT-5","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"openai","id":"gpt-5-chat-latest","selector":"openai/gpt-5-chat-latest","name":"GPT-5 Chat Latest","contextWindow":128000,"maxTokens":16384,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"openai","id":"gpt-5-codex","selector":"openai/gpt-5-codex","name":"GPT-5-Codex","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"openai","id":"gpt-5-mini","selector":"openai/gpt-5-mini","name":"GPT-5 Mini","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.25,"output":2,"cacheRead":0.025,"cacheWrite":0}},{"provider":"openai","id":"gpt-5-nano","selector":"openai/gpt-5-nano","name":"GPT-5 Nano","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":0.05,"output":0.4,"cacheRead":0.005,"cacheWrite":0}},{"provider":"openai","id":"gpt-5-pro","selector":"openai/gpt-5-pro","name":"GPT-5 Pro","contextWindow":400000,"maxTokens":272000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":15,"output":120,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.1","selector":"openai/gpt-5.1","name":"GPT-5.1","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.1-chat-latest","selector":"openai/gpt-5.1-chat-latest","name":"GPT-5.1 Chat","contextWindow":128000,"maxTokens":16384,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.1-codex","selector":"openai/gpt-5.1-codex","name":"GPT-5.1 Codex","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.1-codex-max","selector":"openai/gpt-5.1-codex-max","name":"GPT-5.1 Codex Max","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["minimal","low","medium","high"],"input":["text","image"],"cost":{"input":1.25,"output":10,"cacheRead":0.125,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.1-codex-mini","selector":"openai/gpt-5.1-codex-mini","name":"GPT-5.1 Codex Mini","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["medium","high"],"input":["text","image"],"cost":{"input":0.25,"output":2,"cacheRead":0.025,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.2","selector":"openai/gpt-5.2","name":"GPT-5.2","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1.75,"output":14,"cacheRead":0.175,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.2-chat-latest","selector":"openai/gpt-5.2-chat-latest","name":"GPT-5.2 Chat","contextWindow":128000,"maxTokens":16384,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1.75,"output":14,"cacheRead":0.175,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.2-codex","selector":"openai/gpt-5.2-codex","name":"GPT-5.2 Codex","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1.75,"output":14,"cacheRead":0.175,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.2-pro","selector":"openai/gpt-5.2-pro","name":"GPT-5.2 Pro","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":21,"output":168,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.3-chat-latest","selector":"openai/gpt-5.3-chat-latest","name":"GPT-5.3 Chat","contextWindow":128000,"maxTokens":16384,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":1.75,"output":14,"cacheRead":0.175,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.3-codex","selector":"openai/gpt-5.3-codex","name":"GPT-5.3 Codex","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1.75,"output":14,"cacheRead":0.175,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.3-codex-spark","selector":"openai/gpt-5.3-codex-spark","name":"GPT-5.3 Codex Spark","contextWindow":128000,"maxTokens":32000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1.75,"output":14,"cacheRead":0.175,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.4","selector":"openai/gpt-5.4","name":"GPT-5.4","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":2.5,"output":15,"cacheRead":0.25,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.4-mini","selector":"openai/gpt-5.4-mini","name":"GPT-5.4 mini","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0.75,"output":4.5,"cacheRead":0.075,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.4-nano","selector":"openai/gpt-5.4-nano","name":"GPT-5.4 nano","contextWindow":400000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0.2,"output":1.25,"cacheRead":0.02,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.4-pro","selector":"openai/gpt-5.4-pro","name":"GPT-5.4 Pro","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":30,"output":180,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.5","selector":"openai/gpt-5.5","name":"GPT-5.5","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":5,"output":30,"cacheRead":0.5,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.5-pro","selector":"openai/gpt-5.5-pro","name":"GPT-5.5 Pro","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":30,"output":180,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"gpt-5.6","selector":"openai/gpt-5.6","name":"GPT-5.6","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":5,"output":30,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"openai","id":"gpt-5.6-luna","selector":"openai/gpt-5.6-luna","name":"GPT-5.6 Luna","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":0.2,"output":1.2,"cacheRead":0.02,"cacheWrite":0.25}},{"provider":"openai","id":"gpt-5.6-luna-pro","selector":"openai/gpt-5.6-luna-pro","name":"GPT-5.6 Luna Pro","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":0.2,"output":1.2,"cacheRead":0.02,"cacheWrite":0.25}},{"provider":"openai","id":"gpt-5.6-sol","selector":"openai/gpt-5.6-sol","name":"GPT-5.6 Sol","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":5,"output":30,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"openai","id":"gpt-5.6-sol-pro","selector":"openai/gpt-5.6-sol-pro","name":"GPT-5.6 Sol Pro","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":5,"output":30,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"openai","id":"gpt-5.6-terra","selector":"openai/gpt-5.6-terra","name":"GPT-5.6 Terra","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":2.5}},{"provider":"openai","id":"gpt-5.6-terra-pro","selector":"openai/gpt-5.6-terra-pro","name":"GPT-5.6 Terra Pro","contextWindow":1050000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":2.5}},{"provider":"openai","id":"gpt-realtime-2.1","selector":"openai/gpt-realtime-2.1","name":"GPT-Realtime-2.1","contextWindow":128000,"maxTokens":32000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":4,"output":24,"cacheRead":0.4,"cacheWrite":0}},{"provider":"openai","id":"o1","selector":"openai/o1","name":"o1","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":15,"output":60,"cacheRead":7.5,"cacheWrite":0}},{"provider":"openai","id":"o1-pro","selector":"openai/o1-pro","name":"o1-pro","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":150,"output":600,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"o3","selector":"openai/o3","name":"o3","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":2,"output":8,"cacheRead":0.5,"cacheWrite":0}},{"provider":"openai","id":"o3-deep-research","selector":"openai/o3-deep-research","name":"o3-deep-research","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":10,"output":40,"cacheRead":2.5,"cacheWrite":0}},{"provider":"openai","id":"o3-mini","selector":"openai/o3-mini","name":"o3-mini","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":1.1,"output":4.4,"cacheRead":0.55,"cacheWrite":0}},{"provider":"openai","id":"o3-pro","selector":"openai/o3-pro","name":"o3-pro","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":20,"output":80,"cacheRead":0,"cacheWrite":0}},{"provider":"openai","id":"o4-mini","selector":"openai/o4-mini","name":"o4-mini","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1.1,"output":4.4,"cacheRead":0.275,"cacheWrite":0}},{"provider":"openai","id":"o4-mini-deep-research","selector":"openai/o4-mini-deep-research","name":"o4-mini-deep-research","contextWindow":200000,"maxTokens":100000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":2,"output":8,"cacheRead":0.5,"cacheWrite":0}},{"provider":"openai-codex","id":"gpt-5.3-codex-spark","selector":"openai-codex/gpt-5.3-codex-spark","name":"GPT-5.3-Codex-Spark","contextWindow":128000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text"],"cost":{"input":1.75,"output":14,"cacheRead":0.175,"cacheWrite":0}},{"provider":"openai-codex","id":"gpt-5.4","selector":"openai-codex/gpt-5.4","name":"GPT-5.4","contextWindow":1000000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":2.5,"output":15,"cacheRead":0.25,"cacheWrite":0}},{"provider":"openai-codex","id":"gpt-5.4-mini","selector":"openai-codex/gpt-5.4-mini","name":"GPT-5.4-Mini","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0.75,"output":4.5,"cacheRead":0.075,"cacheWrite":0}},{"provider":"openai-codex","id":"gpt-5.5","selector":"openai-codex/gpt-5.5","name":"GPT-5.5","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":5,"output":30,"cacheRead":0.5,"cacheWrite":0}},{"provider":"openai-codex","id":"gpt-5.6-luna","selector":"openai-codex/gpt-5.6-luna","name":"GPT-5.6-Luna","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":0.2,"output":1.2,"cacheRead":0.02,"cacheWrite":0.25}},{"provider":"openai-codex","id":"gpt-5.6-sol","selector":"openai-codex/gpt-5.6-sol","name":"GPT-5.6-Sol","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":5,"output":30,"cacheRead":0.5,"cacheWrite":6.25}},{"provider":"openai-codex","id":"gpt-5.6-terra","selector":"openai-codex/gpt-5.6-terra","name":"GPT-5.6-Terra","contextWindow":272000,"maxTokens":128000,"reasoning":true,"thinking":["low","medium","high","xhigh","max"],"input":["text","image"],"cost":{"input":2,"output":12,"cacheRead":0.2,"cacheWrite":2.5}},{"provider":"xai-oauth","id":"grok-4.20-0309-non-reasoning","selector":"xai-oauth/grok-4.20-0309-non-reasoning","name":"Grok 4.20 (Non-Reasoning)","contextWindow":2000000,"maxTokens":2000000,"reasoning":false,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"xai-oauth","id":"grok-4.20-0309-reasoning","selector":"xai-oauth/grok-4.20-0309-reasoning","name":"Grok 4.20 (Reasoning)","contextWindow":2000000,"maxTokens":2000000,"reasoning":true,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"xai-oauth","id":"grok-4.20-multi-agent-0309","selector":"xai-oauth/grok-4.20-multi-agent-0309","name":"Grok 4.20 (Multi-Agent)","contextWindow":2000000,"maxTokens":2000000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"xai-oauth","id":"grok-4.3","selector":"xai-oauth/grok-4.3","name":"Grok 4.3","contextWindow":1000000,"maxTokens":1000000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"xai-oauth","id":"grok-4.5","selector":"xai-oauth/grok-4.5","name":"Grok 4.5","contextWindow":500000,"maxTokens":500000,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"xai-oauth","id":"grok-build","selector":"xai-oauth/grok-build","name":"Grok Build","contextWindow":512000,"maxTokens":512000,"reasoning":true,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"xai-oauth","id":"grok-build-0.1","selector":"xai-oauth/grok-build-0.1","name":"Grok Build 0.1","contextWindow":256000,"maxTokens":256000,"reasoning":true,"thinking":null,"input":["text","image"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"xai-oauth","id":"grok-composer-2.5-fast","selector":"xai-oauth/grok-composer-2.5-fast","name":"Grok Composer 2.5 Fast","contextWindow":200000,"maxTokens":200000,"reasoning":false,"thinking":null,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"zai","id":"glm-4.5","selector":"zai/glm-4.5","name":"GLM-4.5","contextWindow":131072,"maxTokens":98304,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":0.6,"output":2.2,"cacheRead":0.11,"cacheWrite":0}},{"provider":"zai","id":"glm-4.5-air","selector":"zai/glm-4.5-air","name":"GLM-4.5-Air","contextWindow":131072,"maxTokens":98304,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":0.2,"output":1.1,"cacheRead":0.03,"cacheWrite":0}},{"provider":"zai","id":"glm-4.5-flash","selector":"zai/glm-4.5-flash","name":"GLM-4.5-Flash","contextWindow":131072,"maxTokens":98304,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"zai","id":"glm-4.5v","selector":"zai/glm-4.5v","name":"GLM-4.5V","contextWindow":64000,"maxTokens":16384,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0.6,"output":1.8,"cacheRead":0,"cacheWrite":0}},{"provider":"zai","id":"glm-4.6","selector":"zai/glm-4.6","name":"GLM-4.6","contextWindow":204800,"maxTokens":131072,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":0.6,"output":2.2,"cacheRead":0.11,"cacheWrite":0}},{"provider":"zai","id":"glm-4.6v","selector":"zai/glm-4.6v","name":"GLM-4.6V","contextWindow":128000,"maxTokens":32768,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":0.3,"output":0.9,"cacheRead":0,"cacheWrite":0}},{"provider":"zai","id":"glm-4.7","selector":"zai/glm-4.7","name":"GLM-4.7","contextWindow":204800,"maxTokens":131072,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":0.6,"output":2.2,"cacheRead":0.11,"cacheWrite":0}},{"provider":"zai","id":"glm-4.7-flash","selector":"zai/glm-4.7-flash","name":"GLM-4.7-Flash","contextWindow":200000,"maxTokens":131072,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0}},{"provider":"zai","id":"glm-4.7-flashx","selector":"zai/glm-4.7-flashx","name":"GLM-4.7-FlashX","contextWindow":200000,"maxTokens":131072,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":0.07,"output":0.4,"cacheRead":0.01,"cacheWrite":0}},{"provider":"zai","id":"glm-5","selector":"zai/glm-5","name":"GLM-5","contextWindow":204800,"maxTokens":131072,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":1,"output":3.2,"cacheRead":0.2,"cacheWrite":0}},{"provider":"zai","id":"glm-5-turbo","selector":"zai/glm-5-turbo","name":"GLM-5-Turbo","contextWindow":200000,"maxTokens":131072,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":1.2,"output":4,"cacheRead":0.24,"cacheWrite":0}},{"provider":"zai","id":"glm-5.1","selector":"zai/glm-5.1","name":"GLM-5.1","contextWindow":200000,"maxTokens":131072,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0}},{"provider":"zai","id":"glm-5.2","selector":"zai/glm-5.2","name":"GLM-5.2","contextWindow":1000000,"maxTokens":131072,"reasoning":true,"thinking":["high","max"],"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0}},{"provider":"zai","id":"glm-5v-turbo","selector":"zai/glm-5v-turbo","name":"GLM-5V-Turbo","contextWindow":200000,"maxTokens":131072,"reasoning":true,"thinking":["minimal","low","medium","high","xhigh"],"input":["text","image"],"cost":{"input":1.2,"output":4,"cacheRead":0.24,"cacheWrite":0}}]}
|
package/package.json
CHANGED
|
@@ -100,6 +100,18 @@ journal tail to decide what happens next, or sweeping orphans — you have taken
|
|
|
100
100
|
its death. Liveness comes from the lock's OWN pid (`kill -0`), never a command-name grep. Recovery is
|
|
101
101
|
`tickmarkr resume <runId>` — **the orchestrator's command, not yours** — and note that resume REPLAYS the
|
|
102
102
|
journal's `baseRef`, so a fix landed on the base branch is unreachable by the running run.
|
|
103
|
+
- **SWEEPING A WORKER ORPHANS ITS CLEANUP, NOT JUST ITS WORK — kill the process GROUP.** Measured
|
|
104
|
+
2026-08-06: a worker running a legitimate load experiment had spawned CPU burners and held a trailing
|
|
105
|
+
`kill` line. It was SIGTERM'd as an orphan; **the cleanup never ran**, and **59 surviving burner shells
|
|
106
|
+
drove load to 243** — which then timed out a 2.4-second test at 20 seconds, failed the run's tip-verify,
|
|
107
|
+
and was initially blamed on an unrelated known defect. Seven workers were swept that day under a rule
|
|
108
|
+
that treats sweeping as pure hygiene, and nothing in it looks for pending cleanup.
|
|
109
|
+
**The fix is mechanical, not vigilance:** kill the process GROUP so forked children die with the parent,
|
|
110
|
+
and identify the target **by PID from a parse — never by name pattern.** A pattern matching a script path
|
|
111
|
+
also matches any supervisor carrying that path in its own argv, so `pgrep -f <script>` kills the watchdog
|
|
112
|
+
along with the watched (measured the same day, on the overseer's own dialog watcher).
|
|
113
|
+
**After any sweep, verify what SURVIVED, not just what died** — the supervisor, the daemon, and the
|
|
114
|
+
current attempt's worker.
|
|
103
115
|
- **Gate quiet ≠ idle.** Between `worker-result` and the batched `gate-result`s, shell gates plus a
|
|
104
116
|
headless judge/review run with little visible signal. Clock the CURRENT phase: a worker heartbeat is
|
|
105
117
|
stale by design once gates start, and clocking the wrong one makes a healthy gate read as a stalled
|
|
@@ -148,9 +160,30 @@ number — an unmeasured budget is not a small budget.
|
|
|
148
160
|
by bracketed-paste on long payloads. Robust sequence: read the pane (bare prompt required) → send-text →
|
|
149
161
|
sleep 2–3s → send-keys Enter → read back (input empty / agent `working`). Never report "briefed" without
|
|
150
162
|
the read-back. Long content goes in a brief file, never pane text.
|
|
163
|
+
**PROBE THE READ-BACK WITH THE SHORTEST DISTINCTIVE TOKEN — a commit hash, a pid, an OBS id — NEVER a
|
|
164
|
+
sentence.** A long phrase crosses the pane's render wrap boundary, so grepping for it returns zero on a
|
|
165
|
+
message that arrived intact, and **a badly-probed successful send is byte-identical to a truncated one.**
|
|
166
|
+
Both natural reactions to that false negative are wrong: re-sending duplicates the message into the
|
|
167
|
+
target's queue, and escalating reports a delivery failure that never happened. Measured 2026-08-06
|
|
168
|
+
(OBS-396): a grep for the full sentence returned 0 while a grep for one word of the same sentence
|
|
169
|
+
returned 1. This trap lives *inside* the verification step above, which is why it survives — the rule
|
|
170
|
+
that is supposed to catch dropped sends is the rule that manufactures the phantom.
|
|
151
171
|
- **Guard-before-Enter** (race-safe prompt answering): chain with `&&` — pane get shows `blocked` && pane
|
|
152
172
|
read shows the expected option under the cursor && only then send-keys. If no longer `blocked`, someone
|
|
153
173
|
already answered; do nothing.
|
|
174
|
+
- **AGENT NAMES ARE GLOBAL ACROSS WORKSPACES — verify a seat you spawned by PANE ID, never by name.**
|
|
175
|
+
Names must be unique among live agents *everywhere*, not within your workspace, so another workspace can
|
|
176
|
+
already hold `opus`, `sol`, `reviewer` or `orch`. When it does, your `agent start` **fails**, your pane
|
|
177
|
+
is left a bare shell, and `agent list` / `agent read` / `agent prompt` for that name then resolve to the
|
|
178
|
+
**stranger's seat**. Measured 2026-08-06 (OBS-392): a spawn of `fable` collided with a live seat in
|
|
179
|
+
another workspace; `agent list` reported `fable -> blocked` and it was read as *this* seat coming up
|
|
180
|
+
blocked. It was an operator research session sitting on a *"Resume full session?"* prompt. One more
|
|
181
|
+
command would have submitted a brief into it. **Namespace every name you pick** (`fable-v187`, not
|
|
182
|
+
`fable`), **treat a failed `agent start` as fatal at the call site** rather than inferring it later from
|
|
183
|
+
a status read — the status read is exactly what the collision corrupts — and print the `workspace_id`
|
|
184
|
+
and `cwd` columns before dispatching to any name. Same class as the liveness rule: a matcher broader
|
|
185
|
+
than the thing it names finds things that are not it, and its output is shaped exactly like a right
|
|
186
|
+
answer.
|
|
154
187
|
- **A dead pane accepts your dispatch and reports success.** `herdr wait agent-status` exits 1 on timeout, 0
|
|
155
188
|
on match — but ALSO 0 (with an error JSON) when the pane is GONE. So does `pane run`: sending to a vanished
|
|
156
189
|
pane prints `{"error":{"code":"pane_not_found"}}` and **still exits 0**, so `pane run … >/dev/null && echo
|
|
@@ -174,6 +207,26 @@ orchestrator gets a 90s grace window to handle worker blocks first. For long par
|
|
|
174
207
|
`herdr wait agent-status <pane> --status <s> --timeout <ms>` beats the watcher. When parking a human
|
|
175
208
|
checkpoint, also fire `herdr notification show "HUMAN CHECKPOINT: <gate>" --sound request`.
|
|
176
209
|
|
|
210
|
+
**⚠ THIS WATCHER KEYS ON `agent_status`, AND `agent_status` IS A PROXY THAT FAILS IN BOTH DIRECTIONS.**
|
|
211
|
+
Measured 2026-08-06 on ONE pane inside TEN MINUTES: a worker wedged behind a CLI's modal trust prompt
|
|
212
|
+
reported **`idle`** (not `blocked`), and the same pane minutes later reported **`done`** while demonstrably
|
|
213
|
+
mid-work — reading files, context climbing. So a status-keyed watcher can both **sleep through a wedged
|
|
214
|
+
worker** and **fire on a working one**, and neither failure announces itself. The bundled watcher inherits
|
|
215
|
+
this; so does any `herdr wait agent-status`. It is still worth arming — it catches vanished panes and real
|
|
216
|
+
blocks — but **never treat its silence as evidence a worker is healthy.**
|
|
217
|
+
Two keys that do not lie, in order of strength:
|
|
218
|
+
- **The daemon's own waiter.** What `herdr pane wait-output` is matching on tells you the phase from the
|
|
219
|
+
harness's state machine rather than from a status field: a `--match` on a readiness banner means the
|
|
220
|
+
worker has not launched; a `--regex` on the completion trailer means it is running. That is how a stuck
|
|
221
|
+
launch was distinguished from a slow one, and it beats reading the pane.
|
|
222
|
+
- **Pane CONTENT.** A rendered prompt pattern is the condition itself; `agent_status` is the harness's
|
|
223
|
+
opinion about the agent. The repo's own `trust-sweeper` scans content and caught a trust modal at
|
|
224
|
+
04:40 that a status-keyed dialog watcher missed at 16:04 — same class, same day, same machine.
|
|
225
|
+
**The product fix for the modal case is adapter parity, not a sweeper:** the claude-code adapter passes
|
|
226
|
+
`--strict-mcp-config` precisely so MCP-trust modals cannot stall a worker. An adapter lacking that flag
|
|
227
|
+
will keep producing this stall, and a sweeper that has been running since 04:40 is evidence the gap was
|
|
228
|
+
visible and got swept instead of fixed.
|
|
229
|
+
|
|
177
230
|
**Every seat you spawn gets an ARTIFACT watcher armed in the SAME call that spawns it** — bundled, and
|
|
178
231
|
keyed on the deliverable rather than the seat:
|
|
179
232
|
|
|
@@ -229,6 +282,33 @@ orchestrator turn boundary.
|
|
|
229
282
|
a fresh one, which is the stated-reason exception above. Close consult rounds only once a later round
|
|
230
283
|
has re-derived their findings.
|
|
231
284
|
- Emptied tabs disappear on their own; do not close tabs by hand.
|
|
285
|
+
- **CLOSE IT AUTOMATICALLY, because remembering is what fails.** `watch-artifacts.sh` already fires on
|
|
286
|
+
the one signal that means a seat is finished — the artifact plus its terminal marker — so hand it the
|
|
287
|
+
panes too: `TKR_CLOSE_PANES="w1:p1,w1:p2" watch-artifacts.sh …`. It closes them on completion and
|
|
288
|
+
**never on timeout**, where the seats are still working. Closing on the marker cannot reap a seat
|
|
289
|
+
mid-write, which is exactly why `done` would be the wrong trigger.
|
|
290
|
+
|
|
291
|
+
- **MEASURE BEFORE EVERY SPLIT, AND JOIN *DOWN* WHEN A RIGHT-SPLIT WOULD GO UNDER THE FLOOR.**
|
|
292
|
+
**Operator-observed 2026-08-06, with a screenshot:** five consult panes in one tab rendered **14 columns
|
|
293
|
+
wide each** out of 220 — every one unreadable, including the two that had finished hours earlier.
|
|
294
|
+
**This rule's own earlier wording said to "split the newest pane; the tree stays balanced", and that
|
|
295
|
+
remedy is wrong** — an OVERSEER followed it the next session and measured `110/55/55`, which is the
|
|
296
|
+
exact split the old text cited as the *failure*. Corrected, with the measurement:
|
|
297
|
+
- **Direction is decided by arithmetic, not by which pane you pick.** The driver's floor is real and
|
|
298
|
+
derived from measurement — `TRAILER_SAFE_FLOOR_COLS = 108` (`src/drivers/herdr.ts:13`, *"narrowest
|
|
299
|
+
safe 53 → floor 108"*), and it splits right only while `paneWidth/2 ≥ 108 + 2` (`herdr.ts:494`),
|
|
300
|
+
otherwise **down**. Apply the same test by hand: `herdr pane layout --pane <id>`, halve the width,
|
|
301
|
+
and if the halves fall under the floor, split `--direction down`.
|
|
302
|
+
- **Binary splits cannot produce an even 3-column row at any width.** 220 goes to 110/55/55 whichever
|
|
303
|
+
pane you split. **At a 220-col terminal the width-derived cap is TWO side-by-side panes**; a third
|
|
304
|
+
seat goes below one of them, or into its own tab. "Three panes" is a *height* heuristic
|
|
305
|
+
(tickmarkr's own `workersPerTab: 3` assumes ~50 rows) and it does not authorise a third column.
|
|
306
|
+
- **A finished seat keeps its width.** Panes are a fixed budget — every seat you do not close is taken
|
|
307
|
+
out of the readability of the ones still working. There is no rebalance command, so the fix is
|
|
308
|
+
closing, not resizing.
|
|
309
|
+
**The general lesson, which is why this correction is worth its lines: a prose rule that restates a
|
|
310
|
+
measurement without carrying the number reproduces the defect at full price.** The floor lives in
|
|
311
|
+
`src/`; every seat that hand-splits panes is outside it and re-learns this by hand.
|
|
232
312
|
|
|
233
313
|
## Non-negotiable rules
|
|
234
314
|
|
|
@@ -325,6 +405,19 @@ twice.** They are mission-independent on purpose: nothing here names a task, a l
|
|
|
325
405
|
6. **Every gate, tool and verdict states what it does NOT establish.** A green gate is a claim about form
|
|
326
406
|
until its negative scope says otherwise. This applies to a *seat's own verdict* as much as to a tool:
|
|
327
407
|
an unchecked cite in a task with no finding is unchecked, not confirmed.
|
|
408
|
+
**THE PRESENCE OF A ROW IS NOT EVIDENCE THAT THE WORK HAPPENED — READ ITS QUALIFYING FIELDS.** Three
|
|
409
|
+
instances in one run (2026-08-06), which is what makes it a law and not an anecdote: a `gate-result`
|
|
410
|
+
for `test` carrying `selectedTests` — a PASS over a 16-test subset, not the suite; a `phase-start` for
|
|
411
|
+
a gate with no result row at all, where *deferred* and *dropped* are indistinguishable; and a
|
|
412
|
+
`tip-verify` row with `cached: true`, whose own source comment says it *"keeps it honest about not
|
|
413
|
+
having re-run the command."* **In the first and third the product had already provided the qualifier
|
|
414
|
+
and the reader ignored it** — an OVERSEER read per-gate `tip-verify` rows as proof of a real verify
|
|
415
|
+
while the distinguishing field sat in its own tool output, and was corrected by the ORCHESTRATOR from
|
|
416
|
+
the same lines. So decompose the blame honestly, because the two halves ship to different places:
|
|
417
|
+
**rows that are never emitted are a PRODUCT defect; rows misread past their qualifiers are a READER
|
|
418
|
+
defect**, and no amount of product work fixes the second. Before quoting any row as evidence of an
|
|
419
|
+
action, ask what field on it would tell you the action was skipped, cached, subsetted or deferred —
|
|
420
|
+
and if you cannot name the field, you have not read the record, you have counted it.
|
|
328
421
|
7. **Never aggregate per-axis PASSes into "it is clean."** Carrying the PASS and dropping the scope
|
|
329
422
|
manufactures a clean bill nobody issued.
|
|
330
423
|
8. **Never exclude a path from a search whose purpose is to find a counterexample there** — and an
|
|
@@ -360,6 +453,23 @@ twice.** They are mission-independent on purpose: nothing here names a task, a l
|
|
|
360
453
|
Two corollaries: **re-arm a wake-and-exit watcher as the same turn's LAST act**, not the next turn's
|
|
361
454
|
first — the gap between them is unwatched and its width is however long the seat stays busy; and **a
|
|
362
455
|
handoff that re-arms one tier's watchers must say which tier's it did NOT re-arm.**
|
|
456
|
+
**That first corollary prescribes DISCIPLINE, and discipline is the wrong fix — measured 2026-08-06.**
|
|
457
|
+
One orchestrator lapsed its journal tier **31 minutes**, then, after diagnosing it and fully intending
|
|
458
|
+
to re-arm, lapsed it again for 3 minutes **while actively thinking about watchers**. Its own diagnosis
|
|
459
|
+
is the durable one: *"I still serialize re-arming behind whatever I am doing."* **A watcher whose
|
|
460
|
+
liveness depends on its owner being free is not armed, it is SCHEDULED.** The structural fix, which
|
|
461
|
+
then survived a wake with zero action from the seat: wrap every wake-and-exit watcher in a supervisor
|
|
462
|
+
that re-execs it, **detached (`ppid 1`) so it outlives the seat and not merely the seat's turn**, and
|
|
463
|
+
have it write a **heartbeat file** so the supervising tier proves liveness *from disk* instead of
|
|
464
|
+
asking the seat that owns it. Decouple **coverage** from **notification**: when the notifier later
|
|
465
|
+
broke, coverage held and nothing was lost — the failure the design was built for.
|
|
466
|
+
**And never convert instrument silence into a WORLD claim.** *"No watcher has fired since X"* is a
|
|
467
|
+
statement about your instrument; *"no state change"* is a statement about the run, and they have
|
|
468
|
+
different truth conditions. A terminal-event watcher is silent through every **non-terminal** change
|
|
469
|
+
**by design**, so its silence is evidence about a narrow event class and **never** about progress.
|
|
470
|
+
Measured the same day: an orchestrator reported *"no state change"* while five events, a completed
|
|
471
|
+
worker and a passing gate sat unread — it had asserted from memory one read-cycle behind a reading
|
|
472
|
+
that was about to arrive. Say the instrument sentence, or **re-read and then say the world one**.
|
|
363
473
|
**A watcher has TWO failure modes, and the second is invisible from inside: never armed, and
|
|
364
474
|
OUTLIVING ITS TRIGGER.** A watcher aimed at an event that can no longer occur **reads as coverage and
|
|
365
475
|
is worse than none** — the process table shows it alive and the seat that armed it remembers arming
|
|
@@ -14,6 +14,11 @@
|
|
|
14
14
|
# wide as however long you stay busy — and you will be busy, because you just spawned work.
|
|
15
15
|
#
|
|
16
16
|
# Prints one wake reason and EXITS. Re-arm after every wake.
|
|
17
|
+
#
|
|
18
|
+
# TKR_CLOSE_PANES="w1:p1,w1:p2" closes those panes when every artifact completes — the answer to panes
|
|
19
|
+
# accumulating because nobody was watching for "this seat is finished". It fires ONLY on completion,
|
|
20
|
+
# never on timeout. Operator-observed 2026-08-06: five consult panes in one tab left each 14 columns
|
|
21
|
+
# wide and unreadable, because closing was a step someone had to remember.
|
|
17
22
|
set -u
|
|
18
23
|
# macOS ships bash 3.2, where `set -u` makes "${arr[@]}" on an EMPTY array a fatal unbound-variable
|
|
19
24
|
# error. Every expansion below therefore uses the ${arr[@]+"${arr[@]}"} guard. Caught by the timeout
|
|
@@ -51,6 +56,17 @@ while :; do
|
|
|
51
56
|
if [ "${#pending[@]}" -eq 0 ]; then
|
|
52
57
|
echo "WAKE: all ${#ready[@]} artifact(s) complete with marker '$MARKER'"
|
|
53
58
|
for f in ${ready[@]+"${ready[@]}"}; do echo " READY $(wc -c <"$f" | tr -d ' ') bytes $f"; done
|
|
59
|
+
# A seat whose artifact is COMPLETE has nothing left to give: the report is the archive, the pane is
|
|
60
|
+
# not. Closing here is safe precisely because the marker — not `done`, not a size — is the trigger,
|
|
61
|
+
# so this can never reap a seat mid-write. Only on the COMPLETE path: on a timeout the seats are
|
|
62
|
+
# still working and closing one would destroy the work being waited for.
|
|
63
|
+
if [ -n "${TKR_CLOSE_PANES:-}" ]; then
|
|
64
|
+
for pane in ${TKR_CLOSE_PANES//,/ }; do
|
|
65
|
+
# `herdr pane close` exits 0 even for a pane that is already gone, so report the body rather
|
|
66
|
+
# than the status — an exit code here would claim a close that may never have happened.
|
|
67
|
+
printf ' CLOSED %s -> %s\n' "$pane" "$(herdr pane close "$pane" 2>&1 | head -c 80)"
|
|
68
|
+
done
|
|
69
|
+
fi
|
|
54
70
|
exit 0
|
|
55
71
|
fi
|
|
56
72
|
|