modelrig 0.3.0 → 0.4.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.
Files changed (78) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/README.md +66 -14
  3. package/dist/adapters/deepseek.d.ts.map +1 -1
  4. package/dist/adapters/deepseek.js +8 -1
  5. package/dist/adapters/gemini.d.ts +6 -0
  6. package/dist/adapters/gemini.d.ts.map +1 -1
  7. package/dist/adapters/gemini.js +14 -4
  8. package/dist/adapters/grok.d.ts +7 -0
  9. package/dist/adapters/grok.d.ts.map +1 -1
  10. package/dist/adapters/grok.js +23 -1
  11. package/dist/adapters/openai-compat.d.ts +7 -0
  12. package/dist/adapters/openai-compat.d.ts.map +1 -1
  13. package/dist/adapters/openai-compat.js +24 -1
  14. package/dist/adapters/openai.d.ts +7 -0
  15. package/dist/adapters/openai.d.ts.map +1 -1
  16. package/dist/adapters/openai.js +23 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +5 -4
  19. package/dist/config.d.ts +7 -1
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/index.d.ts +6 -6
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +28 -25
  24. package/dist/init/init-cli.d.ts.map +1 -1
  25. package/dist/init/init-cli.js +2 -1
  26. package/dist/init/observe-cli.d.ts.map +1 -1
  27. package/dist/init/observe-cli.js +2 -1
  28. package/dist/routes/sampling-config.d.ts.map +1 -1
  29. package/dist/routes/sampling-config.js +11 -0
  30. package/dist/run/dispatch.d.ts +14 -2
  31. package/dist/run/dispatch.d.ts.map +1 -1
  32. package/dist/run/dispatch.js +31 -2
  33. package/dist/run/ladder-key.d.ts +40 -0
  34. package/dist/run/ladder-key.d.ts.map +1 -0
  35. package/dist/run/ladder-key.js +39 -0
  36. package/dist/run/raw-support.d.ts +123 -0
  37. package/dist/run/raw-support.d.ts.map +1 -0
  38. package/dist/run/raw-support.js +150 -0
  39. package/dist/run/raw.d.ts +41 -11
  40. package/dist/run/raw.d.ts.map +1 -1
  41. package/dist/run/raw.js +67 -23
  42. package/dist/run/rawonly.d.ts +60 -0
  43. package/dist/run/rawonly.d.ts.map +1 -0
  44. package/dist/run/rawonly.js +120 -0
  45. package/dist/run/record-attempt.d.ts +14 -1
  46. package/dist/run/record-attempt.d.ts.map +1 -1
  47. package/dist/run/record-attempt.js +43 -2
  48. package/dist/run/resolve.d.ts +4 -0
  49. package/dist/run/resolve.d.ts.map +1 -1
  50. package/dist/run/resolve.js +9 -2
  51. package/dist/run/routing-docs.d.ts +73 -0
  52. package/dist/run/routing-docs.d.ts.map +1 -0
  53. package/dist/run/routing-docs.js +222 -0
  54. package/dist/run/run.d.ts.map +1 -1
  55. package/dist/run/run.js +24 -22
  56. package/dist/telemetry/exporter.d.ts.map +1 -1
  57. package/dist/telemetry/exporter.js +6 -0
  58. package/dist/telemetry/ingest-protocol.d.ts +7 -0
  59. package/dist/telemetry/ingest-protocol.d.ts.map +1 -1
  60. package/dist/telemetry/load-error-report.d.ts.map +1 -1
  61. package/dist/telemetry/load-error-report.js +4 -1
  62. package/dist/telemetry/otel-map.d.ts.map +1 -1
  63. package/dist/telemetry/otel-map.js +8 -0
  64. package/dist/telemetry/store-migrations.d.ts +15 -0
  65. package/dist/telemetry/store-migrations.d.ts.map +1 -0
  66. package/dist/telemetry/store-migrations.js +119 -0
  67. package/dist/telemetry/store.d.ts.map +1 -1
  68. package/dist/telemetry/store.js +26 -93
  69. package/dist/types/failures-teaching.js +1 -1
  70. package/dist/types/provider.d.ts +13 -0
  71. package/dist/types/provider.d.ts.map +1 -1
  72. package/dist/types/route.d.ts +6 -1
  73. package/dist/types/route.d.ts.map +1 -1
  74. package/dist/types/telemetry.d.ts +31 -0
  75. package/dist/types/telemetry.d.ts.map +1 -1
  76. package/dist/validate-cli.d.ts.map +1 -1
  77. package/dist/validate-cli.js +17 -4
  78. package/package.json +1 -1
package/dist/run/run.js CHANGED
@@ -24,6 +24,7 @@ const grounding_1 = require("./grounding");
24
24
  const validate_1 = require("./validate");
25
25
  const dispatch_1 = require("./dispatch");
26
26
  const record_attempt_1 = require("./record-attempt");
27
+ const ladder_key_1 = require("./ladder-key");
27
28
  const run_context_1 = require("../artifacts/run-context");
28
29
  const capture_write_1 = require("./capture-write");
29
30
  /** Look up a named variant; null = default (base config). Unknown names are
@@ -62,19 +63,6 @@ function effectiveRoute(route, variant) {
62
63
  const USER_DIRECTIVE = "Produce the required output now, following the system instructions exactly.";
63
64
  /** User turn for repair calls (WS2) — same terse-trigger convention. */
