mindweave 2.4.8 → 2.4.9

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/drivers/openrouter/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { compatStreamTurn, compatToolTurn } from "../openaiCompat/wire.js";
2
+ import { BASE_URL, OPENROUTER_HEADERS } from "./endpoint.js";
3
+ import { BUFFERED_OUTPUT_TOKENS, DEFAULT_MODEL, wireId } from "./manifest.js";
4
+ /**
5
+ * Reasoning, in OpenRouter's normalized field.
6
+ *
7
+ * Thinking on sends the chosen effort, which OpenRouter maps onto each vendor's own
8
+ * control. Thinking off sends `enabled: false`. The ladder the user picked from came
9
+ * from the catalogue, so a model whose reasoning is mandatory never reaches the off
10
+ * branch, and a model with no reasoning at all only ever has the off row.
11
+ */
12
+ export function reasoningFields(config) {
13
+ if (!config)
14
+ return {};
15
+ return config.thinking ? { reasoning: { effort: config.effort } } : { reasoning: { enabled: false } };
16
+ }
17
+ /**
18
+ * The cache split, including writes.
19
+ *
20
+ * `prompt_tokens` is the whole prompt; `cached_tokens` the part read from cache and
21
+ * `cache_write_tokens` the part written to it. Writes are reported so the ones billed
22
+ * at a premium (Anthropic's 1.25x) are priced as such.
23
+ */
24
+ export function cacheSplit(usage) {
25
+ const details = usage.prompt_tokens_details;
26
+ const hit = typeof details?.cached_tokens === "number" ? details.cached_tokens : 0;
27
+ const write = typeof details?.cache_write_tokens === "number" ? details.cache_write_tokens : 0;
28
+ if (hit === 0 && write === 0)
29
+ return undefined;
30
+ const prompt = typeof usage.prompt_tokens === "number" ? usage.prompt_tokens : 0;
31
+ return { hit, miss: Math.max(0, prompt - hit), ...(write > 0 ? { write } : {}) };
32
+ }
33
+ /** Models that cache only what is marked. Every other family here caches automatically. */
34
+ function needsBreakpoints(model) {
35
+ return model.startsWith("anthropic/");
36
+ }
37
+ /** Put a breakpoint on a message's last content part, turning string content into parts. */
38
+ function mark(message) {
39
+ const content = message.content;
40
+ const breakpoint = { cache_control: { type: "ephemeral" } };
41
+ if (typeof content === "string") {
42
+ return { ...message, content: [{ type: "text", text: content, ...breakpoint }] };
43
+ }
44
+ if (Array.isArray(content) && content.length > 0) {
45
+ const parts = [...content];
46
+ parts[parts.length - 1] = { ...parts[parts.length - 1], ...breakpoint };
47
+ return { ...message, content: parts };
48
+ }
49
+ return message;
50
+ }
51
+ function hasText(message) {
52
+ const content = message.content;
53
+ return (typeof content === "string" && content.length > 0) || (Array.isArray(content) && content.length > 0);
54
+ }
55
+ /**
56
+ * Explicit breakpoints at the two stable boundaries: the end of the system prompt, and
57
+ * the last message before the volatile context tail. The same boundaries the Anthropic
58
+ * driver uses, and never on the tail itself, which changes every step. An assistant
59
+ * message with only tool calls has no text to mark, so the boundary walks back to the
60
+ * nearest one that does.
61
+ */
62
+ export function withBreakpoints(messages, hasContextTail) {
63
+ const out = [...messages];
64
+ if (out[0]?.role === "system" && hasText(out[0]))
65
+ out[0] = mark(out[0]);
66
+ let last = out.length - 1 - (hasContextTail ? 1 : 0);
67
+ while (last > 0 && !hasText(out[last]))
68
+ last--;
69
+ if (last > 0)
70
+ out[last] = mark(out[last]);
71
+ return out;
72
+ }
73
+ export function finishBody(body, req) {
74
+ const model = wireId(String(body.model ?? DEFAULT_MODEL));
75
+ const out = { ...body, model };
76
+ if (needsBreakpoints(model) && Array.isArray(body.messages)) {
77
+ out.messages = withBreakpoints(body.messages, !!req.context?.trim());
78
+ }
79
+ // Allowed by default, which is OpenRouter's default too; the provider notice says so.
80
+ if (process.env.MINDWEAVE_OPENROUTER_DATA?.trim().toLowerCase() === "deny") {
81
+ out.provider = { data_collection: "deny" };
82
+ }
83
+ return out;
84
+ }
85
+ export const openrouterProvider = {
86
+ label: "OpenRouter",
87
+ baseUrl: BASE_URL,
88
+ apiKeyEnv: "OPENROUTER_API_KEY",
89
+ defaultModel: DEFAULT_MODEL,
90
+ reasoningFields,
91
+ cacheSplit,
92
+ bufferedMaxTokens: BUFFERED_OUTPUT_TOKENS,
93
+ headers: OPENROUTER_HEADERS,
94
+ finishBody,
95
+ };
96
+ export async function toolTurn(req, options = {}) {
97
+ return compatToolTurn(openrouterProvider, req, options.signal);
98
+ }
99
+ export async function streamTurn(req, options = {}) {
100
+ return compatStreamTurn(openrouterProvider, req, options.onEvent, options.signal);
101
+ }
102
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/drivers/openrouter/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * endpoint.ts — where OpenRouter lives and how Mindweave introduces itself to it.
3
+ *
4
+ * Its own module so the catalogue and the client share it without the catalogue
5
+ * loading any wire code.
6
+ */
7
+ export const BASE_URL = (process.env.MINDWEAVE_OPENROUTER_URL ?? "https://openrouter.ai/api/v1").replace(/\/+$/, "");
8
+ /**
9
+ * App attribution. OpenRouter credits requests to an app by `HTTP-Referer` plus a title,
10
+ * which is what lists it on openrouter.ai's app rankings; the `User-Agent` every driver
11
+ * already sends is not read for that. `X-Title` is the older spelling of the title and
12
+ * still accepted, so both go out.
13
+ */
14
+ export const OPENROUTER_HEADERS = {
15
+ "HTTP-Referer": "https://github.com/mindweave-cli/mindweave",
16
+ "X-OpenRouter-Title": "mwcode",
17
+ "X-Title": "mwcode",
18
+ "X-OpenRouter-Categories": "cli-agent",
19
+ };
20
+ //# sourceMappingURL=endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/drivers/openrouter/endpoint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,8BAA8B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAErH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,cAAc,EAAE,4CAA4C;IAC5D,oBAAoB,EAAE,QAAQ;IAC9B,SAAS,EAAE,QAAQ;IACnB,yBAAyB,EAAE,WAAW;CACvC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { streamTurn, toolTurn } from "./client.js";
2
+ import { openrouterManifest } from "./manifest.js";
3
+ export const openrouterDriver = { ...openrouterManifest, toolTurn, streamTurn };
4
+ export default openrouterDriver;
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/drivers/openrouter/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAW,EAAE,GAAG,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAExF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,83 @@
1
+ /** The namespace every OpenRouter model id carries inside Mindweave. */
2
+ export const PREFIX = "openrouter:";
3
+ /** OpenRouter's own id for a namespaced one. */
4
+ export function wireId(model) {
5
+ return model.startsWith(PREFIX) ? model.slice(PREFIX.length) : model;
6
+ }
7
+ /**
8
+ * Shown before discovery has run. The same model Mindweave defaults to elsewhere, so a
9
+ * fresh OpenRouter user starts somewhere familiar and cheap. A fallback, never a
10
+ * placement: the full catalogue replaces this list as soon as it arrives.
11
+ */
12
+ export const MODELS = [
13
+ { id: `${PREFIX}deepseek/deepseek-v4.1-flash`, label: "DeepSeek V4.1 Flash", description: "DeepSeek" },
14
+ ];
15
+ export const DEFAULT_MODEL = MODELS[0].id;
16
+ /**
17
+ * Before the catalogue describes a model, offer the two states every reasoning model
18
+ * on OpenRouter accepts. The catalogue's real ladder replaces this per model.
19
+ */
20
+ export function thinkLevels(_model) {
21
+ return [
22
+ { label: "Standard", description: "answer directly — fastest", thinking: false, effort: "low" },
23
+ { label: "Thinking", description: "think first, then answer", thinking: true, effort: "high" },
24
+ ];
25
+ }
26
+ /** DeepSeek V4.1 Flash's catalogue price: the only model a fallback can name. */
27
+ const FALLBACK_PRICE = { cacheHit: 0.003, cacheMiss: 0.15, output: 0.6 };
28
+ export function price(_model) {
29
+ return FALLBACK_PRICE;
30
+ }
31
+ /**
32
+ * The most context Mindweave lets a transcript grow into on this provider.
33
+ *
34
+ * The catalogue reports each model's ADVERTISED maximum, often 1M. The window core
35
+ * wants is the USABLE one, where retrieval stays reliable, and every vendor driver
36
+ * sets that well below the advertised figure (DeepSeek 192K-256K, Gemini 200K) on
37
+ * evidence that recall falls off past it. A router cannot measure hundreds of models,
38
+ * so it applies the same ceiling, and a smaller advertised window still wins.
39
+ */
40
+ export const USABLE_WINDOW_CAP = 200_000;
41
+ export function contextWindow(_model) {
42
+ return 128_000;
43
+ }
44
+ /** The ceiling on a buffered call. Generous, because most models here reason first and
45
+ * a reasoning budget comes out of the same allowance as the answer. */
46
+ export const BUFFERED_OUTPUT_TOKENS = 16_000;
47
+ export function bufferedOutputTokens(_model) {
48
+ return BUFFERED_OUTPUT_TOKENS;
49
+ }
50
+ /**
51
+ * Keep the saved model even when it is not listed yet: the catalogue may not have
52
+ * arrived, and coercing a valid choice onto the fallback would change it on every
53
+ * launch. The registry snaps the reasoning selection onto the model's real ladder once
54
+ * the catalogue describes it.
55
+ */
56
+ export function normalize(config) {
57
+ const model = config.model || DEFAULT_MODEL;
58
+ const thinking = config.thinking === true;
59
+ // Onto the fallback ladder above: one effort per state.
60
+ return { model, thinking, effort: thinking ? "high" : "low" };
61
+ }
62
+ export function ownsModel(model) {
63
+ return model.startsWith(PREFIX);
64
+ }
65
+ export const openrouterManifest = {
66
+ id: "openrouter",
67
+ label: "OpenRouter",
68
+ apiKeyEnv: "OPENROUTER_API_KEY",
69
+ keysUrl: "https://openrouter.ai/keys",
70
+ models: MODELS,
71
+ thinkLevels,
72
+ price,
73
+ contextWindow,
74
+ bufferedOutputTokens,
75
+ normalize,
76
+ ownsModel,
77
+ notice: "OpenRouter may send prompts to hosts that store or train on them. " +
78
+ "Set MINDWEAVE_OPENROUTER_DATA=deny to use only hosts that do not.",
79
+ // Lazy for the same reason as every discovered provider: the manifest loads for every
80
+ // user, and the catalogue code should only load for someone who uses it.
81
+ discoverModels: async () => (await import("./catalog.js")).discoverModels(),
82
+ };
83
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/drivers/openrouter/manifest.ts"],"names":[],"mappings":"AAiBA,wEAAwE;AACxE,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAC;AAEpC,gDAAgD;AAChD,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAkB;IACnC,EAAE,EAAE,EAAE,GAAG,MAAM,8BAA8B,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,EAAE;CACvG,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAe;IACzC,OAAO;QACL,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAC/F,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;KAC/F,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,cAAc,GAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAErF,MAAM,UAAU,KAAK,CAAC,MAAe;IACnC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;wEACwE;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,MAAe;IAClD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,MAAmB;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC1C,wDAAwD;IACxD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,oBAAoB;IAC/B,OAAO,EAAE,4BAA4B;IACrC,MAAM,EAAE,MAAM;IACd,WAAW;IACX,KAAK;IACL,aAAa;IACb,oBAAoB;IACpB,SAAS;IACT,SAAS;IACT,MAAM,EACJ,oEAAoE;QACpE,mEAAmE;IACrE,sFAAsF;IACtF,yEAAyE;IACzE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,EAAE;CAC5E,CAAC"}
@@ -20,6 +20,7 @@
20
20
  * ACCOUNT reason, and QUOTES the provider's own sentence. The wrapper is universal
