modelrig 0.1.0 → 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/README.md +41 -11
- 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 +50 -6
- package/dist/adapters/anthropic.d.ts.map +1 -1
- package/dist/adapters/anthropic.js +123 -29
- 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 +6 -0
- package/dist/adapters/deepseek.d.ts.map +1 -1
- package/dist/adapters/deepseek.js +54 -1
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +46 -6
- package/dist/adapters/grok.d.ts +9 -0
- package/dist/adapters/grok.d.ts.map +1 -1
- package/dist/adapters/grok.js +67 -3
- package/dist/adapters/openai-compat.d.ts +6 -0
- package/dist/adapters/openai-compat.d.ts.map +1 -1
- package/dist/adapters/openai-compat.js +58 -1
- 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 +6 -0
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +60 -1
- 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/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/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 +15 -0
- package/dist/bakeoff/samples.d.ts.map +1 -1
- package/dist/bakeoff/samples.js +20 -0
- package/dist/cli.d.ts +1 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +134 -116
- package/dist/config.d.ts +100 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +104 -0
- package/dist/deprecations.d.ts +32 -0
- package/dist/deprecations.d.ts.map +1 -0
- package/dist/deprecations.js +59 -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 +105 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +266 -138
- package/dist/init/finder.d.ts +15 -0
- package/dist/init/finder.d.ts.map +1 -1
- package/dist/init/finder.js +46 -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/registry/build.d.ts +94 -1
- package/dist/registry/build.d.ts.map +1 -1
- package/dist/registry/build.js +125 -4
- 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.map +1 -1
- package/dist/registry/call-notes.js +40 -2
- 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.map +1 -1
- package/dist/registry/facts.js +16 -0
- package/dist/registry/parity.d.ts +26 -0
- package/dist/registry/parity.d.ts.map +1 -1
- package/dist/registry/parity.js +43 -2
- 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 +25 -1
- package/dist/registry/pricing.d.ts.map +1 -1
- package/dist/registry/pricing.js +64 -6
- 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/loader.d.ts +37 -0
- package/dist/routes/loader.d.ts.map +1 -1
- package/dist/routes/loader.js +138 -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/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.map +1 -1
- package/dist/run/cost.js +1 -1
- 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/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/resolve.d.ts +75 -2
- package/dist/run/resolve.d.ts.map +1 -1
- package/dist/run/resolve.js +126 -4
- package/dist/run/run.d.ts +14 -0
- package/dist/run/run.d.ts.map +1 -1
- package/dist/run/run.js +0 -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.map +1 -1
- package/dist/run/validate.js +6 -7
- 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 +13 -0
- package/dist/savings/emit.d.ts.map +1 -1
- package/dist/savings/emit.js +25 -0
- package/dist/savings/swap-execute.d.ts +14 -0
- package/dist/savings/swap-execute.d.ts.map +1 -1
- package/dist/savings/swap-execute.js +44 -1
- package/dist/savings/swaps-client.d.ts +14 -0
- package/dist/savings/swaps-client.d.ts.map +1 -1
- package/dist/savings/swaps-client.js +16 -2
- 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 +3 -0
- package/dist/telemetry/capture.d.ts.map +1 -1
- package/dist/telemetry/capture.js +15 -8
- 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 +75 -0
- package/dist/telemetry/exporter.d.ts.map +1 -1
- package/dist/telemetry/exporter.js +324 -47
- 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 +152 -3
- package/dist/telemetry/ingest-protocol.d.ts.map +1 -1
- package/dist/telemetry/ingest-protocol.js +204 -4
- 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 +37 -1
- package/dist/telemetry/sinks.d.ts.map +1 -1
- package/dist/telemetry/sinks.js +121 -30
- package/dist/telemetry/store.d.ts +28 -1
- package/dist/telemetry/store.d.ts.map +1 -1
- package/dist/telemetry/store.js +218 -3
- package/dist/tenancy/api-key-format.d.ts +15 -5
- package/dist/tenancy/api-key-format.d.ts.map +1 -1
- package/dist/tenancy/api-key-format.js +24 -5
- 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/provider.d.ts +122 -1
- package/dist/types/provider.d.ts.map +1 -1
- package/dist/types/provider.js +21 -1
- package/dist/types/route.d.ts +79 -1
- package/dist/types/route.d.ts.map +1 -1
- package/dist/types/telemetry.d.ts +117 -0
- package/dist/types/telemetry.d.ts.map +1 -1
- 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/evaluate.d.ts +162 -3
- package/dist/watch/evaluate.d.ts.map +1 -1
- package/dist/watch/evaluate.js +61 -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 +20 -4
- package/dist/watch/proposals.d.ts.map +1 -1
- package/dist/watch/proposals.js +31 -3
- package/dist/watch/run.d.ts +33 -0
- package/dist/watch/run.d.ts.map +1 -1
- package/dist/watch/run.js +39 -0
- package/package.json +7 -1
- package/registry/LICENSE +20 -0
- package/registry/leaderboard.json +3639 -0
- package/registry/registry.json +7263 -0
- package/dist/telemetry/supabase-exporter.d.ts +0 -64
- package/dist/telemetry/supabase-exporter.d.ts.map +0 -1
- package/dist/telemetry/supabase-exporter.js +0 -211
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../src/watch/proposals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../src/watch/proposals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/E,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,WAAW,GACX,UAAU,GACV,UAAU,GACV,UAAU,GACV,SAAS,CAAC;AAWd,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,GAAG,IAAI,CAO/E;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAkCD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B;mEAC+D;IAC/D,YAAY,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE;;;;;;;;;OASG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/E,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChD;;;;4DAIwD;IACxD,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF;6EACyE;IACzE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E;;;;;;;6DAOyD;IACzD,uFAAuF;IACvF,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,UAAU,GAAG,UAAU,EAC3B,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,EAC/B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,wDAAwD;IACxD,aAAa,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAuLpF"}
|
package/dist/watch/proposals.js
CHANGED
|
@@ -67,16 +67,30 @@ function createProposalsClient(config) {
|
|
|
67
67
|
async submitDrafts(drafts) {
|
|
68
68
|
if (drafts.length === 0)
|
|
69
69
|
return 0;
|
|
70
|
-
|
|
70
|
+
// Dedupe on the REAL unique index. 00013 made it tenant-first
|
|
71
|
+
// `(org_id, route, trigger_hash)` and DROPPED the old `(route, trigger_hash)`
|
|
72
|
+
// index — so the on_conflict target is ALWAYS the composite, in both lanes:
|
|
73
|
+
// - hosted cron: org_id is stamped below;
|
|
74
|
+
// - CLI/self-host: org_id is omitted and the row's house-org column DEFAULT
|
|
75
|
+
// applies, and Postgres evaluates ON CONFLICT against the final row, so the
|
|
76
|
+
// composite index still matches. Naming `(route, trigger_hash)` here — a
|
|
77
|
+
// unique index that no longer exists — would 42P10 the CLI's own watch run.
|
|
78
|
+
const onConflict = "org_id,route,trigger_hash";
|
|
79
|
+
const response = await request(`proposals?on_conflict=${encodeURIComponent(onConflict)}`, {
|
|
71
80
|
method: "POST",
|
|
72
81
|
headers: { prefer: "resolution=ignore-duplicates,return=representation" },
|
|
73
82
|
body: JSON.stringify(drafts.map((d) => ({
|
|
83
|
+
...(config.orgId !== undefined ? { org_id: config.orgId } : {}),
|
|
74
84
|
route: d.route,
|
|
75
85
|
kind: d.kind,
|
|
76
86
|
trigger: d.trigger,
|
|
77
87
|
trigger_hash: d.triggerHash,
|
|
78
88
|
status: "suggested",
|
|
79
89
|
expires_at: d.expiresAt,
|
|
90
|
+
// Analyst insights carry their summary as evidence at insert (E6
|
|
91
|
+
// Chunk B). ignore-duplicates means a re-seen trigger_hash is a
|
|
92
|
+
// no-op — an existing row's evidence is never clobbered.
|
|
93
|
+
...(d.evidence !== undefined ? { evidence: d.evidence } : {}),
|
|
80
94
|
}))),
|
|
81
95
|
});
|
|
82
96
|
const inserted = (await response.json().catch(() => []));
|
|
@@ -98,14 +112,24 @@ function createProposalsClient(config) {
|
|
|
98
112
|
return rows.length > 0 ? toRecord(rows[0]) : null;
|
|
99
113
|
},
|
|
100
114
|
async attachEvidence(id, evidence) {
|
|
101
|
-
|
|
115
|
+
// Status-scoped, like setStatus/decide: a terminal proposal matches zero
|
|
116
|
+
// rows, so attaching evidence can never flip an executed/rejected proposal
|
|
117
|
+
// back to `evidenced` (which would make it re-executable — a double-swap /
|
|
118
|
+
// audit-corruption path an oracle-act caller could otherwise reach on their
|
|
119
|
+
// own org's rows). org_id predicate is defense-in-depth on the scoped path.
|
|
120
|
+
const orgPredicate = config.orgId !== undefined ? `&org_id=eq.${encodeURIComponent(config.orgId)}` : "";
|
|
121
|
+
const response = await request(`proposals?id=eq.${encodeURIComponent(id)}` +
|
|
122
|
+
`&status=in.${encodeURIComponent("(suggested,evidenced)")}${orgPredicate}`, {
|
|
102
123
|
method: "PATCH",
|
|
124
|
+
headers: { prefer: "return=representation" },
|
|
103
125
|
body: JSON.stringify({
|
|
104
126
|
status: "evidenced",
|
|
105
127
|
evidence,
|
|
106
128
|
updated_at: new Date().toISOString(),
|
|
107
129
|
}),
|
|
108
130
|
});
|
|
131
|
+
const rows = (await response.json().catch(() => []));
|
|
132
|
+
return Array.isArray(rows) && rows.length > 0;
|
|
109
133
|
},
|
|
110
134
|
async setStatus(id, from, to) {
|
|
111
135
|
assertTransition(from, to);
|
|
@@ -159,8 +183,12 @@ function createProposalsClient(config) {
|
|
|
159
183
|
},
|
|
160
184
|
async expireOverdue(now) {
|
|
161
185
|
const cutoff = now.toISOString();
|
|
186
|
+
// Org-scoped when this client carries a tenant — one org's cron never
|
|
187
|
+
// sweeps another's rows (the sweep is idempotent, but touching a foreign
|
|
188
|
+
// tenant's proposals is the confused-deputy shape we refuse on principle).
|
|
189
|
+
const orgPredicate = config.orgId !== undefined ? `&org_id=eq.${encodeURIComponent(config.orgId)}` : "";
|
|
162
190
|
await request(`proposals?status=in.${encodeURIComponent("(suggested,evidenced)")}` +
|
|
163
|
-
`&expires_at=lt.${encodeURIComponent(cutoff)}`, {
|
|
191
|
+
`&expires_at=lt.${encodeURIComponent(cutoff)}${orgPredicate}`, {
|
|
164
192
|
method: "PATCH",
|
|
165
193
|
body: JSON.stringify({ status: "expired", updated_at: cutoff }),
|
|
166
194
|
});
|
package/dist/watch/run.d.ts
CHANGED
|
@@ -13,6 +13,9 @@ import type { RouteEconomics, WatchEvent } from "./evaluate";
|
|
|
13
13
|
import type { ProposalsClient } from "./proposals";
|
|
14
14
|
import type { PriceUniverse } from "./state";
|
|
15
15
|
import type { WatchStateStore } from "./state-store";
|
|
16
|
+
import type { CacheStatsRollup } from "../savings/cache-stats";
|
|
17
|
+
import type { CachePredictionDrift, ReconcileOptions } from "../savings/cache-reconcile";
|
|
18
|
+
import type { TelemetryRow } from "../types/telemetry";
|
|
16
19
|
export interface WatchCycleOptions {
|
|
17
20
|
readonly routes: readonly RouteEconomics[];
|
|
18
21
|
/** Local-file state path — the self-host fallback. Ignored when `store`
|
|
@@ -37,4 +40,34 @@ export interface WatchCycleResult {
|
|
|
37
40
|
readonly inserted: number;
|
|
38
41
|
}
|
|
39
42
|
export declare function runWatchCycle(opts: WatchCycleOptions): Promise<WatchCycleResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Predicted cache-read tokens for one (route, candidate) — the ledger/simulator
|
|
45
|
+
* estimate that a reconciliation cycle checks against observed ground truth.
|
|
46
|
+
* Keyed by (route, provider, model) to join to a rollup.
|
|
47
|
+
*/
|
|
48
|
+
export interface CacheReadPrediction {
|
|
49
|
+
readonly route: string;
|
|
50
|
+
readonly provider: string;
|
|
51
|
+
readonly model: string;
|
|
52
|
+
readonly predictedReadTokens: number;
|
|
53
|
+
}
|
|
54
|
+
export interface CacheReconciliationResult {
|
|
55
|
+
readonly rollups: readonly CacheStatsRollup[];
|
|
56
|
+
readonly drift: readonly CachePredictionDrift[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The cache half of a watch cycle (cache-aware-routing spec §5.2, step 6):
|
|
60
|
+
* ROLL UP production cache stats from telemetry rows ONCE, then RECONCILE the
|
|
61
|
+
* ledger/simulator predictions against the observed reads, emitting
|
|
62
|
+
* `cache_prediction_drift` events (G-4 pattern). Pure over its inputs — the
|
|
63
|
+
* caller (a cron/CLI) supplies the window's rows and the predictions from the
|
|
64
|
+
* derived ledger/simulator. Deliberately SEPARATE from `runWatchCycle`: the
|
|
65
|
+
* price-move loop is untouched and byte-identical; this is an additive,
|
|
66
|
+
* independently-testable cache concern that a cron runs alongside it.
|
|
67
|
+
*/
|
|
68
|
+
export declare function runCacheReconciliation(rows: readonly TelemetryRow[], predictions: readonly CacheReadPrediction[], opts: {
|
|
69
|
+
now: number;
|
|
70
|
+
windowDays?: number;
|
|
71
|
+
reconcile?: ReconcileOptions;
|
|
72
|
+
}): CacheReconciliationResult;
|
|
40
73
|
//# sourceMappingURL=run.d.ts.map
|
package/dist/watch/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/watch/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C;iEAC6D;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;kDAE8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;8DAC0D;IAC1D,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiCtF"}
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/watch/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,KAAK,EACV,oBAAoB,EAEpB,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C;iEAC6D;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;kDAE8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;8DAC0D;IAC1D,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiCtF;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,SAAS,YAAY,EAAE,EAC7B,WAAW,EAAE,SAAS,mBAAmB,EAAE,EAC3C,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,gBAAgB,CAAA;CAAE,GACvE,yBAAyB,CAyB3B"}
|
package/dist/watch/run.js
CHANGED
|
@@ -12,9 +12,12 @@
|
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.runWatchCycle = runWatchCycle;
|
|
15
|
+
exports.runCacheReconciliation = runCacheReconciliation;
|
|
15
16
|
const evaluate_1 = require("./evaluate");
|
|
16
17
|
const state_1 = require("./state");
|
|
17
18
|
const state_store_1 = require("./state-store");
|
|
19
|
+
const cache_stats_1 = require("../savings/cache-stats");
|
|
20
|
+
const cache_reconcile_1 = require("../savings/cache-reconcile");
|
|
18
21
|
async function runWatchCycle(opts) {
|
|
19
22
|
const now = opts.now ?? new Date();
|
|
20
23
|
const store = opts.store ??
|
|
@@ -42,3 +45,39 @@ async function runWatchCycle(opts) {
|
|
|
42
45
|
}
|
|
43
46
|
return { seeded, events: events.length, drafts: drafts.length, inserted };
|
|
44
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* The cache half of a watch cycle (cache-aware-routing spec §5.2, step 6):
|
|
50
|
+
* ROLL UP production cache stats from telemetry rows ONCE, then RECONCILE the
|
|
51
|
+
* ledger/simulator predictions against the observed reads, emitting
|
|
52
|
+
* `cache_prediction_drift` events (G-4 pattern). Pure over its inputs — the
|
|
53
|
+
* caller (a cron/CLI) supplies the window's rows and the predictions from the
|
|
54
|
+
* derived ledger/simulator. Deliberately SEPARATE from `runWatchCycle`: the
|
|
55
|
+
* price-move loop is untouched and byte-identical; this is an additive,
|
|
56
|
+
* independently-testable cache concern that a cron runs alongside it.
|
|
57
|
+
*/
|
|
58
|
+
function runCacheReconciliation(rows, predictions, opts) {
|
|
59
|
+
const rollups = (0, cache_stats_1.rollupCacheStats)(rows, {
|
|
60
|
+
now: opts.now,
|
|
61
|
+
...(opts.windowDays !== undefined ? { windowDays: opts.windowDays } : {}),
|
|
62
|
+
});
|
|
63
|
+
// Join predictions to their rollup (observed ground truth) by candidate key.
|
|
64
|
+
const byKey = new Map();
|
|
65
|
+
for (const r of rollups)
|
|
66
|
+
byKey.set(`${r.route}\n${r.provider}\n${r.model}`, r);
|
|
67
|
+
const samples = [];
|
|
68
|
+
for (const p of predictions) {
|
|
69
|
+
const rollup = byKey.get(`${p.route}\n${p.provider}\n${p.model}`);
|
|
70
|
+
if (rollup === undefined)
|
|
71
|
+
continue; // no observed traffic → nothing to reconcile
|
|
72
|
+
samples.push({
|
|
73
|
+
route: p.route,
|
|
74
|
+
provider: p.provider,
|
|
75
|
+
model: p.model,
|
|
76
|
+
predictedReadTokens: p.predictedReadTokens,
|
|
77
|
+
observedReadTokens: rollup.tokensCached,
|
|
78
|
+
windowInputTokens: rollup.tokensIn,
|
|
79
|
+
sampleN: rollup.sampleN,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return { rollups, drift: (0, cache_reconcile_1.reconcileCacheDrift)(samples, opts.reconcile) };
|
|
83
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "modelrig",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "ModelRig — capability-aware AI gateway: routes-as-code, provider adapters, typed failures, budget envelopes, and local-first telemetry.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -25,9 +25,15 @@
|
|
|
25
25
|
"main": "dist/index.js",
|
|
26
26
|
"types": "dist/index.d.ts",
|
|
27
27
|
"//files": "ALLOWLIST, not a denylist, and the difference is not academic. Without this field npm falls back to .npmignore, then to THIS DIRECTORY's .gitignore — never the repo root's. The root ignores `.env.*`, which is why git has never committed .env.local; the package-level .gitignore says nothing about it, so `npm pack` happily included it. A publish would have shipped 13 live secrets, the Supabase service-role key among them, into an immutable public tarball. Anything added here must be something we would hand a stranger. See __tests__/publish-safety.test.ts.",
|
|
28
|
+
"//files-registry": "registry/{registry,leaderboard}.json are fail-open runtime reads (facts.ts/rows.ts degrade to the static baseline when absent) — shipped by R-1 F2 RULING so a clean install routes on the PROBED capability profile the docs and the DVP report describe, not the static fallback. Enumerated file entries, NOT the registry/ dir (it also holds build scripts + tests). Public CC BY 4.0.",
|
|
29
|
+
"//files-data": "`data/` is a RUNTIME dependency, not a build input (R-1 clean-room audit, A1): getPricing() reads data/pricing-map.json from the package root at first cost lookup, with NO existsSync guard — so an absent data/ throws, not degrades. 0.1.0 shipped dist-only and broke the flagship 'effective cost' story on a clean `npm i`. It is public CC BY 4.0 pricing data (data/PROVENANCE.md) — safe to hand a stranger. The tarball clean-room test (__tests__/tarball-cleanroom.test.ts) installs the packed artifact and asserts getPricing() returns a real rate, so this can never silently regress again.",
|
|
28
30
|
"files": [
|
|
29
31
|
"dist",
|
|
32
|
+
"data",
|
|
33
|
+
"registry/registry.json",
|
|
34
|
+
"registry/leaderboard.json",
|
|
30
35
|
"README.md",
|
|
36
|
+
"CHANGELOG.md",
|
|
31
37
|
"LICENSE"
|
|
32
38
|
],
|
|
33
39
|
"scripts": {
|
package/registry/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
The ModelRig registry data (registry.json, layers/, leaderboard.json, and all
|
|
2
|
+
probe-derived data files in this directory) is licensed under the Creative
|
|
3
|
+
Commons Attribution 4.0 International License (CC BY 4.0).
|
|
4
|
+
|
|
5
|
+
You are free to share and adapt this data for any purpose, including
|
|
6
|
+
commercially, provided you give appropriate credit to ModelRig
|
|
7
|
+
(https://modelrig.dev), link to the license, and indicate if changes were made.
|
|
8
|
+
|
|
9
|
+
Full license text: https://creativecommons.org/licenses/by/4.0/legalcode
|
|
10
|
+
|
|
11
|
+
Attribution example:
|
|
12
|
+
"Model capability data from the ModelRig registry (https://modelrig.dev),
|
|
13
|
+
CC BY 4.0."
|
|
14
|
+
|
|
15
|
+
The build scripts in this directory (build-*.ts) are code, licensed under the
|
|
16
|
+
repository's Apache-2.0 LICENSE.
|
|
17
|
+
|
|
18
|
+
The pricing snapshot under data/ is derived from BerriAI/litellm's
|
|
19
|
+
model_prices_and_context_window.json (MIT License, Copyright (c) 2023 Berri AI)
|
|
20
|
+
at the pinned SHA recorded in data/PROVENANCE.md.
|