64
65
  const REPAIR_DIRECTIVE = "Produce the corrected JSON object now, following the system instructions exactly.";
65
- /** Schema coaching for the json_mode rung — ported from the production
66
- * DeepSeek provider's schema-in-prompt guidance (minLength-is-a-FLOOR etc.). */
67
- function jsonModeCoaching(schema) {
68
- return ("\n\n---\nOUTPUT FORMAT (STRICT): Respond with a SINGLE valid JSON object and nothing else — " +
69
- 'no markdown fences, no introductory text, no sign-off. Your response MUST start with "{" and ' +
70
- 'end with "}". Sanitize every nested string so embedded quotes/brackets do not break the root ' +
71
- "JSON escaping. The object MUST conform to this JSON Schema — match key names and types " +
72
- "EXACTLY, include ALL required fields, and do not add commentary fields. CRITICAL: where the " +
73
- "schema sets a minLength on a narrative/prose field, that is a FLOOR, not a target — write " +
74
- "thorough, non-repetitive analysis that comfortably EXCEEDS the minimum (do not pad with " +
75
- "repetition; add real substance). When unsure how long to make a prose field, write more, " +
76
- `not less:\n\n${JSON.stringify(schema)}`);
77
- }
78
66
  /** prefer:[cost] ordering metric — combined input+output USD per million
79
67
  * tokens from the pricing snapshot; null (unknown) sorts last in resolve. */
