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
package/dist/index.js ADDED
@@ -0,0 +1,448 @@
1
+ "use strict";
2
+ /**
3
+ * modelrig public surface — plan step 7.
4
+ * Usage sketch (normative):
5
+ * const rig = createRig(loadConfigFromEnv());
6
+ * const result = await rig.run("research.growth_scenarios", {
7
+ * input: { ticker, financials, priorSteps },
8
+ * tags: { run_id, step: "growth_scenarios", ticker },
9
+ * budget: { envelope: run_id },
10
+ * });
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.readObjectLiteral = exports.findCallSitesInText = exports.scanRepoForCallSites = exports.capabilitiesFor = exports.routeNameFor = exports.buildMigrationMarkdown = exports.runInit = exports.loadRoutes = exports.RouteConfigError = exports.renderFailureForTerminal = exports.teach = exports.FAILURE_TEACHING = exports.isRigFailure = exports.RigFailureError = exports.extractCitations = exports.createTavilySearchProvider = exports.wilson95 = exports.aggregateVariantMetrics = exports.OUTPUT_MAX_BYTES = exports.retentionExpiry = exports.truncateOutput = exports.selectArmsToKeep = exports.buildBakeoffSamples = exports.createBakeoffSamplesClient = exports.computeProposal = exports.mirrorBakeoff = exports.runBakeoff = exports.replayVariant = exports.openTelemetryStore = exports.openCaptureStore = exports.KEY_SHAPED_PREFIXES = exports.containsKeyShapedString = exports.scrubSecrets = exports.hasScope = exports.parseScopes = exports.redactApiKey = exports.looksLikeApiKey = exports.hashApiKeySecret = exports.API_KEY_SECRET_BYTES = exports.API_KEY_SCOPES = exports.API_KEY_PREFIX = exports.createDirectSink = exports.createApiSink = exports.createTelemetryExporter = exports.DEFAULT_INGEST_URL = exports.INGEST_PROTOCOL_VERSION = exports.INGEST_PATH = exports.foreignOrgFeedback = exports.stampBatch = exports.loadConfigFromEnv = void 0;
14
+ exports.runWatchCycle = exports.assertTransition = exports.createProposalsClient = exports.PROPOSAL_TTL_DAYS = exports.triggerHash = exports.evaluateEvents = exports.RUNG1_MIN_FEEDBACK = exports.computeCoverage = exports.buildFeedbackRow = exports.ALL_CAPABILITY_FLAGS = exports.computeParity = exports.factsUnderCredential = exports.factsFor = exports.PROBE_FRESHNESS_SLO_DAYS = exports.stalenessSentence = exports.probeFreshness = exports.callNotesFor = exports.PREDICATE_GLOSS = exports.ALL_CAPABILITY_PREDICATES = exports.explainEmptySelection = exports.hasCapability = exports.selectModels = exports.parseCapabilityQuery = exports.capabilityFactsFromEntry = exports.loadRegistryFacts = exports.fingerprintSchema = exports.loadManifest = exports.estimateCostUsd = exports.getPricing = exports.resolveCandidates = exports.OPENAI_COMPAT_HOSTS = exports.shapeFireworksModelId = exports.classifyCompatFailure = exports.buildOpenAICompatParams = exports.createOpenAICompatAdapter = exports.createGrokAdapter = exports.createAnthropicAdapter = exports.createDeepSeekAdapter = exports.createOpenAIAdapter = exports.createGeminiAdapter = exports.PROVIDER_KEY_ENV = exports.serveabilityWarnings = exports.checkServeability = exports.writeRouteDraft = exports.buildRouteDraft = exports.splitModelKey = exports.seedCandidates = exports.loadRegistryRows = exports.signatureFor = exports.PROVIDER_SIGNATURES = void 0;
15
+ exports.computeOdometer = exports.createSwapsClient = exports.executeSwap = exports.buildSwapChange = exports.runTelemetryQuery = exports.QueryGrammarError = exports.compileQuery = exports.writePriorsCells = exports.aggregatePairwiseFromTelemetry = exports.aggregatePriors = exports.DEFAULT_WATCH_MONTHLY_USD = exports.watchEnvelopeKey = exports.reserveWatchBudget = exports.WATCH_STATE_KEY = exports.createFileWatchStateStore = exports.createControlPlaneWatchStateStore = exports.createWatchStateStore = exports.saveWatchState = exports.loadWatchState = exports.computeWatchEvents = exports.buildPriceUniverse = void 0;
16
+ exports.createRig = createRig;
17
+ const anthropic_1 = require("./adapters/anthropic");
18
+ const deepseek_1 = require("./adapters/deepseek");
19
+ const gemini_1 = require("./adapters/gemini");
20
+ const grok_1 = require("./adapters/grok");
21
+ const openai_1 = require("./adapters/openai");
22
+ const openai_compat_1 = require("./adapters/openai-compat");
23
+ const loader_1 = require("./routes/loader");
24
+ const serveability_1 = require("./routes/serveability");
25
+ const manifest_1 = require("./routes/manifest");
26
+ const run_1 = require("./run/run");
27
+ const node_path_1 = require("node:path");
28
+ const node_os_1 = require("node:os");
29
+ const grounding_1 = require("./run/grounding");
30
+ const capture_1 = require("./telemetry/capture");
31
+ const store_1 = require("./telemetry/store");
32
+ const exporter_1 = require("./telemetry/exporter");
33
+ const sinks_1 = require("./telemetry/sinks");
34
+ const constants_1 = require("./tenancy/constants");
35
+ const feedback_1 = require("./feedback/feedback");
36
+ const facts_1 = require("./registry/facts");
37
+ const engine_1 = require("./bakeoff/engine");
38
+ const replay_1 = require("./bakeoff/replay");
39
+ const samples_1 = require("./bakeoff/samples");
40
+ const provider_1 = require("./types/provider");
41
+ /** Per-variant replay spend ceiling when the caller doesn't set one. */
42
+ const DEFAULT_REPLAY_ENVELOPE_USD = 10;
43
+ function createRig(config) {
44
+ const routes = (0, loader_1.loadRoutes)(config.routesDir);
45
+ // rig.yaml lives at the rig dir root, one level above routes/
46
+ // (modelrig/rig.yaml next to modelrig/routes/ — cost-dimensions-design §2a).
47
+ const manifest = (0, manifest_1.loadManifest)((0, node_path_1.dirname)(config.routesDir));
48
+ // Registry facts load BEFORE adapters: the A1 compat hosts take their
49
+ // capability profile from the registry, never from the dialect.
50
+ const registryFacts = (0, facts_1.loadRegistryFacts)(config.registryPath);
51
+ const COMPAT_STATIC = new Set(["json_mode"]);
52
+ const adapters = new Map();
53
+ if (config.keys.gemini)
54
+ adapters.set("gemini", (0, gemini_1.createGeminiAdapter)({ apiKey: config.keys.gemini }));
55
+ if (config.keys.openai)
56
+ adapters.set("openai", (0, openai_1.createOpenAIAdapter)({ apiKey: config.keys.openai }));
57
+ if (config.keys.deepseek) {
58
+ adapters.set("deepseek", (0, deepseek_1.createDeepSeekAdapter)({ apiKey: config.keys.deepseek }));
59
+ }
60
+ if (config.keys.anthropic) {
61
+ adapters.set("anthropic", (0, anthropic_1.createAnthropicAdapter)({ apiKey: config.keys.anthropic }));
62
+ }
63
+ if (config.keys.grok)
64
+ adapters.set("grok", (0, grok_1.createGrokAdapter)({ apiKey: config.keys.grok }));
65
+ // A1 aggregator hosts behind the generic openai-compatible adapter.
66
+ for (const hostId of ["deepinfra", "fireworks"]) {
67
+ const apiKey = config.keys[hostId];
68
+ if (!apiKey)
69
+ continue;
70
+ const host = openai_compat_1.OPENAI_COMPAT_HOSTS[hostId];
71
+ adapters.set(hostId, (0, openai_compat_1.createOpenAICompatAdapter)({
72
+ providerId: hostId,
73
+ baseUrl: host.baseUrl,
74
+ apiKey,
75
+ ...(host.shapeModelId !== undefined ? { shapeModelId: host.shapeModelId } : {}),
76
+ capabilityProfile: (model) => registryFacts.flagsFor(hostId, model, COMPAT_STATIC) ?? COMPAT_STATIC,
77
+ }));
78
+ }
79
+ // Load-time serveability (Phase 4 resilience): a keyless declared
80
+ // candidate is INERT, not fatal — warn and keep serving on keyed
81
+ // candidates; only a route with ZERO serveable candidates is a hard error.
82
+ // The run loop skips inert candidates at dispatch; the candidate-set upper
83
+ // bound is untouched. (Was: throw on the first keyless candidate, which
84
+ // downed the standalone server on any keyless challenger arm.)
85
+ const serveability = (0, serveability_1.serveabilityWarnings)(routes.list(), (p) => adapters.has(p));
86
+ for (const warning of serveability) {
87
+ console.warn(`[modelrig] ${warning.message} (${warning.fixHint})`);
88
+ }
89
+ // Registry-wired capability facts (Phase 3 WS6): the Phase 1 stub — grant
90
+ // whatever the adapter claims — is gone. Precedence per flag:
91
+ // capabilityOverrides > probed > declared (adapter-static is the declared
92
+ // baseline for unprobed call-shaping dimensions); models absent from the
93
+ // registry fall back to the adapter-static map alone.
94
+ const capabilities = (provider, model) => {
95
+ const override = config.capabilityOverrides?.[provider];
96
+ if (override !== undefined)
97
+ return new Set(override);
98
+ const adapter = adapters.get(provider);
99
+ if (adapter === undefined)
100
+ return new Set();
101
+ const staticFlags = new Set(provider_1.ALL_CAPABILITY_FLAGS.filter((flag) => adapter.supports(flag, model)));
102
+ return registryFacts.flagsFor(provider, model, staticFlags) ?? staticFlags;
103
+ };
104
+ const telemetry = (0, store_1.openTelemetryStore)(config.telemetryDbPath);
105
+ // Local-only capture store (Phase 3 WS4): opened only when a bundle opts
106
+ // in; a SEPARATE handle over the same file — the exporter cannot reach it.
107
+ let captures = null;
108
+ if (routes.list().some((b) => b.capture)) {
109
+ captures = (0, capture_1.openCaptureStore)(config.telemetryDbPath);
110
+ }
111
+ // Grounding-inject search provider (Phase 3 WS3).
112
+ const search = config.search !== undefined
113
+ ? (0, grounding_1.createTavilySearchProvider)({
114
+ apiKey: config.search.tavilyApiKey,
115
+ ...(config.search.costPerSearchUsd !== undefined
116
+ ? { costPerSearchUsd: config.search.costPerSearchUsd }
117
+ : {}),
118
+ ...(config.search.searchDepth !== undefined
119
+ ? { searchDepth: config.search.searchDepth }
120
+ : {}),
121
+ })
122
+ : null;
123
+ // Cloud sink (optional, fire-and-forget): the run loop never blocks on or
124
+ // fails because of it — the exporter swallows all sink errors.
125
+ let exporter = null;
126
+ if (config.export !== undefined) {
127
+ const exportConfig = config.export;
128
+ const sourceId = exportConfig.sourceId ?? (0, node_os_1.hostname)();
129
+ const sink = exportConfig.mode === "api"
130
+ ? (0, sinks_1.createApiSink)({
131
+ ingestUrl: exportConfig.ingestUrl,
132
+ apiKey: exportConfig.apiKey,
133
+ // A batch the server partly refused comes back 200. Without this,
134
+ // a customer whose rows are being dropped would find out by
135
+ // noticing a gap in a chart weeks later.
136
+ onOutcome: (outcome) => {
137
+ const dropped = Object.values(outcome.dropped).reduce((a, b) => a + b, 0);
138
+ if (dropped === 0)
139
+ return;
140
+ const reasons = Object.entries(outcome.reasons)
141
+ .map(([reason, count]) => `${reason}×${count}`)
142
+ .join(", ");
143
+ console.warn(`[modelrig exporter] ingest dropped ${dropped} row(s): ${reasons}`);
144
+ },
145
+ })
146
+ : (0, sinks_1.createDirectSink)({
147
+ supabaseUrl: exportConfig.supabaseUrl,
148
+ serviceRoleKey: exportConfig.serviceRoleKey,
149
+ tenancy: {
150
+ org_id: exportConfig.orgId ?? constants_1.HOUSE_ORG_ID,
151
+ project_id: exportConfig.projectId ?? null,
152
+ source_id: sourceId,
153
+ },
154
+ });
155
+ exporter = (0, exporter_1.createTelemetryExporter)(telemetry, {
156
+ sink,
157
+ sourceId,
158
+ ...(exportConfig.batchSize !== undefined ? { batchSize: exportConfig.batchSize } : {}),
159
+ ...(exportConfig.intervalMs !== undefined ? { intervalMs: exportConfig.intervalMs } : {}),
160
+ routes: routes.list().map((b) => ({
161
+ route: b.route,
162
+ version: b.version,
163
+ candidates: b.candidates.map((c) => ({ provider: c.provider, model: c.model })),
164
+ capture: b.capture,
165
+ })),
166
+ manifest,
167
+ serveability,
168
+ });
169
+ exporter.start();
170
+ }
171
+ const deps = {
172
+ routes,
173
+ adapters,
174
+ telemetry,
175
+ capabilities,
176
+ manifest,
177
+ captures,
178
+ search,
179
+ ...(config.envelopeBudgetUsd !== undefined
180
+ ? { envelopeBudgetUsd: config.envelopeBudgetUsd }
181
+ : {}),
182
+ ...(config.unpricedRateUsdPerMTok !== undefined
183
+ ? { unpricedRateUsdPerMTok: config.unpricedRateUsdPerMTok }
184
+ : {}),
185
+ };
186
+ // Replay reads captures even when no route currently opts in to writing
187
+ // them — open the read handle lazily.
188
+ function captureStoreForReplay() {
189
+ if (captures === null) {
190
+ captures = (0, capture_1.openCaptureStore)(config.telemetryDbPath);
191
+ }
192
+ return captures;
193
+ }
194
+ // Bake-off review-sample sink (addendum A3): persists retained outputs to
195
+ // the SEPARATE bakeoff_samples store (service role; deny-anon RLS). Only
196
+ // exists when the control plane is configured — captures never touch it.
197
+ //
198
+ // DIRECT MODE ONLY, and that is a real limitation, not an oversight:
199
+ // `bakeoff_samples` has no ingest route (telemetry-ingestion-boundary.md §2
200
+ // covers telemetry, not review samples), so an api-mode rig keeps its
201
+ // retained outputs local. Flagged for the architect in the WS2 report
202
+ // rather than papered over — a silent no-op here would look like data loss.
203
+ const directExport = config.export?.mode === "direct" ? config.export : undefined;
204
+ const samplesSink = directExport !== undefined
205
+ ? async ({ bakeoffId, route, arms }) => {
206
+ const rows = (0, samples_1.buildBakeoffSamples)(bakeoffId, route, arms, (0, samples_1.retentionExpiry)(Date.now()));
207
+ await (0, samples_1.createBakeoffSamplesClient)({
208
+ supabaseUrl: directExport.supabaseUrl,
209
+ serviceRoleKey: directExport.serviceRoleKey,
210
+ }).insert(rows);
211
+ }
212
+ : undefined;
213
+ return {
214
+ serveability,
215
+ run(route, opts) {
216
+ return (0, run_1.run)(deps, route, opts);
217
+ },
218
+ feedback(target, opts) {
219
+ const row = (0, feedback_1.buildFeedbackRow)(target, opts);
220
+ telemetry.recordFeedback(row);
221
+ return row;
222
+ },
223
+ replay(route, opts) {
224
+ return (0, replay_1.replayVariant)(deps, captureStoreForReplay(), {
225
+ route,
226
+ variant: opts.variant,
227
+ lastN: opts.lastN,
228
+ envelopeUsd: opts.envelopeUsd ?? DEFAULT_REPLAY_ENVELOPE_USD,
229
+ });
230
+ },
231
+ bakeoff(route, opts) {
232
+ return (0, engine_1.runBakeoff)(deps, captureStoreForReplay(), {
233
+ route,
234
+ variants: opts.variants,
235
+ replayLastN: opts.replayLastN,
236
+ envelopeUsdPerVariant: opts.envelopeUsdPerVariant ?? DEFAULT_REPLAY_ENVELOPE_USD,
237
+ ...(opts.keepOutputs !== undefined ? { keepOutputs: opts.keepOutputs } : {}),
238
+ }, samplesSink);
239
+ },
240
+ close() {
241
+ captures?.close();
242
+ if (exporter !== null) {
243
+ // Final best-effort flush; sink errors are swallowed by the exporter.
244
+ void exporter.stop().finally(() => telemetry.close());
245
+ return;
246
+ }
247
+ telemetry.close();
248
+ },
249
+ };
250
+ }
251
+ var config_1 = require("./config");
252
+ Object.defineProperty(exports, "loadConfigFromEnv", { enumerable: true, get: function () { return config_1.loadConfigFromEnv; } });
253
+ // The telemetry wire contract (Phase 6 WS2). Exported because modelrig-server
254
+ // COMPILES AGAINST IT: one definition of a batch and one mapper from batch to
255
+ // database rows, shared by the SDK's two sinks and the ingest endpoint. A
256
+ // second copy on the server side is exactly the drift this prevents.
257
+ var ingest_protocol_1 = require("./telemetry/ingest-protocol");
258
+ Object.defineProperty(exports, "stampBatch", { enumerable: true, get: function () { return ingest_protocol_1.stampBatch; } });
259
+ Object.defineProperty(exports, "foreignOrgFeedback", { enumerable: true, get: function () { return ingest_protocol_1.foreignOrgFeedback; } });
260
+ Object.defineProperty(exports, "INGEST_PATH", { enumerable: true, get: function () { return ingest_protocol_1.INGEST_PATH; } });
261
+ Object.defineProperty(exports, "INGEST_PROTOCOL_VERSION", { enumerable: true, get: function () { return ingest_protocol_1.INGEST_PROTOCOL_VERSION; } });
262
+ Object.defineProperty(exports, "DEFAULT_INGEST_URL", { enumerable: true, get: function () { return ingest_protocol_1.DEFAULT_INGEST_URL; } });
263
+ var exporter_2 = require("./telemetry/exporter");
264
+ Object.defineProperty(exports, "createTelemetryExporter", { enumerable: true, get: function () { return exporter_2.createTelemetryExporter; } });
265
+ var sinks_2 = require("./telemetry/sinks");
266
+ Object.defineProperty(exports, "createApiSink", { enumerable: true, get: function () { return sinks_2.createApiSink; } });
267
+ Object.defineProperty(exports, "createDirectSink", { enumerable: true, get: function () { return sinks_2.createDirectSink; } });
268
+ // The rig_sk_ key FORMAT (not minting — that is the control plane's). Shared
269
+ // so the SDK, the server and the oracle cannot disagree about what a key is.
270
+ var api_key_format_1 = require("./tenancy/api-key-format");
271
+ Object.defineProperty(exports, "API_KEY_PREFIX", { enumerable: true, get: function () { return api_key_format_1.API_KEY_PREFIX; } });
272
+ Object.defineProperty(exports, "API_KEY_SCOPES", { enumerable: true, get: function () { return api_key_format_1.API_KEY_SCOPES; } });
273
+ Object.defineProperty(exports, "API_KEY_SECRET_BYTES", { enumerable: true, get: function () { return api_key_format_1.API_KEY_SECRET_BYTES; } });
274
+ Object.defineProperty(exports, "hashApiKeySecret", { enumerable: true, get: function () { return api_key_format_1.hashApiKeySecret; } });
275
+ Object.defineProperty(exports, "looksLikeApiKey", { enumerable: true, get: function () { return api_key_format_1.looksLikeApiKey; } });
276
+ Object.defineProperty(exports, "redactApiKey", { enumerable: true, get: function () { return api_key_format_1.redactApiKey; } });
277
+ Object.defineProperty(exports, "parseScopes", { enumerable: true, get: function () { return api_key_format_1.parseScopes; } });
278
+ Object.defineProperty(exports, "hasScope", { enumerable: true, get: function () { return api_key_format_1.hasScope; } });
279
+ // C2's leak gate — the one secret-scrubber every failure/telemetry/export/log
280
+ // boundary shares. Widened in WS3 to the BYOK provider families.
281
+ var scrub_1 = require("./tenancy/scrub");
282
+ Object.defineProperty(exports, "scrubSecrets", { enumerable: true, get: function () { return scrub_1.scrubSecrets; } });
283
+ Object.defineProperty(exports, "containsKeyShapedString", { enumerable: true, get: function () { return scrub_1.containsKeyShapedString; } });
284
+ Object.defineProperty(exports, "KEY_SHAPED_PREFIXES", { enumerable: true, get: function () { return scrub_1.KEY_SHAPED_PREFIXES; } });
285
+ var capture_2 = require("./telemetry/capture");
286
+ Object.defineProperty(exports, "openCaptureStore", { enumerable: true, get: function () { return capture_2.openCaptureStore; } });
287
+ var store_2 = require("./telemetry/store");
288
+ Object.defineProperty(exports, "openTelemetryStore", { enumerable: true, get: function () { return store_2.openTelemetryStore; } });
289
+ var replay_2 = require("./bakeoff/replay");
290
+ Object.defineProperty(exports, "replayVariant", { enumerable: true, get: function () { return replay_2.replayVariant; } });
291
+ var engine_2 = require("./bakeoff/engine");
292
+ Object.defineProperty(exports, "runBakeoff", { enumerable: true, get: function () { return engine_2.runBakeoff; } });
293
+ Object.defineProperty(exports, "mirrorBakeoff", { enumerable: true, get: function () { return engine_2.mirrorBakeoff; } });
294
+ Object.defineProperty(exports, "computeProposal", { enumerable: true, get: function () { return engine_2.computeProposal; } });
295
+ var samples_2 = require("./bakeoff/samples");
296
+ Object.defineProperty(exports, "createBakeoffSamplesClient", { enumerable: true, get: function () { return samples_2.createBakeoffSamplesClient; } });
297
+ Object.defineProperty(exports, "buildBakeoffSamples", { enumerable: true, get: function () { return samples_2.buildBakeoffSamples; } });
298
+ Object.defineProperty(exports, "selectArmsToKeep", { enumerable: true, get: function () { return samples_2.selectArmsToKeep; } });
299
+ Object.defineProperty(exports, "truncateOutput", { enumerable: true, get: function () { return samples_2.truncateOutput; } });
300
+ Object.defineProperty(exports, "retentionExpiry", { enumerable: true, get: function () { return samples_2.retentionExpiry; } });
301
+ Object.defineProperty(exports, "OUTPUT_MAX_BYTES", { enumerable: true, get: function () { return samples_2.OUTPUT_MAX_BYTES; } });
302
+ var stats_1 = require("./bakeoff/stats");
303
+ Object.defineProperty(exports, "aggregateVariantMetrics", { enumerable: true, get: function () { return stats_1.aggregateVariantMetrics; } });
304
+ Object.defineProperty(exports, "wilson95", { enumerable: true, get: function () { return stats_1.wilson95; } });
305
+ var grounding_2 = require("./run/grounding");
306
+ Object.defineProperty(exports, "createTavilySearchProvider", { enumerable: true, get: function () { return grounding_2.createTavilySearchProvider; } });
307
+ Object.defineProperty(exports, "extractCitations", { enumerable: true, get: function () { return grounding_2.extractCitations; } });
308
+ var failures_1 = require("./types/failures");
309
+ Object.defineProperty(exports, "RigFailureError", { enumerable: true, get: function () { return failures_1.RigFailureError; } });
310
+ Object.defineProperty(exports, "isRigFailure", { enumerable: true, get: function () { return failures_1.isRigFailure; } });
311
+ // Errors that teach (Phase 5 WS3) — one table, consumed by CLI + server.
312
+ var failures_teaching_1 = require("./types/failures-teaching");
313
+ Object.defineProperty(exports, "FAILURE_TEACHING", { enumerable: true, get: function () { return failures_teaching_1.FAILURE_TEACHING; } });
314
+ Object.defineProperty(exports, "teach", { enumerable: true, get: function () { return failures_teaching_1.teach; } });
315
+ Object.defineProperty(exports, "renderFailureForTerminal", { enumerable: true, get: function () { return failures_teaching_1.renderFailureForTerminal; } });
316
+ var loader_2 = require("./routes/loader");
317
+ Object.defineProperty(exports, "RouteConfigError", { enumerable: true, get: function () { return loader_2.RouteConfigError; } });
318
+ Object.defineProperty(exports, "loadRoutes", { enumerable: true, get: function () { return loader_2.loadRoutes; } });
319
+ // `modelrig init` (Phase 5 WS2) — repo scan → drafted route bundles.
320
+ var run_2 = require("./init/run");
321
+ Object.defineProperty(exports, "runInit", { enumerable: true, get: function () { return run_2.runInit; } });
322
+ Object.defineProperty(exports, "buildMigrationMarkdown", { enumerable: true, get: function () { return run_2.buildMigrationMarkdown; } });
323
+ Object.defineProperty(exports, "routeNameFor", { enumerable: true, get: function () { return run_2.routeNameFor; } });
324
+ Object.defineProperty(exports, "capabilitiesFor", { enumerable: true, get: function () { return run_2.capabilitiesFor; } });
325
+ var finder_1 = require("./init/finder");
326
+ Object.defineProperty(exports, "scanRepoForCallSites", { enumerable: true, get: function () { return finder_1.scanRepoForCallSites; } });
327
+ Object.defineProperty(exports, "findCallSitesInText", { enumerable: true, get: function () { return finder_1.findCallSitesInText; } });
328
+ Object.defineProperty(exports, "readObjectLiteral", { enumerable: true, get: function () { return finder_1.readObjectLiteral; } });
329
+ var signatures_1 = require("./init/signatures");
330
+ Object.defineProperty(exports, "PROVIDER_SIGNATURES", { enumerable: true, get: function () { return signatures_1.PROVIDER_SIGNATURES; } });
331
+ Object.defineProperty(exports, "signatureFor", { enumerable: true, get: function () { return signatures_1.signatureFor; } });
332
+ var rows_1 = require("./registry/rows");
333
+ Object.defineProperty(exports, "loadRegistryRows", { enumerable: true, get: function () { return rows_1.loadRegistryRows; } });
334
+ var seed_1 = require("./registry/seed");
335
+ Object.defineProperty(exports, "seedCandidates", { enumerable: true, get: function () { return seed_1.seedCandidates; } });
336
+ Object.defineProperty(exports, "splitModelKey", { enumerable: true, get: function () { return seed_1.splitModelKey; } });
337
+ // Route drafting (Phase 5) — shared by `modelrig init` and oracle create_route.
338
+ var draft_1 = require("./routes/draft");
339
+ Object.defineProperty(exports, "buildRouteDraft", { enumerable: true, get: function () { return draft_1.buildRouteDraft; } });
340
+ Object.defineProperty(exports, "writeRouteDraft", { enumerable: true, get: function () { return draft_1.writeRouteDraft; } });
341
+ var serveability_2 = require("./routes/serveability");
342
+ Object.defineProperty(exports, "checkServeability", { enumerable: true, get: function () { return serveability_2.checkServeability; } });
343
+ Object.defineProperty(exports, "serveabilityWarnings", { enumerable: true, get: function () { return serveability_2.serveabilityWarnings; } });
344
+ var config_2 = require("./config");
345
+ Object.defineProperty(exports, "PROVIDER_KEY_ENV", { enumerable: true, get: function () { return config_2.PROVIDER_KEY_ENV; } });
346
+ // Probe-suite surface (Phase 2 plan §4: probes drive adapters DIRECTLY, and
347
+ // mint CandidateRefs through resolveCandidates — the single brand site —
348
+ // against their own single-candidate probe routes).
349
+ var gemini_2 = require("./adapters/gemini");
350
+ Object.defineProperty(exports, "createGeminiAdapter", { enumerable: true, get: function () { return gemini_2.createGeminiAdapter; } });
351
+ var openai_2 = require("./adapters/openai");
352
+ Object.defineProperty(exports, "createOpenAIAdapter", { enumerable: true, get: function () { return openai_2.createOpenAIAdapter; } });
353
+ var deepseek_2 = require("./adapters/deepseek");
354
+ Object.defineProperty(exports, "createDeepSeekAdapter", { enumerable: true, get: function () { return deepseek_2.createDeepSeekAdapter; } });
355
+ var anthropic_2 = require("./adapters/anthropic");
356
+ Object.defineProperty(exports, "createAnthropicAdapter", { enumerable: true, get: function () { return anthropic_2.createAnthropicAdapter; } });
357
+ var grok_2 = require("./adapters/grok");
358
+ Object.defineProperty(exports, "createGrokAdapter", { enumerable: true, get: function () { return grok_2.createGrokAdapter; } });
359
+ var openai_compat_2 = require("./adapters/openai-compat");
360
+ Object.defineProperty(exports, "createOpenAICompatAdapter", { enumerable: true, get: function () { return openai_compat_2.createOpenAICompatAdapter; } });
361
+ Object.defineProperty(exports, "buildOpenAICompatParams", { enumerable: true, get: function () { return openai_compat_2.buildOpenAICompatParams; } });
362
+ Object.defineProperty(exports, "classifyCompatFailure", { enumerable: true, get: function () { return openai_compat_2.classifyCompatFailure; } });
363
+ Object.defineProperty(exports, "shapeFireworksModelId", { enumerable: true, get: function () { return openai_compat_2.shapeFireworksModelId; } });
364
+ Object.defineProperty(exports, "OPENAI_COMPAT_HOSTS", { enumerable: true, get: function () { return openai_compat_2.OPENAI_COMPAT_HOSTS; } });
365
+ var resolve_1 = require("./run/resolve");
366
+ Object.defineProperty(exports, "resolveCandidates", { enumerable: true, get: function () { return resolve_1.resolveCandidates; } });
367
+ var pricing_1 = require("./registry/pricing");
368
+ Object.defineProperty(exports, "getPricing", { enumerable: true, get: function () { return pricing_1.getPricing; } });
369
+ Object.defineProperty(exports, "estimateCostUsd", { enumerable: true, get: function () { return pricing_1.estimateCostUsd; } });
370
+ var manifest_2 = require("./routes/manifest");
371
+ Object.defineProperty(exports, "loadManifest", { enumerable: true, get: function () { return manifest_2.loadManifest; } });
372
+ var fingerprint_1 = require("./registry/fingerprint");
373
+ Object.defineProperty(exports, "fingerprintSchema", { enumerable: true, get: function () { return fingerprint_1.fingerprintSchema; } });
374
+ var facts_2 = require("./registry/facts");
375
+ Object.defineProperty(exports, "loadRegistryFacts", { enumerable: true, get: function () { return facts_2.loadRegistryFacts; } });
376
+ Object.defineProperty(exports, "capabilityFactsFromEntry", { enumerable: true, get: function () { return facts_2.capabilityFactsFromEntry; } });
377
+ // Shared capability-selection grammar (Phase 5 WS1) — the console query box
378
+ // and the MCP oracle answer from THIS module, never their own copy.
379
+ var select_1 = require("./registry/select");
380
+ Object.defineProperty(exports, "parseCapabilityQuery", { enumerable: true, get: function () { return select_1.parseCapabilityQuery; } });
381
+ Object.defineProperty(exports, "selectModels", { enumerable: true, get: function () { return select_1.selectModels; } });
382
+ Object.defineProperty(exports, "hasCapability", { enumerable: true, get: function () { return select_1.hasCapability; } });
383
+ Object.defineProperty(exports, "explainEmptySelection", { enumerable: true, get: function () { return select_1.explainEmptySelection; } });
384
+ Object.defineProperty(exports, "ALL_CAPABILITY_PREDICATES", { enumerable: true, get: function () { return select_1.ALL_CAPABILITY_PREDICATES; } });
385
+ Object.defineProperty(exports, "PREDICATE_GLOSS", { enumerable: true, get: function () { return select_1.PREDICATE_GLOSS; } });
386
+ var call_notes_1 = require("./registry/call-notes");
387
+ Object.defineProperty(exports, "callNotesFor", { enumerable: true, get: function () { return call_notes_1.callNotesFor; } });
388
+ var staleness_1 = require("./registry/staleness");
389
+ Object.defineProperty(exports, "probeFreshness", { enumerable: true, get: function () { return staleness_1.probeFreshness; } });
390
+ Object.defineProperty(exports, "stalenessSentence", { enumerable: true, get: function () { return staleness_1.stalenessSentence; } });
391
+ Object.defineProperty(exports, "PROBE_FRESHNESS_SLO_DAYS", { enumerable: true, get: function () { return staleness_1.PROBE_FRESHNESS_SLO_DAYS; } });
392
+ var claims_1 = require("./registry/claims");
393
+ Object.defineProperty(exports, "factsFor", { enumerable: true, get: function () { return claims_1.factsFor; } });
394
+ Object.defineProperty(exports, "factsUnderCredential", { enumerable: true, get: function () { return claims_1.factsUnderCredential; } });
395
+ var parity_1 = require("./registry/parity");
396
+ Object.defineProperty(exports, "computeParity", { enumerable: true, get: function () { return parity_1.computeParity; } });
397
+ var provider_2 = require("./types/provider");
398
+ Object.defineProperty(exports, "ALL_CAPABILITY_FLAGS", { enumerable: true, get: function () { return provider_2.ALL_CAPABILITY_FLAGS; } });
399
+ var feedback_2 = require("./feedback/feedback");
400
+ Object.defineProperty(exports, "buildFeedbackRow", { enumerable: true, get: function () { return feedback_2.buildFeedbackRow; } });
401
+ var coverage_1 = require("./feedback/coverage");
402
+ Object.defineProperty(exports, "computeCoverage", { enumerable: true, get: function () { return coverage_1.computeCoverage; } });
403
+ Object.defineProperty(exports, "RUNG1_MIN_FEEDBACK", { enumerable: true, get: function () { return coverage_1.RUNG1_MIN_FEEDBACK; } });
404
+ // Watch loop + proposals (Phase 4 WS1).
405
+ var evaluate_1 = require("./watch/evaluate");
406
+ Object.defineProperty(exports, "evaluateEvents", { enumerable: true, get: function () { return evaluate_1.evaluateEvents; } });
407
+ Object.defineProperty(exports, "triggerHash", { enumerable: true, get: function () { return evaluate_1.triggerHash; } });
408
+ Object.defineProperty(exports, "PROPOSAL_TTL_DAYS", { enumerable: true, get: function () { return evaluate_1.PROPOSAL_TTL_DAYS; } });
409
+ var proposals_1 = require("./watch/proposals");
410
+ Object.defineProperty(exports, "createProposalsClient", { enumerable: true, get: function () { return proposals_1.createProposalsClient; } });
411
+ Object.defineProperty(exports, "assertTransition", { enumerable: true, get: function () { return proposals_1.assertTransition; } });
412
+ var run_3 = require("./watch/run");
413
+ Object.defineProperty(exports, "runWatchCycle", { enumerable: true, get: function () { return run_3.runWatchCycle; } });
414
+ var state_1 = require("./watch/state");
415
+ Object.defineProperty(exports, "buildPriceUniverse", { enumerable: true, get: function () { return state_1.buildPriceUniverse; } });
416
+ Object.defineProperty(exports, "computeWatchEvents", { enumerable: true, get: function () { return state_1.computeWatchEvents; } });
417
+ Object.defineProperty(exports, "loadWatchState", { enumerable: true, get: function () { return state_1.loadWatchState; } });
418
+ Object.defineProperty(exports, "saveWatchState", { enumerable: true, get: function () { return state_1.saveWatchState; } });
419
+ // Durable watch state (addendum A4) — cron containers are ephemeral.
420
+ var state_store_1 = require("./watch/state-store");
421
+ Object.defineProperty(exports, "createWatchStateStore", { enumerable: true, get: function () { return state_store_1.createWatchStateStore; } });
422
+ Object.defineProperty(exports, "createControlPlaneWatchStateStore", { enumerable: true, get: function () { return state_store_1.createControlPlaneWatchStateStore; } });
423
+ Object.defineProperty(exports, "createFileWatchStateStore", { enumerable: true, get: function () { return state_store_1.createFileWatchStateStore; } });
424
+ Object.defineProperty(exports, "WATCH_STATE_KEY", { enumerable: true, get: function () { return state_store_1.WATCH_STATE_KEY; } });
425
+ var budget_1 = require("./watch/budget");
426
+ Object.defineProperty(exports, "reserveWatchBudget", { enumerable: true, get: function () { return budget_1.reserveWatchBudget; } });
427
+ Object.defineProperty(exports, "watchEnvelopeKey", { enumerable: true, get: function () { return budget_1.watchEnvelopeKey; } });
428
+ Object.defineProperty(exports, "DEFAULT_WATCH_MONTHLY_USD", { enumerable: true, get: function () { return budget_1.DEFAULT_WATCH_MONTHLY_USD; } });
429
+ // Matrix aggregation (Phase 4 WS6 — gated groundwork; no UI, deny-all RLS).
430
+ var aggregate_1 = require("./matrix/aggregate");
431
+ Object.defineProperty(exports, "aggregatePriors", { enumerable: true, get: function () { return aggregate_1.aggregatePriors; } });
432
+ Object.defineProperty(exports, "aggregatePairwiseFromTelemetry", { enumerable: true, get: function () { return aggregate_1.aggregatePairwiseFromTelemetry; } });
433
+ Object.defineProperty(exports, "writePriorsCells", { enumerable: true, get: function () { return aggregate_1.writePriorsCells; } });
434
+ // Telemetry query surface (Phase 4 WS5).
435
+ var grammar_1 = require("./query/grammar");
436
+ Object.defineProperty(exports, "compileQuery", { enumerable: true, get: function () { return grammar_1.compileQuery; } });
437
+ Object.defineProperty(exports, "QueryGrammarError", { enumerable: true, get: function () { return grammar_1.QueryGrammarError; } });
438
+ var run_4 = require("./query/run");
439
+ Object.defineProperty(exports, "runTelemetryQuery", { enumerable: true, get: function () { return run_4.runTelemetryQuery; } });
440
+ // Savings odometer + swap machinery (Phase 4 WS4).
441
+ var emit_1 = require("./savings/emit");
442
+ Object.defineProperty(exports, "buildSwapChange", { enumerable: true, get: function () { return emit_1.buildSwapChange; } });
443
+ var swap_execute_1 = require("./savings/swap-execute");
444
+ Object.defineProperty(exports, "executeSwap", { enumerable: true, get: function () { return swap_execute_1.executeSwap; } });
445
+ var swaps_client_1 = require("./savings/swaps-client");
446
+ Object.defineProperty(exports, "createSwapsClient", { enumerable: true, get: function () { return swaps_client_1.createSwapsClient; } });
447
+ var odometer_1 = require("./savings/odometer");
448
+ Object.defineProperty(exports, "computeOdometer", { enumerable: true, get: function () { return odometer_1.computeOdometer; } });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Provider call-site finder — `modelrig init` v0 (spec WS2).
3
+ *
4
+ * AST-lite on purpose: a balanced-brace reader over the call's options
5
+ * object, not a TypeScript parser. The job is to find call sites and read
6
+ * the handful of literals that matter (model, system prompt, schema hint,
7
+ * generation params) well enough to DRAFT a route a human will review. It is
8
+ * allowed to be unsure — every uncertainty is recorded as a `note` on the
9
+ * site rather than guessed into the output, because a confident wrong draft
10
+ * is worse than an honest incomplete one.
11
+ *
12
+ * Generic by construction: everything provider-specific lives in
13
+ * signatures.ts. No repo, framework, or company is special-cased.
14
+ */
15
+ export interface CallSiteParams {
16
+ readonly temperature?: number;
17
+ readonly topP?: number;
18
+ readonly maxTokens?: number;
19
+ readonly timeoutMs?: number;
20
+ }
21
+ export interface CallSite {
22
+ readonly file: string;
23
+ /** 1-indexed line of the call expression. */
24
+ readonly line: number;
25
+ readonly provider: string;
26
+ /** Model id when it was a literal; null when it came from a variable. */
27
+ readonly model: string | null;
28
+ /** The identifier the model came from, when it wasn't a literal. */
29
+ readonly modelExpression: string | null;
30
+ /** Literal system prompt when inline; null when referenced or absent. */
31
+ readonly systemPrompt: string | null;
32
+ /** The caller asked for structured output (schema/JSON mode present). */
33
+ readonly wantsStructuredOutput: boolean;
34
+ /** How the schema was expressed, when we could tell: zod | json-schema | json-mode. */
35
+ readonly schemaHint: string | null;
36
+ readonly params: CallSiteParams;
37
+ /** How the site was recognized — SDK call shape, or the API host. */
38
+ readonly matchedBy: "sdk" | "host";
39
+ /** Honest uncertainties for the human reviewing the draft. */
40
+ readonly notes: readonly string[];
41
+ }
42
+ export interface FinderOptions {
43
+ /** Skip these directory names anywhere in the tree. */
44
+ readonly skipDirs?: readonly string[];
45
+ readonly extensions?: readonly string[];
46
+ /** Include test files. Off by default: a mock is not a call site. */
47
+ readonly includeTests?: boolean;
48
+ readonly maxFileBytes?: number;
49
+ }
50
+ export declare const DEFAULT_SKIP_DIRS: readonly string[];
51
+ export interface FileSystemLike {
52
+ readdirSync(path: string, options: {
53
+ withFileTypes: true;
54
+ }): Array<{
55
+ name: string;
56
+ isDirectory(): boolean;
57
+ isFile(): boolean;
58
+ }>;
59
+ readFileSync(path: string, encoding: "utf8"): string;
60
+ statSync(path: string): {
61
+ size: number;
62
+ };
63
+ }
64
+ /** Read the balanced `{...}` object starting at or after `from`. Returns null
65
+ * when the call has no object literal (e.g. a spread or a variable). */
66
+ export declare function readObjectLiteral(source: string, from: number): string | null;
67
+ /** Find provider call sites in one file's text. Exported for fixtures. */
68
+ export declare function findCallSitesInText(file: string, fileText: string): CallSite[];
69
+ export interface ScanResult {
70
+ readonly sites: readonly CallSite[];
71
+ readonly filesScanned: number;
72
+ /** Files skipped for size — reported, never silently dropped. */
73
+ readonly filesSkipped: readonly string[];
74
+ }
75
+ export declare function scanRepoForCallSites(root: string, fs: FileSystemLike, path: {
76
+ join: (...parts: string[]) => string;
77
+ relative: (from: string, to: string) => string;
78
+ }, options?: FinderOptions): ScanResult;
79
+ //# sourceMappingURL=finder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../../src/init/finder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,yEAAyE;IACzE,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,uFAAuF;IACvF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAS9C,CAAC;AAKF,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAAG,KAAK,CAAC;QACjE,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,IAAI,OAAO,CAAC;QACvB,MAAM,IAAI,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED;wEACwE;AACxE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8B7E;AAmID,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,CAqE9E;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,EAC9F,OAAO,GAAE,aAAkB,GAC1B,UAAU,CA4CZ"}