21
21
  * and cannot be wrong; the precision comes from the provider, which already knows.
22
22
  */
23
+ import { isRetryable } from "./retryPolicy.js";
23
24
  /**
24
25
  * Statuses that mean the ACCOUNT cannot run this request.
25
26
  *
@@ -178,4 +179,54 @@ export function accessRefusal(error, providerLabel, canSwitch) {
178
179
  body: said ? `${said}\n\n${action}` : action,
179
180
  };
180
181
  }
182
+ /**
183
+ * Recognise a failure on the provider's side and shape it for the screen.
184
+ *
185
+ * By the time one of these reaches the user, the retry layer has already tried again
186
+ * and given up, so the useful thing to say is what the user can do: wait, or pick
187
+ * another model. A red "API error 502: ERROR" says neither, and reads as if Mindweave
188
+ * crashed. Three shapes count:
189
+ * - a 5xx status, the provider or its upstream host falling over;
190
+ * - a failure the provider reported inside a successful response (a router whose
191
+ * upstream died mid-reply), which carries no status;
192
+ * - a request that never got through, after the network retries ran out.
193
+ *
194
+ * A 4xx never lands here. 400 and friends are a request we built wrong and stay loud;
195
+ * 401/402/403/429 are `accessRefusal`'s.
196
+ *
197
+ * The provider's own sentence is quoted when it says something. Routers often send a
198
+ * bare "ERROR" or the status text, and quoting that adds a line that explains nothing.
199
+ */
200
+ export function providerOutage(error, providerLabel, modelLabel) {
201
+ const status = statusOf(error);
202
+ const upstream = !!error && typeof error === "object" && error.upstream === true;
203
+ const serverSide = status !== null && status >= 500 && status < 600;
204
+ const unreachable = status === null && !upstream && isRetryable(error, null);
205
+ if (!serverSide && !upstream && !unreachable)
206
+ return null;
207
+ const NL = String.fromCharCode(10);
208
+ const advice = "The conversation is saved. Try again in a moment, or pick a different model with /model.";
209
+ if (unreachable) {
210
+ return {
211
+ title: `Can't reach ${providerLabel}`,
212
+ body: `The request didn't get through, even after retrying. Check your connection, or the provider may be down.${NL}${NL}${advice}`,
213
+ };
214
+ }
215
+ const reported = serverSide
216
+ ? providerMessage(detailOf(error))
217
+ : providerMessage(String(error.message ?? "").replace(/^.*?API error:\s*/, ""));
218
+ const informative = reported.length > 0 &&
219
+ !/^(error|internal server error|bad gateway|service unavailable|gateway timeout|the reply ended with an error)\.?$/i.test(reported);
220
+ const what = serverSide
221
+ ? `${providerLabel} returned an error (${status}) while running it, even after retrying.`
222
+ : `${providerLabel} reported an error part way through the reply.`;
223
+ const lines = [
224
+ `${what} This is on the provider's side, not your key or your setup. New and preview models fail like this more often.`,
225
+ ...(informative ? [`${providerLabel} said: "${reported}"`] : []),
226
+ ];
227
+ return {
228
+ title: `${modelLabel} isn't responding right now`,
229
+ body: `${lines.join(NL)}${NL}${NL}${advice}`,
230
+ };
231
+ }
181
232
  //# sourceMappingURL=providerError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"providerError.js","sourceRoot":"","sources":["../../src/drivers/providerError.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providerError.js","sourceRoot":"","sources":["../../src/drivers/providerError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAU/C;;;;;;;;;GASG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,eAAe,GAAG;IACtB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,oBAAoB;IACpB,6BAA6B;IAC7B,SAAS;IACT,kBAAkB;IAClB,kBAAkB;CACnB,CAAC;AAEF,qEAAqE;AACrE,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,MAAM,GAAI,KAA8B,CAAC,MAAM,CAAC;IACtD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,KAAiE,CAAC;IAC5E,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACrE,6EAA6E;IAC7E,kEAAkE;IAClE,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,MAAiC,CAAC;YAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;YACtB,MAAM,UAAU,GAAG;gBACjB,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAE,GAA+B,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBACrF,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;gBACzC,GAAG,CAAC,OAAO;gBACX,GAAG,CAAC,MAAM;aACX,CAAC;YACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxE,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+EAA+E;IACjF,CAAC;IAED,+EAA+E;IAC/E,8DAA8D;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,aAAqB,EAAE,SAAkB;IACrF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,uFAAuF;IACvF,mFAAmF;IACnF,sFAAsF;IACtF,sFAAsF;IACtF,kFAAkF;IAClF,MAAM,WAAW,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;IACrD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,MAAM,GAAG,WAAW;QACxB,CAAC,CAAC,oFAAoF;YACpF,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,2CAA2C,GAAG,UAAU;QACpF,CAAC,CAAC,2EAA2E;YAC3E,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,qBAAqB,GAAG,UAAU,CAAC;IAEjE,OAAO;QACL,KAAK,EAAE,GAAG,aAAa,uCAAuC;QAC9D,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;KAC7C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,aAAqB,EAAE,UAAkB;IACtF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAgC,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC7G,MAAM,UAAU,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;IACpE,MAAM,WAAW,GAAG,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7E,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE1D,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,0FAA0F,CAAC;IAE1G,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,eAAe,aAAa,EAAE;YACrC,IAAI,EAAE,2GAA2G,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE;SACpI,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU;QACzB,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAE,KAAe,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7F,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,GAAG,CAAC;QACnB,CAAC,mHAAmH,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtI,MAAM,IAAI,GAAG,UAAU;QACrB,CAAC,CAAC,GAAG,aAAa,uBAAuB,MAAM,0CAA0C;QACzF,CAAC,CAAC,GAAG,aAAa,gDAAgD,CAAC;IACrE,MAAM,KAAK,GAAG;QACZ,GAAG,IAAI,gHAAgH;QACvH,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;IACF,OAAO;QACL,KAAK,EAAE,GAAG,UAAU,6BAA6B;QACjD,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE;KAC7C,CAAC;AACJ,CAAC"}
