@aligndottech/cli 0.18.0 → 0.19.1

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.
Files changed (37) hide show
  1. package/README.md +10 -8
  2. package/dist/commands/check.d.ts.map +1 -1
  3. package/dist/commands/check.js +18 -1
  4. package/dist/commands/check.js.map +1 -1
  5. package/dist/commands/setup.js +1 -1
  6. package/dist/commands/setup.js.map +1 -1
  7. package/dist/commands/why.d.ts.map +1 -1
  8. package/dist/commands/why.js +26 -8
  9. package/dist/commands/why.js.map +1 -1
  10. package/dist/index.js +6 -4
  11. package/dist/index.js.map +1 -1
  12. package/dist/lib/hook-payload.js +34 -4
  13. package/dist/lib/hook-payload.js.map +1 -1
  14. package/dist/lib/local-db.d.ts +54 -0
  15. package/dist/lib/local-db.d.ts.map +1 -1
  16. package/dist/lib/local-db.js +180 -6
  17. package/dist/lib/local-db.js.map +1 -1
  18. package/dist/lib/local-embeddings.d.ts.map +1 -1
  19. package/dist/lib/local-embeddings.js +13 -2
  20. package/dist/lib/local-embeddings.js.map +1 -1
  21. package/dist/lib/local-gateway-client.d.ts +36 -1
  22. package/dist/lib/local-gateway-client.d.ts.map +1 -1
  23. package/dist/lib/local-gateway-client.js +96 -8
  24. package/dist/lib/local-gateway-client.js.map +1 -1
  25. package/dist/lib/local-llm.d.ts +78 -15
  26. package/dist/lib/local-llm.d.ts.map +1 -1
  27. package/dist/lib/local-llm.js +327 -88
  28. package/dist/lib/local-llm.js.map +1 -1
  29. package/dist/lib/local-relationship-classifier.d.ts +22 -4
  30. package/dist/lib/local-relationship-classifier.d.ts.map +1 -1
  31. package/dist/lib/local-relationship-classifier.js +19 -9
  32. package/dist/lib/local-relationship-classifier.js.map +1 -1
  33. package/dist/lib/usage-telemetry.d.ts +36 -1
  34. package/dist/lib/usage-telemetry.d.ts.map +1 -1
  35. package/dist/lib/usage-telemetry.js +73 -3
  36. package/dist/lib/usage-telemetry.js.map +1 -1
  37. package/package.json +1 -1
@@ -22,12 +22,68 @@ function buildUserPrompt(question, decisions) {
22
22
  const ctx = decisions.map(d => `- ${d.title}: ${d.summary}`).join('\n');
23
23
  return `Question: ${question}\n\nDecision context:\n${ctx}`;
24
24
  }
25
- // --- Provider adapters: each takes a generic (system, user) chat and returns text or null ---
25
+ /** Classify a non-2xx response: availability-class advances, anything else stops. */
26
+ async function classifyHttpFailure(res, model) {
27
+ const detail = `HTTP ${res.status}`;
28
+ // 401/403/404 decide on the status alone, so do not download a body to ignore it -
29
+ // behind a proxy the 401 body is an HTML page, and a dead key is the common case.
30
+ if (res.status === 401 || res.status === 403 || res.status === 404) {
31
+ return { kind: 'unavailable', detail };
32
+ }
33
+ let body = '';
34
+ try {
35
+ body = await res.text();
36
+ }
37
+ catch {
38
+ // No readable body; the status alone decides.
39
+ }
40
+ return isAvailabilityFailure(res.status, body)
41
+ ? { kind: 'unavailable', detail }
42
+ : { kind: 'failed', model, detail };
43
+ }
44
+ /**
45
+ * Classify a thrown fetch. An ABORT is not an absence: we chose this provider and gave
46
+ * up waiting on it, which is the same event as a 429 from the caller's point of view
47
+ * and must stop the chain. Slow is not absent - otherwise the same overloaded provider
48
+ * stops the chain when it answers 429 and demotes to a weaker model when it answers
49
+ * nothing, which is the harder failure to notice. A connection or DNS error genuinely
50
+ * means nothing answered, so that advances.
51
+ */
52
+ function classifyThrownFetch(err, model) {
53
+ const name = err?.name;
54
+ if (name === 'TimeoutError' || name === 'AbortError') {
55
+ return { kind: 'failed', model, detail: 'timed out' };
56
+ }
57
+ return { kind: 'unavailable', detail: String(err) };
58
+ }
59
+ // A reasoning model (the deepseek-r family) prefixes its answer with a <think> block.
60
+ // It is a monologue, not prose for a human, and `align ask` prints the response
61
+ // verbatim while parseRelationship's brace match would span a brace inside it.
62
+ function stripReasoningBlock(text) {
63
+ return text.replace(/<think>[\s\S]*?<\/think>/gi, '').trim();
64
+ }
65
+ /**
66
+ * The shared tail every adapter needs: read the body, extract the model's text, and
67
+ * decide answer-or-stop. One owner, because this IS the response policy - four copies
68
+ * drift, and the Gemini copy had already grown its own shape.
69
+ */
70
+ async function parseAdapterResponse(res, model, extract) {
71
+ let data;
72
+ try {
73
+ data = await res.json();
74
+ }
75
+ catch {
76
+ return { kind: 'failed', model, detail: 'malformed response body' };
77
+ }
78
+ const text = stripReasoningBlock(extract(data)?.trim() ?? '');
79
+ return text ? { kind: 'answer', text } : { kind: 'failed', model, detail: 'empty response' };
80
+ }
26
81
  // OpenAI-compatible Chat Completions API (OpenAI, Groq, Mistral, xAI/Grok, and any
