modelrig 0.0.1 → 0.1.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 (220) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +115 -8
  3. package/dist/adapters/anthropic.d.ts +46 -0
  4. package/dist/adapters/anthropic.d.ts.map +1 -0
  5. package/dist/adapters/anthropic.js +202 -0
  6. package/dist/adapters/deepseek.d.ts +41 -0
  7. package/dist/adapters/deepseek.d.ts.map +1 -0
  8. package/dist/adapters/deepseek.js +163 -0
  9. package/dist/adapters/gemini.d.ts +44 -0
  10. package/dist/adapters/gemini.d.ts.map +1 -0
  11. package/dist/adapters/gemini.js +222 -0
  12. package/dist/adapters/grok.d.ts +44 -0
  13. package/dist/adapters/grok.d.ts.map +1 -0
  14. package/dist/adapters/grok.js +168 -0
  15. package/dist/adapters/openai-compat.d.ts +74 -0
  16. package/dist/adapters/openai-compat.d.ts.map +1 -0
  17. package/dist/adapters/openai-compat.js +187 -0
  18. package/dist/adapters/openai.d.ts +49 -0
  19. package/dist/adapters/openai.d.ts.map +1 -0
  20. package/dist/adapters/openai.js +222 -0
  21. package/dist/bakeoff/engine.d.ts +52 -0
  22. package/dist/bakeoff/engine.d.ts.map +1 -0
  23. package/dist/bakeoff/engine.js +163 -0
  24. package/dist/bakeoff/replay.d.ts +52 -0
  25. package/dist/bakeoff/replay.d.ts.map +1 -0
  26. package/dist/bakeoff/replay.js +94 -0
  27. package/dist/bakeoff/samples.d.ts +62 -0
  28. package/dist/bakeoff/samples.d.ts.map +1 -0
  29. package/dist/bakeoff/samples.js +128 -0
  30. package/dist/bakeoff/stats.d.ts +13 -0
  31. package/dist/bakeoff/stats.d.ts.map +1 -0
  32. package/dist/bakeoff/stats.js +48 -0
  33. package/dist/bakeoff/types.d.ts +37 -0
  34. package/dist/bakeoff/types.d.ts.map +1 -0
  35. package/dist/bakeoff/types.js +10 -0
  36. package/dist/cli.d.ts +27 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +572 -0
  39. package/dist/config.d.ts +104 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +148 -0
  42. package/dist/feedback/coverage.d.ts +32 -0
  43. package/dist/feedback/coverage.d.ts.map +1 -0
  44. package/dist/feedback/coverage.js +95 -0
  45. package/dist/feedback/feedback.d.ts +35 -0
  46. package/dist/feedback/feedback.d.ts.map +1 -0
  47. package/dist/feedback/feedback.js +39 -0
  48. package/dist/index.d.ts +155 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +448 -0
  51. package/dist/init/finder.d.ts +79 -0
  52. package/dist/init/finder.d.ts.map +1 -0
  53. package/dist/init/finder.js +297 -0
  54. package/dist/init/run.d.ts +99 -0
  55. package/dist/init/run.d.ts.map +1 -0
  56. package/dist/init/run.js +281 -0
  57. package/dist/init/signatures.d.ts +39 -0
  58. package/dist/init/signatures.d.ts.map +1 -0
  59. package/dist/init/signatures.js +116 -0
  60. package/dist/matrix/aggregate.d.ts +89 -0
  61. package/dist/matrix/aggregate.d.ts.map +1 -0
  62. package/dist/matrix/aggregate.js +186 -0
  63. package/dist/query/grammar.d.ts +35 -0
  64. package/dist/query/grammar.d.ts.map +1 -0
  65. package/dist/query/grammar.js +279 -0
  66. package/dist/query/run.d.ts +8 -0
  67. package/dist/query/run.d.ts.map +1 -0
  68. package/dist/query/run.js +21 -0
  69. package/dist/registry/build.d.ts +126 -0
  70. package/dist/registry/build.d.ts.map +1 -0
  71. package/dist/registry/build.js +192 -0
  72. package/dist/registry/call-notes.d.ts +11 -0
  73. package/dist/registry/call-notes.d.ts.map +1 -0
  74. package/dist/registry/call-notes.js +72 -0
  75. package/dist/registry/claims.d.ts +63 -0
  76. package/dist/registry/claims.d.ts.map +1 -0
  77. package/dist/registry/claims.js +107 -0
  78. package/dist/registry/facts.d.ts +32 -0
  79. package/dist/registry/facts.d.ts.map +1 -0
  80. package/dist/registry/facts.js +120 -0
  81. package/dist/registry/fingerprint.d.ts +20 -0
  82. package/dist/registry/fingerprint.d.ts.map +1 -0
  83. package/dist/registry/fingerprint.js +150 -0
  84. package/dist/registry/parity.d.ts +26 -0
  85. package/dist/registry/parity.d.ts.map +1 -0
  86. package/dist/registry/parity.js +41 -0
  87. package/dist/registry/pricing.d.ts +19 -0
  88. package/dist/registry/pricing.d.ts.map +1 -0
  89. package/dist/registry/pricing.js +69 -0
  90. package/dist/registry/rows.d.ts +16 -0
  91. package/dist/registry/rows.d.ts.map +1 -0
  92. package/dist/registry/rows.js +57 -0
  93. package/dist/registry/seed.d.ts +43 -0
  94. package/dist/registry/seed.d.ts.map +1 -0
  95. package/dist/registry/seed.js +97 -0
  96. package/dist/registry/select.d.ts +68 -0
  97. package/dist/registry/select.d.ts.map +1 -0
  98. package/dist/registry/select.js +141 -0
  99. package/dist/registry/staleness.d.ts +18 -0
  100. package/dist/registry/staleness.d.ts.map +1 -0
  101. package/dist/registry/staleness.js +39 -0
  102. package/dist/routes/draft.d.ts +83 -0
  103. package/dist/routes/draft.d.ts.map +1 -0
  104. package/dist/routes/draft.js +135 -0
  105. package/dist/routes/loader.d.ts +26 -0
  106. package/dist/routes/loader.d.ts.map +1 -0
  107. package/dist/routes/loader.js +436 -0
  108. package/dist/routes/manifest.d.ts +24 -0
  109. package/dist/routes/manifest.d.ts.map +1 -0
  110. package/dist/routes/manifest.js +118 -0
  111. package/dist/routes/serveability.d.ts +52 -0
  112. package/dist/routes/serveability.d.ts.map +1 -0
  113. package/dist/routes/serveability.js +73 -0
  114. package/dist/routes/template.d.ts +18 -0
  115. package/dist/routes/template.d.ts.map +1 -0
  116. package/dist/routes/template.js +94 -0
  117. package/dist/run/cost.d.ts +26 -0
  118. package/dist/run/cost.d.ts.map +1 -0
  119. package/dist/run/cost.js +41 -0
  120. package/dist/run/envelope.d.ts +21 -0
  121. package/dist/run/envelope.d.ts.map +1 -0
  122. package/dist/run/envelope.js +45 -0
  123. package/dist/run/grounding.d.ts +56 -0
  124. package/dist/run/grounding.d.ts.map +1 -0
  125. package/dist/run/grounding.js +89 -0
  126. package/dist/run/repair.d.ts +36 -0
  127. package/dist/run/repair.d.ts.map +1 -0
  128. package/dist/run/repair.js +61 -0
  129. package/dist/run/resolve.d.ts +26 -0
  130. package/dist/run/resolve.d.ts.map +1 -0
  131. package/dist/run/resolve.js +81 -0
  132. package/dist/run/retry.d.ts +19 -0
  133. package/dist/run/retry.d.ts.map +1 -0
  134. package/dist/run/retry.js +50 -0
  135. package/dist/run/run.d.ts +41 -0
  136. package/dist/run/run.d.ts.map +1 -0
  137. package/dist/run/run.js +0 -0
  138. package/dist/run/validate.d.ts +15 -0
  139. package/dist/run/validate.d.ts.map +1 -0
  140. package/dist/run/validate.js +56 -0
  141. package/dist/savings/emit.d.ts +25 -0
  142. package/dist/savings/emit.d.ts.map +1 -0
  143. package/dist/savings/emit.js +75 -0
  144. package/dist/savings/odometer.d.ts +32 -0
  145. package/dist/savings/odometer.d.ts.map +1 -0
  146. package/dist/savings/odometer.js +70 -0
  147. package/dist/savings/swap-execute.d.ts +44 -0
  148. package/dist/savings/swap-execute.d.ts.map +1 -0
  149. package/dist/savings/swap-execute.js +87 -0
  150. package/dist/savings/swaps-client.d.ts +41 -0
  151. package/dist/savings/swaps-client.d.ts.map +1 -0
  152. package/dist/savings/swaps-client.js +81 -0
  153. package/dist/telemetry/capture.d.ts +28 -0
  154. package/dist/telemetry/capture.d.ts.map +1 -0
  155. package/dist/telemetry/capture.js +74 -0
  156. package/dist/telemetry/exporter.d.ts +62 -0
  157. package/dist/telemetry/exporter.d.ts.map +1 -0
  158. package/dist/telemetry/exporter.js +233 -0
  159. package/dist/telemetry/ingest-protocol.d.ts +161 -0
  160. package/dist/telemetry/ingest-protocol.d.ts.map +1 -0
  161. package/dist/telemetry/ingest-protocol.js +163 -0
  162. package/dist/telemetry/sinks.d.ts +54 -0
  163. package/dist/telemetry/sinks.d.ts.map +1 -0
  164. package/dist/telemetry/sinks.js +89 -0
  165. package/dist/telemetry/store.d.ts +38 -0
  166. package/dist/telemetry/store.d.ts.map +1 -0
  167. package/dist/telemetry/store.js +332 -0
  168. package/dist/telemetry/supabase-exporter.d.ts +64 -0
  169. package/dist/telemetry/supabase-exporter.d.ts.map +1 -0
  170. package/dist/telemetry/supabase-exporter.js +211 -0
  171. package/dist/tenancy/api-key-format.d.ts +67 -0
  172. package/dist/tenancy/api-key-format.d.ts.map +1 -0
  173. package/dist/tenancy/api-key-format.js +91 -0
  174. package/dist/tenancy/constants.d.ts +23 -0
  175. package/dist/tenancy/constants.d.ts.map +1 -0
  176. package/dist/tenancy/constants.js +25 -0
  177. package/dist/tenancy/scrub.d.ts +47 -0
  178. package/dist/tenancy/scrub.d.ts.map +1 -0
  179. package/dist/tenancy/scrub.js +85 -0
  180. package/dist/types/failures-teaching.d.ts +56 -0
  181. package/dist/types/failures-teaching.d.ts.map +1 -0
  182. package/dist/types/failures-teaching.js +177 -0
  183. package/dist/types/failures.d.ts +27 -0
  184. package/dist/types/failures.d.ts.map +1 -0
  185. package/dist/types/failures.js +41 -0
  186. package/dist/types/provider.d.ts +79 -0
  187. package/dist/types/provider.d.ts.map +1 -0
  188. package/dist/types/provider.js +20 -0
  189. package/dist/types/route.d.ts +127 -0
  190. package/dist/types/route.d.ts.map +1 -0
  191. package/dist/types/route.js +6 -0
  192. package/dist/types/telemetry.d.ts +89 -0
  193. package/dist/types/telemetry.d.ts.map +1 -0
  194. package/dist/types/telemetry.js +6 -0
  195. package/dist/watch/budget.d.ts +19 -0
  196. package/dist/watch/budget.d.ts.map +1 -0
  197. package/dist/watch/budget.js +35 -0
  198. package/dist/watch/evaluate.d.ts +66 -0
  199. package/dist/watch/evaluate.d.ts.map +1 -0
  200. package/dist/watch/evaluate.js +94 -0
  201. package/dist/watch/proposals.d.ts +73 -0
  202. package/dist/watch/proposals.d.ts.map +1 -0
  203. package/dist/watch/proposals.js +169 -0
  204. package/dist/watch/run-record.d.ts +64 -0
  205. package/dist/watch/run-record.d.ts.map +1 -0
  206. package/dist/watch/run-record.js +86 -0
  207. package/dist/watch/run-reported.d.ts +20 -0
  208. package/dist/watch/run-reported.d.ts.map +1 -0
  209. package/dist/watch/run-reported.js +53 -0
  210. package/dist/watch/run.d.ts +40 -0
  211. package/dist/watch/run.d.ts.map +1 -0
  212. package/dist/watch/run.js +44 -0
  213. package/dist/watch/state-store.d.ts +48 -0
  214. package/dist/watch/state-store.d.ts.map +1 -0
  215. package/dist/watch/state-store.js +86 -0
  216. package/dist/watch/state.d.ts +21 -0
  217. package/dist/watch/state.d.ts.map +1 -0
  218. package/dist/watch/state.js +93 -0
  219. package/package.json +50 -14
  220. package/index.js +0 -3
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ /**
3
+ * Registry v0 build logic — spec WS3. Pure functions (script entrypoints in
4
+ * registry/ do the IO): declared from the vendored pricing map + adapter
5
+ * capability maps; probed from probe result files; observed from telemetry
6
+ * aggregates; merge + discrepancy detection.
7
+ *
8
+ * PRIVACY (spec WS6 / plan step-4 review): the observed layer publishes
9
+ * AGGREGATES ONLY — no tags, no payloads, no fingerprint joins.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.latestPerClass = latestPerClass;
13
+ exports.summarizeSchemaResult = summarizeSchemaResult;
14
+ exports.summarizeGroundingResult = summarizeGroundingResult;
15
+ exports.summarizeCachingResult = summarizeCachingResult;
16
+ exports.buildProbedLayer = buildProbedLayer;
17
+ exports.detectDiscrepancies = detectDiscrepancies;
18
+ exports.buildRegistry = buildRegistry;
19
+ exports.effectiveCostPer1kConformant = effectiveCostPer1kConformant;
20
+ const call_notes_1 = require("./call-notes");
21
+ const claims_1 = require("./claims");
22
+ const CONFORMANCE_BAR = 0.9;
23
+ const GROUNDED_BAR = 0.5;
24
+ function mean(values) {
25
+ if (values.length === 0)
26
+ return null;
27
+ return values.reduce((a, b) => a + b, 0) / values.length;
28
+ }
29
+ function wilson95(successes, n) {
30
+ if (n === 0)
31
+ return [0, 1];
32
+ const z = 1.959963984540054;
33
+ const p = successes / n;
34
+ const z2 = z * z;
35
+ const denominator = 1 + z2 / n;
36
+ const center = (p + z2 / (2 * n)) / denominator;
37
+ const half = (z * Math.sqrt((p * (1 - p)) / n + z2 / (4 * n * n))) / denominator;
38
+ return [Math.max(0, center - half), Math.min(1, center + half)];
39
+ }
40
+ /** Latest result per class wins (results are dated). */
41
+ function latestPerClass(results) {
42
+ const byClass = {};
43
+ for (const result of results) {
44
+ const current = byClass[result.class];
45
+ if (current === undefined || result.date > current.date) {
46
+ byClass[result.class] = result;
47
+ }
48
+ }
49
+ return byClass;
50
+ }
51
+ function summarizeSchemaResult(result) {
52
+ const samples = Object.values(result.raw).flat();
53
+ const n = samples.length;
54
+ const judged = samples.filter((s) => s.schemaConform !== null);
55
+ const conforming = judged.filter((s) => s.schemaConform === true).length;
56
+ const rungs = samples.filter((s) => s.rung !== undefined);
57
+ const accuracies = samples
58
+ .map((s) => s.valueAccuracy)
59
+ .filter((a) => a !== null);
60
+ return {
61
+ samples: n,
62
+ parse_rate: n === 0 ? 0 : samples.filter((s) => s.parseOk).length / n,
63
+ conform_rate: judged.length === 0 ? null : conforming / judged.length,
64
+ conform_ci95: judged.length === 0 ? null : wilson95(conforming, judged.length),
65
+ value_accuracy_mean: mean(accuracies),
66
+ native_rung_rate: rungs.length === 0 ? null : rungs.filter((s) => s.rung === "native").length / rungs.length,
67
+ mean_cost_usd: n === 0 ? 0 : samples.reduce((a, s) => a + s.costUsd, 0) / n,
68
+ };
69
+ }
70
+ function summarizeGroundingResult(result) {
71
+ const samples = Object.values(result.raw).flat();
72
+ const n = samples.length;
73
+ return {
74
+ samples: n,
75
+ grounded_rate: n === 0 ? 0 : samples.filter((s) => s.grounded === true).length / n,
76
+ mean_citations: mean(samples.map((s) => s.citationCount ?? 0)) ?? 0,
77
+ };
78
+ }
79
+ function summarizeCachingResult(result) {
80
+ const samples = Object.values(result.raw).flat();
81
+ const okSamples = samples.filter((s) => s.failureClass === null);
82
+ const n = okSamples.length;
83
+ return {
84
+ samples: samples.length,
85
+ cache_hit_rate: n === 0 ? 0 : okSamples.filter((s) => (s.cachedTokens ?? 0) > 0).length / n,
86
+ mean_cached_tokens: mean(okSamples.map((s) => s.cachedTokens ?? 0)) ?? 0,
87
+ };
88
+ }
89
+ function buildProbedLayer(results) {
90
+ if (results.length === 0)
91
+ return null;
92
+ const byClass = latestPerClass(results);
93
+ const dates = results.map((r) => r.date).sort();
94
+ const versions = results.map((r) => r.harnessVersion).sort();
95
+ const newest = dates[dates.length - 1];
96
+ const version = versions[versions.length - 1];
97
+ return {
98
+ as_of: newest,
99
+ source: `modelrig-probes@${version}`,
100
+ schema: byClass.schema !== undefined ? summarizeSchemaResult(byClass.schema) : null,
101
+ grounding: byClass.grounding !== undefined ? summarizeGroundingResult(byClass.grounding) : null,
102
+ caching: byClass.caching !== undefined ? summarizeCachingResult(byClass.caching) : null,
103
+ };
104
+ }
105
+ /** Declared-vs-probed disagreement detection — plan §4 (the rule pair) plus
106
+ * the rung gap that motivated the whole exercise (DeepSeek json_object). */
107
+ function detectDiscrepancies(declared, probed) {
108
+ if (declared === null || probed === null)
109
+ return [];
110
+ const out = [];
111
+ const schema = probed.schema;
112
+ if (schema !== null && schema.conform_rate !== null) {
113
+ if (declared.flags.supports_response_schema === true && schema.conform_rate < CONFORMANCE_BAR) {
114
+ out.push({
115
+ kind: "declared_schema_low_conformance",
116
+ message: `declared supports_response_schema, but probed conformance is ` +
117
+ `${(schema.conform_rate * 100).toFixed(0)}% (bar: ${CONFORMANCE_BAR * 100}%)`,
118
+ });
119
+ }
120
+ if (declared.flags.supports_response_schema !== true &&
121
+ schema.conform_rate >= CONFORMANCE_BAR) {
122
+ out.push({
123
+ kind: "undeclared_schema_capable",
124
+ message: `no declared schema support, but probed conformance is ` +
125
+ `${(schema.conform_rate * 100).toFixed(0)}% — capability exists undeclared`,
126
+ });
127
+ }
128
+ }
129
+ if (schema !== null &&
130
+ schema.native_rung_rate !== null &&
131
+ declared.flags.supports_response_schema === true &&
132
+ schema.native_rung_rate === 0) {
133
+ out.push({
134
+ kind: "schema_served_via_json_mode",
135
+ message: "declared supports_response_schema, but every probed sample was served via " +
136
+ "json_mode coaching — no native strict enforcement exists on this serving path " +
137
+ "(the json_object-vs-schema gap)",
138
+ });
139
+ }
140
+ const grounding = probed.grounding;
141
+ if (grounding !== null && grounding.samples > 0) {
142
+ if (declared.flags.supports_web_search === true && grounding.grounded_rate < GROUNDED_BAR) {
143
+ out.push({
144
+ kind: "declared_search_ungrounded",
145
+ message: `declared supports_web_search, but only ${(grounding.grounded_rate * 100).toFixed(0)}% ` +
146
+ `of probed answers carried citations (bar: ${GROUNDED_BAR * 100}%)`,
147
+ });
148
+ }
149
+ if (declared.flags.supports_web_search !== true && grounding.grounded_rate >= GROUNDED_BAR) {
150
+ out.push({
151
+ kind: "citations_without_declared_search",
152
+ message: `no declared web-search support, but ${(grounding.grounded_rate * 100).toFixed(0)}% of ` +
153
+ `probed answers cited URLs — verify whether these are real or fabricated sources`,
154
+ });
155
+ }
156
+ }
157
+ const caching = probed.caching;
158
+ if (caching !== null && caching.samples > 0) {
159
+ if (declared.flags.supports_prompt_caching === true && caching.cache_hit_rate === 0) {
160
+ out.push({
161
+ kind: "declared_caching_unrealized",
162
+ message: "declared supports_prompt_caching, but no probed repeat call reported cached tokens",
163
+ });
164
+ }
165
+ }
166
+ return out;
167
+ }
168
+ function buildRegistry(entries, generatedAt) {
169
+ return {
170
+ generated_at: generatedAt,
171
+ license: "CC-BY-4.0",
172
+ models: entries
173
+ .map((e) => ({
174
+ model_key: e.model_key,
175
+ declared: e.declared,
176
+ probed: e.probed,
177
+ observed: e.observed,
178
+ discrepancies: detectDiscrepancies(e.declared, e.probed),
179
+ callNotes: (0, call_notes_1.callNotesFor)(e.model_key),
180
+ facts: (0, claims_1.factsFor)(e.model_key),
181
+ }))
182
+ .sort((a, b) => (a.model_key < b.model_key ? -1 : 1)),
183
+ };
184
+ }
185
+ /** Leaderboard ranking metric — spec WS3: "conformance per dollar".
186
+ * Effective $ per 1K conformant outputs: mean sample cost ÷ conform rate
187
+ * × 1000. Null when unjudged or never conformant. */
188
+ function effectiveCostPer1kConformant(schema) {
189
+ if (schema === null || schema.conform_rate === null || schema.conform_rate === 0)
190
+ return null;
191
+ return (schema.mean_cost_usd / schema.conform_rate) * 1000;
192
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Per-model call-shaping knowledge as data — addendum A1 (Phase 2), closed as
3
+ * post-C2 patch P1 (Phase 3 step 0). Seeded from the adapters' documented
4
+ * constraints (the same facts the adapter code enforces); consumed by the
5
+ * registry artifact today and the Phase 5 oracle's `get_call_notes` later.
6
+ * Registry entries carry these top-level as `callNotes[]`; the Supabase
7
+ * mirror rides them inside the existing `declared` jsonb (no migration).
8
+ */
9
+ /** Call notes for a "provider/model" key; [] for unknown providers. */
10
+ export declare function callNotesFor(modelKey: string): readonly string[];
11
+ //# sourceMappingURL=call-notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-notes.d.ts","sourceRoot":"","sources":["../../src/registry/call-notes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8BH,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAoChE"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * Per-model call-shaping knowledge as data — addendum A1 (Phase 2), closed as
4
+ * post-C2 patch P1 (Phase 3 step 0). Seeded from the adapters' documented
5
+ * constraints (the same facts the adapter code enforces); consumed by the
6
+ * registry artifact today and the Phase 5 oracle's `get_call_notes` later.
7
+ * Registry entries carry these top-level as `callNotes[]`; the Supabase
8
+ * mirror rides them inside the existing `declared` jsonb (no migration).
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.callNotesFor = callNotesFor;
12
+ /** Models that accept thinkingConfig — mirror of the gemini adapter's set. */
13
+ const GEMINI_THINKING_CAPABLE = new Set([
14
+ "gemini-3.1-pro-preview",
15
+ "gemini-3.0-pro-preview",
16
+ "gemini-3.1-flash-preview",
17
+ ]);
18
+ const GEMINI_COMMON = [
19
+ "temperature must be 1.0 — lower values cause output looping on Gemini 3 models",
20
+ "native strict structured output via responseJsonSchema; very complex schemas can be rejected as INVALID_ARGUMENT (complexity ceiling)",
21
+ "native web grounding via the googleSearch tool",
22
+ "cachedContent excludes systemInstruction and tools — bake the system prompt (and the googleSearch tool for grounded steps) into the cache at creation time",
23
+ ];
24
+ const OPENAI_COMMON = [
25
+ "native strict structured output via response_format json_schema with strict: true",
26
+ "streamed refusal deltas are terminal for the call, even alongside partial content",
27
+ "prompt caching is keyed via prompt_cache_key; retention extends to 24h when the cache directive's TTL is ≥ 86400s",
28
+ "finish_reason=stop with <200 visible completion tokens on a 50K+ token prompt indicates flex-tier degradation or a stream drop — treat as invalid, not success",
29
+ ];
30
+ const DEEPSEEK_COMMON = [
31
+ "no native json_schema — json_object forcing only; the schema must be coached into the prompt and validated caller-side",
32
+ 'json_object mode returns 400 unless the literal word "JSON" appears in the prompt',
33
+ "automatic prefix caching: prompt_cache_hit_tokens are billed ~10x cheaper than fresh input",
34
+ "no service tiers — served tier is always standard",
35
+ ];
36
+ /** Call notes for a "provider/model" key; [] for unknown providers. */
37
+ function callNotesFor(modelKey) {
38
+ const slash = modelKey.indexOf("/");
39
+ if (slash <= 0)
40
+ return [];
41
+ const provider = modelKey.slice(0, slash);
42
+ const model = modelKey.slice(slash + 1);
43
+ switch (provider) {
44
+ case "gemini":
45
+ return [
46
+ ...GEMINI_COMMON,
47
+ GEMINI_THINKING_CAPABLE.has(model)
48
+ ? "accepts thinkingConfig (thinking level); thinking tokens are billed as output and count against maxOutputTokens"
49
+ : "does NOT accept thinkingConfig — sending it returns 400 (thinking models only)",
50
+ ];
51
+ case "openai": {
52
+ const flexEligible = !model.includes("-mini") &&
53
+ !model.includes("-nano") &&
54
+ ["gpt-5.4", "gpt-5.2", "gpt-5.1", "gpt-5", "gpt-4.1"].some((p) => model.startsWith(p));
55
+ return [
56
+ ...OPENAI_COMMON,
57
+ flexEligible
58
+ ? "flex service tier eligible — discounted, sheddable capacity; served tier is echoed on the stream"
59
+ : "NOT flex-eligible (mini/nano and older families) — flex requests are silently served at default tier",
60
+ ];
61
+ }
62
+ case "deepseek":
63
+ return [
64
+ ...DEEPSEEK_COMMON,
65
+ model.includes("reasoner")
66
+ ? "emits reasoning_content (chain-of-thought) deltas — exclude them from the JSON buffer; only delta.content is the answer"
67
+ : "max_tokens up to 64K — full capacity for long structured reports",
68
+ ];
69
+ default:
70
+ return [];
71
+ }
72
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Curated credential-scoped claims — Phase 4 WS3 fact-shape upgrade.
3
+ * Every fact is {value, scope, source, as_of}: WHAT is claimed, UNDER WHICH
4
+ * CREDENTIAL it holds, WHERE it's cited, and WHEN it was checked.
5
+ *
6
+ * Scope semantics (the TrustedRouter lesson): a provider's zero-data-
7
+ * retention arrangement on OUR managed account does not transfer to a
8
+ * customer's own (BYOK) key — the same capability can be true on one
9
+ * credential and false on the other, and conflating them is a compliance
10
+ * hazard. Conservative default: models/facts absent here are absent from
11
+ * the registry — false-until-cited, same doctrine as probed-beats-declared.
12
+ *
13
+ * This is the curated seed (same pattern as call-notes.ts); probe-derived
14
+ * facts can join the same shape later without changing consumers.
15
+ */
16
+ export declare const SCOPES: readonly ["managed", "byok", "any"];
17
+ export type FactScope = (typeof SCOPES)[number];
18
+ export interface ScopedFact {
19
+ readonly value: boolean | string | number;
20
+ /** Which credential the claim holds under: the vendor-managed account,
21
+ * a bring-your-own-key credential, or any. */
22
+ readonly scope: FactScope;
23
+ /** Citation — a URL or document reference; never "we assume". */
24
+ readonly source: string;
25
+ readonly as_of: string;
26
+ }
27
+ export type ModelFacts = Readonly<Record<string, readonly ScopedFact[]>>;
28
+ /** Facts for a model, or null when nothing is cited (the conservative
29
+ * default — absence is the claim). */
30
+ export declare function factsFor(modelKey: string): ModelFacts | null;
31
+ /** Which credential an account is calling a model under. Phase 6 WS3: the
32
+ * telemetry `key_ownership` dimension, seen from the registry's side. */
33
+ export type CredentialOwnership = "managed" | "byok";
34
+ /** A fact resolved to what holds under ONE credential. */
35
+ export interface CredentialScopedFact {
36
+ readonly value: boolean | string | number;
37
+ readonly source: string;
38
+ readonly as_of: string;
39
+ /**
40
+ * True when a fact is cited for THIS credential (its own scope or `any`).
41
+ * False means "not established for your key" — the honest answer when a
42
+ * fact holds only under our managed account and the account is BYOK. It is
43
+ * NEVER silently promoted to the managed value.
44
+ */
45
+ readonly established: boolean;
46
+ }
47
+ /**
48
+ * Render a model's facts as they hold under ONE account's credential — Phase 6
49
+ * WS3, the "credential-scoped facts render per account" deliverable.
50
+ *
51
+ * THE RULE, and the whole reason this exists: **a BYOK key does not inherit our
52
+ * managed-account posture.** If `zero_retention` is cited `true` under
53
+ * `managed` and nothing is cited under `byok`, a BYOK account sees
54
+ * `established: false` — not `true`. Inheriting the managed value onto a
55
+ * customer's own key is the exact compliance hazard claims.ts's scope field
56
+ * exists to prevent (the TrustedRouter lesson). An `any`-scoped fact holds on
57
+ * every credential; a scope-specific fact holds only on its own.
58
+ *
59
+ * Returns one entry per fact NAME, so a caller (the console's model surface)
60
+ * can render "zero retention: yes / not established for your key" honestly.
61
+ */
62
+ export declare function factsUnderCredential(modelKey: string, ownership: CredentialOwnership): Readonly<Record<string, CredentialScopedFact>>;
63
+ //# sourceMappingURL=claims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.d.ts","sourceRoot":"","sources":["../../src/registry/claims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,MAAM,qCAAsC,CAAC;AAC1D,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C;kDAC8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC,CAAC,CAAC;AA0CzE;sCACsC;AACtC,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE5D;AAED;yEACyE;AACzE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,mBAAmB,GAC7B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAwBhD"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * Curated credential-scoped claims — Phase 4 WS3 fact-shape upgrade.
4
+ * Every fact is {value, scope, source, as_of}: WHAT is claimed, UNDER WHICH
5
+ * CREDENTIAL it holds, WHERE it's cited, and WHEN it was checked.
6
+ *
7
+ * Scope semantics (the TrustedRouter lesson): a provider's zero-data-
8
+ * retention arrangement on OUR managed account does not transfer to a
9
+ * customer's own (BYOK) key — the same capability can be true on one
10
+ * credential and false on the other, and conflating them is a compliance
11
+ * hazard. Conservative default: models/facts absent here are absent from
12
+ * the registry — false-until-cited, same doctrine as probed-beats-declared.
13
+ *
14
+ * This is the curated seed (same pattern as call-notes.ts); probe-derived
15
+ * facts can join the same shape later without changing consumers.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.SCOPES = void 0;
19
+ exports.factsFor = factsFor;
20
+ exports.factsUnderCredential = factsUnderCredential;
21
+ exports.SCOPES = ["managed", "byok", "any"];
22
+ /** The curated claims table. Add entries WITH citations only. */
23
+ const CLAIMS = {
24
+ "openai/gpt-5.4-mini": {
25
+ zero_retention: [
26
+ {
27
+ // OpenAI's API-platform data controls: eligible orgs can be approved
28
+ // for zero data retention on the API — an ACCOUNT property, granted
29
+ // to our managed platform account.
30
+ value: true,
31
+ scope: "managed",
32
+ source: "https://platform.openai.com/docs/models/how-we-use-your-data",
33
+ as_of: "2026-08-02",
34
+ },
35
+ {
36
+ // The same claim does NOT transfer to a customer's own key: a BYOK
37
+ // org has whatever retention ITS account negotiated — unknowable
38
+ // from here, so the honest value is false (not "probably fine").
39
+ value: false,
40
+ scope: "byok",
41
+ source: "https://platform.openai.com/docs/models/how-we-use-your-data",
42
+ as_of: "2026-08-02",
43
+ },
44
+ ],
45
+ },
46
+ "gemini/gemini-3.1-pro-preview": {
47
+ zero_retention: [
48
+ {
49
+ // Paid-tier Gemini API: prompts/outputs not used for training, but
50
+ // retained transiently for abuse monitoring — that is NOT zero
51
+ // retention, on any credential. Recorded false to keep the registry
52
+ // honest where marketing language blurs.
53
+ value: false,
54
+ scope: "any",
55
+ source: "https://ai.google.dev/gemini-api/terms",
56
+ as_of: "2026-08-02",
57
+ },
58
+ ],
59
+ },
60
+ };
61
+ /** Facts for a model, or null when nothing is cited (the conservative
62
+ * default — absence is the claim). */
63
+ function factsFor(modelKey) {
64
+ return CLAIMS[modelKey] ?? null;
65
+ }
66
+ /**
67
+ * Render a model's facts as they hold under ONE account's credential — Phase 6
68
+ * WS3, the "credential-scoped facts render per account" deliverable.
69
+ *
70
+ * THE RULE, and the whole reason this exists: **a BYOK key does not inherit our
71
+ * managed-account posture.** If `zero_retention` is cited `true` under
72
+ * `managed` and nothing is cited under `byok`, a BYOK account sees
73
+ * `established: false` — not `true`. Inheriting the managed value onto a
74
+ * customer's own key is the exact compliance hazard claims.ts's scope field
75
+ * exists to prevent (the TrustedRouter lesson). An `any`-scoped fact holds on
76
+ * every credential; a scope-specific fact holds only on its own.
77
+ *
78
+ * Returns one entry per fact NAME, so a caller (the console's model surface)
79
+ * can render "zero retention: yes / not established for your key" honestly.
80
+ */
81
+ function factsUnderCredential(modelKey, ownership) {
82
+ const facts = CLAIMS[modelKey];
83
+ if (facts === undefined)
84
+ return {};
85
+ const out = {};
86
+ for (const [name, claims] of Object.entries(facts)) {
87
+ // Prefer the credential-specific claim; fall back to an `any` claim; never
88
+ // borrow the OTHER credential's claim.
89
+ const specific = claims.find((c) => c.scope === ownership);
90
+ const anyScoped = claims.find((c) => c.scope === "any");
91
+ const chosen = specific ?? anyScoped;
92
+ if (chosen !== undefined) {
93
+ out[name] = {
94
+ value: chosen.value,
95
+ source: chosen.source,
96
+ as_of: chosen.as_of,
97
+ established: true,
98
+ };
99
+ }
100
+ else {
101
+ // A managed-only fact seen from a BYOK account (or vice-versa): not
102
+ // inherited. The value is the conservative false, flagged not-established.
103
+ out[name] = { value: false, source: claims[0]?.source ?? "", as_of: claims[0]?.as_of ?? "", established: false };
104
+ }
105
+ }
106
+ return out;
107
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Registry-wired capability facts — Phase 3 spec WS6, plan §4. Replaces the
3
+ * Phase 1 "grant whatever the adapter claims" stub: routing now consumes
4
+ * declared+probed registry facts from the packaged registry.json
5
+ * (env-overridable path), with precedence
6
+ *
7
+ * capabilityOverrides (config) > probed > declared
8
+ *
9
+ * applied PER FLAG. Discrepancy-aware: a probed-false trumps a declared-true
10
+ * — the DeepSeek case (declared supports_response_schema, probed
11
+ * native_rung_rate = 0) finally routes correctly.
12
+ *
13
+ * Conservatism rules (measurement honesty):
14
+ * - grounded_native: probed can only REVOKE (a declared-true with a low
15
+ * probed grounded rate), never grant — high citation rates without
16
+ * declared search may be fabricated URLs.
17
+ * - Unprobed/undeclared dimensions (explicit caches, cache keys, flex tier,
18
+ * trace visibility) fall back to the adapter-static map, which is the
19
+ * declared layer for call-shaping facts.
20
+ */
21
+ import type { CapabilityFlag, ProviderId } from "../types/provider";
22
+ import type { RegistryEntry } from "./build";
23
+ export interface RegistryFacts {
24
+ /** Capability flags for a (provider, model), or null when the registry has
25
+ * no entry for it (caller falls back to the adapter-static map). */
26
+ flagsFor(provider: ProviderId, model: string, staticFlags: ReadonlySet<CapabilityFlag>): ReadonlySet<CapabilityFlag> | null;
27
+ }
28
+ /** Per-flag fact merge for one registry entry. `staticFlags` is the
29
+ * adapter-static (declared call-shaping) baseline. */
30
+ export declare function capabilityFactsFromEntry(entry: RegistryEntry, staticFlags: ReadonlySet<CapabilityFlag>): Set<CapabilityFlag>;
31
+ export declare function loadRegistryFacts(registryPath?: string): RegistryFacts;
32
+ //# sourceMappingURL=facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../src/registry/facts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,SAAS,CAAC;AAMvD,MAAM,WAAW,aAAa;IAC5B;wEACoE;IACpE,QAAQ,CACN,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC,GACvC,WAAW,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;CACvC;AAED;sDACsD;AACtD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC,GACvC,GAAG,CAAC,cAAc,CAAC,CAsDrB;AAQD,wBAAgB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CA8BtE"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * Registry-wired capability facts — Phase 3 spec WS6, plan §4. Replaces the
4
+ * Phase 1 "grant whatever the adapter claims" stub: routing now consumes
5
+ * declared+probed registry facts from the packaged registry.json
6
+ * (env-overridable path), with precedence
7
+ *
8
+ * capabilityOverrides (config) > probed > declared
9
+ *
10
+ * applied PER FLAG. Discrepancy-aware: a probed-false trumps a declared-true
11
+ * — the DeepSeek case (declared supports_response_schema, probed
12
+ * native_rung_rate = 0) finally routes correctly.
13
+ *
14
+ * Conservatism rules (measurement honesty):
15
+ * - grounded_native: probed can only REVOKE (a declared-true with a low
16
+ * probed grounded rate), never grant — high citation rates without
17
+ * declared search may be fabricated URLs.
18
+ * - Unprobed/undeclared dimensions (explicit caches, cache keys, flex tier,
19
+ * trace visibility) fall back to the adapter-static map, which is the
20
+ * declared layer for call-shaping facts.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.capabilityFactsFromEntry = capabilityFactsFromEntry;
24
+ exports.loadRegistryFacts = loadRegistryFacts;
25
+ const node_fs_1 = require("node:fs");
26
+ const node_path_1 = require("node:path");
27
+ /** Same bar the registry's discrepancy detection uses. */
28
+ const GROUNDED_BAR = 0.5;
29
+ const CONFORMANCE_BAR = 0.9;
30
+ /** Per-flag fact merge for one registry entry. `staticFlags` is the
31
+ * adapter-static (declared call-shaping) baseline. */
32
+ function capabilityFactsFromEntry(entry, staticFlags) {
33
+ const flags = new Set(staticFlags);
34
+ const declared = entry.declared;
35
+ const probed = entry.probed;
36
+ // structured_native — probed native_rung_rate is the ground truth when
37
+ // sampled; else declared (adapter fact first, pricing-map flag second).
38
+ const nativeRate = probed?.schema?.native_rung_rate ?? null;
39
+ if (nativeRate !== null) {
40
+ if (nativeRate > 0)
41
+ flags.add("structured_native");
42
+ else
43
+ flags.delete("structured_native"); // the DeepSeek json_object-vs-schema gap
44
+ }
45
+ else if (declared !== null) {
46
+ const declaredNative = declared.flags.adapter_structured_native ?? declared.flags.supports_response_schema;
47
+ if (declaredNative === true)
48
+ flags.add("structured_native");
49
+ else if (declaredNative === false)
50
+ flags.delete("structured_native");
51
+ }
52
+ // json_mode — probed: a sampled schema class with a decent conform rate on
53
+ // ANY rung proves the model can emit parseable schema-shaped JSON.
54
+ const conformRate = probed?.schema?.conform_rate ?? null;
55
+ if (conformRate !== null && conformRate >= CONFORMANCE_BAR) {
56
+ flags.add("json_mode");
57
+ }
58
+ // grounded_native — probed may REVOKE a declared-true, never grant.
59
+ const groundedRate = probed?.grounding?.grounded_rate ?? null;
60
+ const declaredGrounded = declared === null
61
+ ? null
62
+ : (declared.flags.adapter_grounded_native ?? declared.flags.supports_web_search);
63
+ if (declaredGrounded === true)
64
+ flags.add("grounded_native");
65
+ else if (declaredGrounded === false)
66
+ flags.delete("grounded_native");
67
+ if (flags.has("grounded_native") &&
68
+ groundedRate !== null &&
69
+ (probed?.grounding?.samples ?? 0) > 0 &&
70
+ groundedRate < GROUNDED_BAR) {
71
+ flags.delete("grounded_native");
72
+ }
73
+ // prefix_cache_implicit — probed realized cache behavior wins when sampled.
74
+ const caching = probed?.caching ?? null;
75
+ if (caching !== null && caching.samples > 0) {
76
+ if (caching.cache_hit_rate > 0)
77
+ flags.add("prefix_cache_implicit");
78
+ else
79
+ flags.delete("prefix_cache_implicit");
80
+ }
81
+ else if (declared?.flags.supports_prompt_caching === true) {
82
+ flags.add("prefix_cache_implicit");
83
+ }
84
+ // context_cache_explicit / prompt_cache_key / tier_flex / trace_visible:
85
+ // unprobed dimensions — the adapter-static baseline stands.
86
+ return flags;
87
+ }
88
+ /** Packaged registry.json (registry/ at the package root; dist/ and src/
89
+ * both sit one level below it). */
90
+ function packagedRegistryPath() {
91
+ return (0, node_path_1.join)(__dirname, "..", "..", "registry", "registry.json");
92
+ }
93
+ function loadRegistryFacts(registryPath) {
94
+ const path = registryPath ?? packagedRegistryPath();
95
+ let byKey = new Map();
96
+ if ((0, node_fs_1.existsSync)(path)) {
97
+ const registry = JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
98
+ byKey = new Map(registry.models.map((m) => [m.model_key, m]));
99
+ }
100
+ else if (registryPath !== undefined) {
101
+ // An EXPLICIT path that doesn't exist is a config error worth failing on;
102
+ // a missing packaged file just means static fallback (fresh checkout).
103
+ throw new Error(`registry facts file not found: ${path}`);
104
+ }
105
+ const cache = new Map();
106
+ return {
107
+ flagsFor(provider, model, staticFlags) {
108
+ const key = `${provider}/${model}`;
109
+ const entry = byKey.get(key);
110
+ if (entry === undefined)
111
+ return null;
112
+ let flags = cache.get(key);
113
+ if (flags === undefined) {
114
+ flags = capabilityFactsFromEntry(entry, staticFlags);
115
+ cache.set(key, flags);
116
+ }
117
+ return flags;
118
+ },
119
+ };
120
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Schema fingerprinting — spec §2 WS6, network-effects instrumentation.
3
+ * Pure function: JSON schema → bucketed structural features + task category
4
+ * + a stable cell key. Computed at route load; stored on every telemetry row.
5
+ * PRIVACY: the fingerprint must be irreversible — features and category only,
6
+ * never field names, titles, descriptions, or enum values.
7
+ */
8
+ export type TaskCategory = "extraction" | "generation" | "classification" | "analysis";
9
+ export interface SchemaFingerprint {
10
+ readonly depthBucket: "1-2" | "3-4" | "5+";
11
+ readonly fieldCountBucket: "1-5" | "6-20" | "21-60" | "61+";
12
+ readonly enumDensityBucket: "none" | "low" | "high";
13
+ readonly lengthFloorCount: number;
14
+ readonly arrayComplexityBucket: "none" | "flat" | "nested";
15
+ readonly category: TaskCategory;
16
+ /** Stable hash of the buckets above — the Conformance Matrix cell key. */
17
+ readonly cellKey: string;
18
+ }
19
+ export declare function fingerprintSchema(schema: object | null): SchemaFingerprint | null;
20
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/registry/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,gBAAgB,GAAG,UAAU,CAAC;AAEvF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IAC5D,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACpD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC3D,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA8GD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAgDjF"}