@@ -12,6 +12,7 @@ import { geminiManifest } from "./gemini/manifest.js";
12
12
  import { metaManifest } from "./meta/manifest.js";
13
13
  import { minimaxManifest } from "./minimax/manifest.js";
14
14
  import { tencentManifest } from "./tencent/manifest.js";
15
+ import { openrouterManifest } from "./openrouter/manifest.js";
15
16
  /** Every provider's cheap metadata, in display order. Always loaded. */
16
17
  const MANIFESTS = [
17
18
  deepseekManifest,
@@ -28,6 +29,7 @@ const MANIFESTS = [
28
29
  metaManifest,
29
30
  minimaxManifest,
30
31
  tencentManifest,
32
+ openrouterManifest,
31
33
  ];
32
34
  /** How to load each provider's wire code, on demand. Keyed by manifest id. */
33
35
  const LOADERS = {
@@ -45,6 +47,7 @@ const LOADERS = {
45
47
  meta: async () => (await import("./meta/index.js")).metaDriver,
46
48
  minimax: async () => (await import("./minimax/index.js")).minimaxDriver,
47
49
  tencent: async () => (await import("./tencent/index.js")).tencentDriver,
50
+ openrouter: async () => (await import("./openrouter/index.js")).openrouterDriver,
48
51
  };
49
52
  /** The provider used when a model id doesn't match any other. */
50
53
  const FALLBACK = MANIFESTS[0];
@@ -85,10 +88,77 @@ export function modelsOf(manifest) {
85
88
  * actually serves.
86
89
  */
87
90
  export function manifestForModel(model) {
88
- return (MANIFESTS.find((m) => modelsOf(m).some((c) => c.id === model)) ??
91
+ return withFacts(MANIFESTS.find((m) => modelsOf(m).some((c) => c.id === model)) ??
89
92
  MANIFESTS.find((m) => m.ownsModel?.(model) === true) ??
90
93
  FALLBACK);
91
94
  }
95
+ /** The facts a discovered listing reported for one model, if any. */
96
+ function factsOf(manifest, model) {
97
+ return discovered.get(manifest.id)?.find((c) => c.id === model)?.facts;
98
+ }
99
+ const views = new WeakMap();
100
+ /**
101
+ * A discovered provider's manifest, answering from its listing's facts first.
102
+ *
103
+ * Every consumer reads a model's window, price, vision and reasoning ladder through
104
+ * `manifestForModel`, so wrapping here is what lets a router report real numbers
105
+ * without a single call site learning that discovered facts exist. Anything the
106
+ * listing did not report falls through to the manifest's own function.
107
+ *
108
+ * A fixed provider is returned untouched: it has no listing to consult.
109
+ */
110
+ function withFacts(manifest) {
111
+ if (!manifest.discoverModels)
112
+ return manifest;
113
+ let view = views.get(manifest);
114
+ if (view)
115
+ return view;
116
+ view = {
117
+ ...manifest,
118
+ thinkLevels: (model) => factsOf(manifest, model)?.thinkLevels ?? manifest.thinkLevels(model),
119
+ price: (model) => factsOf(manifest, model)?.price ?? manifest.price(model),
120
+ contextWindow: (model) => factsOf(manifest, model)?.contextWindow ?? manifest.contextWindow(model),
121
+ bufferedOutputTokens: (model) => factsOf(manifest, model)?.bufferedOutputTokens ?? manifest.bufferedOutputTokens?.(model) ?? 0,
122
+ acceptsImages: (model) => factsOf(manifest, model)?.acceptsImages ?? manifest.acceptsImages?.(model) ?? false,
123
+ normalize: (config) => {
124
+ const base = manifest.normalize(config);
125
+ const levels = factsOf(manifest, base.model)?.thinkLevels;
126
+ // Snapped from the caller's own selection, not the manifest's fallback answer: the
127
+ // fallback ladder is coarser, and rounding through it first would lose a rung the
128
+ // real ladder has.
129
+ return levels ? snapToLevels({ ...config, model: base.model }, levels) : base;
130
+ },
131
+ };
132
+ views.set(manifest, view);
133
+ return view;
134
+ }
135
+ const EFFORTS = ["low", "medium", "high", "xhigh", "max"];
136
+ /**
137
+ * Move a reasoning selection onto a ladder the model actually offers.
138
+ *
139
+ * Thinking is kept on or off when the ladder allows it, and flipped when it does not
140
+ * (a model that cannot stop reasoning has no off rung). The effort goes to the nearest
141
+ * offered rung, ties downward, which is the convention every fixed driver follows:
142
+ * rounding up would quietly spend more than the user chose.
143
+ */
144
+ export function snapToLevels(config, levels) {
145
+ if (levels.length === 0)
146
+ return config;
147
+ const same = levels.filter((l) => l.thinking === config.thinking);
148
+ const pool = same.length > 0 ? same : levels;
149
+ const thinking = pool[0].thinking;
150
+ if (pool.some((l) => l.effort === config.effort))
151
+ return { ...config, thinking };
152
+ const want = EFFORTS.indexOf(config.effort);
153
+ let best = pool[0];
154
+ for (const level of pool) {
155
+ const d = Math.abs(EFFORTS.indexOf(level.effort) - want);
156
+ const bestD = Math.abs(EFFORTS.indexOf(best.effort) - want);
157
+ if (d < bestD || (d === bestD && EFFORTS.indexOf(level.effort) < EFFORTS.indexOf(best.effort)))
158
+ best = level;
159
+ }
160
+ return { ...config, thinking, effort: best.effort };
161
+ }
92
162
  /** Every model offered across all installed providers. */
93
163
  export function allModels() {
94
164
  return MANIFESTS.flatMap((m) => modelsOf(m));
@@ -105,14 +175,23 @@ export function allModels() {
105
175
  * it (no key, nothing running), not by a picker that quietly loses its contents.
106
176
  * Returns the ids that refreshed successfully, so a caller can tell the difference.
107
177
  */
108
- export async function refreshModels() {
109
- const dynamic = MANIFESTS.filter((m) => m.discoverModels);
178
+ export async function refreshModels(options = {}) {
179
+ const maxAge = options.maxAgeMs ?? 0;
180
+ const now = Date.now();
181
+ const dynamic = MANIFESTS.filter((m) => m.discoverModels).filter((m) => {
182
+ // A list younger than the caller's tolerance is left alone. A router's catalogue is
183
+ // a large download, and asking for it on every picker open costs a visible pause
184
+ // for a list that changes weekly.
185
+ const at = refreshedAt.get(m.id);
186
+ return maxAge <= 0 || at === undefined || now - at >= maxAge;
187
+ });
110
188
  const results = await Promise.all(dynamic.map(async (m) => {
111
189
  try {
112
190
  const models = await m.discoverModels();
113
191
  // An empty result is a real answer — a runtime with nothing pulled — and is
114
192
  // stored as such. Failure is the case that must not overwrite.
115
193
  discovered.set(m.id, models);
194
+ refreshedAt.set(m.id, Date.now());
116
195
  return m.id;
117
196
  }
118
197
  catch {
@@ -121,9 +200,38 @@ export async function refreshModels() {
121
200
  }));
122
201
  return results.filter((id) => id !== null);
123
202
  }
203
+ /** When each discovered list was fetched, in ms. Seeded lists carry their fetch time. */
204
+ const refreshedAt = new Map();
205
+ /**
206
+ * A discovered provider's list as last fetched, for persisting. Undefined when it has
207
+ * never been fetched or seeded, which is different from an empty list.
208
+ */
209
+ export function discoveredList(id) {
210
+ const models = discovered.get(id);
211
+ const fetchedAt = refreshedAt.get(id);
212
+ return models && fetchedAt !== undefined ? { models, fetchedAt } : undefined;
213
+ }
214
+ /**
215
+ * Install a previously fetched list, so a picker and the first turn have real facts
216
+ * before the network answers. Never replaces a list fetched in this process: a disk
217
+ * copy is older by definition.
218
+ */
219
+ export function seedDiscovered(id, models, fetchedAt) {
220
+ if (!MANIFESTS.some((m) => m.id === id && m.discoverModels))
221
+ return;
222
+ if (discovered.has(id))
223
+ return;
224
+ discovered.set(id, models);
225
+ refreshedAt.set(id, fetchedAt);
226
+ }
227
+ /** Ids of every provider that discovers its models. */
228
+ export function discoveredProviderIds() {
229
+ return MANIFESTS.filter((m) => m.discoverModels).map((m) => m.id);
230
+ }
124
231
  /** Drop every discovered list. For tests, and for a full provider reset. */
125
232
  export function clearDiscovered() {
126
233
  discovered.clear();
234
+ refreshedAt.clear();
127
235
  }
128
236
  /**
129
237
  * Every installed provider, in display order — what `/provider` lists.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/drivers/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/drivers/registry.ts"],"names":[],"mappings":"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"}
@@ -14,9 +14,62 @@
14
14
  */
15
15
  import { promises as fs } from "node:fs";
16
16
  import { join } from "node:path";
17
- import { projectDir } from "../memory/store.js";
18
- import { allModels, allProviders, ensureDriver, manifestForModel, modelsOf, normalizeConfig, refreshModels, } from "../drivers/registry.js";
19
- export { refreshModels };
17
+ import { projectDir, stateRoot } from "../memory/store.js";
18
+ import { allModels, allProviders, discoveredList, discoveredProviderIds, ensureDriver, manifestForModel, modelsOf, normalizeConfig, refreshModels as refreshDiscovered, seedDiscovered, } from "../drivers/registry.js";
19
+ /**
20
+ * How long a discovered model list is trusted before it is fetched again.
21
+ *
22
+ * A router's catalogue is a large download that changes weekly, and asking for it every
23
+ * time `/model` opens puts a pause in front of a list that almost never changed. Six
24
+ * hours keeps a new model a same-day arrival without paying for it on every open.
25
+ */
26
+ export const DISCOVERY_TTL_MS = 6 * 60 * 60 * 1000;
27
+ function discoveryCachePath(id) {
28
+ return join(stateRoot(), "cache", `models-${id}.json`);
29
+ }
30
+ /**
31
+ * Refresh discovered model lists older than `maxAgeMs` (all of them by default), and
32
+ * keep what arrived on disk so the next launch starts with it.
33
+ */
34
+ export async function refreshModels(options = {}) {
35
+ const refreshed = await refreshDiscovered(options);
36
+ await Promise.all(refreshed.map((id) => persistDiscovered(id)));
37
+ return refreshed;
38
+ }
39
+ async function persistDiscovered(id) {
40
+ const entry = discoveredList(id);
41
+ if (!entry)
42
+ return;
43
+ try {
44
+ const path = discoveryCachePath(id);
45
+ await fs.mkdir(join(stateRoot(), "cache"), { recursive: true });
46
+ // Written beside and renamed over, so a crash mid-write leaves the old list rather
47
+ // than half a JSON file that would be discarded on the next launch.
48
+ const tmp = `${path}.${process.pid}.tmp`;
49
+ await fs.writeFile(tmp, JSON.stringify({ fetchedAt: entry.fetchedAt, models: entry.models }), "utf8");
50
+ await fs.rename(tmp, path);
51
+ }
52
+ catch {
53
+ /* best-effort: the list is still in memory */
54
+ }
55
+ }
56
+ /** Write one provider's list to disk now. Exported for tests only. */
57
+ export const persistedForTest = persistDiscovered;
58
+ /** Install every discovered list saved by an earlier run. A bad file is ignored. */
59
+ export async function loadDiscoveryCache() {
60
+ await Promise.all(discoveredProviderIds().map(async (id) => {
61
+ try {
62
+ const parsed = JSON.parse(await fs.readFile(discoveryCachePath(id), "utf8"));
63
+ if (typeof parsed.fetchedAt !== "number" || !Array.isArray(parsed.models))
64
+ return;
65
+ const models = parsed.models.filter((m) => !!m && typeof m.id === "string" && typeof m.label === "string");
66
+ seedDiscovered(id, models.map((m) => ({ ...m, description: m.description ?? "" })), parsed.fetchedAt);
67
+ }
68
+ catch {
69
+ /* no cache yet, or unreadable: discovery will fill it */
70
+ }
71
+ }));
72
+ }
20
73
  /**
21
74
  * The models offered by `/model`, across every installed provider.
22
75
  *
@@ -142,7 +195,13 @@ function configPath(projectCwd) {
142
195
  * config survives to be normalized against a list that arrives later.
143
196
  */
144
197
  export async function loadModelConfig(projectCwd) {
145
- await refreshModels();
198
+ // A provider with a saved list starts from it and refreshes in the background once
199
+ // stale; only a provider with no list at all is waited on, because normalizing a
200
+ // saved config against nothing is the bug the comment above describes.
201
+ await loadDiscoveryCache();
202
+ const refresh = refreshModels({ maxAgeMs: DISCOVERY_TTL_MS });
203
+ if (discoveredProviderIds().some((id) => !discoveredList(id)))
204
+ await refresh;
146
205
  let config;
147
206
  try {
148
207
  const raw = await fs.readFile(configPath(projectCwd), "utf8");