27
82
  // ALIGN_LLM_BASE_URL endpoint - OpenRouter, Together, DeepSeek, LM Studio, vLLM, ...).
28
83
  async function tryOpenAiCompatible(system, user, endpoint, model, key, maxTokens = 256, timeoutMs = 15000, temperature) {
84
+ let res;
29
85
  try {
30
- const res = await fetch(endpoint, {
86
+ res = await fetch(endpoint, {
31
87
  method: 'POST',
32
88
  headers: {
33
89
  'Content-Type': 'application/json',
@@ -44,18 +100,19 @@ async function tryOpenAiCompatible(system, user, endpoint, model, key, maxTokens
44
100
  }),
45
101
  signal: AbortSignal.timeout(timeoutMs),
46
102
  });
47
- if (!res.ok)
48
- return null;
49
- const data = await res.json();
50
- return data.choices?.[0]?.message?.content?.trim() ?? null;
51
103
  }
52
- catch {
53
- return null;
104
+ catch (err) {
105
+ return classifyThrownFetch(err, model);
54
106
  }
107
+ if (!res.ok)
108
+ return classifyHttpFailure(res, model);
109
+ return parseAdapterResponse(res, model, d => d.choices?.[0]?.message?.content);
55
110
  }
56
111
  async function tryAnthropic(system, user, key, maxTokens = 256, temperature) {
112
+ const model = process.env['ALIGN_ANTHROPIC_MODEL'] || 'claude-haiku-4-5-20251001';
113
+ let res;
57
114
  try {
58
- const res = await fetch('https://api.anthropic.com/v1/messages', {
115
+ res = await fetch('https://api.anthropic.com/v1/messages', {
59
116
  method: 'POST',
60
117
  headers: {
61
118
  'Content-Type': 'application/json',
@@ -63,7 +120,7 @@ async function tryAnthropic(system, user, key, maxTokens = 256, temperature) {
63
120
  'anthropic-version': '2023-06-01',
64
121
  },
65
122
  body: JSON.stringify({
66
- model: process.env['ALIGN_ANTHROPIC_MODEL'] ?? 'claude-haiku-4-5-20251001',
123
+ model,
67
124
  max_tokens: maxTokens,
68
125
  ...(temperature !== undefined ? { temperature } : {}),
69
126
  system,
@@ -71,19 +128,22 @@ async function tryAnthropic(system, user, key, maxTokens = 256, temperature) {
71
128
  }),
72
129
  signal: AbortSignal.timeout(15000),
73
130
  });
74
- if (!res.ok)
75
- return null;
76
- const data = await res.json();
77
- return data.content?.[0]?.text?.trim() ?? null;
78
131
  }
79
- catch {
80
- return null;
132
+ catch (err) {
133
+ return classifyThrownFetch(err, model);
81
134
  }
135
+ if (!res.ok)
136
+ return classifyHttpFailure(res, model);
137
+ // First block with text, not content[0]: a thinking or tool-use block can lead, and
138
+ // reading index 0 blindly calls a correct answer an empty response - which now STOPS
139
+ // the chain rather than merely falling through it.
140
+ return parseAdapterResponse(res, model, d => d.content?.find(b => b.text?.trim())?.text);
82
141
  }
83
142
  async function tryGemini(system, user, key, maxTokens = 256, temperature) {
143
+ const geminiModel = process.env['ALIGN_GEMINI_MODEL'] || 'gemini-1.5-flash';
144
+ let res;
84
145
  try {
85
- const geminiModel = process.env['ALIGN_GEMINI_MODEL'] ?? 'gemini-1.5-flash';
86
- const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${geminiModel}:generateContent?key=${key}`, {
146
+ res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${geminiModel}:generateContent?key=${key}`, {
87
147
  method: 'POST',
88
148
  headers: { 'Content-Type': 'application/json' },
89
149
  body: JSON.stringify({
@@ -96,18 +156,86 @@ async function tryGemini(system, user, key, maxTokens = 256, temperature) {
96
156
  }),
97
157
  signal: AbortSignal.timeout(15000),
98
158
  });
99
- if (!res.ok)
100
- return null;
101
- const data = await res.json();
102
- return data.candidates?.[0]?.content?.parts?.[0]?.text?.trim() ?? null;
103
159
  }
104
- catch {
105
- return null;
160
+ catch (err) {
161
+ return classifyThrownFetch(err, geminiModel);
106
162
  }
163
+ if (!res.ok)
164
+ return classifyHttpFailure(res, geminiModel);
165
+ // First part with text, for the same reason as Anthropic's blocks above.
166
+ return parseAdapterResponse(res, geminiModel, d => d.candidates?.[0]?.content?.parts?.find(p => p.text?.trim())?.text);
107
167
  }
108
- export const VETTED_OLLAMA_MODELS = [
109
- 'llama3.2', 'llama3.1', 'llama3', 'mistral', 'gemma2', 'phi3',
168
+ /**
169
+ * Ollama model families recognised for decision synthesis, in OUR preference order
170
+ * (never /api/tags order - ALI-420). Family-level and version-free on purpose: the
171
+ * old exact-version list (llama3.2, llama3.1, llama3, mistral, gemma2, phi3) went
172
+ * stale the moment a new version shipped, and the 2026-08-25 vetting eval showed the
173
+ * quality lever is SYNTHESIS_SYSTEM_PROMPT, not which mainstream family answers. The
174
+ * list's remaining job is "is something recognisable installed" - matched against the
175
+ * LIVE /api/tags registry, and the newest installed version wins within a family.
176
+ * (ALI-692)
177
+ */
178
+ export const OLLAMA_MODEL_FAMILIES = [
179
+ /^llama[\d.:-]/i,
180
+ /^mistral[\d.:-]/i,
181
+ /^gemma[\d.:-]/i,
182
+ /^phi[\d.:-]/i,
183
+ /^qwen[\d.:-]/i,
184
+ /^deepseek-r[\d.:-]/i,
110
185
  ];
186
+ /**
187
+ * A family match says who trained it, never what it was trained FOR, and the ALI-420
188
+ * floor is about the second: llama2-uncensored is in the llama family and is the same
189
+ * category as the pentest model from that ticket, while a coder or embedding model is
190
+ * not a synthesis model at all. So a tuning marker disqualifies a tag even when its
191
+ * family is recognised - a user can still name one explicitly via ALIGN_OLLAMA_MODEL.
192
+ */
193
+ const OLLAMA_TUNING_DISQUALIFIERS = /(coder|code|math|uncensored|embed|guard|vision|dolphin)/i;
194
+ /**
195
+ * A tag is recognised by its LAST path segment, because `ollama pull hf.co/<user>/<repo>`
196
+ * prefixes the name - anchoring at the start of the whole string refuses every model
197
+ * installed that mainstream way.
198
+ */
199
+ function ollamaTagBase(name) {
200
+ return name.split('/').pop() ?? name;
201
+ }
202
+ function isRecognisedOllamaModel(name, family) {
203
+ const base = ollamaTagBase(name);
204
+ return family.test(base) && !OLLAMA_TUNING_DISQUALIFIERS.test(base);
205
+ }
206
+ /**
207
+ * Static fallback for the "pull one" hint only - version-pinned so it is
208
+ * copy-pasteable, therefore stale by design. Resolution never consults it:
209
+ * resolveOllamaModel picks from what the live registry actually has.
210
+ */
211
+ export const RECOMMENDED_OLLAMA_PULL = 'llama3.2';
212
+ /**
213
+ * Numeric version segments from a tag name ('llama3.10:latest' -> [3, 10]).
214
+ *
215
+ * A PARAMETER SIZE is not a version, and community tags put one in the name: taking
216
+ * the first digit run makes `mistral-7b-instruct` look newer than `mistral-small3.1`,
217
+ * so any `-7b` / `_7x8b` token comes out before the version is read.
218
+ */
219
+ function modelVersionSegments(name) {
220
+ const base = (name.split(':')[0] ?? '').replace(/[-_]\d+(\.\d+)?x?\d*b\b/gi, '');
221
+ const m = base.match(/(\d+(?:\.\d+)*)/);
222
+ return m ? m[1].split('.').map(Number) : [0];
223
+ }
224
+ /** Parameter count in billions from a tag ('llama3.2:3b' -> 3), 0 when absent. */
225
+ function modelParameterBillions(name) {
226
+ const m = name.match(/(\d+(?:\.\d+)?)b\b/i);
227
+ return m ? Number(m[1]) : 0;
228
+ }
229
+ // Segment-wise, so 3.10 > 3.9 (a float parse or string sort gets it backwards).
230
+ function compareVersionSegments(a, b) {
231
+ const len = Math.max(a.length, b.length);
232
+ for (let i = 0; i < len; i++) {
233
+ const d = (a[i] ?? 0) - (b[i] ?? 0);
234
+ if (d !== 0)
235
+ return d;
236
+ }
237
+ return 0;
238
+ }
111
239
  export function resolveOllamaModel(installed, override) {
112
240
  // Named by the user, so it is their call - the contract every other provider here
113
241
  // already has via ALIGN_<PROVIDER>_MODEL.
@@ -115,60 +243,119 @@ export function resolveOllamaModel(installed, override) {
115
243
  return { ok: true, model: override };
116
244
  if (!installed.length)
117
245
  return { ok: false, reason: 'no_models' };
118
- // Iterate the VETTED list, not the installed list: `/api/tags` order is Ollama's, and
119
- // letting it pick among vetted models is the same defect one line over.
120
- for (const family of VETTED_OLLAMA_MODELS) {
121
- const match = installed.find(m => m.startsWith(family));
122
- if (match)
123
- return { ok: true, model: match };
246
+ // Iterate OUR family order, not the installed list: `/api/tags` order is Ollama's,
247
+ // and letting it pick among recognised families is the same defect one line over.
248
+ for (const family of OLLAMA_MODEL_FAMILIES) {
249
+ const matches = installed.filter(m => isRecognisedOllamaModel(m, family));
250
+ if (!matches.length)
251
+ continue;
252
+ // Newest version, then the larger model, then the name. The last two exist so the
253
+ // result cannot depend on `/api/tags` order: llama3.2:1b and llama3.2:3b tie on
254
+ // version, and a stable sort would hand that choice straight back to Ollama.
255
+ matches.sort((a, b) => compareVersionSegments(modelVersionSegments(b), modelVersionSegments(a))
256
+ || modelParameterBillions(b) - modelParameterBillions(a)
257
+ || a.localeCompare(b));
258
+ return { ok: true, model: matches[0] };
124
259
  }
125
- return { ok: false, reason: 'no_vetted_model' };
260
+ return { ok: false, reason: 'no_recognised_model' };
126
261
  }
127
- let unvettedOllamaModels = null;
128
262
  /**
129
- * The models Ollama had when it declined to answer for want of a vetted one (ALI-420),
130
- * or null when that did not happen. Read it on the failure branch to say WHY there was
131
- * no answer, the same way `hasConfiguredProvider()` is read there.
263
+ * Error-body wordings that mean PERMANENT: this key or this model cannot answer here
264
+ * however many times we ask. Providers report several of these on statuses outside
265
+ * 401/403/404 - Gemini says 400 for a bad key, OpenAI says 429 for a dead account -
266
+ * and each one, misread as transient, permanently disables every provider behind it
267
+ * in the chain. Every entry is a real provider phrasing.
132
268
  *
133
- * Recorded rather than re-probed: `tryOllama` has already fetched `/api/tags`, and
134
- * `callChat` cannot return null without running it (step 4 is unconditional), so
135
- * whenever a caller asks, the recording is from this run.
269
+ * A TRANSIENT failure must never appear here: a real rate limit, a 529 overload or a
270
+ * 5xx is the chosen provider having a bad minute, and advancing past it is the silent
271
+ * demotion this whole mechanism exists to prevent.
136
272
  */
137
- export function getUnvettedOllamaModels() {
138
- return unvettedOllamaModels;
273
+ const AVAILABILITY_BODY_PATTERNS = [
274
+ /unauthori[sz]ed/i,
275
+ /authentication[\s_-]+(failed|error)/i,
276
+ /permission[\s_-]+denied/i,
277
+ /\binvalid[\s_-]+api[\s_-]?key\b/i,
278
+ /\bapi[\s_-]?key[\s_-]+not[\s_-]+valid\b/i,
279
+ /\bunknown\s+(model|provider)\b/i,
280
+ /\binvalid\s+(model|provider)\b/i,
281
+ /\bmodel\s+not\s+(found|available|registered|supported)\b/i,
282
+ /\bno\s+such\s+(model|provider)\b/i,
283
+ /not a valid model/i,
284
+ /\bmodel_not_found\b/i,
285
+ /\binsufficient_quota\b/i,
286
+ /credit balance is too low/i,
287
+ /\bunsupported (parameter|value)\b/i,
288
+ ];
289
+ /**
290
+ * The body text a provider's error carries, WITHOUT any part of the request it may
291
+ * have echoed back. `classifyRelationship` sends a 2,000-character diff as the user
292
+ * prompt, and endpoints routinely quote the offending request in a 4xx body - so
293
+ * matching prose against the whole body lets the decision text under review decide
294
+ * whether to demote to a weaker model. Reading only the error member closes that.
295
+ *
296
+ * A non-JSON body has no error member to read, so it falls back to the raw text: the
297
+ * boundary of this defence is "the provider replied in JSON", which is all of them.
298
+ */
299
+ function providerErrorText(body) {
300
+ try {
301
+ const parsed = JSON.parse(body);
302
+ if (typeof parsed !== 'object' || parsed === null)
303
+ return body;
304
+ const err = parsed.error;
305
+ if (err === undefined)
306
+ return body;
307
+ return typeof err === 'string' ? err : JSON.stringify(err);
308
+ }
309
+ catch {
310
+ return body;
311
+ }
139
312
  }
140
- /** Test seam: clears the recording above between cases. */
141
- export function resetOllamaDiagnostics() {
142
- unvettedOllamaModels = null;
313
+ /**
314
+ * Only failures on this allowlist may advance the fallback chain: they mean the chosen
315
+ * model can NEVER answer in this environment (bad key, no such model, no credit), so
316
+ * trying the next provider loses nothing. Anything else - a malformed body, an empty
317
+ * answer, a real rate limit, a 5xx - came from the provider the user chose, and
318
+ * silently demoting to a weaker model would launder that failure into an answer the
319
+ * caller trusts as if the chosen model wrote it. Deliberately conservative (ALI-692).
320
+ */
321
+ export function isAvailabilityFailure(status, body) {
322
+ if (status === 401 || status === 403 || status === 404)
323
+ return true;
324
+ const text = providerErrorText(body);
325
+ return AVAILABILITY_BODY_PATTERNS.some(p => p.test(text));
143
326
  }
144
327
  async function tryOllama(system, user, temperature) {
145
- const host = process.env['OLLAMA_HOST'] ?? 'http://localhost:11434';
146
- // Clear first, so the recording always describes THIS attempt. Without it a refusal
147
- // from an earlier call in the same process outlives its cause, and a later failure
148
- // with a different cause inherits the wrong diagnosis.
149
- unvettedOllamaModels = null;
328
+ // `||`, not `??`: OLLAMA_HOST='' (a stock .env template, an unset compose variable)
329
+ // would otherwise make every probe a relative URL that fetch cannot parse, so a
330
+ // healthy local Ollama is never asked and the user is told to configure a key.
331
+ const host = process.env['OLLAMA_HOST'] || 'http://localhost:11434';
332
+ // The /api/tags probe is discovery, not a model answering: every way it can fail
333
+ // (not running, no models, nothing recognised) means "no usable model here".
150
334
  let model;
151
335
  try {
152
336
  const tagsRes = await fetch(`${host}/api/tags`, { signal: AbortSignal.timeout(2000) });
153
337
  if (!tagsRes.ok)
154
- return null;
338
+ return { kind: 'unavailable', detail: 'tags probe failed' };
155
339
  const tags = await tagsRes.json();
156
340
  const models = (tags.models ?? []).map(m => m.name);
157
341
  if (!models.length)
158
- return null;
342
+ return { kind: 'unavailable', detail: 'no models installed' };
159
343
  const choice = resolveOllamaModel(models, process.env['ALIGN_OLLAMA_MODEL']);
160
344
  if (!choice.ok) {
161
- if (choice.reason === 'no_vetted_model')
162
- unvettedOllamaModels = models;
163
- return null;
345
+ // The models travel WITH the outcome, so the caller that asked gets them - see
346
+ // LlmFailure. A module variable here could be cleared by a concurrent call.
347
+ return choice.reason === 'no_recognised_model'
348
+ ? { kind: 'unavailable', detail: choice.reason, unrecognisedModels: models }
349
+ : { kind: 'unavailable', detail: choice.reason };
164
350
  }
165
351
  model = choice.model;
166
352
  }
167
- catch {
168
- return null;
353
+ catch (err) {
354
+ return { kind: 'unavailable', detail: String(err) };
169
355
  }
356
+ let res;
170
357
  try {
171
- const res = await fetch(`${host}/api/chat`, {
358
+ res = await fetch(`${host}/api/chat`, {
172
359
  method: 'POST',
173
360
  headers: { 'Content-Type': 'application/json' },
174
361
  body: JSON.stringify({
@@ -182,14 +369,19 @@ async function tryOllama(system, user, temperature) {
182
369
  }),
183
370
  signal: AbortSignal.timeout(30000),
184
371
  });
185
- if (!res.ok)
186
- return null;
187
- const data = await res.json();
188
- return data.message?.content?.trim() ?? null;
189
372
  }
190
- catch {
191
- return null;
373
+ catch (err) {
374
+ // Past selection, Ollama is a CHOSEN provider like any other, so every failure here
375
+ // must be attributable: an unrecorded stop sends the caller to the generic "set a
376
+ // key" hint, which is nonsense for a user whose local model just replied. A cold
377
+ // 7B commonly exceeds the 30s budget on its first load, and that is the model's
378
+ // failure to name, not an absent provider.
379
+ const name = err?.name;
380
+ return { kind: 'failed', model, detail: name === 'TimeoutError' || name === 'AbortError' ? 'timed out' : 'unreachable' };
192
381
  }
382
+ if (!res.ok)
383
+ return { kind: 'failed', model, detail: `HTTP ${res.status}` };
384
+ return parseAdapterResponse(res, model, d => d.message?.content);
193
385
  }
194
386
  /** Normalize a base URL into a full Chat Completions endpoint. */
195
387
  function chatCompletionsUrl(base) {
@@ -200,10 +392,12 @@ function keyForProvider(provider) {
200
392
  switch (provider) {
201
393
  case 'anthropic': return process.env['ANTHROPIC_API_KEY'];
202
394
  case 'openai': return process.env['OPENAI_API_KEY'];
203
- case 'gemini': return process.env['GEMINI_API_KEY'] ?? process.env['GOOGLE_API_KEY'];
395
+ // `||` on the aliases: an empty GEMINI_API_KEY must not shadow a real GOOGLE_API_KEY
396
+ // (a stock .env template ships both names), which `??` would do silently.
397
+ case 'gemini': return process.env['GEMINI_API_KEY'] || process.env['GOOGLE_API_KEY'];
204
398
  case 'groq': return process.env['GROQ_API_KEY'];
205
399
  case 'mistral': return process.env['MISTRAL_API_KEY'];
206
- case 'grok': return process.env['GROK_API_KEY'] ?? process.env['XAI_API_KEY'];
400
+ case 'grok': return process.env['GROK_API_KEY'] || process.env['XAI_API_KEY'];
207
401
  }
208
402
  }
209
403
  async function callProvider(provider, key, system, user, maxTokens, temperature) {
@@ -211,24 +405,26 @@ async function callProvider(provider, key, system, user, maxTokens, temperature)
211
405
  case 'anthropic':
212
406
  return tryAnthropic(system, user, key, maxTokens, temperature);
213
407
  case 'openai':
214
- return tryOpenAiCompatible(system, user, 'https://api.openai.com/v1/chat/completions', process.env['ALIGN_OPENAI_MODEL'] ?? 'gpt-4o-mini', key, maxTokens, undefined, temperature);
408
+ return tryOpenAiCompatible(system, user, 'https://api.openai.com/v1/chat/completions', process.env['ALIGN_OPENAI_MODEL'] || 'gpt-4o-mini', key, maxTokens, undefined, temperature);
215
409
  case 'gemini':
216
410
  return tryGemini(system, user, key, maxTokens, temperature);
217
411
  case 'groq':
218
- return tryOpenAiCompatible(system, user, 'https://api.groq.com/openai/v1/chat/completions', process.env['ALIGN_GROQ_MODEL'] ?? 'llama-3.1-8b-instant', key, maxTokens, undefined, temperature);
412
+ return tryOpenAiCompatible(system, user, 'https://api.groq.com/openai/v1/chat/completions', process.env['ALIGN_GROQ_MODEL'] || 'llama-3.1-8b-instant', key, maxTokens, undefined, temperature);
219
413
  case 'mistral':
220
- return tryOpenAiCompatible(system, user, 'https://api.mistral.ai/v1/chat/completions', process.env['ALIGN_MISTRAL_MODEL'] ?? 'mistral-small-latest', key, maxTokens, undefined, temperature);
414
+ return tryOpenAiCompatible(system, user, 'https://api.mistral.ai/v1/chat/completions', process.env['ALIGN_MISTRAL_MODEL'] || 'mistral-small-latest', key, maxTokens, undefined, temperature);
221
415
  case 'grok':
222
- return tryOpenAiCompatible(system, user, 'https://api.x.ai/v1/chat/completions', process.env['ALIGN_GROK_MODEL'] ?? 'grok-2-latest', key, maxTokens, undefined, temperature);
416
+ return tryOpenAiCompatible(system, user, 'https://api.x.ai/v1/chat/completions', process.env['ALIGN_GROK_MODEL'] || 'grok-2-latest', key, maxTokens, undefined, temperature);
223
417
  }
224
418
  }
225
419
  const ALL_PROVIDERS = ['anthropic', 'openai', 'gemini', 'groq', 'mistral', 'grok'];
226
420
  /**
227
421
  * Is any LLM provider configured by environment? (ALI-414)
228
422
  *
229
- * `callChat` returns null for a missing key, a timeout and a non-2xx alike, so a
230
- * caller that needs to tell "never configured" from "configured but failed" has to
231
- * ask first. Deliberately synchronous and env-only: it does NOT probe Ollama, so a
423
+ * `callChat` returns null for a missing key and for a provider that answered unusably
424
+ * alike, so a caller that needs to tell "never configured" from "configured but
425
+ * failed" has to ask - this, then the failure `callChatDetailed` returned for the
426
+ * second case, which is the one this function cannot see. Deliberately synchronous and
427
+ * env-only: it does NOT probe Ollama, so a
232
428
  * machine whose only provider is a broken local Ollama reads as unconfigured. The
233
429
  * remedy that points at - configure a provider - is still the right one.
234
430
  */
@@ -244,25 +440,51 @@ export function hasConfiguredProvider() {
244
440
  * Together, DeepSeek, LM Studio, vLLM, ...) via ALIGN_LLM_MODEL/ALIGN_LLM_API_KEY
245
441
  * 3. named providers by env key (Anthropic, OpenAI, Gemini, Groq, Mistral, Grok)
246
442
  * 4. local Ollama (no key)
247
- * Returns the model's text, or null if nothing is available (callers fall back).
443
+ * Returns the model's text, or the reason there is none - see LlmFailure. The reason
444
+ * is RETURNED rather than recorded in module state, so concurrent calls cannot read
445
+ * each other's diagnosis.
446
+ *
447
+ * ALI-692: only an availability-class failure advances that chain (see
448
+ * isAvailabilityFailure). Anything else - the chosen model answering unusably, a rate
449
+ * limit, a 5xx - stops it, so the caller can name the model that failed instead of a
450
+ * weaker one answering in its place.
248
451
  */
249
- export async function callChat(system, user, opts) {
452
+ export async function callChatDetailed(system, user, opts) {
250
453
  const maxTokens = opts?.maxTokens;
251
454
  const temperature = opts?.temperature;
455
+ // The most specific unavailability seen while walking the chain. Only Ollama can
456
+ // produce one today, and it is a local (not module) variable, so a sibling call
457
+ // cannot clear it mid-flight - which is the whole point of this shape.
458
+ let unrecognised;
459
+ // An answer or a stop settles the chain; availability advances it (undefined).
460
+ const settle = (outcome, provider) => {
461
+ if (outcome.kind === 'answer')
462
+ return { ok: true, text: outcome.text };
463
+ if (outcome.kind === 'failed') {
464
+ return { ok: false, failure: { kind: 'provider_stopped', provider, model: outcome.model, detail: outcome.detail } };
465
+ }
466
+ // Narrowed to `unavailable` by the two returns above, so reading its own field
467
+ // needs no guard. Deliberately left to exhaustion rather than an explicit
468
+ // `kind === 'unavailable'` check: a fourth AdapterOutcome variant would make this
469
+ // line a type error, where an explicit check would silently route it to advance.
470
+ if (outcome.unrecognisedModels)
471
+ unrecognised = outcome.unrecognisedModels;
472
+ return undefined;
473
+ };
252
474
  // 1. configured provider (from align setup) takes priority
253
475
  if (opts?.provider && opts.apiKey) {
254
- const result = await callProvider(opts.provider, opts.apiKey, system, user, maxTokens, temperature);
255
- if (result)
256
- return result;
476
+ const settled = settle(await callProvider(opts.provider, opts.apiKey, system, user, maxTokens, temperature), opts.provider);
477
+ if (settled)
478
+ return settled;
257
479
  }
258
480
  // 2. generic OpenAI-compatible escape hatch - covers any provider
259
481
  const baseUrl = process.env['ALIGN_LLM_BASE_URL'];
260
482
  if (baseUrl) {
261
483
  const key = process.env['ALIGN_LLM_API_KEY'] ?? '';
262
- const model = process.env['ALIGN_LLM_MODEL'] ?? 'gpt-4o-mini';
263
- const result = await tryOpenAiCompatible(system, user, chatCompletionsUrl(baseUrl), model, key, maxTokens, undefined, temperature);
264
- if (result)
265
- return result;
484
+ const model = process.env['ALIGN_LLM_MODEL'] || 'gpt-4o-mini';
485
+ const settled = settle(await tryOpenAiCompatible(system, user, chatCompletionsUrl(baseUrl), model, key, maxTokens, undefined, temperature), 'custom');
486
+ if (settled)
487
+ return settled;
266
488
  }
267
489
  // 3. named providers via env keys, in priority order
268
490
  for (const provider of ALL_PROVIDERS) {
@@ -270,17 +492,34 @@ export async function callChat(system, user, opts) {
270
492
  continue; // already tried above
271
493
  const key = keyForProvider(provider);
272
494
  if (key) {
273
- const result = await callProvider(provider, key, system, user, maxTokens, temperature);
274
- if (result)
275
- return result;
495
+ const settled = settle(await callProvider(provider, key, system, user, maxTokens, temperature), provider);
496
+ if (settled)
497
+ return settled;
276
498
  }
277
499
  }
278
500
  // 4. local Ollama as last resort
279
- return tryOllama(system, user, temperature);
501
+ const settled = settle(await tryOllama(system, user, temperature), 'ollama');
502
+ if (settled)
503
+ return settled;
504
+ // Nothing answered. An unrecognised local model is the more specific diagnosis and
505
+ // its remedy is the opposite of "configure a provider", so it wins (ALI-420).
506
+ return unrecognised
507
+ ? { ok: false, failure: { kind: 'unrecognised_local_models', models: unrecognised } }
508
+ : { ok: false, failure: { kind: 'no_provider' } };
509
+ }
510
+ /** Text-only convenience wrapper. Use callChatDetailed when you need to say WHY. */
511
+ export async function callChat(system, user, opts) {
512
+ const result = await callChatDetailed(system, user, opts);
513
+ return result.ok ? result.text : null;
280
514
  }
281
515
  /** Synthesise a natural-language answer from retrieved decisions, using any configured provider. */
282
- export async function synthesiseLocally(question, decisions, options) {
516
+ export async function synthesiseDetailed(question, decisions, options) {
283
517
  const user = buildUserPrompt(question, decisions);
284
- return callChat(SYNTHESIS_SYSTEM_PROMPT, user, { provider: options?.provider, apiKey: options?.apiKey });
518
+ return callChatDetailed(SYNTHESIS_SYSTEM_PROMPT, user, { provider: options?.provider, apiKey: options?.apiKey });
519
+ }
520
+ /** Text-only wrapper on synthesiseDetailed, for callers that cannot use the reason. */
521
+ export async function synthesiseLocally(question, decisions, options) {
522
+ const result = await synthesiseDetailed(question, decisions, options);
523
+ return result.ok ? result.text : null;
285
524
  }
286
525
  //# sourceMappingURL=local-llm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-llm.js","sourceRoot":"","sources":["../../src/lib/local-llm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-llm.js","sourceRoot":"","sources":["../../src/lib/local-llm.ts"],"names":[],"mappings":"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"}