80
68
  function costPerMTok(provider, model) {
@@ -109,6 +97,9 @@ async function run(deps, routeName, opts) {
109
97
  // it (attempt-per-row, ruling c). Inert without a run.start on this path.
110
98
  const runCtx = (0, run_context_1.getActiveRunContext)();
111
99
  const autoStepKey = runCtx !== null ? runCtx.nextStepKey(route.route) : null;
100
+ // Per-call ladder key (spec §2.1 R0): one call_id, a monotonic attempt_seq per
101
+ // row, and the current candidate_index (advanced by nextCandidate below).
102
+ const ladder = (0, ladder_key_1.createLadderKeyMinter)();
112
103
  // Capture-WRITE gate (settings-plane §1.5, closes gate 5): the control-plane
113
104
  // capture flag wins over the YAML flag, the task's scrub setting is honored,
114
105
  // and capture OFF is a no-op writer (byte-identical). See ./capture-write.ts.
@@ -126,6 +117,7 @@ async function run(deps, routeName, opts) {
126
117
  autoStepKey,
127
118
  cache: opts.cache,
128
119
  droppedCacheHandle,
120
+ ladder,
129
121
  });
130
122
  function failRun(candidate, failure, latencyMs) {
131
123
  recordAttempt({
@@ -254,6 +246,7 @@ async function run(deps, routeName, opts) {
254
246
  attemptsByClass: ledger.snapshot(),
255
247
  servedVariant,
256
248
  repairedBy,
249
+ callId: ladder.callId,
257
250
  ...(injectedSources !== null
258
251
  ? { citations: (0, grounding_1.extractCitations)(result.text, injectedSources) }
259
252
  : {}),
@@ -263,7 +256,14 @@ async function run(deps, routeName, opts) {
263
256
  }
264
257
  const searchAvailable = deps.search !== undefined && deps.search !== null;
265
258
  const iter = (0, resolve_1.resolveCandidates)(route, deps.capabilities, costPerMTok, searchAvailable, (0, resolve_1.candidateFilterFromOptions)(opts));
266
- let candidate = iter.next();
259
+ // Advance the iterator AND publish the served candidate's index to the ladder,
260
+ // so every row of this candidate's turn (incl. repair rows) carries it (§2.1).
261
+ const nextCandidate = () => {
262
+ const c = iter.next();
263
+ ladder.setCandidateIndex(iter.index);
264
+ return c;
265
+ };
266
+ let candidate = nextCandidate();
267
267
  if (candidate === null) {
268
268
  throw new loader_1.RouteConfigError(`route "${route.route}" has no eligible candidate — none of the declared candidates ` +
269
269
  `satisfy require=[${route.require.join(", ")}] with json=${route.policy.json}${(0, resolve_1.filterSummary)(opts)}`);
@@ -294,7 +294,7 @@ async function run(deps, routeName, opts) {
294
294
  // the next (the invariant guard above already OK'd the pair); nothing
295
295
  // dispatched, so nothing billed. All-inert surfaces via the final throw.
296
296
  lastFailure = (0, serveability_1.inertCandidateFailure)(candidate, route.route);
297
- candidate = iter.next();
297
+ candidate = nextCandidate();
298
298
  continue;
299
299
  }
300
300
  // Render against the SERVING candidate's capability flags.
@@ -324,14 +324,13 @@ async function run(deps, routeName, opts) {
324
324
  try {
325
325
  searchResponse = await deps.search.search(query);
326
326
  guard?.settle(searchResponse.costUsd);
327
- (0, dispatch_1.recordSearchCostRow)(deps.telemetry, route, effectiveTags, servedVariant, deps.search.id, searchResponse.costUsd);
327
+ (0, dispatch_1.recordSearchCostRow)(deps.telemetry, route, effectiveTags, servedVariant, deps.search.id, searchResponse.costUsd, ladder);
328
328
  }
329
329
  catch (err) {
330
330
  const failure = {
331
331
  class: "network",
332
332
  message: `grounding search failed: ${err instanceof Error ? err.message : String(err)}`,
333
- fixHint: "check the search provider key/config (RigConfig.search)",
334
- cause: err,
333
+ fixHint: "check the search provider key/config (RigConfig.search)", cause: err,
335
334
  };
336
335
  recordAttempt({
337
336
  candidate,
@@ -342,13 +341,14 @@ async function run(deps, routeName, opts) {
342
341
  costUsd: 0,
343
342
  latencyMs: 0,
344
343
  failure,
344
+ rung: "search", // the SEARCH failed, no model was asked — never a candidate dispatch
345
345
  });
346
346
  lastFailure = failure;
347
347
  if (ledger.consume("network")) {
348
348
  await sleep(ledger.delayMs("network"));
349
349
  continue;
350
350
  }
351
- candidate = iter.next();
351
+ candidate = nextCandidate();
352
352
  continue;
353
353
  }
354
354
  }
@@ -360,7 +360,7 @@ async function run(deps, routeName, opts) {
360
360
  const useJsonModeCoaching = route.outputSchema !== null &&
361
361
  (route.policy.json === "json_mode" || !flags.has("structured_native"));
362
362
  if (useJsonModeCoaching) {
363
- systemPrompt += jsonModeCoaching(route.outputSchema);
363
+ systemPrompt += (0, dispatch_1.jsonModeCoaching)(route.outputSchema);
364
364
  }
365
365
  // Envelope precheck BEFORE dispatch — upper-bound estimate from the
366
366
  // pricing snapshot (prompt-length input + full output budget).
@@ -404,6 +404,7 @@ async function run(deps, routeName, opts) {
404
404
  attemptsByClass: ledger.snapshot(),
405
405
  servedVariant,
406
406
  pricingMissing,
407
+ callId: ladder.callId,
407
408
  });
408
409
  }
409
410
  const outcome = (0, validate_1.validateOutput)(route, result.text);
@@ -440,6 +441,7 @@ async function run(deps, routeName, opts) {
440
441
  attemptsByClass: ledger.snapshot(),
441
442
  servedVariant,
442
443
  repairedBy: null,
444
+ callId: ladder.callId,
443
445
  ...(injectedSources !== null
444
446
  ? { citations: (0, grounding_1.extractCitations)(result.text, injectedSources) }
445
447
  : {}),
@@ -491,7 +493,7 @@ async function run(deps, routeName, opts) {
491
493
  if (ledger.consume("content_invalid")) {
492
494
  continue; // retry the SAME candidate until the class budget is spent
493
495
  }
494
- candidate = iter.next(); // then advance within the declared set
496
+ candidate = nextCandidate(); // then advance within the declared set
495
497
  continue;
496
498
  }
497
499
  // Adapter-level typed failure. F1: refusals/truncations that BILLED
@@ -531,7 +533,7 @@ async function run(deps, routeName, opts) {
531
533
  await sleep(ledger.delayMs(failure.class));
532
534
  continue; // retry the SAME candidate
533
535
  }
534
- candidate = iter.next(); // class budget spent — advance candidate
536
+ candidate = nextCandidate(); // class budget spent — advance candidate
535
537
  }
536
538
  throw new failures_1.RigFailureError(lastFailure ?? {
537
539
  class: "network",
@@ -1 +1 @@
1
- {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../src/telemetry/exporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../src/telemetry/exporter.ts"],"names":[],"mappings":"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"}
@@ -94,6 +94,12 @@ function toWireInference(row) {
94
94
  tokens_cache_write_1h: row.tokensCacheWrite1h ?? 0,
95
95
  cache_key: row.cacheKey ?? null,
96
96
  prefix_fingerprint: row.prefixFingerprint ?? null,
97
+ // Ladder key (spec §2.1 R0) — spread-iff-present: a row without it (pre-0.4.0
98
+ // SDK, read back as null) emits NO key, so the wire payload is byte-identical
99
+ // to before R0 and the server leaves the column null.
100
+ ...(row.callId != null ? { call_id: row.callId } : {}),
101
+ ...(row.attemptSeq != null ? { attempt_seq: row.attemptSeq } : {}),
102
+ ...(row.candidateIndex != null ? { candidate_index: row.candidateIndex } : {}),
97
103
  };
98
104
  }
99
105
  function toWireRun(row) {
@@ -83,6 +83,13 @@ export interface WireInference {
83
83
  readonly tokens_cache_write_1h?: number;
84
84
  readonly cache_key?: string | null;
85
85
  readonly prefix_fingerprint?: string | null;
86
+ /** Per-call ladder key (routing-console spec §2.1 R0). OPTIONAL on the wire and
87
+ * OMITTED when unset (spread-iff-present in the exporter), so an older SDK's
88
+ * payload is byte-identical and the server defaults the columns to null.
89
+ * `attempt_seq ≥ 1`, `candidate_index ≥ 0` (ingest.validInference). */
90
+ readonly call_id?: string;
91
+ readonly attempt_seq?: number;
92
+ readonly candidate_index?: number;
86
93
  }
87
94
  export interface WireFeedback {
88
95
  readonly id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ingest-protocol.d.ts","sourceRoot":"","sources":["../../src/telemetry/ingest-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,oDAAoD;AACpD,eAAO,MAAM,WAAW,eAAe,CAAC;AAExC;;;;6DAI6D;AAC7D,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;+EAE+E;AAC/E,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAE5D;kBACkB;AAClB,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;;;+EAG2E;IAC3E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;gFAC4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;2EAIuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IACtC;sBACkB;IAClB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;oDAEoD;AACpD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;CACnE;AAED;;;;;oEAKoE;AACpE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,UAAU,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;oEAEoE;AACpE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;;yEAGqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC;CAC5C;AAED;;;;kBAIkB;AAClB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;0CAG0C;AAC1C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,eAAe,GAAG,aAAa,GAAG,OAAO,CAAC;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1C;;;;wBAIoB;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CAC3C;AAED;gDACgD;AAChD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB;;8CAE0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC;gFAC4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAClE;oFACgF;IAChF,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;mEACmE;AACnE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAClD,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;2EACuE;IACvE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,EAAE,CAgT7E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,YAAY,EAAE,EAC7B,QAAQ,EAAE,MAAM,GACf,SAAS,MAAM,EAAE,CAInB;AAED;;oBAEoB;AACpB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD;qCACiC;IACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD"}
1
+ {"version":3,"file":"ingest-protocol.d.ts","sourceRoot":"","sources":["../../src/telemetry/ingest-protocol.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"load-error-report.d.ts","sourceRoot":"","sources":["../../src/telemetry/load-error-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOpD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAoBhF"}
1
+ {"version":3,"file":"load-error-report.d.ts","sourceRoot":"","sources":["../../src/telemetry/load-error-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOpD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAsBhF"}
@@ -35,7 +35,10 @@ function reportLoadError(config, error) {
35
35
  // name/dimensions/contribution so the reporting upsert doesn't blank them.
36
36
  let manifestMeta = null;
37
37
  try {
38
- manifestMeta = (0, manifest_1.loadManifest)((0, node_path_1.dirname)(config.routesDir));
38
+ // routesDir === null is a runRaw-only rig with no manifest (CE-8); it never
39
+ // reaches here (load errors come from the string path), so null ⇒ no meta.
40
+ if (config.routesDir !== null)
41
+ manifestMeta = (0, manifest_1.loadManifest)((0, node_path_1.dirname)(config.routesDir));
39
42
  }
40
43
  catch {
41
44
  // rig.yaml is itself broken/absent; fall back to source-id naming so the
@@ -1 +1 @@
1
- {"version":3,"file":"otel-map.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel-map.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"otel-map.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel-map.ts"],"names":[],"mappings":"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"}
@@ -146,6 +146,14 @@ function inferenceToSpan(row) {
146
146
  attrs.push(strAttr("modelrig.served_variant", row.servedVariant));
147
147
  if (row.repairedBy !== null)
148
148
  attrs.push(strAttr("modelrig.repaired_by", row.repairedBy));
149
+ // Per-call ladder key (spec §2.1 R0) — emitted only when present, so a pre-0.4.0
150
+ // row's span is byte-identical to before R0.
151
+ if (row.callId != null)
152
+ attrs.push(strAttr("modelrig.call_id", row.callId));
153
+ if (row.attemptSeq != null)
154
+ attrs.push(intAttr("modelrig.attempt_seq", row.attemptSeq));
155
+ if (row.candidateIndex != null)
156
+ attrs.push(intAttr("modelrig.candidate_index", row.candidateIndex));
149
157
  if (row.fingerprintCell !== null) {
150
158
  // Irreversible by construction (a schema hash) — safe to emit (spec §3).
151
159
  attrs.push(strAttr("modelrig.fingerprint_cell", row.fingerprintCell));
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SQLite telemetry-store migration ladder — extracted from store.ts.
3
+ *
4
+ * Every rung is idempotent on every open: a FRESH database gets the full current
5
+ * schema from `SCHEMA_SQL` (store.ts) and each rung only stamps `user_version`;
6
+ * an OLDER database (whose CREATEs were no-ops) gains the additive columns via
7
+ * `ALTER TABLE … ADD COLUMN`, existing rows reading the nullable/default value.
8
+ * The ladder lives here so store.ts stays under the LOC cap and a new schema
9
+ * epoch is one self-contained rung to add.
10
+ */
11
+ import type Database from "better-sqlite3";
12
+ /** Apply every pending schema migration to an open telemetry database. Safe to
13
+ * call on every open (idempotent). */
14
+ export declare function runStoreMigrations(db: Database.Database): void;
15
+ //# sourceMappingURL=store-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-migrations.d.ts","sourceRoot":"","sources":["../../src/telemetry/store-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;sCACsC;AACtC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAuG9D"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * SQLite telemetry-store migration ladder — extracted from store.ts.
4
+ *
5
+ * Every rung is idempotent on every open: a FRESH database gets the full current
6
+ * schema from `SCHEMA_SQL` (store.ts) and each rung only stamps `user_version`;
7
+ * an OLDER database (whose CREATEs were no-ops) gains the additive columns via
8
+ * `ALTER TABLE … ADD COLUMN`, existing rows reading the nullable/default value.
9
+ * The ladder lives here so store.ts stays under the LOC cap and a new schema
10
+ * epoch is one self-contained rung to add.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.runStoreMigrations = runStoreMigrations;
14
+ /** Apply every pending schema migration to an open telemetry database. Safe to
15
+ * call on every open (idempotent). */
16
+ function runStoreMigrations(db) {
17
+ // v1 databases (tables pre-existing, so SCHEMA_SQL's CREATEs were no-ops) gain
18
+ // the fingerprint_cell column additively — existing rows read it as NULL.
19
+ if (db.pragma("user_version", { simple: true }) < 2) {
20
+ const columns = db.prepare("PRAGMA table_info(inferences)").all();
21
+ if (!columns.some((c) => c.name === "fingerprint_cell")) {
22
+ db.exec("ALTER TABLE inferences ADD COLUMN fingerprint_cell TEXT");
23
+ }
24
+ db.pragma("user_version = 2");
25
+ }
26
+ // v3 (Phase 3): captures table (from SCHEMA_SQL — a no-op CREATE on fresh
27
+ // databases) + the variant/repair columns, additive and nullable.
28
+ if (db.pragma("user_version", { simple: true }) < 3) {
29
+ const columns = db.prepare("PRAGMA table_info(inferences)").all();
30
+ if (!columns.some((c) => c.name === "served_variant")) {
31
+ db.exec("ALTER TABLE inferences ADD COLUMN served_variant TEXT");
32
+ }
33
+ if (!columns.some((c) => c.name === "repaired_by")) {
34
+ db.exec("ALTER TABLE inferences ADD COLUMN repaired_by TEXT");
35
+ }
36
+ db.pragma("user_version = 3");
37
+ }
38
+ // v4 (addendum A1): pricing_missing flag — additive; old rows read false.
39
+ if (db.pragma("user_version", { simple: true }) < 4) {
40
+ const columns = db.prepare("PRAGMA table_info(inferences)").all();
41
+ if (!columns.some((c) => c.name === "pricing_missing")) {
42
+ db.exec("ALTER TABLE inferences ADD COLUMN pricing_missing INTEGER NOT NULL DEFAULT 0");
43
+ }
44
+ db.pragma("user_version = 4");
45
+ }
46
+ // v5 (Phase 4 WS2): feedback table — purely additive; SCHEMA_SQL's
47
+ // CREATE IF NOT EXISTS handles fresh AND migrating databases identically, so
48
+ // the bump only stamps the version.
49
+ if (db.pragma("user_version", { simple: true }) < 5) {
50
+ db.pragma("user_version = 5");
51
+ }
52
+ // v6 (Phase 4 WS3): ttfb_ms — additive, nullable; old rows read null.
53
+ if (db.pragma("user_version", { simple: true }) < 6) {
54
+ const columns = db.prepare("PRAGMA table_info(inferences)").all();
55
+ if (!columns.some((c) => c.name === "ttfb_ms")) {
56
+ db.exec("ALTER TABLE inferences ADD COLUMN ttfb_ms INTEGER");
57
+ }
58
+ db.pragma("user_version = 6");
59
+ }
60
+ // v7 (Phase 6 WS2): feedback.org_id + feedback.created_by — additive,
61
+ // nullable. Old verdicts read null on both, which is TRUE of them: they were
62
+ // recorded before either concept existed, and backfilling a guess into an
63
+ // unrecomputable record is exactly what 00017 refused to do.
64
+ if (db.pragma("user_version", { simple: true }) < 7) {
65
+ const columns = db.prepare("PRAGMA table_info(feedback)").all();
66
+ if (!columns.some((c) => c.name === "org_id")) {
67
+ db.exec("ALTER TABLE feedback ADD COLUMN org_id TEXT");
68
+ }
69
+ if (!columns.some((c) => c.name === "created_by")) {
70
+ db.exec("ALTER TABLE feedback ADD COLUMN created_by TEXT");
71
+ }
72
+ db.pragma("user_version = 7");
73
+ }
74
+ // v8 (G-4 observed-health): idx_inferences_provider_model_ts — index-only, no
75
+ // data change. SCHEMA_SQL's CREATE INDEX IF NOT EXISTS handles fresh AND
76
+ // migrating databases identically (it ran above), so the bump only stamps the
77
+ // version. Kept explicit rather than folded into v5's bare-stamp branch so the
78
+ // migration ladder reads one rung per schema epoch.
79
+ if (db.pragma("user_version", { simple: true }) < 8) {
80
+ db.exec("CREATE INDEX IF NOT EXISTS idx_inferences_provider_model_ts ON inferences (provider, model, ts)");
81
+ db.pragma("user_version = 8");
82
+ }
83
+ // v9 (Expansion E2 chunk A): runs + steps local outbox. Purely additive —
84
+ // SCHEMA_SQL's CREATE TABLE IF NOT EXISTS handles fresh AND migrating
85
+ // databases identically (it ran above), so the bump only stamps the version.
86
+ // A rig that never enables the artifact namespace simply never writes to them.
87
+ if (db.pragma("user_version", { simple: true }) < 9) {
88
+ db.pragma("user_version = 9");
89
+ }
90
+ // v10 (WS-A cache accounting): cache-write buckets + cache-key/prefix
91
+ // substrate. Additive; old rows read 0 / null (true of them — recorded before
92
+ // caching was accounted). Same ALTER pattern as v2–v6, folded over a list.
93
+ if (db.pragma("user_version", { simple: true }) < 10) {
94
+ const cols = db.prepare("PRAGMA table_info(inferences)").all();
95
+ const add = (name, ddl) => {
96
+ if (!cols.some((c) => c.name === name))
97
+ db.exec(`ALTER TABLE inferences ADD COLUMN ${ddl}`);
98
+ };
99
+ add("tokens_cache_write", "tokens_cache_write INTEGER NOT NULL DEFAULT 0");
100
+ add("tokens_cache_write_1h", "tokens_cache_write_1h INTEGER NOT NULL DEFAULT 0");
101
+ add("cache_key", "cache_key TEXT");
102
+ add("prefix_fingerprint", "prefix_fingerprint TEXT");
103
+ db.pragma("user_version = 10");
104
+ }
105
+ // v11 (routing-console R0, spec §2.1): the per-call ladder key. Three nullable
106
+ // columns; old rows read null ("recorded by an SDK older than 0.4.0"). Additive;
107
+ // same ALTER-over-a-list pattern as v10. No backfill (it cannot be derived).
108
+ if (db.pragma("user_version", { simple: true }) < 11) {
109
+ const cols = db.prepare("PRAGMA table_info(inferences)").all();
110
+ const add = (name, ddl) => {
111
+ if (!cols.some((c) => c.name === name))
112
+ db.exec(`ALTER TABLE inferences ADD COLUMN ${ddl}`);
113
+ };
114
+ add("call_id", "call_id TEXT");
115
+ add("attempt_seq", "attempt_seq INTEGER");
116
+ add("candidate_index", "candidate_index INTEGER");
117
+ db.pragma("user_version = 11");
118
+ }
119
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,MAAM,EACN,OAAO,EACP,YAAY,EACZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAA2B,KAAK,cAAc,EAAuB,MAAM,UAAU,CAAC;AAE7F;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,qEAAqE;IACrE,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACpG,uEAAuE;IACvE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IACjG;mEAC+D;IAC/D,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,mEAAmE;IACnE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1F;;iFAE6E;IAC7E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClE,iEAAiE;IACjE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAC3C,aAAa,IAAI,WAAW,EAAE,CAAC;IAC/B,oEAAoE;IACpE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D;;;;;OAKG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;CAC3E;AA6RD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CA8V3E"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,MAAM,EACN,OAAO,EACP,YAAY,EACZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAA2B,KAAK,cAAc,EAAuB,MAAM,UAAU,CAAC;AAG7F;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,qEAAqE;IACrE,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACpG,uEAAuE;IACvE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IACjG;mEAC+D;IAC/D,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,mEAAmE;IACnE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1F;;iFAE6E;IAC7E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClE,iEAAiE;IACjE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAC3C,aAAa,IAAI,WAAW,EAAE,CAAC;IAC/B,oEAAoE;IACpE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D;;;;;OAKG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;CAC3E;AA0SD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CA+Q3E"}
@@ -19,6 +19,7 @@ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
19
19
  const node_fs_1 = require("node:fs");
20
20
  const node_path_1 = require("node:path");
21
21
  const health_1 = require("./health");
22
+ const store_migrations_1 = require("./store-migrations");
22
23
  const SCHEMA_SQL = `
23
24
  CREATE TABLE IF NOT EXISTS inferences (
24
25
  id TEXT PRIMARY KEY,
@@ -47,7 +48,12 @@ CREATE TABLE IF NOT EXISTS inferences (
47
48
  tokens_cache_write INTEGER NOT NULL DEFAULT 0,
48
49
  tokens_cache_write_1h INTEGER NOT NULL DEFAULT 0,
49
50
  cache_key TEXT,
50
- prefix_fingerprint TEXT
51
+ prefix_fingerprint TEXT,
52
+ -- v11 (routing-console R0): the per-call ladder key. Fresh here; older
53
+ -- databases gain them via the ALTER ladder. Null = recorded pre-0.4.0.
54
+ call_id TEXT,
55
+ attempt_seq INTEGER,
56
+ candidate_index INTEGER
51
57
  );
52
58
  CREATE INDEX IF NOT EXISTS idx_inferences_route_ts ON inferences (route, ts);
53
59
  -- v8 (G-4 observed-health): per-endpoint windowed aggregation filters by
@@ -213,6 +219,11 @@ function toTelemetryRow(r) {
213
219
  tokensCacheWrite1h: r.tokens_cache_write_1h ?? 0,
214
220
  cacheKey: r.cache_key ?? null,
215
221
  prefixFingerprint: r.prefix_fingerprint ?? null,
222
+ // Ladder key (spec §2.1 R0) — `?? null`: a v10-or-earlier database returns
223
+ // undefined for a v11 ALTER column, and those rows genuinely predate the key.
224
+ callId: r.call_id ?? null,
225
+ attemptSeq: r.attempt_seq ?? null,
226
+ candidateIndex: r.candidate_index ?? null,
216
227
  };
217
228
  }
218
229
  function toEnvelopeRow(r) {
@@ -228,107 +239,23 @@ function openTelemetryStore(dbPath) {
228
239
  const db = new better_sqlite3_1.default(dbPath);
229
240
  db.pragma("journal_mode = WAL");
230
241
  db.exec(SCHEMA_SQL);
231
- // Migrations, idempotent on every open. Fresh databases get the full v2
232
- // schema from SCHEMA_SQL above; v1 databases (tables pre-existing, so the
233
- // CREATEs were no-ops) gain the fingerprint_cell column additively —
234
- // existing rows are untouched and read back with fingerprint_cell = NULL.
235
- if (db.pragma("user_version", { simple: true }) < 2) {
236
- const columns = db.prepare("PRAGMA table_info(inferences)").all();
237
- if (!columns.some((c) => c.name === "fingerprint_cell")) {
238
- db.exec("ALTER TABLE inferences ADD COLUMN fingerprint_cell TEXT");
239
- }
240
- db.pragma("user_version = 2");
241
- }
242
- // v3 (Phase 3): captures table (from SCHEMA_SQL above — a no-op CREATE on
243
- // fresh databases) + the variant/repair columns, additive and nullable.
244
- if (db.pragma("user_version", { simple: true }) < 3) {
245
- const columns = db.prepare("PRAGMA table_info(inferences)").all();
246
- if (!columns.some((c) => c.name === "served_variant")) {
247
- db.exec("ALTER TABLE inferences ADD COLUMN served_variant TEXT");
248
- }
249
- if (!columns.some((c) => c.name === "repaired_by")) {
250
- db.exec("ALTER TABLE inferences ADD COLUMN repaired_by TEXT");
251
- }
252
- db.pragma("user_version = 3");
253
- }
254
- // v4 (addendum A1): pricing_missing flag — additive; old rows read false.
255
- if (db.pragma("user_version", { simple: true }) < 4) {
256
- const columns = db.prepare("PRAGMA table_info(inferences)").all();
257
- if (!columns.some((c) => c.name === "pricing_missing")) {
258
- db.exec("ALTER TABLE inferences ADD COLUMN pricing_missing INTEGER NOT NULL DEFAULT 0");
259
- }
260
- db.pragma("user_version = 4");
261
- }
262
- // v5 (Phase 4 WS2): feedback table — purely additive; SCHEMA_SQL's
263
- // CREATE IF NOT EXISTS handles fresh AND migrating databases identically,
264
- // so the bump only stamps the version.
265
- if (db.pragma("user_version", { simple: true }) < 5) {
266
- db.pragma("user_version = 5");
267
- }
268
- // v6 (Phase 4 WS3): ttfb_ms — additive, nullable; old rows read null.
269
- if (db.pragma("user_version", { simple: true }) < 6) {
270
- const columns = db.prepare("PRAGMA table_info(inferences)").all();
271
- if (!columns.some((c) => c.name === "ttfb_ms")) {
272
- db.exec("ALTER TABLE inferences ADD COLUMN ttfb_ms INTEGER");
273
- }
274
- db.pragma("user_version = 6");
275
- }
276
- // v7 (Phase 6 WS2): feedback.org_id + feedback.created_by — additive,
277
- // nullable. Old verdicts read null on both, which is TRUE of them: they were
278
- // recorded before either concept existed, and backfilling a guess into an
279
- // unrecomputable record is exactly what 00017 refused to do.
280
- if (db.pragma("user_version", { simple: true }) < 7) {
281
- const columns = db.prepare("PRAGMA table_info(feedback)").all();
282
- if (!columns.some((c) => c.name === "org_id")) {
283
- db.exec("ALTER TABLE feedback ADD COLUMN org_id TEXT");
284
- }
285
- if (!columns.some((c) => c.name === "created_by")) {
286
- db.exec("ALTER TABLE feedback ADD COLUMN created_by TEXT");
287
- }
288
- db.pragma("user_version = 7");
289
- }
290
- // v8 (G-4 observed-health): idx_inferences_provider_model_ts — index-only, no
291
- // data change. SCHEMA_SQL's CREATE INDEX IF NOT EXISTS handles fresh AND
292
- // migrating databases identically (it ran above), so the bump only stamps the
293
- // version. Kept explicit rather than folded into v5's bare-stamp branch so the
294
- // migration ladder reads one rung per schema epoch.
295
- if (db.pragma("user_version", { simple: true }) < 8) {
296
- db.exec("CREATE INDEX IF NOT EXISTS idx_inferences_provider_model_ts ON inferences (provider, model, ts)");
297
- db.pragma("user_version = 8");
298
- }
299
- // v9 (Expansion E2 chunk A): runs + steps local outbox. Purely additive —
300
- // SCHEMA_SQL's CREATE TABLE IF NOT EXISTS handles fresh AND migrating
301
- // databases identically (it ran above), so the bump only stamps the version.
302
- // A rig that never enables the artifact namespace simply never writes to them.
303
- if (db.pragma("user_version", { simple: true }) < 9) {
304
- db.pragma("user_version = 9");
305
- }
306
- // v10 (WS-A cache accounting): cache-write buckets + cache-key/prefix
307
- // substrate. Additive; old rows read 0 / null (true of them — recorded before
308
- // caching was accounted). Same ALTER pattern as v2–v6, folded over a list.
309
- if (db.pragma("user_version", { simple: true }) < 10) {
310
- const cols = db.prepare("PRAGMA table_info(inferences)").all();
311
- const add = (name, ddl) => {
312
- if (!cols.some((c) => c.name === name))
313
- db.exec(`ALTER TABLE inferences ADD COLUMN ${ddl}`);
314
- };
315
- add("tokens_cache_write", "tokens_cache_write INTEGER NOT NULL DEFAULT 0");
316
- add("tokens_cache_write_1h", "tokens_cache_write_1h INTEGER NOT NULL DEFAULT 0");
317
- add("cache_key", "cache_key TEXT");
318
- add("prefix_fingerprint", "prefix_fingerprint TEXT");
319
- db.pragma("user_version = 10");
320
- }
242
+ // Schema migrations — idempotent on every open (telemetry/store-migrations.ts).
243
+ // Fresh databases get the full current schema from SCHEMA_SQL above; older
244
+ // databases gain the additive columns via the ALTER ladder.
245
+ (0, store_migrations_1.runStoreMigrations)(db);
321
246
  const insertInference = db.prepare(`
322
247
  INSERT INTO inferences (
323
248
  id, ts, route, route_version, provider, model, requested_tier, served_tier,
324
249
  tokens_in, tokens_out, tokens_cached, cost_estimate_usd, latency_ms, ttfb_ms,
325
250
  failure_class, attempts_json, tags_json, fingerprint_cell, served_variant, repaired_by, pricing_missing,
326
- tokens_cache_write, tokens_cache_write_1h, cache_key, prefix_fingerprint
251
+ tokens_cache_write, tokens_cache_write_1h, cache_key, prefix_fingerprint,
252
+ call_id, attempt_seq, candidate_index
327
253
  ) VALUES (
328
254
  @id, @ts, @route, @route_version, @provider, @model, @requested_tier, @served_tier,
329
255
  @tokens_in, @tokens_out, @tokens_cached, @cost_estimate_usd, @latency_ms, @ttfb_ms,
330
256
  @failure_class, @attempts_json, @tags_json, @fingerprint_cell, @served_variant, @repaired_by, @pricing_missing,
331
- @tokens_cache_write, @tokens_cache_write_1h, @cache_key, @prefix_fingerprint
257
+ @tokens_cache_write, @tokens_cache_write_1h, @cache_key, @prefix_fingerprint,
258
+ @call_id, @attempt_seq, @candidate_index
332
259
  )
333
260
  `);
334
261
  const selectByTag = db.prepare(`
@@ -413,6 +340,12 @@ function openTelemetryStore(dbPath) {
413
340
  tokens_cache_write_1h: row.tokensCacheWrite1h ?? 0,
414
341
  cache_key: row.cacheKey ?? null,
415
342
  prefix_fingerprint: row.prefixFingerprint ?? null,
343
+ // `?? null`: the ladder-key fields are optional on TelemetryRow, and
344
+ // better-sqlite3 rejects an `undefined` bound param — a row that omits
345
+ // them (pre-0.4.0 read-back) binds null (the nullable-column default).
346
+ call_id: row.callId ?? null,
347
+ attempt_seq: row.attemptSeq ?? null,
348
+ candidate_index: row.candidateIndex ?? null,
416
349
  });
417
350
  },
418
351
  recordFeedback(row) {
@@ -22,7 +22,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.FAILURE_TEACHING = void 0;
23
23
  exports.teach = teach;
24
24
  exports.renderFailureForTerminal = renderFailureForTerminal;
25
- const DOCS_BASE = "https://modelrig.dev/docs/failures";
25
+ const DOCS_BASE = "https://modelrig.dev/routing-reliability.html";
26
26
  exports.FAILURE_TEACHING = {
27
27
  content_invalid: {
28
28
  class: "content_invalid",
@@ -136,6 +136,19 @@ export interface AdapterRequest {
136
136
  * the gemini adapter rejects a non-thinking model (adapters/gemini.ts).
137
137
  */
138
138
  readonly reasoning?: ReasoningParams;
139
+ /**
140
+ * Declared response-format shaping (CE-9, spec R4). Threaded from the raw
141
+ * lane's `RawRunInput.responseFormat` (run/raw.ts). `"json_object"` maps to
142
+ * each provider's syntactic-JSON directive: the OpenAI-dialect providers
143
+ * (openai/deepseek/grok/deepinfra/fireworks) → `response_format: { type:
144
+ * "json_object" }`; gemini → `responseMimeType: "application/json"` WITHOUT a
145
+ * schema. This is MIME-SHAPING, NOT schema enforcement — F4 stands: the raw
146
+ * lane never validates or repairs and `meta.validated` stays false. Anthropic
147
+ * has no equivalent and FAILS CLOSED at the raw-lane guard (run/raw.ts);
148
+ * absent ⇒ no key added (byte-identical). Never set alongside a non-null
149
+ * `outputSchema` — the routed lane uses `outputSchema`, the raw lane this
150
+ * field; where both could appear, `outputSchema` (native/strict) wins. */
151
+ readonly responseFormat?: "json_object";
139
152
  /** Unified tool-calling (spec §4.4) — tools the model may call. Adapters map
140
153
  * to native tool shapes; absent => no tool surface (identical to today). */
141
154
  readonly tools?: readonly ToolDefinition[];