modelrig 0.0.1 → 0.2.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.
- package/CHANGELOG.md +94 -0
- package/LICENSE +201 -0
- package/README.md +145 -8
- package/data/PROVENANCE.md +19 -0
- package/data/pricing-manual.json +22 -0
- package/data/pricing-map.json +46362 -0
- package/data/pricing-overlay.json +419 -0
- package/dist/adapters/anthropic.d.ts +90 -0
- package/dist/adapters/anthropic.d.ts.map +1 -0
- package/dist/adapters/anthropic.js +296 -0
- package/dist/adapters/build-adapters.d.ts +11 -0
- package/dist/adapters/build-adapters.d.ts.map +1 -0
- package/dist/adapters/build-adapters.js +45 -0
- package/dist/adapters/deepseek.d.ts +47 -0
- package/dist/adapters/deepseek.d.ts.map +1 -0
- package/dist/adapters/deepseek.js +216 -0
- package/dist/adapters/gemini.d.ts +44 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +262 -0
- package/dist/adapters/grok.d.ts +53 -0
- package/dist/adapters/grok.d.ts.map +1 -0
- package/dist/adapters/grok.js +232 -0
- package/dist/adapters/openai-compat.d.ts +80 -0
- package/dist/adapters/openai-compat.d.ts.map +1 -0
- package/dist/adapters/openai-compat.js +244 -0
- package/dist/adapters/openai-stream.d.ts +58 -0
- package/dist/adapters/openai-stream.d.ts.map +1 -0
- package/dist/adapters/openai-stream.js +120 -0
- package/dist/adapters/openai.d.ts +55 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +281 -0
- package/dist/adapters/sampling.d.ts +28 -0
- package/dist/adapters/sampling.d.ts.map +1 -0
- package/dist/adapters/sampling.js +34 -0
- package/dist/adapters/tool-mapping.d.ts +92 -0
- package/dist/adapters/tool-mapping.d.ts.map +1 -0
- package/dist/adapters/tool-mapping.js +143 -0
- package/dist/artifacts/artifact.d.ts +137 -0
- package/dist/artifacts/artifact.d.ts.map +1 -0
- package/dist/artifacts/artifact.js +377 -0
- package/dist/artifacts/content-uploader.d.ts +87 -0
- package/dist/artifacts/content-uploader.d.ts.map +1 -0
- package/dist/artifacts/content-uploader.js +124 -0
- package/dist/artifacts/index.d.ts +63 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +80 -0
- package/dist/artifacts/run-context.d.ts +129 -0
- package/dist/artifacts/run-context.d.ts.map +1 -0
- package/dist/artifacts/run-context.js +208 -0
- package/dist/artifacts/scrub.d.ts +60 -0
- package/dist/artifacts/scrub.d.ts.map +1 -0
- package/dist/artifacts/scrub.js +139 -0
- package/dist/artifacts/step.d.ts +26 -0
- package/dist/artifacts/step.d.ts.map +1 -0
- package/dist/artifacts/step.js +37 -0
- package/dist/artifacts/taint.d.ts +63 -0
- package/dist/artifacts/taint.d.ts.map +1 -0
- package/dist/artifacts/taint.js +76 -0
- package/dist/bakeoff/cache-sim.d.ts +99 -0
- package/dist/bakeoff/cache-sim.d.ts.map +1 -0
- package/dist/bakeoff/cache-sim.js +126 -0
- package/dist/bakeoff/engine.d.ts +52 -0
- package/dist/bakeoff/engine.d.ts.map +1 -0
- package/dist/bakeoff/engine.js +163 -0
- package/dist/bakeoff/eval-cases.d.ts +96 -0
- package/dist/bakeoff/eval-cases.d.ts.map +1 -0
- package/dist/bakeoff/eval-cases.js +105 -0
- package/dist/bakeoff/replay.d.ts +52 -0
- package/dist/bakeoff/replay.d.ts.map +1 -0
- package/dist/bakeoff/replay.js +94 -0
- package/dist/bakeoff/report.d.ts +41 -0
- package/dist/bakeoff/report.d.ts.map +1 -0
- package/dist/bakeoff/report.js +142 -0
- package/dist/bakeoff/samples.d.ts +77 -0
- package/dist/bakeoff/samples.d.ts.map +1 -0
- package/dist/bakeoff/samples.js +148 -0
- package/dist/bakeoff/stats.d.ts +13 -0
- package/dist/bakeoff/stats.d.ts.map +1 -0
- package/dist/bakeoff/stats.js +48 -0
- package/dist/bakeoff/types.d.ts +37 -0
- package/dist/bakeoff/types.d.ts.map +1 -0
- package/dist/bakeoff/types.js +10 -0
- package/dist/cli.d.ts +25 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +590 -0
- package/dist/config.d.ts +204 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +252 -0
- package/dist/deprecations.d.ts +32 -0
- package/dist/deprecations.d.ts.map +1 -0
- package/dist/deprecations.js +59 -0
- package/dist/feedback/coverage.d.ts +32 -0
- package/dist/feedback/coverage.d.ts.map +1 -0
- package/dist/feedback/coverage.js +95 -0
- package/dist/feedback/feedback.d.ts +35 -0
- package/dist/feedback/feedback.d.ts.map +1 -0
- package/dist/feedback/feedback.js +39 -0
- package/dist/gateway/http-protocol.d.ts +175 -0
- package/dist/gateway/http-protocol.d.ts.map +1 -0
- package/dist/gateway/http-protocol.js +105 -0
- package/dist/index.d.ts +242 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +576 -0
- package/dist/init/finder.d.ts +94 -0
- package/dist/init/finder.d.ts.map +1 -0
- package/dist/init/finder.js +343 -0
- package/dist/init/init-cli.d.ts +10 -0
- package/dist/init/init-cli.d.ts.map +1 -0
- package/dist/init/init-cli.js +86 -0
- package/dist/init/observe-cli.d.ts +19 -0
- package/dist/init/observe-cli.d.ts.map +1 -0
- package/dist/init/observe-cli.js +73 -0
- package/dist/init/observe.d.ts +81 -0
- package/dist/init/observe.d.ts.map +1 -0
- package/dist/init/observe.js +245 -0
- package/dist/init/run.d.ts +99 -0
- package/dist/init/run.d.ts.map +1 -0
- package/dist/init/run.js +281 -0
- package/dist/init/signatures.d.ts +39 -0
- package/dist/init/signatures.d.ts.map +1 -0
- package/dist/init/signatures.js +116 -0
- package/dist/matrix/aggregate.d.ts +89 -0
- package/dist/matrix/aggregate.d.ts.map +1 -0
- package/dist/matrix/aggregate.js +186 -0
- package/dist/query/grammar.d.ts +35 -0
- package/dist/query/grammar.d.ts.map +1 -0
- package/dist/query/grammar.js +279 -0
- package/dist/query/run.d.ts +8 -0
- package/dist/query/run.d.ts.map +1 -0
- package/dist/query/run.js +21 -0
- package/dist/registry/build.d.ts +219 -0
- package/dist/registry/build.d.ts.map +1 -0
- package/dist/registry/build.js +313 -0
- package/dist/registry/cache-policy.d.ts +94 -0
- package/dist/registry/cache-policy.d.ts.map +1 -0
- package/dist/registry/cache-policy.js +238 -0
- package/dist/registry/call-notes.d.ts +11 -0
- package/dist/registry/call-notes.d.ts.map +1 -0
- package/dist/registry/call-notes.js +110 -0
- package/dist/registry/claims.d.ts +63 -0
- package/dist/registry/claims.d.ts.map +1 -0
- package/dist/registry/claims.js +107 -0
- package/dist/registry/effective-rate.d.ts +151 -0
- package/dist/registry/effective-rate.d.ts.map +1 -0
- package/dist/registry/effective-rate.js +156 -0
- package/dist/registry/facts.d.ts +32 -0
- package/dist/registry/facts.d.ts.map +1 -0
- package/dist/registry/facts.js +136 -0
- package/dist/registry/fingerprint.d.ts +20 -0
- package/dist/registry/fingerprint.d.ts.map +1 -0
- package/dist/registry/fingerprint.js +150 -0
- package/dist/registry/parity.d.ts +52 -0
- package/dist/registry/parity.d.ts.map +1 -0
- package/dist/registry/parity.js +82 -0
- package/dist/registry/pricing-shape.d.ts +113 -0
- package/dist/registry/pricing-shape.d.ts.map +1 -0
- package/dist/registry/pricing-shape.js +123 -0
- package/dist/registry/pricing.d.ts +43 -0
- package/dist/registry/pricing.d.ts.map +1 -0
- package/dist/registry/pricing.js +127 -0
- package/dist/registry/rows.d.ts +16 -0
- package/dist/registry/rows.d.ts.map +1 -0
- package/dist/registry/rows.js +57 -0
- package/dist/registry/seed.d.ts +43 -0
- package/dist/registry/seed.d.ts.map +1 -0
- package/dist/registry/seed.js +97 -0
- package/dist/registry/select.d.ts +68 -0
- package/dist/registry/select.d.ts.map +1 -0
- package/dist/registry/select.js +141 -0
- package/dist/registry/staleness.d.ts +18 -0
- package/dist/registry/staleness.d.ts.map +1 -0
- package/dist/registry/staleness.js +39 -0
- package/dist/rigindex/bootstrap.d.ts +36 -0
- package/dist/rigindex/bootstrap.d.ts.map +1 -0
- package/dist/rigindex/bootstrap.js +97 -0
- package/dist/rigindex/fit.d.ts +24 -0
- package/dist/rigindex/fit.d.ts.map +1 -0
- package/dist/rigindex/fit.js +76 -0
- package/dist/rigindex/gates.d.ts +52 -0
- package/dist/rigindex/gates.d.ts.map +1 -0
- package/dist/rigindex/gates.js +109 -0
- package/dist/rigindex/graph.d.ts +31 -0
- package/dist/rigindex/graph.d.ts.map +1 -0
- package/dist/rigindex/graph.js +120 -0
- package/dist/rigindex/index.d.ts +23 -0
- package/dist/rigindex/index.d.ts.map +1 -0
- package/dist/rigindex/index.js +112 -0
- package/dist/rigindex/types.d.ts +76 -0
- package/dist/rigindex/types.d.ts.map +1 -0
- package/dist/rigindex/types.js +8 -0
- package/dist/routes/cache-lint.d.ts +41 -0
- package/dist/routes/cache-lint.d.ts.map +1 -0
- package/dist/routes/cache-lint.js +81 -0
- package/dist/routes/draft.d.ts +83 -0
- package/dist/routes/draft.d.ts.map +1 -0
- package/dist/routes/draft.js +135 -0
- package/dist/routes/loader.d.ts +63 -0
- package/dist/routes/loader.d.ts.map +1 -0
- package/dist/routes/loader.js +574 -0
- package/dist/routes/manifest.d.ts +24 -0
- package/dist/routes/manifest.d.ts.map +1 -0
- package/dist/routes/manifest.js +118 -0
- package/dist/routes/resolved-bundle.d.ts +79 -0
- package/dist/routes/resolved-bundle.d.ts.map +1 -0
- package/dist/routes/resolved-bundle.js +148 -0
- package/dist/routes/sampling-config.d.ts +32 -0
- package/dist/routes/sampling-config.d.ts.map +1 -0
- package/dist/routes/sampling-config.js +91 -0
- package/dist/routes/serveability.d.ts +52 -0
- package/dist/routes/serveability.d.ts.map +1 -0
- package/dist/routes/serveability.js +73 -0
- package/dist/routes/template.d.ts +18 -0
- package/dist/routes/template.d.ts.map +1 -0
- package/dist/routes/template.js +94 -0
- package/dist/run/ajv.d.ts +22 -0
- package/dist/run/ajv.d.ts.map +1 -0
- package/dist/run/ajv.js +32 -0
- package/dist/run/cache-handle.d.ts +58 -0
- package/dist/run/cache-handle.d.ts.map +1 -0
- package/dist/run/cache-handle.js +54 -0
- package/dist/run/cache-stamp.d.ts +65 -0
- package/dist/run/cache-stamp.d.ts.map +1 -0
- package/dist/run/cache-stamp.js +0 -0
- package/dist/run/capture-write.d.ts +33 -0
- package/dist/run/capture-write.d.ts.map +1 -0
- package/dist/run/capture-write.js +55 -0
- package/dist/run/cost.d.ts +26 -0
- package/dist/run/cost.d.ts.map +1 -0
- package/dist/run/cost.js +41 -0
- package/dist/run/dispatch.d.ts +99 -0
- package/dist/run/dispatch.d.ts.map +1 -0
- package/dist/run/dispatch.js +191 -0
- package/dist/run/envelope.d.ts +21 -0
- package/dist/run/envelope.d.ts.map +1 -0
- package/dist/run/envelope.js +45 -0
- package/dist/run/grounding.d.ts +56 -0
- package/dist/run/grounding.d.ts.map +1 -0
- package/dist/run/grounding.js +89 -0
- package/dist/run/raw.d.ts +88 -0
- package/dist/run/raw.d.ts.map +1 -0
- package/dist/run/raw.js +286 -0
- package/dist/run/record-attempt.d.ts +40 -0
- package/dist/run/record-attempt.d.ts.map +1 -0
- package/dist/run/record-attempt.js +99 -0
- package/dist/run/repair.d.ts +36 -0
- package/dist/run/repair.d.ts.map +1 -0
- package/dist/run/repair.js +61 -0
- package/dist/run/resolve.d.ts +99 -0
- package/dist/run/resolve.d.ts.map +1 -0
- package/dist/run/resolve.js +203 -0
- package/dist/run/retry.d.ts +19 -0
- package/dist/run/retry.d.ts.map +1 -0
- package/dist/run/retry.js +50 -0
- package/dist/run/run.d.ts +55 -0
- package/dist/run/run.d.ts.map +1 -0
- package/dist/run/run.js +540 -0
- package/dist/run/stream.d.ts +49 -0
- package/dist/run/stream.d.ts.map +1 -0
- package/dist/run/stream.js +87 -0
- package/dist/run/validate.d.ts +15 -0
- package/dist/run/validate.d.ts.map +1 -0
- package/dist/run/validate.js +55 -0
- package/dist/savings/cache-ledger.d.ts +108 -0
- package/dist/savings/cache-ledger.d.ts.map +1 -0
- package/dist/savings/cache-ledger.js +174 -0
- package/dist/savings/cache-reconcile.d.ts +64 -0
- package/dist/savings/cache-reconcile.d.ts.map +1 -0
- package/dist/savings/cache-reconcile.js +59 -0
- package/dist/savings/cache-stats.d.ts +63 -0
- package/dist/savings/cache-stats.d.ts.map +1 -0
- package/dist/savings/cache-stats.js +108 -0
- package/dist/savings/emit.d.ts +38 -0
- package/dist/savings/emit.d.ts.map +1 -0
- package/dist/savings/emit.js +100 -0
- package/dist/savings/odometer.d.ts +32 -0
- package/dist/savings/odometer.d.ts.map +1 -0
- package/dist/savings/odometer.js +70 -0
- package/dist/savings/swap-execute.d.ts +58 -0
- package/dist/savings/swap-execute.d.ts.map +1 -0
- package/dist/savings/swap-execute.js +130 -0
- package/dist/savings/swaps-client.d.ts +55 -0
- package/dist/savings/swaps-client.d.ts.map +1 -0
- package/dist/savings/swaps-client.js +95 -0
- package/dist/settings/api-fetcher.d.ts +39 -0
- package/dist/settings/api-fetcher.d.ts.map +1 -0
- package/dist/settings/api-fetcher.js +92 -0
- package/dist/settings/index.d.ts +10 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +15 -0
- package/dist/settings/task-settings.d.ts +91 -0
- package/dist/settings/task-settings.d.ts.map +1 -0
- package/dist/settings/task-settings.js +116 -0
- package/dist/status.d.ts +77 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +113 -0
- package/dist/telemetry/artifact-store.d.ts +48 -0
- package/dist/telemetry/artifact-store.d.ts.map +1 -0
- package/dist/telemetry/artifact-store.js +189 -0
- package/dist/telemetry/cache-miss-streak.d.ts +79 -0
- package/dist/telemetry/cache-miss-streak.d.ts.map +1 -0
- package/dist/telemetry/cache-miss-streak.js +99 -0
- package/dist/telemetry/capture.d.ts +31 -0
- package/dist/telemetry/capture.d.ts.map +1 -0
- package/dist/telemetry/capture.js +81 -0
- package/dist/telemetry/exporter-setup.d.ts +28 -0
- package/dist/telemetry/exporter-setup.d.ts.map +1 -0
- package/dist/telemetry/exporter-setup.js +34 -0
- package/dist/telemetry/exporter.d.ts +137 -0
- package/dist/telemetry/exporter.d.ts.map +1 -0
- package/dist/telemetry/exporter.js +510 -0
- package/dist/telemetry/health.d.ts +76 -0
- package/dist/telemetry/health.d.ts.map +1 -0
- package/dist/telemetry/health.js +92 -0
- package/dist/telemetry/ingest-protocol.d.ts +310 -0
- package/dist/telemetry/ingest-protocol.d.ts.map +1 -0
- package/dist/telemetry/ingest-protocol.js +363 -0
- package/dist/telemetry/load-error-report.d.ts +24 -0
- package/dist/telemetry/load-error-report.d.ts.map +1 -0
- package/dist/telemetry/load-error-report.js +50 -0
- package/dist/telemetry/otel-map.d.ts +121 -0
- package/dist/telemetry/otel-map.d.ts.map +1 -0
- package/dist/telemetry/otel-map.js +224 -0
- package/dist/telemetry/otel-normalize.d.ts +104 -0
- package/dist/telemetry/otel-normalize.d.ts.map +1 -0
- package/dist/telemetry/otel-normalize.js +530 -0
- package/dist/telemetry/otlp-emitter.d.ts +52 -0
- package/dist/telemetry/otlp-emitter.d.ts.map +1 -0
- package/dist/telemetry/otlp-emitter.js +144 -0
- package/dist/telemetry/otlp-proto.d.ts +29 -0
- package/dist/telemetry/otlp-proto.d.ts.map +1 -0
- package/dist/telemetry/otlp-proto.js +266 -0
- package/dist/telemetry/sinks.d.ts +90 -0
- package/dist/telemetry/sinks.d.ts.map +1 -0
- package/dist/telemetry/sinks.js +180 -0
- package/dist/telemetry/store.d.ts +65 -0
- package/dist/telemetry/store.d.ts.map +1 -0
- package/dist/telemetry/store.js +547 -0
- package/dist/tenancy/api-key-format.d.ts +77 -0
- package/dist/tenancy/api-key-format.d.ts.map +1 -0
- package/dist/tenancy/api-key-format.js +110 -0
- package/dist/tenancy/constants.d.ts +23 -0
- package/dist/tenancy/constants.d.ts.map +1 -0
- package/dist/tenancy/constants.js +25 -0
- package/dist/tenancy/scrub.d.ts +47 -0
- package/dist/tenancy/scrub.d.ts.map +1 -0
- package/dist/tenancy/scrub.js +85 -0
- package/dist/types/config-teaching.d.ts +62 -0
- package/dist/types/config-teaching.d.ts.map +1 -0
- package/dist/types/config-teaching.js +183 -0
- package/dist/types/failures-teaching.d.ts +56 -0
- package/dist/types/failures-teaching.d.ts.map +1 -0
- package/dist/types/failures-teaching.js +177 -0
- package/dist/types/failures.d.ts +27 -0
- package/dist/types/failures.d.ts.map +1 -0
- package/dist/types/failures.js +41 -0
- package/dist/types/provider.d.ts +200 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +40 -0
- package/dist/types/route.d.ts +205 -0
- package/dist/types/route.d.ts.map +1 -0
- package/dist/types/route.js +6 -0
- package/dist/types/telemetry.d.ts +206 -0
- package/dist/types/telemetry.d.ts.map +1 -0
- package/dist/types/telemetry.js +6 -0
- package/dist/validate-cli.d.ts +12 -0
- package/dist/validate-cli.d.ts.map +1 -0
- package/dist/validate-cli.js +57 -0
- package/dist/verify/capture.d.ts +66 -0
- package/dist/verify/capture.d.ts.map +1 -0
- package/dist/verify/capture.js +180 -0
- package/dist/verify/cli-run.d.ts +23 -0
- package/dist/verify/cli-run.d.ts.map +1 -0
- package/dist/verify/cli-run.js +57 -0
- package/dist/verify/diff.d.ts +48 -0
- package/dist/verify/diff.d.ts.map +1 -0
- package/dist/verify/diff.js +157 -0
- package/dist/verify/index.d.ts +17 -0
- package/dist/verify/index.d.ts.map +1 -0
- package/dist/verify/index.js +24 -0
- package/dist/verify/report.d.ts +14 -0
- package/dist/verify/report.d.ts.map +1 -0
- package/dist/verify/report.js +88 -0
- package/dist/verify/types.d.ts +101 -0
- package/dist/verify/types.d.ts.map +1 -0
- package/dist/verify/types.js +17 -0
- package/dist/verify/verify.d.ts +29 -0
- package/dist/verify/verify.d.ts.map +1 -0
- package/dist/verify/verify.js +148 -0
- package/dist/watch/budget.d.ts +19 -0
- package/dist/watch/budget.d.ts.map +1 -0
- package/dist/watch/budget.js +35 -0
- package/dist/watch/evaluate.d.ts +225 -0
- package/dist/watch/evaluate.d.ts.map +1 -0
- package/dist/watch/evaluate.js +155 -0
- package/dist/watch/monitor.d.ts +116 -0
- package/dist/watch/monitor.d.ts.map +1 -0
- package/dist/watch/monitor.js +199 -0
- package/dist/watch/proposals.d.ts +89 -0
- package/dist/watch/proposals.d.ts.map +1 -0
- package/dist/watch/proposals.js +197 -0
- package/dist/watch/run-record.d.ts +64 -0
- package/dist/watch/run-record.d.ts.map +1 -0
- package/dist/watch/run-record.js +86 -0
- package/dist/watch/run-reported.d.ts +20 -0
- package/dist/watch/run-reported.d.ts.map +1 -0
- package/dist/watch/run-reported.js +53 -0
- package/dist/watch/run.d.ts +73 -0
- package/dist/watch/run.d.ts.map +1 -0
- package/dist/watch/run.js +83 -0
- package/dist/watch/state-store.d.ts +48 -0
- package/dist/watch/state-store.d.ts.map +1 -0
- package/dist/watch/state-store.js +86 -0
- package/dist/watch/state.d.ts +21 -0
- package/dist/watch/state.d.ts.map +1 -0
- package/dist/watch/state.js +93 -0
- package/package.json +56 -14
- package/registry/LICENSE +20 -0
- package/registry/leaderboard.json +3639 -0
- package/registry/registry.json +7263 -0
- package/index.js +0 -3
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The two telemetry transports — Phase 6 WS2.
|
|
4
|
+
*
|
|
5
|
+
* telemetry-ingestion-boundary.md §2.4 names three modes. Two of them are
|
|
6
|
+
* sinks and live here; the third (local-only) is the absence of a sink.
|
|
7
|
+
*
|
|
8
|
+
* direct self-host + our own single-tenant deployments · their database
|
|
9
|
+
* api every hosted customer · their `rig_sk_` key only
|
|
10
|
+
*
|
|
11
|
+
* Both implement `TelemetrySink`, both are driven by the SAME exporter loop,
|
|
12
|
+
* and both produce their database rows through `stampBatch` — so the promise
|
|
13
|
+
* that "self-host ↔ hosted migration is a config change, not a data model
|
|
14
|
+
* change" is enforced by construction rather than by review.
|
|
15
|
+
*
|
|
16
|
+
* ── WHY THE API SINK GZIPS AND THE DIRECT ONE DOES NOT ───────────────────
|
|
17
|
+
* The api sink crosses the public internet with one batch per flush, and a
|
|
18
|
+
* batch is highly repetitive JSON. The direct sink talks to PostgREST, which
|
|
19
|
+
* would have to decompress it again on the way into the same database the
|
|
20
|
+
* caller already holds a service-role key for. Compression there would be
|
|
21
|
+
* cost with no payer.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.SinkSendError = void 0;
|
|
25
|
+
exports.createDirectSink = createDirectSink;
|
|
26
|
+
exports.createApiSink = createApiSink;
|
|
27
|
+
exports.buildTelemetrySink = buildTelemetrySink;
|
|
28
|
+
const node_zlib_1 = require("node:zlib");
|
|
29
|
+
const ingest_protocol_1 = require("./ingest-protocol");
|
|
30
|
+
const constants_1 = require("../tenancy/constants");
|
|
31
|
+
/**
|
|
32
|
+
* A sink send failed — the typed error both transports throw (E2 hardening
|
|
33
|
+
* Phase 2, spec §2.3.1). It carries the HTTP status the sink observed (absent
|
|
34
|
+
* for a network-level throw) and a `retriable` verdict the exporter branches on:
|
|
35
|
+
*
|
|
36
|
+
* retriable network throw (no status) · any 5xx · a 429 (overload)
|
|
37
|
+
* → the same batch may land next time; retry forever, never drop.
|
|
38
|
+
* NOT every other 4xx, including the server's deterministic 422
|
|
39
|
+
* → the same bytes will be rejected identically forever; the
|
|
40
|
+
* exporter poison-skips it after a bounded self-heal window.
|
|
41
|
+
*
|
|
42
|
+
* The message is leak-safe BY CONSTRUCTION — status + table only, NEVER the
|
|
43
|
+
* PostgREST/response body. An exporter's warnings are the likeliest place for a
|
|
44
|
+
* secret or a foreign row to reach someone else's log aggregator (C2's leak
|
|
45
|
+
* gate), so the body a failed write returns is logged nowhere.
|
|
46
|
+
*/
|
|
47
|
+
class SinkSendError extends Error {
|
|
48
|
+
constructor(message, status) {
|
|
49
|
+
super(message);
|
|
50
|
+
this.name = "SinkSendError";
|
|
51
|
+
if (status !== undefined)
|
|
52
|
+
this.status = status;
|
|
53
|
+
this.retriable = status === undefined || status >= 500 || status === 429;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.SinkSendError = SinkSendError;
|
|
57
|
+
function createDirectSink(config) {
|
|
58
|
+
const base = config.supabaseUrl.replace(/\/$/, "");
|
|
59
|
+
const fetchFn = config.fetchFn ?? fetch;
|
|
60
|
+
return {
|
|
61
|
+
mode: "direct",
|
|
62
|
+
async send(batch) {
|
|
63
|
+
for (const write of (0, ingest_protocol_1.stampBatch)(batch, config.tenancy)) {
|
|
64
|
+
let response;
|
|
65
|
+
try {
|
|
66
|
+
response = await fetchFn(
|
|
67
|
+
// S5: the upsert names a real unique constraint. A single-argument
|
|
68
|
+
// upsert targets the primary key and 23505s later.
|
|
69
|
+
`${base}/rest/v1/${write.table}?on_conflict=${encodeURIComponent(write.onConflict)}`, {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers: {
|
|
72
|
+
"content-type": "application/json",
|
|
73
|
+
apikey: config.serviceRoleKey,
|
|
74
|
+
authorization: `Bearer ${config.serviceRoleKey}`,
|
|
75
|
+
prefer: write.merge
|
|
76
|
+
? "resolution=merge-duplicates,return=minimal"
|
|
77
|
+
: "resolution=ignore-duplicates,return=minimal",
|
|
78
|
+
},
|
|
79
|
+
body: JSON.stringify(write.rows),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Network-level throw — no status, so TRANSIENT (the exporter retries
|
|
84
|
+
// forever). The raw error can carry the control-plane host, so it is
|
|
85
|
+
// NOT echoed (C2); the table + "network error" is the whole message.
|
|
86
|
+
throw new SinkSendError(`sink POST ${write.table} → network error`, undefined);
|
|
87
|
+
}
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
// Status + table only — never the PostgREST body (it carries the
|
|
90
|
+
// control-plane host and, on some failures, header fragments; C2).
|
|
91
|
+
// The status is what the exporter classifies on (spec §2.3.1).
|
|
92
|
+
throw new SinkSendError(`sink POST ${write.table} → ${response.status}`, response.status);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Below this, gzip costs more than it saves. */
|
|
99
|
+
const GZIP_MIN_BYTES = 1024;
|
|
100
|
+
function createApiSink(config) {
|
|
101
|
+
const url = config.ingestUrl.replace(/\/$/, "") + ingest_protocol_1.INGEST_PATH;
|
|
102
|
+
const fetchFn = config.fetchFn ?? fetch;
|
|
103
|
+
return {
|
|
104
|
+
mode: "api",
|
|
105
|
+
async send(batch) {
|
|
106
|
+
// Trust the version the EXPORTER set (spec §1.3): it announces v2 only
|
|
107
|
+
// when the artifact namespace is active, v1 otherwise. Overriding it here
|
|
108
|
+
// would force every batch to the max version and break the v1-byte-
|
|
109
|
+
// identical guarantee (and 422 v1 rigs against a strict old server).
|
|
110
|
+
const json = JSON.stringify(batch);
|
|
111
|
+
const compress = Buffer.byteLength(json) >= GZIP_MIN_BYTES;
|
|
112
|
+
let response;
|
|
113
|
+
try {
|
|
114
|
+
response = await fetchFn(url, {
|
|
115
|
+
method: "POST",
|
|
116
|
+
headers: {
|
|
117
|
+
"content-type": "application/json",
|
|
118
|
+
authorization: `Bearer ${config.apiKey}`,
|
|
119
|
+
...(compress ? { "content-encoding": "gzip" } : {}),
|
|
120
|
+
},
|
|
121
|
+
body: compress ? (0, node_zlib_1.gzipSync)(json) : json,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Network-level throw — no status ⇒ TRANSIENT (retry forever). The raw
|
|
126
|
+
// error can carry the endpoint host, so it is not echoed (C2).
|
|
127
|
+
throw new SinkSendError("ingest POST → network error", undefined);
|
|
128
|
+
}
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
// Status only — never the response body. The key never appears in the
|
|
131
|
+
// message (C2's leak gate covers failure text), and an exporter's
|
|
132
|
+
// warnings are the likeliest place for a secret to reach someone else's
|
|
133
|
+
// log aggregator. The status is the exporter's transient-vs-poison
|
|
134
|
+
// signal: the server sends 422 for a deterministic control-plane
|
|
135
|
+
// rejection, 503 for a transient one (spec §2.2/§2.3.1).
|
|
136
|
+
throw new SinkSendError(`ingest POST → ${response.status}`, response.status);
|
|
137
|
+
}
|
|
138
|
+
if (config.onOutcome !== undefined) {
|
|
139
|
+
const outcome = (await response.json().catch(() => null));
|
|
140
|
+
if (outcome !== null)
|
|
141
|
+
config.onOutcome(outcome);
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build the telemetry transport for the configured export mode. One place, so
|
|
148
|
+
* the run-loop exporter and the load-error reporter build it the same way —
|
|
149
|
+
* telemetry-ingestion-boundary.md §4's "one loop, two transports". (Lived in
|
|
150
|
+
* index.ts until Phase D; moved here — its natural home — to keep that file
|
|
151
|
+
* under the LOC cap.)
|
|
152
|
+
*/
|
|
153
|
+
function buildTelemetrySink(exportConfig, sourceId) {
|
|
154
|
+
return exportConfig.mode === "api"
|
|
155
|
+
? createApiSink({
|
|
156
|
+
ingestUrl: exportConfig.ingestUrl,
|
|
157
|
+
apiKey: exportConfig.apiKey,
|
|
158
|
+
// A batch the server partly refused comes back 200. Without this, a
|
|
159
|
+
// customer whose rows are being dropped would find out by noticing a
|
|
160
|
+
// gap in a chart weeks later.
|
|
161
|
+
onOutcome: (outcome) => {
|
|
162
|
+
const dropped = Object.values(outcome.dropped).reduce((a, b) => a + b, 0);
|
|
163
|
+
if (dropped === 0)
|
|
164
|
+
return;
|
|
165
|
+
const reasons = Object.entries(outcome.reasons)
|
|
166
|
+
.map(([reason, count]) => `${reason}×${count}`)
|
|
167
|
+
.join(", ");
|
|
168
|
+
console.warn(`[modelrig exporter] ingest dropped ${dropped} row(s): ${reasons}`);
|
|
169
|
+
},
|
|
170
|
+
})
|
|
171
|
+
: createDirectSink({
|
|
172
|
+
supabaseUrl: exportConfig.supabaseUrl,
|
|
173
|
+
serviceRoleKey: exportConfig.serviceRoleKey,
|
|
174
|
+
tenancy: {
|
|
175
|
+
org_id: exportConfig.orgId ?? constants_1.HOUSE_ORG_ID,
|
|
176
|
+
project_id: exportConfig.projectId ?? null,
|
|
177
|
+
source_id: sourceId,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite telemetry store — spec §5, plan §2. Package-owned storage; zero
|
|
3
|
+
* InferWealth Supabase involvement. Schema created idempotently on open;
|
|
4
|
+
* PRAGMA user_version tracks migrations (v2: fingerprint_cell, Phase 2;
|
|
5
|
+
* v3: captures table + served_variant/repaired_by, Phase 3).
|
|
6
|
+
*
|
|
7
|
+
* PRIVACY (Phase 3 WS4): the `captures` table is created here but NEVER read
|
|
8
|
+
* here — capture access lives exclusively behind telemetry/capture.ts's
|
|
9
|
+
* separate handle. ExportableTelemetryStore MUST NOT gain capture accessors;
|
|
10
|
+
* the export-isolation tests are the tripwire.
|
|
11
|
+
*/
|
|
12
|
+
import type { EnvelopeRow, FeedbackRow, RunRow, StepRow, TelemetryRow, TelemetryStore } from "../types/telemetry";
|
|
13
|
+
import { type EndpointHealth } from "./health";
|
|
14
|
+
/**
|
|
15
|
+
* Superset of the TelemetryStore contract with the enumeration hooks the
|
|
16
|
+
* Supabase exporter needs (rowid-watermarked reads + local export state).
|
|
17
|
+
* Kept out of types/telemetry.ts on purpose: the public contract stays
|
|
18
|
+
* minimal; the exporter is wired against the concrete store.
|
|
19
|
+
*/
|
|
20
|
+
export interface ExportableTelemetryStore extends TelemetryStore {
|
|
21
|
+
/** Rows with rowid > afterRowid, oldest first, with their rowids. */
|
|
22
|
+
readInferencesAfter(afterRowid: number, limit: number): Array<{
|
|
23
|
+
rowid: number;
|
|
24
|
+
row: TelemetryRow;
|
|
25
|
+
}>;
|
|
26
|
+
/** Feedback rows past the watermark, oldest first (Phase 4 mirror). */
|
|
27
|
+
readFeedbackAfter(afterRowid: number, limit: number): Array<{
|
|
28
|
+
rowid: number;
|
|
29
|
+
row: FeedbackRow;
|
|
30
|
+
}>;
|
|
31
|
+
/** Record a run (E2 chunk A) — run.start/run.end. Upsert: run.end overwrites
|
|
32
|
+
* the running projection with its terminal status/ended_at. */
|
|
33
|
+
recordRun(row: RunRow): void;
|
|
34
|
+
/** Record one step attempt (E2 chunk A) — a fact, insert-or-ignore on the PK. */
|
|
35
|
+
recordStep(row: StepRow): void;
|
|
36
|
+
/** Runs past the watermark, oldest first (E2 exporter stream). */
|
|
37
|
+
readRunsAfter(afterRowid: number, limit: number): Array<{
|
|
38
|
+
rowid: number;
|
|
39
|
+
row: RunRow;
|
|
40
|
+
}>;
|
|
41
|
+
/** Steps past the watermark, oldest first (E2 exporter stream). */
|
|
42
|
+
readStepsAfter(afterRowid: number, limit: number): Array<{
|
|
43
|
+
rowid: number;
|
|
44
|
+
row: StepRow;
|
|
45
|
+
}>;
|
|
46
|
+
/** The ground-truth inference id for a (run, step) — the LATEST attempt with a
|
|
47
|
+
* non-null inference_id, or null (E4 chunk A: bake-off rehydration resolves an
|
|
48
|
+
* eval case's source step to the inference that keys its captured input). */
|
|
49
|
+
getStepInferenceId(runId: string, stepKey: string): string | null;
|
|
50
|
+
/** Newest-first local feedback read (console/dev inspection). */
|
|
51
|
+
listFeedback(limit: number): FeedbackRow[];
|
|
52
|
+
listEnvelopes(): EnvelopeRow[];
|
|
53
|
+
/** Local exporter watermark (per source instance), 0 when unset. */
|
|
54
|
+
getExportWatermark(sourceId: string): number;
|
|
55
|
+
setExportWatermark(sourceId: string, lastRowid: number): void;
|
|
56
|
+
/**
|
|
57
|
+
* Observed-health aggregate (G-4) — per (provider, model) over the last
|
|
58
|
+
* `windowMinutes`: p50/p90/p99 latency + TTFB and recent error-rate, gated to
|
|
59
|
+
* `null` below `minN`. Advisory operational health for routing + the console;
|
|
60
|
+
* NEVER an input to RigIndex rank (spec §4.4).
|
|
61
|
+
*/
|
|
62
|
+
readEndpointHealth(windowMinutes: number, minN: number): EndpointHealth[];
|
|
63
|
+
}
|
|
64
|
+
export declare function openTelemetryStore(dbPath: string): ExportableTelemetryStore;
|
|
65
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,MAAM,EACN,OAAO,EACP,YAAY,EACZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAA2B,KAAK,cAAc,EAAuB,MAAM,UAAU,CAAC;AAE7F;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,qEAAqE;IACrE,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACpG,uEAAuE;IACvE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IACjG;mEAC+D;IAC/D,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,mEAAmE;IACnE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1F;;iFAE6E;IAC7E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClE,iEAAiE;IACjE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAC3C,aAAa,IAAI,WAAW,EAAE,CAAC;IAC/B,oEAAoE;IACpE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D;;;;;OAKG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;CAC3E;AA6RD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CA8V3E"}
|