@sixb/core 0.1.16 → 0.1.18
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/dist/actions/index.js +30 -27
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/read-facade.d.ts +1 -1
- package/dist/actions/types/context.d.ts +2 -2
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- package/dist/actions/worker.js +6 -2
- package/dist/actions/worker.js.map +3 -3
- package/dist/agents/adapters.d.ts +7 -0
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +7 -0
- package/dist/agents/authority.d.ts.map +1 -1
- package/dist/agents/context/entries.d.ts +10 -1
- package/dist/agents/context/entries.d.ts.map +1 -1
- package/dist/agents/context/index.d.ts +1 -1
- package/dist/agents/context/index.d.ts.map +1 -1
- package/dist/agents/context/index.js +4 -2
- package/dist/agents/context/index.js.map +1 -1
- package/dist/agents/context-compaction.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +1 -1
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/index.d.ts +6 -4
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +54 -46
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +8 -1
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/request.d.ts +19 -5
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/skills.d.ts +41 -0
- package/dist/agents/skills.d.ts.map +1 -0
- package/dist/agents/streams/index.js +1 -1
- package/dist/agents/streams/internal.js +1 -1
- package/dist/agents/types.d.ts +33 -4
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/auth/index.js +9 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/types.d.ts +6 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/authorization/index.js +5 -3
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +1 -1
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/authorization/types.d.ts +7 -0
- package/dist/authorization/types.d.ts.map +1 -1
- package/dist/blob-storage/browser.js +1 -1
- package/dist/blob-storage/download-urls.d.ts +41 -0
- package/dist/blob-storage/download-urls.d.ts.map +1 -0
- package/dist/blob-storage/execution.d.ts +9 -1
- package/dist/blob-storage/execution.d.ts.map +1 -1
- package/dist/blob-storage/file-content.d.ts +18 -0
- package/dist/blob-storage/file-content.d.ts.map +1 -0
- package/dist/blob-storage/index.d.ts +1 -1
- package/dist/blob-storage/index.d.ts.map +1 -1
- package/dist/blob-storage/index.js +6 -4
- package/dist/blob-storage/index.js.map +1 -1
- package/dist/blob-storage/internal.d.ts +4 -0
- package/dist/blob-storage/internal.d.ts.map +1 -0
- package/dist/blob-storage/internal.js +23 -0
- package/dist/blob-storage/internal.js.map +9 -0
- package/dist/blob-storage/media-type.d.ts +8 -0
- package/dist/blob-storage/media-type.d.ts.map +1 -0
- package/dist/blob-storage/types.d.ts +12 -1
- package/dist/blob-storage/types.d.ts.map +1 -1
- package/dist/blob-storage/validation.d.ts +6 -0
- package/dist/blob-storage/validation.d.ts.map +1 -1
- package/dist/bootstrap/agent-context.d.ts +33 -0
- package/dist/bootstrap/agent-context.d.ts.map +1 -0
- package/dist/bootstrap/discovery.d.ts +23 -3
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.d.ts +2 -1
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +287 -75
- package/dist/bootstrap/index.js.map +4 -3
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
- package/dist/{chunk-kttr5ftm.js → chunk-1b1f2d5f.js} +23 -6
- package/dist/chunk-1b1f2d5f.js.map +12 -0
- package/dist/{chunk-hgqpcmyr.js → chunk-1hqwggsn.js} +47 -19
- package/dist/chunk-1hqwggsn.js.map +12 -0
- package/dist/{chunk-9vx5e9g1.js → chunk-1sr8ryzk.js} +3 -3
- package/dist/chunk-1sr8ryzk.js.map +11 -0
- package/dist/{chunk-4gmng3vf.js → chunk-22v5bpz3.js} +1 -1
- package/dist/{chunk-tnvafr7g.js → chunk-29yx306f.js} +124 -9
- package/dist/chunk-29yx306f.js.map +22 -0
- package/dist/{chunk-fj1dvp37.js → chunk-2vhg6ysa.js} +1 -1
- package/dist/chunk-3zxk45er.js +152 -0
- package/dist/chunk-3zxk45er.js.map +11 -0
- package/dist/{chunk-gmdvns8f.js → chunk-48e3cn2d.js} +2 -2
- package/dist/{chunk-jgwb25gc.js → chunk-4as3wt1c.js} +13 -5
- package/dist/chunk-4as3wt1c.js.map +12 -0
- package/dist/{chunk-91kcnbf0.js → chunk-6gmfggss.js} +22 -9
- package/dist/chunk-6gmfggss.js.map +10 -0
- package/dist/{chunk-2xvgy3x5.js → chunk-6h5m9xjx.js} +43 -415
- package/dist/{chunk-2xvgy3x5.js.map → chunk-6h5m9xjx.js.map} +7 -11
- package/dist/{chunk-cq44v1a6.js → chunk-7hpdd6r9.js} +3 -3
- package/dist/{chunk-f85hpqnm.js → chunk-99nd4rc1.js} +3 -3
- package/dist/{chunk-f85hpqnm.js.map → chunk-99nd4rc1.js.map} +3 -3
- package/dist/chunk-b9affek3.js +261 -0
- package/dist/chunk-b9affek3.js.map +12 -0
- package/dist/{chunk-zvmr2hqk.js → chunk-bs7sqkre.js} +10 -4
- package/dist/chunk-bs7sqkre.js.map +12 -0
- package/dist/{chunk-rb143ggb.js → chunk-bwjcehza.js} +1 -1
- package/dist/{chunk-667x4drs.js → chunk-d0eb5yy6.js} +143 -7
- package/dist/chunk-d0eb5yy6.js.map +14 -0
- package/dist/chunk-d62kjtbg.js.map +2 -2
- package/dist/{chunk-gkxsenvp.js → chunk-de4z2bj6.js} +31 -7
- package/dist/{chunk-gkxsenvp.js.map → chunk-de4z2bj6.js.map} +5 -4
- package/dist/{chunk-mdnw7nj8.js → chunk-dnmadg9k.js} +35 -10
- package/dist/chunk-dnmadg9k.js.map +15 -0
- package/dist/chunk-enpsx8k5.js +127 -0
- package/dist/chunk-enpsx8k5.js.map +10 -0
- package/dist/{chunk-xnx96gfy.js → chunk-ere85b8y.js} +17 -8
- package/dist/chunk-ere85b8y.js.map +15 -0
- package/dist/{chunk-k4kkp58d.js → chunk-ewqa58h9.js} +12 -2
- package/dist/chunk-ewqa58h9.js.map +11 -0
- package/dist/{chunk-7g2gjvah.js → chunk-ex496vct.js} +1 -1
- package/dist/{chunk-nvymebc1.js → chunk-f1zxad2t.js} +1 -1
- package/dist/{chunk-3q7z9hd4.js → chunk-fe52eczz.js} +483 -101
- package/dist/chunk-fe52eczz.js.map +49 -0
- package/dist/{chunk-8x74221e.js → chunk-fx93hd2n.js} +79 -32
- package/dist/chunk-fx93hd2n.js.map +20 -0
- package/dist/{chunk-39tqv9hz.js → chunk-gc4ntf7d.js} +6 -7
- package/dist/{chunk-39tqv9hz.js.map → chunk-gc4ntf7d.js.map} +3 -4
- package/dist/chunk-h8teetr0.js +9 -0
- package/dist/chunk-h8teetr0.js.map +10 -0
- package/dist/{chunk-98cw09sw.js → chunk-hkc3jct7.js} +4 -2
- package/dist/chunk-hkc3jct7.js.map +10 -0
- package/dist/chunk-hn2r7z41.js.map +1 -1
- package/dist/{chunk-h044jb97.js → chunk-htr6wjmv.js} +282 -58
- package/dist/chunk-htr6wjmv.js.map +19 -0
- package/dist/{chunk-h3v76ams.js → chunk-jhm3zsa7.js} +25 -2
- package/dist/chunk-jhm3zsa7.js.map +12 -0
- package/dist/{chunk-chdg6eqq.js → chunk-k6hrnf35.js} +5 -5
- package/dist/chunk-k6hrnf35.js.map +10 -0
- package/dist/{chunk-a0073121.js → chunk-kpx7jrmn.js} +3 -1
- package/dist/chunk-kpx7jrmn.js.map +12 -0
- package/dist/{chunk-b9y8hcm2.js → chunk-mfs23znk.js} +1 -1
- package/dist/{chunk-kvysp909.js → chunk-ny3xyvcn.js} +32 -19
- package/dist/chunk-ny3xyvcn.js.map +17 -0
- package/dist/{chunk-h4138ww2.js → chunk-p0dqwj3n.js} +450 -799
- package/dist/chunk-p0dqwj3n.js.map +49 -0
- package/dist/{chunk-f72rbvsb.js → chunk-p844e0rn.js} +23 -8
- package/dist/chunk-p844e0rn.js.map +19 -0
- package/dist/{chunk-dmn70ztd.js → chunk-pfp1txq2.js} +25 -6
- package/dist/chunk-pfp1txq2.js.map +11 -0
- package/dist/chunk-pqajwytd.js.map +3 -3
- package/dist/{chunk-mr60an99.js → chunk-qczk96d9.js} +22 -2
- package/dist/{chunk-mr60an99.js.map → chunk-qczk96d9.js.map} +3 -3
- package/dist/{chunk-69kt9q43.js → chunk-qkbx3tf6.js} +17 -128
- package/dist/{chunk-69kt9q43.js.map → chunk-qkbx3tf6.js.map} +6 -7
- package/dist/{chunk-h866d223.js → chunk-qkvz64nd.js} +2 -2
- package/dist/{chunk-vsvrv7n8.js → chunk-qmnnhde6.js} +4 -8
- package/dist/{chunk-vsvrv7n8.js.map → chunk-qmnnhde6.js.map} +3 -3
- package/dist/{chunk-6z1q7j19.js → chunk-qq90g05n.js} +1128 -782
- package/dist/chunk-qq90g05n.js.map +66 -0
- package/dist/{chunk-40qb8wpe.js → chunk-qxvp5epv.js} +84 -29
- package/dist/{chunk-40qb8wpe.js.map → chunk-qxvp5epv.js.map} +10 -9
- package/dist/chunk-rdghfsss.js.map +2 -2
- package/dist/{chunk-s3csryxe.js → chunk-rj69qcrd.js} +8 -2
- package/dist/chunk-rj69qcrd.js.map +11 -0
- package/dist/{chunk-tkdbge6v.js → chunk-rt9p8m9t.js} +1 -1
- package/dist/{chunk-cd234ba4.js → chunk-rz53yb4v.js} +10 -5
- package/dist/chunk-rz53yb4v.js.map +14 -0
- package/dist/{chunk-a7ne02hk.js → chunk-s4jhg8a3.js} +351 -296
- package/dist/chunk-s4jhg8a3.js.map +15 -0
- package/dist/{chunk-69266efg.js → chunk-s54c868q.js} +12 -4
- package/dist/chunk-s54c868q.js.map +12 -0
- package/dist/{chunk-dsv8kdgk.js → chunk-tffvfy6s.js} +8 -7
- package/dist/{chunk-dsv8kdgk.js.map → chunk-tffvfy6s.js.map} +3 -3
- package/dist/{chunk-sbcm1b92.js → chunk-v6xpd60t.js} +3 -3
- package/dist/{chunk-nj0020ay.js → chunk-vgk3hknm.js} +1 -1
- package/dist/{chunk-qnd7ehe5.js → chunk-vx2yp45y.js} +2 -2
- package/dist/{chunk-vjqt7q3a.js → chunk-vz3gc1tm.js} +607 -45
- package/dist/chunk-vz3gc1tm.js.map +41 -0
- package/dist/{chunk-g4rbm4a6.js → chunk-wt4szfec.js} +379 -331
- package/dist/chunk-wt4szfec.js.map +14 -0
- package/dist/chunk-xt1zt7gv.js +471 -0
- package/dist/chunk-xt1zt7gv.js.map +13 -0
- package/dist/{chunk-swxzncrv.js → chunk-y05543x6.js} +51 -8
- package/dist/{chunk-swxzncrv.js.map → chunk-y05543x6.js.map} +5 -5
- package/dist/{chunk-zdkcdshk.js → chunk-y9jmd7e5.js} +41 -3
- package/dist/{chunk-zdkcdshk.js.map → chunk-y9jmd7e5.js.map} +4 -3
- package/dist/{chunk-nkbev3tr.js → chunk-yv9czyfr.js} +3 -3
- package/dist/{chunk-z5rnrmz1.js → chunk-yw9pyg66.js} +5 -3
- package/dist/chunk-yw9pyg66.js.map +11 -0
- package/dist/{chunk-cxj8y8t0.js → chunk-za5yd58j.js} +2 -2
- package/dist/{chunk-zb47r1c8.js → chunk-zb77kjth.js} +3 -3
- package/dist/{chunk-dp7yk20b.js → chunk-zxawp1n2.js} +1 -1
- package/dist/datasets/builders.d.ts +12 -1
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/execution.d.ts +27 -1
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/index.d.ts +1 -1
- package/dist/datasets/index.d.ts.map +1 -1
- package/dist/datasets/types.d.ts +2 -0
- package/dist/datasets/types.d.ts.map +1 -1
- package/dist/datasets/write.d.ts +5 -0
- package/dist/datasets/write.d.ts.map +1 -1
- package/dist/datasets/write.js +10 -5
- package/dist/datasets/write.js.map +1 -1
- package/dist/edits/properties.d.ts.map +1 -1
- package/dist/events/execution.d.ts +2 -1
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/types/objects.d.ts +5 -0
- package/dist/events/types/objects.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +10 -0
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +49 -43
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +9 -2
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/primitive.js +45 -41
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.js +46 -42
- package/dist/execution/request.js.map +2 -2
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -71
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +5 -1
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +1 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +8 -5
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/types.d.ts +26 -0
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/maintenance/ontology-maintenance.d.ts +5 -1
- package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
- package/dist/maintenance/types.d.ts +1 -4
- package/dist/maintenance/types.d.ts.map +1 -1
- package/dist/materialization/event-envelopes.d.ts +20 -0
- package/dist/materialization/event-envelopes.d.ts.map +1 -0
- package/dist/materialization/events.d.ts +29 -3
- package/dist/materialization/events.d.ts.map +1 -1
- package/dist/materialization/index.d.ts +4 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +9 -3
- package/dist/materialization/index.js.map +1 -1
- package/dist/materializer/edits/plan.d.ts +2 -10
- package/dist/materializer/edits/plan.d.ts.map +1 -1
- package/dist/materializer/effective/build-events.d.ts +5 -21
- package/dist/materializer/effective/build-events.d.ts.map +1 -1
- package/dist/materializer/effective/vector-indexing.d.ts +2 -3
- package/dist/materializer/effective/vector-indexing.d.ts.map +1 -1
- package/dist/materializer/effective/vectors.d.ts +2 -3
- package/dist/materializer/effective/vectors.d.ts.map +1 -1
- package/dist/materializer/execution/scope.d.ts +1 -11
- package/dist/materializer/execution/scope.d.ts.map +1 -1
- package/dist/materializer/execution/work-executor.d.ts +5 -7
- package/dist/materializer/execution/work-executor.d.ts.map +1 -1
- package/dist/materializer/execution/work-records.d.ts +1 -3
- package/dist/materializer/execution/work-records.d.ts.map +1 -1
- package/dist/materializer/index.js +35 -33
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/projections/replace.d.ts.map +1 -1
- package/dist/materializer/projections/replacement-plan.d.ts +8 -11
- package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
- package/dist/materializer/shared/batching.d.ts +5 -0
- package/dist/materializer/shared/batching.d.ts.map +1 -1
- package/dist/materializer/telemetry/plan.d.ts +2 -8
- package/dist/materializer/telemetry/plan.d.ts.map +1 -1
- package/dist/models/audio/catalog.d.ts +20 -0
- package/dist/models/audio/catalog.d.ts.map +1 -0
- package/dist/models/audio/errors.d.ts +8 -0
- package/dist/models/audio/errors.d.ts.map +1 -0
- package/dist/models/audio/file.d.ts +9 -0
- package/dist/models/audio/file.d.ts.map +1 -0
- package/dist/models/audio/runtime.d.ts +8 -0
- package/dist/models/audio/runtime.d.ts.map +1 -0
- package/dist/models/audio/types.d.ts +60 -0
- package/dist/models/audio/types.d.ts.map +1 -0
- package/dist/models/catalog.d.ts +24 -2
- package/dist/models/catalog.d.ts.map +1 -1
- package/dist/models/definitions.d.ts +1 -1
- package/dist/models/definitions.d.ts.map +1 -1
- package/dist/models/events.d.ts +3 -0
- package/dist/models/events.d.ts.map +1 -1
- package/dist/models/execution/binding.d.ts +6 -0
- package/dist/models/execution/binding.d.ts.map +1 -1
- package/dist/models/execution/index.js +27 -24
- package/dist/models/execution/index.js.map +1 -1
- package/dist/models/execution/model-call-admission.d.ts +6 -1
- package/dist/models/execution/model-call-admission.d.ts.map +1 -1
- package/dist/models/execution/model-call-limits.d.ts.map +1 -1
- package/dist/models/execution/model-call-recorder.d.ts +4 -0
- package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
- package/dist/models/execution/reranking.d.ts +4 -0
- package/dist/models/execution/reranking.d.ts.map +1 -0
- package/dist/models/execution/usage.d.ts.map +1 -1
- package/dist/models/execution.d.ts +2 -1
- package/dist/models/execution.d.ts.map +1 -1
- package/dist/models/generation-types.d.ts +2 -0
- package/dist/models/generation-types.d.ts.map +1 -1
- package/dist/models/index.d.ts +7 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +6 -2
- package/dist/models/index.js.map +1 -1
- package/dist/models/language-model.d.ts +6 -0
- package/dist/models/language-model.d.ts.map +1 -1
- package/dist/models/pricing.d.ts +2 -2
- package/dist/models/pricing.d.ts.map +1 -1
- package/dist/models/reranking-model.d.ts +49 -0
- package/dist/models/reranking-model.d.ts.map +1 -0
- package/dist/objects/context/index.d.ts +1 -1
- package/dist/objects/context/index.d.ts.map +1 -1
- package/dist/objects/context/types.d.ts +6 -0
- package/dist/objects/context/types.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +2 -1
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +31 -27
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/materializer-adapter.d.ts.map +1 -1
- package/dist/objects/object/upsert-batch.d.ts.map +1 -1
- package/dist/objects/object/upsert.d.ts.map +1 -1
- package/dist/objects/property-clearance.d.ts +41 -0
- package/dist/objects/property-clearance.d.ts.map +1 -0
- package/dist/objects/query/executor.d.ts +5 -1
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.d.ts +1 -1
- package/dist/objects/query/index.d.ts.map +1 -1
- package/dist/objects/query/index.js +27 -24
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/ir.d.ts +8 -1
- package/dist/objects/query/ir.d.ts.map +1 -1
- package/dist/objects/query/normalize.d.ts.map +1 -1
- package/dist/objects/query/planner.d.ts +1 -1
- package/dist/objects/query/planner.d.ts.map +1 -1
- package/dist/objects/query/primary-id.d.ts +7 -0
- package/dist/objects/query/primary-id.d.ts.map +1 -0
- package/dist/objects/query/reranking-executor.d.ts +13 -0
- package/dist/objects/query/reranking-executor.d.ts.map +1 -0
- package/dist/objects/query/reranking-limits.d.ts +3 -0
- package/dist/objects/query/reranking-limits.d.ts.map +1 -0
- package/dist/objects/query/reranking-query.d.ts +4 -0
- package/dist/objects/query/reranking-query.d.ts.map +1 -0
- package/dist/objects/query/validate.d.ts +10 -1
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/sdk/file-handle.d.ts +6 -0
- package/dist/objects/sdk/file-handle.d.ts.map +1 -0
- package/dist/objects/sdk/object-handle.d.ts +2 -2
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts +2 -0
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/query-builder.d.ts +8 -0
- package/dist/objects/sdk/query-builder.d.ts.map +1 -1
- package/dist/objects/sdk/query-executor.d.ts +2 -2
- package/dist/objects/sdk/query-executor.d.ts.map +1 -1
- package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
- package/dist/objects/vectors/indexing-dispatch.d.ts +21 -0
- package/dist/objects/vectors/indexing-dispatch.d.ts.map +1 -0
- package/dist/objects/vectors/query.d.ts.map +1 -1
- package/dist/ontology/builders.d.ts +12 -1
- package/dist/ontology/builders.d.ts.map +1 -1
- package/dist/ontology/docs-markdown.d.ts +35 -0
- package/dist/ontology/docs-markdown.d.ts.map +1 -0
- package/dist/ontology/docs.d.ts +50 -0
- package/dist/ontology/docs.d.ts.map +1 -0
- package/dist/ontology/index.d.ts +1 -1
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +7 -4
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/inference/index.d.ts +19 -0
- package/dist/ontology/inference/index.d.ts.map +1 -1
- package/dist/ontology/internal.d.ts +3 -1
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +276 -3
- package/dist/ontology/internal.js.map +4 -3
- package/dist/ontology/query-capabilities.d.ts +1 -0
- package/dist/ontology/query-capabilities.d.ts.map +1 -1
- package/dist/ontology/tokens.d.ts +8 -1
- package/dist/ontology/tokens.d.ts.map +1 -1
- package/dist/ontology/types.d.ts +25 -0
- package/dist/ontology/types.d.ts.map +1 -1
- package/dist/ontology/validation/index.d.ts +1 -1
- package/dist/ontology/validation/index.d.ts.map +1 -1
- package/dist/ontology/validation/query.d.ts.map +1 -1
- package/dist/ontology/validation/schema.d.ts +7 -0
- package/dist/ontology/validation/schema.d.ts.map +1 -1
- package/dist/pipelines/index.js +29 -26
- package/dist/pipelines/index.js.map +1 -1
- package/dist/projections/internal.js +27 -24
- package/dist/projections/internal.js.map +1 -1
- package/dist/query.d.ts +4 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +2 -2
- package/dist/queues/in-memory.d.ts +3 -0
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/types.d.ts +4 -0
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/runtime/create.d.ts +11 -2
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +3 -1
- package/dist/runtime/definitions.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +14 -2
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +1 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +32 -27
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/locale.d.ts +9 -0
- package/dist/runtime/locale.d.ts.map +1 -0
- package/dist/runtime/public-origin.d.ts +10 -0
- package/dist/runtime/public-origin.d.ts.map +1 -0
- package/dist/runtime/resolve-definitions.d.ts +4 -2
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +1 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +42 -5
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandboxes/index.js +7 -6
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/scheduler/index.js +1 -1
- package/dist/scheduler/runtime.d.ts +3 -0
- package/dist/scheduler/runtime.d.ts.map +1 -1
- package/dist/security/builders.d.ts +11 -2
- package/dist/security/builders.d.ts.map +1 -1
- package/dist/security/index.d.ts +4 -4
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/markings.d.ts +19 -0
- package/dist/security/markings.d.ts.map +1 -0
- package/dist/security/redactions.d.ts +4 -0
- package/dist/security/redactions.d.ts.map +1 -0
- package/dist/security/registry.d.ts +7 -1
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +25 -0
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +4 -1
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/internal.js +24 -21
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +5 -4
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +15 -9
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/analytics.d.ts +1 -0
- package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.js +3 -3
- package/dist/storage/ai-cost/types.d.ts +1 -1
- package/dist/storage/ai-cost/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/validation.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.js +2 -2
- package/dist/storage/ai-limits/in-memory.d.ts.map +1 -1
- package/dist/storage/ai-limits/provider.d.ts +7 -2
- package/dist/storage/ai-limits/provider.d.ts.map +1 -1
- package/dist/storage/ai-limits/provider.js +4 -2
- package/dist/storage/ai-limits/provider.js.map +1 -1
- package/dist/storage/ai-limits/types.d.ts +3 -0
- package/dist/storage/ai-limits/types.d.ts.map +1 -1
- package/dist/storage/ai-usage/record.d.ts.map +1 -1
- package/dist/storage/ai-usage/types.d.ts +8 -4
- package/dist/storage/ai-usage/types.d.ts.map +1 -1
- package/dist/storage/ai-usage/usage.d.ts.map +1 -1
- package/dist/storage/file-download-grants/in-memory.d.ts +11 -0
- package/dist/storage/file-download-grants/in-memory.d.ts.map +1 -0
- package/dist/storage/file-download-grants/index.d.ts +3 -0
- package/dist/storage/file-download-grants/index.d.ts.map +1 -0
- package/dist/storage/file-download-grants/record.d.ts +11 -0
- package/dist/storage/file-download-grants/record.d.ts.map +1 -0
- package/dist/storage/file-download-grants/types.d.ts +44 -0
- package/dist/storage/file-download-grants/types.d.ts.map +1 -0
- package/dist/storage/file-upload-sessions/provider.js +10 -7
- package/dist/storage/file-upload-sessions/provider.js.map +1 -1
- package/dist/storage/in-memory/index.d.ts +4 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +6 -3
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +35 -32
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +1 -0
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +9 -4
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/migrations/index.d.ts +1 -1
- package/dist/storage/migrations/index.d.ts.map +1 -1
- package/dist/storage/migrations/migrate-storage.d.ts +3 -3
- package/dist/storage/migrations/migrate-storage.d.ts.map +1 -1
- package/dist/storage/migrations/types.d.ts +7 -0
- package/dist/storage/migrations/types.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/storage.d.ts.map +1 -1
- package/dist/storage/objects/query-preparation.d.ts +39 -0
- package/dist/storage/objects/query-preparation.d.ts.map +1 -0
- package/dist/storage/objects/types.d.ts +9 -0
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/ontology/commits.d.ts +1 -6
- package/dist/storage/ontology/commits.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/index.d.ts +4 -2
- package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations-state.d.ts +0 -2
- package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations-work.d.ts +1 -3
- package/dist/storage/ontology/in-memory/materializations-work.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +23 -57
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/outbox.d.ts +3 -2
- package/dist/storage/ontology/in-memory/outbox.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/replacement-plans.d.ts +104 -0
- package/dist/storage/ontology/in-memory/replacement-plans.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/shared-state.d.ts +17 -2
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/source-roots.d.ts +3 -1
- package/dist/storage/ontology/in-memory/source-roots.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/sources.d.ts +1 -2
- package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/state-reader.d.ts +25 -0
- package/dist/storage/ontology/in-memory/state-reader.d.ts.map +1 -0
- package/dist/storage/ontology/index.d.ts +6 -3
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/materializations.d.ts +40 -59
- package/dist/storage/ontology/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/outbox.d.ts +4 -6
- package/dist/storage/ontology/outbox.d.ts.map +1 -1
- package/dist/storage/ontology/provider-work.d.ts +114 -3
- package/dist/storage/ontology/provider-work.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +14 -39
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +26 -12
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/ontology/replacement-plans.d.ts +103 -0
- package/dist/storage/ontology/replacement-plans.d.ts.map +1 -0
- package/dist/storage/ontology/sources.d.ts +0 -8
- package/dist/storage/ontology/sources.d.ts.map +1 -1
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +1 -1
- package/dist/storage/projection-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/projection-runs/types.d.ts +2 -0
- package/dist/storage/projection-runs/types.d.ts.map +1 -1
- package/dist/storage/types.d.ts +2 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +10 -7
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/syncs/index.js +30 -27
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
- package/dist/testing/file-download-grant-storage-contract.d.ts +9 -0
- package/dist/testing/file-download-grant-storage-contract.d.ts.map +1 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2556 -1495
- package/dist/testing/index.js.map +14 -13
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/materializer-storage-contract.d.ts +14 -0
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/object-read-scope-contract.d.ts.map +1 -1
- package/dist/testing/ontology-contract-fixture.d.ts +5 -1
- package/dist/testing/ontology-contract-fixture.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/webhooks/internal.js +25 -22
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +15 -17
- package/dist/workers/index.js.map +3 -3
- package/dist/workers/queue-worker.d.ts +3 -2
- package/dist/workers/queue-worker.d.ts.map +1 -1
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/index.js +51 -47
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +6 -3
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts +2 -1
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +7 -1
- package/src/actions/read-facade.ts +2 -1
- package/src/actions/types/context.ts +5 -2
- package/src/actions/validation.ts +4 -1
- package/src/agents/adapters.ts +15 -0
- package/src/agents/authority.ts +15 -0
- package/src/agents/context/entries.ts +48 -4
- package/src/agents/context/index.ts +1 -0
- package/src/agents/context-compaction.ts +6 -0
- package/src/agents/errors.ts +3 -0
- package/src/agents/index.ts +13 -1
- package/src/agents/message.ts +9 -0
- package/src/agents/request.ts +178 -22
- package/src/agents/skills.ts +63 -0
- package/src/agents/types.ts +35 -5
- package/src/auth/runtime.ts +14 -0
- package/src/auth/types.ts +6 -0
- package/src/authorization/resolve.ts +6 -1
- package/src/authorization/types.ts +7 -0
- package/src/blob-storage/download-urls.ts +138 -0
- package/src/blob-storage/execution.ts +44 -1
- package/src/blob-storage/file-content.ts +106 -0
- package/src/blob-storage/index.ts +1 -0
- package/src/blob-storage/internal.ts +8 -0
- package/src/blob-storage/media-type.ts +29 -0
- package/src/blob-storage/types.ts +13 -1
- package/src/blob-storage/validation.ts +13 -0
- package/src/bootstrap/agent-context.ts +356 -0
- package/src/bootstrap/discovery.ts +100 -33
- package/src/bootstrap/index.ts +1 -1
- package/src/bootstrap/ontology-type-manifest.ts +3 -38
- package/src/datasets/builders.ts +17 -1
- package/src/datasets/execution.ts +110 -2
- package/src/datasets/index.ts +7 -1
- package/src/datasets/types.ts +2 -0
- package/src/datasets/write.ts +21 -2
- package/src/edits/properties.ts +3 -0
- package/src/events/execution.ts +15 -16
- package/src/events/types/objects.ts +5 -0
- package/src/execution/agent.ts +27 -0
- package/src/execution/authorization.ts +1 -0
- package/src/execution/authorized-object-reader.ts +104 -35
- package/src/execution/scopes.ts +2 -6
- package/src/http/api-routes.ts +4 -3
- package/src/index.ts +52 -2
- package/src/lake-storage/in-memory.ts +38 -9
- package/src/lake-storage/index.ts +2 -0
- package/src/lake-storage/types.ts +30 -0
- package/src/maintenance/ontology-maintenance.ts +50 -23
- package/src/maintenance/types.ts +1 -4
- package/src/materialization/event-envelopes.ts +168 -0
- package/src/materialization/events.ts +40 -4
- package/src/materialization/index.ts +9 -1
- package/src/materializer/README.md +55 -10
- package/src/materializer/edits/commit.ts +3 -19
- package/src/materializer/edits/plan.ts +20 -71
- package/src/materializer/effective/build-events.ts +42 -136
- package/src/materializer/effective/vector-indexing.ts +2 -3
- package/src/materializer/effective/vectors.ts +2 -3
- package/src/materializer/execution/scope.ts +1 -38
- package/src/materializer/execution/work-executor.ts +21 -115
- package/src/materializer/execution/work-records.ts +0 -15
- package/src/materializer/projections/replace.ts +106 -63
- package/src/materializer/projections/replacement-plan.ts +73 -218
- package/src/materializer/shared/batching.ts +7 -0
- package/src/materializer/telemetry/append.ts +2 -14
- package/src/materializer/telemetry/plan.ts +6 -43
- package/src/models/audio/catalog.ts +90 -0
- package/src/models/audio/errors.ts +19 -0
- package/src/models/audio/file.ts +78 -0
- package/src/models/audio/runtime.ts +182 -0
- package/src/models/audio/types.ts +69 -0
- package/src/models/catalog.ts +78 -7
- package/src/models/definitions.ts +8 -1
- package/src/models/events.ts +3 -0
- package/src/models/execution/README.md +24 -4
- package/src/models/execution/binding.ts +6 -0
- package/src/models/execution/model-call-admission.ts +6 -1
- package/src/models/execution/model-call-limits.ts +21 -11
- package/src/models/execution/model-call-recorder.ts +11 -0
- package/src/models/execution/model-call-recovery.ts +1 -0
- package/src/models/execution/reranking.ts +137 -0
- package/src/models/execution/session.ts +2 -2
- package/src/models/execution/usage.ts +1 -0
- package/src/models/execution.ts +11 -3
- package/src/models/generation-types.ts +2 -0
- package/src/models/index.ts +32 -0
- package/src/models/language-model.ts +6 -0
- package/src/models/pricing.ts +2 -1
- package/src/models/reranking-model.ts +114 -0
- package/src/objects/context/index.ts +1 -0
- package/src/objects/context/types.ts +7 -0
- package/src/objects/execution.ts +4 -1
- package/src/objects/materializer-adapter.ts +3 -0
- package/src/objects/object/upsert-batch.ts +4 -1
- package/src/objects/object/upsert.ts +3 -1
- package/src/objects/property-clearance.ts +209 -0
- package/src/objects/query/executor.ts +85 -38
- package/src/objects/query/explain.ts +8 -0
- package/src/objects/query/index.ts +1 -0
- package/src/objects/query/ir.ts +10 -0
- package/src/objects/query/normalize.ts +2 -0
- package/src/objects/query/planner.ts +12 -1
- package/src/objects/query/primary-id.ts +56 -0
- package/src/objects/query/reranking-executor.ts +91 -0
- package/src/objects/query/reranking-limits.ts +3 -0
- package/src/objects/query/reranking-query.ts +8 -0
- package/src/objects/query/validate.ts +166 -15
- package/src/objects/sdk/file-handle.ts +77 -0
- package/src/objects/sdk/object-handle.ts +8 -4
- package/src/objects/sdk/object-set.ts +5 -2
- package/src/objects/sdk/query-builder.ts +15 -2
- package/src/objects/sdk/query-executor.ts +2 -2
- package/src/objects/sdk/runtime-query-executor.ts +7 -4
- package/src/objects/vectors/README.md +6 -2
- package/src/objects/vectors/indexing-dispatch.ts +83 -0
- package/src/objects/vectors/query.ts +3 -0
- package/src/ontology/builders.ts +19 -2
- package/src/ontology/docs-markdown.ts +394 -0
- package/src/ontology/docs.ts +196 -0
- package/src/ontology/index.ts +2 -0
- package/src/ontology/inference/index.ts +25 -0
- package/src/ontology/internal.ts +7 -0
- package/src/ontology/query-capabilities.ts +1 -1
- package/src/ontology/tokens.ts +13 -2
- package/src/ontology/types.ts +26 -0
- package/src/ontology/validation/index.ts +1 -0
- package/src/ontology/validation/query.ts +57 -0
- package/src/ontology/validation/schema.ts +26 -1
- package/src/query.ts +4 -0
- package/src/queues/in-memory.ts +54 -19
- package/src/queues/types.ts +4 -0
- package/src/runtime/create.ts +34 -4
- package/src/runtime/definitions.ts +3 -1
- package/src/runtime/host.ts +73 -2
- package/src/runtime/index.ts +4 -0
- package/src/runtime/internal.ts +1 -0
- package/src/runtime/locale.ts +26 -0
- package/src/runtime/public-origin.ts +33 -0
- package/src/runtime/resolve-definitions.ts +28 -1
- package/src/runtime/sixb.ts +14 -3
- package/src/runtime/types.ts +51 -5
- package/src/scheduler/runtime.ts +11 -2
- package/src/security/builders.ts +49 -5
- package/src/security/index.ts +6 -1
- package/src/security/markings.ts +313 -0
- package/src/security/redactions.ts +6 -0
- package/src/security/registry.ts +21 -1
- package/src/security/types.ts +26 -0
- package/src/security/validation.ts +59 -2
- package/src/storage/agents/provider.ts +11 -0
- package/src/storage/agents/types.ts +15 -7
- package/src/storage/ai-cost/analytics.ts +2 -0
- package/src/storage/ai-cost/codec.ts +2 -1
- package/src/storage/ai-cost/types.ts +1 -0
- package/src/storage/ai-cost/validation.ts +21 -8
- package/src/storage/ai-limits/in-memory.ts +10 -2
- package/src/storage/ai-limits/provider.ts +29 -2
- package/src/storage/ai-limits/types.ts +3 -0
- package/src/storage/ai-usage/record.ts +9 -0
- package/src/storage/ai-usage/types.ts +8 -4
- package/src/storage/ai-usage/usage.ts +2 -0
- package/src/storage/file-download-grants/in-memory.ts +73 -0
- package/src/storage/file-download-grants/index.ts +8 -0
- package/src/storage/file-download-grants/record.ts +47 -0
- package/src/storage/file-download-grants/types.ts +48 -0
- package/src/storage/in-memory/index.ts +13 -2
- package/src/storage/index.ts +32 -13
- package/src/storage/internal.ts +1 -0
- package/src/storage/migrations/index.ts +1 -0
- package/src/storage/migrations/migrate-storage.ts +36 -12
- package/src/storage/migrations/types.ts +8 -0
- package/src/storage/objects/in-memory/query.ts +2 -0
- package/src/storage/objects/in-memory/selected-reader.ts +1 -0
- package/src/storage/objects/in-memory/storage.ts +1 -0
- package/src/storage/objects/query-preparation.ts +77 -0
- package/src/storage/objects/types.ts +9 -0
- package/src/storage/ontology/commits.ts +1 -6
- package/src/storage/ontology/in-memory/index.ts +28 -9
- package/src/storage/ontology/in-memory/materializations-finalization.ts +35 -68
- package/src/storage/ontology/in-memory/materializations-state.ts +0 -22
- package/src/storage/ontology/in-memory/materializations-work.ts +0 -45
- package/src/storage/ontology/in-memory/materializations.ts +172 -653
- package/src/storage/ontology/in-memory/outbox.ts +37 -29
- package/src/storage/ontology/in-memory/replacement-plans.ts +697 -0
- package/src/storage/ontology/in-memory/shared-state.ts +24 -2
- package/src/storage/ontology/in-memory/source-roots.ts +7 -2
- package/src/storage/ontology/in-memory/sources.ts +7 -33
- package/src/storage/ontology/in-memory/state-reader.ts +245 -0
- package/src/storage/ontology/index.ts +19 -13
- package/src/storage/ontology/materializations.ts +45 -74
- package/src/storage/ontology/outbox.ts +4 -7
- package/src/storage/ontology/provider-header-validation.ts +0 -57
- package/src/storage/ontology/provider-work.ts +381 -90
- package/src/storage/ontology/provider.ts +74 -171
- package/src/storage/ontology/replacement-plans.ts +117 -0
- package/src/storage/ontology/sources.ts +0 -12
- package/src/storage/operation-scope.ts +33 -1
- package/src/storage/projection-runs/in-memory.ts +7 -1
- package/src/storage/projection-runs/types.ts +2 -0
- package/src/storage/types.ts +2 -0
- package/src/testing/ai-cost-storage-contract.ts +1 -0
- package/src/testing/ai-limit-storage-contract.ts +62 -0
- package/src/testing/ai-usage-storage-contract.ts +31 -0
- package/src/testing/file-download-grant-storage-contract.ts +139 -0
- package/src/testing/index.ts +4 -0
- package/src/testing/lake-storage-contract.ts +87 -1
- package/src/testing/materializer-storage-contract.ts +1008 -1
- package/src/testing/object-read-scope-contract.ts +1 -0
- package/src/testing/ontology-contract-fixture.ts +11 -87
- package/src/testing/ontology-storage-contract.ts +70 -39
- package/src/testing/projection-run-storage-contract.ts +14 -0
- package/src/testing/queues-contract.ts +59 -0
- package/src/workers/queue-worker.ts +19 -16
- package/src/workflows/builders.ts +24 -1
- package/src/workflows/request.ts +3 -0
- package/src/workflows/types.ts +6 -3
- package/src/workflows/validation.ts +32 -4
- package/dist/chunk-3q7z9hd4.js.map +0 -46
- package/dist/chunk-667x4drs.js.map +0 -12
- package/dist/chunk-69266efg.js.map +0 -12
- package/dist/chunk-6z1q7j19.js.map +0 -62
- package/dist/chunk-7ytf06d3.js +0 -113
- package/dist/chunk-7ytf06d3.js.map +0 -10
- package/dist/chunk-8x74221e.js.map +0 -20
- package/dist/chunk-91kcnbf0.js.map +0 -10
- package/dist/chunk-98cw09sw.js.map +0 -10
- package/dist/chunk-9vx5e9g1.js.map +0 -11
- package/dist/chunk-a0073121.js.map +0 -12
- package/dist/chunk-a7ne02hk.js.map +0 -15
- package/dist/chunk-cd234ba4.js.map +0 -14
- package/dist/chunk-chdg6eqq.js.map +0 -10
- package/dist/chunk-dmn70ztd.js.map +0 -11
- package/dist/chunk-f72rbvsb.js.map +0 -19
- package/dist/chunk-g4rbm4a6.js.map +0 -15
- package/dist/chunk-h044jb97.js.map +0 -15
- package/dist/chunk-h3v76ams.js.map +0 -11
- package/dist/chunk-h4138ww2.js.map +0 -50
- package/dist/chunk-hgqpcmyr.js.map +0 -12
- package/dist/chunk-jgwb25gc.js.map +0 -12
- package/dist/chunk-k4kkp58d.js.map +0 -11
- package/dist/chunk-kttr5ftm.js.map +0 -12
- package/dist/chunk-kvysp909.js.map +0 -17
- package/dist/chunk-mdnw7nj8.js.map +0 -15
- package/dist/chunk-s3csryxe.js.map +0 -11
- package/dist/chunk-tnvafr7g.js.map +0 -19
- package/dist/chunk-vjqt7q3a.js.map +0 -36
- package/dist/chunk-xnx96gfy.js.map +0 -15
- package/dist/chunk-z5rnrmz1.js.map +0 -11
- package/dist/chunk-zvmr2hqk.js.map +0 -12
- package/dist/materializer/execution/plan-stream.d.ts +0 -8
- package/dist/materializer/execution/plan-stream.d.ts.map +0 -1
- package/src/materializer/execution/plan-stream.ts +0 -121
- /package/dist/{chunk-4gmng3vf.js.map → chunk-22v5bpz3.js.map} +0 -0
- /package/dist/{chunk-fj1dvp37.js.map → chunk-2vhg6ysa.js.map} +0 -0
- /package/dist/{chunk-gmdvns8f.js.map → chunk-48e3cn2d.js.map} +0 -0
- /package/dist/{chunk-cq44v1a6.js.map → chunk-7hpdd6r9.js.map} +0 -0
- /package/dist/{chunk-rb143ggb.js.map → chunk-bwjcehza.js.map} +0 -0
- /package/dist/{chunk-7g2gjvah.js.map → chunk-ex496vct.js.map} +0 -0
- /package/dist/{chunk-nvymebc1.js.map → chunk-f1zxad2t.js.map} +0 -0
- /package/dist/{chunk-b9y8hcm2.js.map → chunk-mfs23znk.js.map} +0 -0
- /package/dist/{chunk-h866d223.js.map → chunk-qkvz64nd.js.map} +0 -0
- /package/dist/{chunk-tkdbge6v.js.map → chunk-rt9p8m9t.js.map} +0 -0
- /package/dist/{chunk-sbcm1b92.js.map → chunk-v6xpd60t.js.map} +0 -0
- /package/dist/{chunk-nj0020ay.js.map → chunk-vgk3hknm.js.map} +0 -0
- /package/dist/{chunk-qnd7ehe5.js.map → chunk-vx2yp45y.js.map} +0 -0
- /package/dist/{chunk-nkbev3tr.js.map → chunk-yv9czyfr.js.map} +0 -0
- /package/dist/{chunk-cxj8y8t0.js.map → chunk-za5yd58j.js.map} +0 -0
- /package/dist/{chunk-zb47r1c8.js.map → chunk-zb77kjth.js.map} +0 -0
- /package/dist/{chunk-dp7yk20b.js.map → chunk-zxawp1n2.js.map} +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/models/audio/errors.ts", "../src/models/catalog-index.ts", "../src/models/audio/catalog.ts", "../src/models/decision/validation.ts", "../src/models/decision/catalog.ts", "../src/models/definitions.ts", "../src/models/reranking-model.ts", "../src/models/catalog.ts", "../src/models/decision/errors.ts", "../src/models/decision/output.ts", "../src/models/decision/questions.ts", "../src/models/pricing.ts", "../src/models/rate-card.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { ModelProviderError } from \"../errors\"\nimport type { TranscriptionModelResponseMetadata } from \"./types\"\n\n/** Retains billing metadata even when the provider returns an invalid transcript. */\nexport class TranscriptionModelResponseError extends ModelProviderError {\n constructor(\n message: string,\n providerId: string,\n modelId: string,\n readonly metadata: TranscriptionModelResponseMetadata,\n options?: ErrorOptions\n ) {\n super(message, providerId, modelId, {\n ...options,\n code: \"invalid_transcription_response\",\n retryable: false,\n })\n }\n}\n",
|
|
6
|
+
"import { RuntimeError } from \"../runtime/errors\"\nimport type { ModelRef } from \"./catalog\"\n\ninterface ModelBinding {\n readonly providerId: string\n readonly modelId: string\n}\n\ninterface ModelEntry<TModel> extends ModelRef {\n readonly model: TModel\n}\n\n/** Private index shared by model families; default selection belongs to each family. */\nexport function indexModelBindings<TModel extends ModelBinding>(\n models: readonly TModel[],\n kind: string,\n validate: (model: TModel, index: number) => void\n) {\n const byRef = new Map<string, ModelEntry<TModel>>()\n\n for (const [index, model] of models.entries()) {\n validate(model, index)\n const key = JSON.stringify([model.providerId, model.modelId])\n if (byRef.has(key)) {\n throw new RuntimeError(\n `[Sixb] Duplicate ${kind} model '${model.providerId}/${model.modelId}' in 'models.${kind}'. Each provider and model id pair may be configured once.`\n )\n }\n\n byRef.set(key, Object.freeze({ provider: model.providerId, modelId: model.modelId, model }))\n }\n\n const entries = Object.freeze([...byRef.values()])\n return Object.freeze({\n list: () => entries,\n getByRef: (ref: ModelRef) => byRef.get(JSON.stringify([ref.provider, ref.modelId])) ?? null,\n })\n}\n",
|
|
7
|
+
"import type { ModelRef } from \"../catalog\"\nimport { indexModelBindings } from \"../catalog-index\"\nimport type { TranscriptionModel } from \"./types\"\n\nexport interface TranscriptionModelEntry extends ModelRef {\n readonly model: TranscriptionModel\n}\n\nexport interface TranscriptionModelCatalog {\n readonly default: TranscriptionModelEntry\n list(): readonly TranscriptionModelEntry[]\n getByRef(ref: ModelRef): TranscriptionModelEntry | null\n}\n\nexport interface AudioModelCatalog {\n readonly transcription?: TranscriptionModelCatalog\n}\n\nexport interface AudioModelCatalogInput {\n /** Ordered; the first entry is the default transcriber. */\n readonly transcription?: readonly TranscriptionModel[]\n}\n\nexport function createAudioCatalog(\n input: AudioModelCatalogInput | undefined\n): AudioModelCatalog | undefined {\n if (input === undefined) return undefined\n if (\n !input ||\n typeof input !== \"object\" ||\n Array.isArray(input) ||\n !Array.isArray(input.transcription)\n ) {\n throw new TypeError(\n \"[Sixb] models.audio.transcription must be a nonempty array of transcription models.\"\n )\n }\n\n const index = indexModelBindings(\n input.transcription,\n \"audio.transcription\",\n assertTranscriptionModel\n )\n const [defaultEntry] = index.list()\n if (!defaultEntry) {\n throw new TypeError(\"[Sixb] models.audio.transcription must contain at least one model.\")\n }\n\n return Object.freeze({ transcription: Object.freeze({ ...index, default: defaultEntry }) })\n}\n\nexport function assertTranscriptionModel(model: unknown): asserts model is TranscriptionModel {\n const candidate = model as Partial<TranscriptionModel> | null\n const definition = candidate?.definition\n if (\n !candidate ||\n !isValidId(candidate.providerId) ||\n !isValidId(candidate.modelId) ||\n typeof candidate.transcribe !== \"function\" ||\n definition?.kind !== \"transcription\" ||\n definition.providerId !== candidate.providerId ||\n definition.modelId !== candidate.modelId\n ) {\n throw invalidModel()\n }\n\n if (!Number.isSafeInteger(definition.maxInputBytes) || definition.maxInputBytes <= 0) {\n throw invalidModel()\n }\n\n const mediaTypes = definition.mediaTypes\n if (\n mediaTypes !== undefined &&\n (!Array.isArray(mediaTypes) ||\n mediaTypes.length === 0 ||\n !mediaTypes.every((type) => typeof type === \"string\" && /^audio\\/[a-z0-9.+-]+$/.test(type)))\n ) {\n throw invalidModel()\n }\n}\n\nfunction isValidId(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0 && value.trim() === value\n}\n\nfunction invalidModel(): TypeError {\n return new TypeError(\n \"[SixbModels] Invalid transcription model identity, definition or input limits.\"\n )\n}\n",
|
|
8
|
+
"import { assertJsonValue, cloneJsonValue } from \"../../json\"\nimport { UnsupportedModelFeatureError } from \"../errors\"\nimport type {\n ChoiceQuestion,\n DecisionAnswers,\n DecisionContent,\n DecisionModel,\n DecisionModelDefinition,\n DecisionQuestion,\n DecisionQuestions,\n ScoreQuestion,\n} from \"./types\"\n\ntype DecisionCapabilities = DecisionModelDefinition[\"capabilities\"]\n\n// Allow serialization rounding without normalizing provider answers.\nconst DISTRIBUTION_TOLERANCE = 1e-4\nconst CHOICE_TOLERANCE = 1e-6\n\nexport function assertDecisionContent(\n value: unknown,\n path: string\n): asserts value is DecisionContent {\n assertJsonValue(value, path)\n if (value === null || (typeof value !== \"string\" && typeof value !== \"object\")) {\n throw new TypeError(`[SixbModels] ${path} must be text, a JSON object or an array.`)\n }\n}\n\nexport function assertDecisionQuestions(value: unknown): asserts value is DecisionQuestions {\n assertJsonValue(value, \"questions\")\n const questions = readRecord(value, \"questions\")\n if (!Object.keys(questions).length) {\n fail(\"questions must not be empty\")\n }\n\n for (const [key, question] of Object.entries(questions)) {\n if (!key.trim()) {\n fail(\"question names must not be empty\")\n }\n assertQuestion(question, `questions.${key}`)\n }\n}\n\nfunction assertQuestion(value: unknown, path: string): void {\n const question = readRecord(value, path)\n assertDecisionContent(question.instructions, `${path}.instructions`)\n if (typeof question.instructions === \"string\" && !question.instructions.trim()) {\n fail(`${path}.instructions must not be empty`)\n }\n\n switch (question.type) {\n case \"choice\":\n assertOnlyKeys(question, [\"type\", \"instructions\", \"options\"], path)\n assertChoiceOptions(question.options, `${path}.options`)\n break\n case \"score\":\n assertOnlyKeys(question, [\"type\", \"instructions\", \"levels\"], path)\n assertScoreLevels(question.levels, `${path}.levels`)\n break\n case \"probability\":\n assertOnlyKeys(question, [\"type\", \"instructions\"], path)\n break\n default:\n fail(`${path}.type is not a supported decision primitive`)\n }\n}\n\nfunction assertChoiceOptions(value: unknown, path: string): void {\n const options = readRecord(value, path)\n if (!Object.keys(options).length) {\n fail(`${path} must not be empty`)\n }\n\n for (const [option, description] of Object.entries(options)) {\n if (!option.trim()) {\n fail(`${path} contains an empty label`)\n }\n if (description !== null) {\n assertDecisionContent(description, `${path}.${option}`)\n }\n }\n}\n\nfunction assertScoreLevels(value: unknown, path: string): void {\n if (!Array.isArray(value) || value.length < 2) {\n fail(`${path} needs at least two levels`)\n }\n\n for (const level of value) {\n assertDecisionContent(level, path)\n }\n}\n\nexport function assertDecisionModel(model: DecisionModel): void {\n const definition = model?.definition\n if (\n !model ||\n typeof model.evaluate !== \"function\" ||\n !isValidId(model.providerId) ||\n !isValidId(model.modelId) ||\n definition?.kind !== \"decision\" ||\n definition.providerId !== model.providerId ||\n definition.modelId !== model.modelId\n ) {\n fail(\"Expected a DecisionModel with matching provider/model identity\")\n }\n\n const capabilities = definition.capabilities\n if (\n !capabilities ||\n !Array.isArray(capabilities.questions) ||\n !capabilities.questions.length ||\n capabilities.questions.some((kind) => ![\"choice\", \"score\", \"probability\"].includes(kind)) ||\n new Set(capabilities.questions).size !== capabilities.questions.length\n ) {\n fail(\"Decision model capabilities must list distinct supported question types\")\n }\n\n assertCapabilityLimit(capabilities.maxChoices, \"maxChoices\", 1)\n assertCapabilityLimit(capabilities.maxScoreLevels, \"maxScoreLevels\", 2)\n const decimals = capabilities.answerDecimalPlaces\n if (\n decimals !== undefined &&\n (!Number.isSafeInteger(decimals) || decimals < 1 || decimals > 15)\n ) {\n fail(\"Invalid decision answerDecimalPlaces (expected 1–15)\")\n }\n}\n\nfunction assertCapabilityLimit(value: number | undefined, name: string, minimum: number): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < minimum)) {\n fail(`Invalid decision capability '${name}'`)\n }\n}\n\nexport function assertDecisionSupport(model: DecisionModel, questions: DecisionQuestions): void {\n for (const [key, question] of Object.entries(questions)) {\n if (!supportsQuestion(model.definition.capabilities, question)) {\n throw new UnsupportedModelFeatureError(\n `[SixbModels] Model '${model.providerId}/${model.modelId}' does not support questions.${key}.`\n )\n }\n }\n}\n\nfunction supportsQuestion(capabilities: DecisionCapabilities, question: DecisionQuestion): boolean {\n if (!capabilities.questions.includes(question.type)) return false\n\n switch (question.type) {\n case \"choice\":\n return Object.keys(question.options).length <= (capabilities.maxChoices ?? Infinity)\n case \"score\":\n return question.levels.length <= (capabilities.maxScoreLevels ?? Infinity)\n case \"probability\":\n return true\n }\n}\n\nexport function validateDecisionAnswers<const Q extends DecisionQuestions>(\n questions: Q,\n value: unknown,\n answerDecimalPlaces?: number\n): DecisionAnswers<Q> {\n assertJsonValue(value, \"decision output\")\n const answers = readRecord(value, \"decision output\")\n assertExactKeys(answers, Object.keys(questions), \"decision output\")\n\n const roundingError = answerDecimalPlaces === undefined ? 0 : 0.5 * 10 ** -answerDecimalPlaces\n for (const [key, question] of Object.entries(questions)) {\n assertAnswer(question, answers[key], `output.${key}`, roundingError)\n }\n\n // Validation establishes the mapped type; callers receive an independent JSON snapshot.\n return cloneJsonValue(value) as DecisionAnswers<Q>\n}\n\nfunction assertAnswer(\n question: DecisionQuestion,\n value: unknown,\n path: string,\n roundingError: number\n): void {\n const answer = readRecord(value, path)\n if (question.type === \"probability\") {\n assertExactKeys(answer, [\"probability\"], path)\n readProbability(answer.probability, path)\n return\n }\n\n assertOnlyKeys(answer, [question.type, \"probabilities\", \"confidence\"], path)\n if (answer.confidence !== undefined) {\n readProbability(answer.confidence, `${path}.confidence`)\n }\n\n const distribution =\n question.type === \"choice\"\n ? validateChoiceAnswer(question, answer, path)\n : validateScoreAnswer(question, answer, path, roundingError)\n\n const total = distribution.reduce((sum, probability) => sum + probability, 0)\n const tolerance = Math.max(DISTRIBUTION_TOLERANCE, distribution.length * roundingError)\n if (Math.abs(total - 1) > tolerance + Number.EPSILON * distribution.length) {\n fail(`${path}.probabilities must sum to one`)\n }\n}\n\nfunction validateChoiceAnswer(\n question: ChoiceQuestion,\n answer: Record<string, unknown>,\n path: string\n): number[] {\n const probabilities = readRecord(answer.probabilities, `${path}.probabilities`)\n assertExactKeys(probabilities, Object.keys(question.options), `${path}.probabilities`)\n const distribution = Object.values(probabilities).map((value) => readProbability(value, path))\n\n if (typeof answer.choice !== \"string\" || !Object.hasOwn(question.options, answer.choice)) {\n fail(`${path}.choice is not a declared option`)\n }\n\n const winner = readProbability(probabilities[answer.choice], path)\n if (winner + CHOICE_TOLERANCE < Math.max(...distribution)) {\n fail(`${path}.choice is not a highest-probability option`)\n }\n\n return distribution\n}\n\nfunction validateScoreAnswer(\n question: ScoreQuestion,\n answer: Record<string, unknown>,\n path: string,\n roundingError: number\n): number[] {\n if (\n !Array.isArray(answer.probabilities) ||\n answer.probabilities.length !== question.levels.length\n ) {\n fail(`${path}.probabilities must match the score levels`)\n }\n\n const distribution = answer.probabilities.map((value) => readProbability(value, path))\n const expected = distribution.reduce((sum, probability, index) => sum + probability * index, 0)\n const levels = question.levels.length\n const [minimum, maximum] = roundingError\n ? roundedScoreBounds(distribution, roundingError, path)\n : [expected, expected]\n const tolerance = roundingError || DISTRIBUTION_TOLERANCE * levels\n if (\n typeof answer.score !== \"number\" ||\n !Number.isFinite(answer.score) ||\n answer.score < 0 ||\n answer.score > question.levels.length - 1 ||\n answer.score < minimum - tolerance - Number.EPSILON * levels ** 2 ||\n answer.score > maximum + tolerance + Number.EPSILON * levels ** 2\n ) {\n fail(`${path}.score is inconsistent with its distribution`)\n }\n\n return distribution\n}\n\n/** Find possible means without changing the returned probabilities. */\nfunction roundedScoreBounds(\n distribution: readonly number[],\n roundingError: number,\n path: string\n): readonly [number, number] {\n const lower = distribution.map((value) => Math.max(0, value - roundingError))\n const upper = distribution.map((value) => Math.min(1, value + roundingError))\n const remaining = 1 - lower.reduce((sum, value) => sum + value, 0)\n const epsilon = Number.EPSILON * distribution.length\n if (remaining < -epsilon || upper.reduce((sum, value) => sum + value, 0) < 1 - epsilon) {\n fail(`${path}.probabilities must sum to one`)\n }\n\n const base = lower.reduce((sum, value, index) => sum + value * index, 0)\n function extreme(highestFirst: boolean): number {\n let mass = Math.max(0, remaining)\n let mean = base\n // Start at each probability's lower bound, then allocate exactly the remaining mass.\n // Filling lower levels first minimizes the mean; filling higher levels maximizes it.\n for (let offset = 0; offset < distribution.length && mass > 0; offset++) {\n const index = highestFirst ? distribution.length - 1 - offset : offset\n const added = Math.min(mass, upper[index]! - lower[index]!)\n mean += added * index\n mass -= added\n }\n return mean\n }\n return [extreme(false), extreme(true)]\n}\n\nfunction readProbability(value: unknown, path: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 1) {\n fail(`${path} must contain probabilities between zero and one`)\n }\n return value\n}\n\nfunction readRecord(value: unknown, path: string): Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n fail(`${path} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction assertOnlyKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n path: string\n): void {\n if (Object.keys(value).some((key) => !keys.includes(key))) {\n fail(`${path} contains an unknown field`)\n }\n}\n\nfunction assertExactKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n path: string\n): void {\n assertOnlyKeys(value, keys, path)\n if (keys.some((key) => !Object.hasOwn(value, key))) {\n fail(`${path} is missing an expected field`)\n }\n}\n\nfunction isValidId(value: unknown): value is string {\n return typeof value === \"string\" && !!value.trim() && value.trim() === value\n}\n\nfunction fail(detail: string): never {\n throw new TypeError(`[SixbModels] ${detail}.`)\n}\n",
|
|
9
|
+
"import { RuntimeError } from \"../../runtime/errors\"\nimport type { ModelRef } from \"../catalog\"\nimport { indexModelBindings } from \"../catalog-index\"\nimport type { DecisionModel } from \"./types\"\nimport { assertDecisionModel } from \"./validation\"\n\nexport interface DecisionModelEntry extends ModelRef {\n readonly model: DecisionModel\n}\n\nexport interface DecisionModelCatalog {\n readonly default: DecisionModelEntry\n list(): readonly DecisionModelEntry[]\n getByRef(ref: ModelRef): DecisionModelEntry | null\n}\n\nexport function createDecisionCatalog(\n models: readonly DecisionModel[] | undefined\n): DecisionModelCatalog | undefined {\n if (models === undefined) return undefined\n if (!Array.isArray(models)) {\n throw new RuntimeError(\"[Sixb] models.decision must be a nonempty array of decision models.\")\n }\n\n const index = indexModelBindings(models, \"decision\", assertDecisionModel)\n const [defaultEntry] = index.list()\n if (!defaultEntry) {\n throw new RuntimeError(\"[Sixb] models.decision must be a nonempty array of decision models.\")\n }\n\n return Object.freeze({ ...index, default: defaultEntry })\n}\n",
|
|
10
|
+
"import {\n MODEL_REASONING_EFFORTS,\n type ModelCapabilities,\n type ModelReasoningBudgetCapabilities,\n type ModelReasoningCapabilities,\n} from \"./language-model\"\n\nexport type ModelKind =\n | \"language\"\n | \"image\"\n | \"video\"\n | \"embedding\"\n | \"decision\"\n | \"transcription\"\n | \"reranking\"\n\n/** Common catalog identity shared by every present and future model runtime. */\nexport interface ModelDefinition {\n readonly kind: ModelKind\n readonly providerId: string\n readonly modelId: string\n readonly name?: string\n readonly description?: string\n /** Model author for display; does not change the provider/model routing identity. */\n readonly publisher?: { readonly id: string; readonly name: string }\n /** Hosting service label, when the model is offered through an intermediary. */\n readonly via?: string\n readonly family?: string\n readonly tags?: readonly string[]\n readonly releaseDate?: string\n}\n\n/** Serializable facts about one concrete model offering from one provider. */\nexport interface LanguageModelDefinition extends ModelDefinition {\n readonly kind: \"language\"\n readonly knowledgeCutoff?: string\n readonly contextWindow?: number\n /** Maximum input tokens, distinct from a shared input/output context window. */\n readonly maxInputTokens?: number\n readonly maxOutputTokens?: number\n readonly capabilities: ModelCapabilities\n}\n\nexport function defineLanguageModel(definition: LanguageModelDefinition): LanguageModelDefinition {\n if (definition.kind !== \"language\") {\n throw new TypeError(\"[Sixb] Language model definitions must use kind 'language'.\")\n }\n assertModelId(definition.providerId, \"providerId\")\n assertModelId(definition.modelId, \"modelId\")\n assertOptionalString(definition.name, \"name\")\n assertOptionalString(definition.description, \"description\")\n assertOptionalString(definition.via, \"via\")\n if (definition.via !== undefined && !definition.via.trim())\n throw new TypeError(\"[Sixb] Model via must not be empty.\")\n const publisher = definition.publisher\n if (publisher !== undefined) {\n assertRecord(publisher, \"publisher\")\n for (const [field, value] of Object.entries({ id: publisher.id, name: publisher.name })) {\n if (typeof value !== \"string\" || !value.trim() || value !== value.trim())\n throw new TypeError(`[Sixb] Model publisher.${field} must be a nonempty trimmed string.`)\n }\n }\n assertOptionalString(definition.family, \"family\")\n assertOptionalString(definition.releaseDate, \"releaseDate\")\n assertOptionalString(definition.knowledgeCutoff, \"knowledgeCutoff\")\n const tags = freezeStrings(definition.tags, \"tags\")\n const capabilities = defineModelCapabilities(definition.capabilities)\n assertOptionalPositiveInteger(definition.contextWindow, \"contextWindow\")\n assertOptionalPositiveInteger(definition.maxInputTokens, \"maxInputTokens\")\n assertOptionalPositiveInteger(definition.maxOutputTokens, \"maxOutputTokens\")\n return Object.freeze({\n kind: \"language\",\n providerId: definition.providerId,\n modelId: definition.modelId,\n ...(definition.name === undefined ? {} : { name: definition.name }),\n ...(definition.description === undefined ? {} : { description: definition.description }),\n ...(publisher === undefined\n ? {}\n : { publisher: Object.freeze({ id: publisher.id, name: publisher.name }) }),\n ...(definition.via === undefined ? {} : { via: definition.via }),\n ...(definition.family === undefined ? {} : { family: definition.family }),\n ...(tags === undefined ? {} : { tags }),\n ...(definition.releaseDate === undefined ? {} : { releaseDate: definition.releaseDate }),\n ...(definition.knowledgeCutoff === undefined\n ? {}\n : { knowledgeCutoff: definition.knowledgeCutoff }),\n ...(definition.contextWindow === undefined ? {} : { contextWindow: definition.contextWindow }),\n ...(definition.maxInputTokens === undefined\n ? {}\n : { maxInputTokens: definition.maxInputTokens }),\n ...(definition.maxOutputTokens === undefined\n ? {}\n : { maxOutputTokens: definition.maxOutputTokens }),\n capabilities,\n })\n}\n\nfunction defineModelCapabilities(capabilities: unknown): ModelCapabilities {\n assertRecord(capabilities, \"capabilities\")\n const inputMediaTypes =\n capabilities.inputMediaTypes === \"any\"\n ? \"any\"\n : freezeStrings(capabilities.inputMediaTypes, \"capabilities.inputMediaTypes\")\n for (const [field, value] of Object.entries(capabilities)) {\n if (field === \"inputMediaTypes\" || field === \"reasoning\") continue\n if (value !== undefined && typeof value !== \"boolean\") {\n throw new TypeError(`[Sixb] Model capability '${field}' must be boolean.`)\n }\n }\n const reasoning = freezeReasoningCapabilities(capabilities.reasoning)\n const flags: {\n localTools?: boolean\n parallelToolCalls?: boolean\n nativeStructuredOutput?: boolean\n providerExecutedTools?: boolean\n } = {}\n for (const key of [\n \"localTools\",\n \"parallelToolCalls\",\n \"nativeStructuredOutput\",\n \"providerExecutedTools\",\n ] as const) {\n const value = capabilities[key]\n if (typeof value === \"boolean\") flags[key] = value\n }\n return Object.freeze({\n ...(inputMediaTypes === undefined ? {} : { inputMediaTypes }),\n ...(reasoning === undefined ? {} : { reasoning }),\n ...flags,\n })\n}\n\nfunction freezeReasoningCapabilities(reasoning: unknown): ModelCapabilities[\"reasoning\"] {\n if (reasoning === undefined || reasoning === false) return reasoning\n assertRecord(reasoning, \"reasoning\")\n if (reasoning.canDisable !== undefined && typeof reasoning.canDisable !== \"boolean\") {\n throw new TypeError(\"[Sixb] Model reasoning capability 'canDisable' must be boolean.\")\n }\n const efforts = freezeReasoningEfforts(reasoning.efforts)\n const budgetTokens = freezeReasoningBudgetCapabilities(reasoning.budgetTokens)\n return Object.freeze({\n ...(reasoning.canDisable === undefined ? {} : { canDisable: reasoning.canDisable }),\n ...(efforts === undefined ? {} : { efforts }),\n ...(budgetTokens === undefined ? {} : { budgetTokens }),\n } satisfies ModelReasoningCapabilities)\n}\n\nfunction freezeReasoningEfforts(\n efforts: unknown\n): readonly (typeof MODEL_REASONING_EFFORTS)[number][] | undefined {\n if (efforts === undefined) return undefined\n if (!Array.isArray(efforts)) {\n throw new TypeError(\"[Sixb] Model reasoning capability 'efforts' must be an array.\")\n }\n const seen = new Set<string>()\n return Object.freeze(\n efforts.map((value: unknown) => {\n const effort = MODEL_REASONING_EFFORTS.find((allowed) => allowed === value)\n if (effort === undefined) {\n throw new TypeError(`[Sixb] Model reasoning effort '${String(value)}' is invalid.`)\n }\n if (seen.has(effort)) {\n throw new TypeError(`[Sixb] Model reasoning effort '${effort}' is duplicated.`)\n }\n seen.add(effort)\n return effort\n })\n )\n}\n\nfunction freezeReasoningBudgetCapabilities(\n budget: unknown\n): ModelReasoningBudgetCapabilities | undefined {\n if (budget === undefined) return undefined\n assertRecord(budget, \"reasoning budgetTokens\")\n assertOptionalNonnegativeInteger(budget.min, \"capabilities.reasoning.budgetTokens.min\")\n assertOptionalNonnegativeInteger(budget.max, \"capabilities.reasoning.budgetTokens.max\")\n if (budget.min !== undefined && budget.max !== undefined && budget.max < budget.min) {\n throw new TypeError(\n \"[Sixb] Model reasoning token budget maximum must not be below its minimum.\"\n )\n }\n return Object.freeze({\n ...(budget.min === undefined ? {} : { min: budget.min }),\n ...(budget.max === undefined ? {} : { max: budget.max }),\n })\n}\n\nfunction assertModelId(value: string, field: string): void {\n if (!value.trim()) throw new TypeError(`[Sixb] Model ${field} must not be empty.`)\n}\n\nfunction assertOptionalPositiveInteger(value: number | undefined, field: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new TypeError(`[Sixb] Model ${field} must be a positive safe integer.`)\n }\n}\n\nfunction assertOptionalNonnegativeInteger(\n value: unknown,\n field: string\n): asserts value is number | undefined {\n if (\n value !== undefined &&\n (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0)\n ) {\n throw new TypeError(`[Sixb] Model ${field} must be a nonnegative safe integer.`)\n }\n}\n\nfunction assertOptionalString(value: string | undefined, field: string): void {\n if (value !== undefined && typeof value !== \"string\") {\n throw new TypeError(`[Sixb] Model ${field} must be a string.`)\n }\n}\n\nfunction freezeStrings(value: unknown, field: string): readonly string[] | undefined {\n if (value === undefined) return undefined\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\" || !entry.trim())) {\n throw new TypeError(`[Sixb] Model ${field} must contain nonempty strings.`)\n }\n return Object.freeze([...value])\n}\n\nfunction assertRecord(value: unknown, field: string): asserts value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value))\n throw new TypeError(`[Sixb] Model ${field} must be an object.`)\n}\n",
|
|
11
|
+
"import type { ModelDefinition } from \"./definitions\"\nimport { ModelProviderError } from \"./errors\"\nimport type { ModelProviderIds, ModelRoute, ModelUsage } from \"./events\"\nimport type { ModelCostEstimator, ModelReportedCost } from \"./pricing\"\n\nexport interface RerankingModelDefinition extends ModelDefinition {\n readonly kind: \"reranking\"\n}\n\n/** Serializable identity; the server resolves its own registered binding. */\nexport interface RerankingModelRef {\n readonly providerId: string\n readonly modelId: string\n readonly definition: RerankingModelDefinition\n}\n\nexport interface RerankingModelRequest {\n readonly query: string\n readonly documents: readonly string[]\n readonly signal?: AbortSignal\n}\n\nexport interface RerankingModelResponseMetadata {\n readonly usage?: ModelUsage\n readonly providerIds?: ModelProviderIds\n readonly responseModelId?: string\n readonly reportedCost?: ModelReportedCost\n readonly route?: ModelRoute\n}\n\nexport interface RerankingResult {\n /** Position in the original documents array. */\n readonly index: number\n /** Provider relevance score, not a calibrated probability. */\n readonly score: number\n}\n\nexport interface RerankingModelResult extends RerankingModelResponseMetadata {\n /** One result per input document; Sixb validates completeness and orders by score. */\n readonly results: readonly RerankingResult[]\n}\n\nexport interface RerankingModel extends RerankingModelRef {\n readonly costEstimator?: ModelCostEstimator\n resolve?(): Promise<RerankingModel>\n rerank(request: RerankingModelRequest): Promise<RerankingModelResult>\n}\n\nexport function assertRerankingModel(model: RerankingModel): void {\n if (\n !model ||\n typeof model !== \"object\" ||\n typeof model.rerank !== \"function\" ||\n !validIdentifier(model.providerId) ||\n !validIdentifier(model.modelId) ||\n model.definition?.kind !== \"reranking\" ||\n model.definition.providerId !== model.providerId ||\n model.definition.modelId !== model.modelId\n ) {\n throw new TypeError(\"[Sixb] Expected a RerankingModel with a valid identity and rerank method.\")\n }\n}\n\nexport function validateRerankingResults(\n results: unknown,\n documentCount: number\n): RerankingResult[] {\n if (!Array.isArray(results) || results.length !== documentCount) {\n throw new TypeError(\"[SixbModels] Reranking must return one result per document.\")\n }\n const seen = new Set<number>()\n const validated = results.map((result: unknown) => {\n if (!result || typeof result !== \"object\") {\n throw new TypeError(\"[SixbModels] Invalid reranking result.\")\n }\n const index: unknown = Reflect.get(result, \"index\")\n const score: unknown = Reflect.get(result, \"score\")\n if (\n typeof index !== \"number\" ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index >= documentCount ||\n seen.has(index) ||\n typeof score !== \"number\" ||\n !Number.isFinite(score)\n ) {\n throw new TypeError(\"[SixbModels] Reranking requires unique valid indices and finite scores.\")\n }\n seen.add(index)\n return { index, score }\n })\n // Stable ties preserve candidate rank, independent of the provider's response ordering.\n return validated.sort((left, right) => right.score - left.score || left.index - right.index)\n}\n\nfunction validIdentifier(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0 && value.trim() === value\n}\n\nexport class RerankingModelResponseError extends ModelProviderError {\n constructor(\n message: string,\n providerId: string,\n modelId: string,\n readonly metadata: RerankingModelResponseMetadata,\n options?: { cause?: unknown }\n ) {\n super(message, providerId, modelId, {\n code: \"invalid_reranking_response\",\n retryable: false,\n cause: options?.cause,\n })\n }\n}\n",
|
|
12
|
+
"import { RuntimeError } from \"../runtime/errors\"\nimport {\n type AudioModelCatalog,\n type AudioModelCatalogInput,\n createAudioCatalog,\n} from \"./audio/catalog\"\nimport { indexModelBindings } from \"./catalog-index\"\nimport { createDecisionCatalog, type DecisionModelCatalog } from \"./decision/catalog\"\nimport type { DecisionModel } from \"./decision/types\"\nimport {\n defineLanguageModel,\n type LanguageModelDefinition,\n type ModelDefinition,\n} from \"./definitions\"\nimport { assertEmbeddingModel, type EmbeddingModel } from \"./embedding-model\"\nimport {\n type LanguageModel,\n MODEL_REASONING_LEVELS,\n modelReasoningSupportIssue,\n} from \"./language-model\"\nimport { assertRerankingModel, type RerankingModel } from \"./reranking-model\"\n\n/** Stable identity of a configured provider binding. */\nexport interface ModelRef {\n readonly provider: string\n readonly modelId: string\n}\n\nexport type LanguageModelRef = ModelRef\n\nexport interface EmbeddingModelEntry extends ModelRef {\n readonly model: EmbeddingModel\n}\n\nexport interface EmbeddingModelCatalog {\n list(): readonly EmbeddingModelEntry[]\n getByRef(ref: ModelRef): EmbeddingModelEntry | null\n}\n\nexport interface RerankingModelEntry extends ModelRef {\n readonly model: RerankingModel\n}\n\nexport interface RerankingModelCatalog {\n list(): readonly RerankingModelEntry[]\n getByRef(ref: ModelRef): RerankingModelEntry | null\n}\n\n/** The configured language models, with the project default. */\nexport interface LanguageModelCatalog {\n readonly default: LanguageModelEntry\n list(): readonly LanguageModelEntry[]\n getByRef(ref: LanguageModelRef): LanguageModelEntry | null\n}\n\n/**\n * One configured language model.\n *\n * The identity describes the configured binding, not only a vendor model. For example,\n * A gateway binding and a direct provider binding for the same vendor model are distinct because their\n * `provider` values differ.\n */\nexport interface LanguageModelEntry extends LanguageModelRef {\n readonly model: LanguageModel\n}\n\n/** Models a project allows Sixb to use, organized by technical model kind. */\nexport interface ModelCatalog {\n readonly audio?: AudioModelCatalog\n readonly language?: LanguageModelCatalog\n readonly decision?: DecisionModelCatalog\n readonly embedding: EmbeddingModelCatalog\n readonly reranking?: RerankingModelCatalog\n}\n\nexport interface ModelCatalogInput {\n readonly audio?: AudioModelCatalogInput\n /** Ordered; the first entry is the project default. */\n readonly language?: readonly LanguageModel[]\n /** Ordered; the first entry is the project default decision model. */\n readonly decision?: readonly DecisionModel[]\n readonly embedding?: readonly EmbeddingModel[]\n /** Available rerankers; no default model and no automatic activation. */\n readonly reranking?: readonly RerankingModel[]\n}\n\n// Only statically required inputs make their corresponding catalogs required.\ntype ConfiguredModelKinds<TInput> = {\n [Kind in keyof ModelCatalog]-?: [TInput] extends [Record<Kind, readonly unknown[]>] ? Kind : never\n}[keyof ModelCatalog]\n\nexport type ModelCatalogFor<TInput extends ModelCatalogInput> = ModelCatalog &\n Required<Pick<ModelCatalog, ConfiguredModelKinds<TInput>>> &\n ([TInput] extends [{ readonly audio: { readonly transcription: readonly unknown[] } }]\n ? {\n readonly audio: AudioModelCatalog & {\n readonly transcription: NonNullable<AudioModelCatalog[\"transcription\"]>\n }\n }\n : unknown)\n\n/** Build an immutable catalog while preserving each family's default and empty-list rules. */\nexport function createModelCatalog<TInput extends ModelCatalogInput>(\n input: TInput\n): ModelCatalogFor<TInput>\nexport function createModelCatalog(input: ModelCatalogInput): ModelCatalog {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new RuntimeError(\"[Sixb] 'models' must be a model catalog configuration.\")\n }\n\n const language = createLanguageCatalog(input.language)\n const embedding = createEmbeddingCatalog(input.embedding)\n const decision = createDecisionCatalog(input.decision)\n const audio = createAudioCatalog(input.audio)\n const reranking = createRerankingCatalog(input.reranking)\n\n if (\n !language &&\n !decision &&\n !audio &&\n embedding.list().length === 0 &&\n !reranking?.list().length\n ) {\n throw new RuntimeError(\n \"[Sixb] Configure at least one language, embedding, decision, audio or reranking model.\"\n )\n }\n\n return Object.freeze({ language, embedding, decision, audio, reranking })\n}\n\nfunction createRerankingCatalog(\n models: readonly RerankingModel[] | undefined\n): RerankingModelCatalog | undefined {\n if (models === undefined) return undefined\n if (!Array.isArray(models)) {\n throw new RuntimeError(\"[Sixb] models.reranking must be an array of reranking models.\")\n }\n return indexModelBindings(models, \"reranking\", assertRerankingModel)\n}\n\nfunction createLanguageCatalog(\n models: readonly LanguageModel[] | undefined\n): LanguageModelCatalog | undefined {\n if (models === undefined) return undefined\n if (!Array.isArray(models)) {\n throw new RuntimeError(\"[Sixb] 'models.language' must be an array of Sixb language models.\")\n }\n\n const index = indexModelBindings(models, \"language\", (model, position) => {\n assertLanguageModel(model, position)\n assertDefaultReasoning(model, position)\n })\n const [defaultEntry] = index.list()\n if (!defaultEntry) {\n throw new RuntimeError(\n \"[Sixb] 'models.language' needs at least one model. Configure one or omit 'models.language'.\"\n )\n }\n\n return Object.freeze({ ...index, default: defaultEntry })\n}\n\nfunction createEmbeddingCatalog(\n models: readonly EmbeddingModel[] | undefined\n): EmbeddingModelCatalog {\n if (models !== undefined && !Array.isArray(models)) {\n throw new RuntimeError(\"[Sixb] models.embedding must be an array of embedding models.\")\n }\n\n return indexModelBindings(models ?? [], \"embedding\", assertEmbeddingModel)\n}\n\n// Capabilities known without catalog I/O. Unknown support is accepted: providers fall back to their\n// default when a resolved model turns out not to support the level.\nfunction assertDefaultReasoning(model: LanguageModel, index: number): void {\n const reasoning: unknown = model.defaultReasoning\n if (reasoning === undefined) return\n if (!(MODEL_REASONING_LEVELS as readonly unknown[]).includes(reasoning)) {\n throw invalidLanguageModel(\n index,\n `expected 'defaultReasoning' to be one of: ${MODEL_REASONING_LEVELS.join(\", \")}`\n )\n }\n const issue = modelReasoningSupportIssue(model.definition.capabilities.reasoning, reasoning)\n if (issue !== undefined) {\n throw invalidLanguageModel(index, `default reasoning '${reasoning}' cannot be used: ${issue}`)\n }\n}\n\nfunction assertLanguageModel(model: unknown, index: number): asserts model is LanguageModel {\n if ((typeof model !== \"object\" && typeof model !== \"function\") || model === null) {\n throw invalidLanguageModel(index, \"expected a Sixb LanguageModel instance\")\n }\n\n const candidate = model as Record<string, unknown>\n assertModelIdentifier(candidate.providerId, \"provider\", index)\n assertModelIdentifier(candidate.modelId, \"modelId\", index)\n if (typeof candidate.stream !== \"function\") {\n throw invalidLanguageModel(index, \"expected 'stream' to be a function\")\n }\n try {\n const definition = defineLanguageModel(candidate.definition as LanguageModelDefinition)\n if (\n definition.providerId !== candidate.providerId ||\n definition.modelId !== candidate.modelId\n ) {\n throw new Error(\"definition identity does not match the binding\")\n }\n } catch (error) {\n throw invalidLanguageModel(index, error instanceof Error ? error.message : \"invalid definition\")\n }\n}\n\nfunction assertModelIdentifier(value: unknown, field: \"provider\" | \"modelId\", index: number): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throw invalidLanguageModel(index, `expected '${field}' to be a non-empty string`)\n }\n if (value.trim() !== value) {\n throw invalidLanguageModel(index, `expected '${field}' not to have surrounding whitespace`)\n }\n}\n\nfunction invalidLanguageModel(index: number, detail: string): RuntimeError {\n return new RuntimeError(\n `[Sixb] Invalid language model at 'models.language[${index}]': ${detail}.`\n )\n}\n\n/** Provider-owned metadata lookup, independent from the project's configured bindings. */\nexport interface ModelDefinitionCatalog<TDefinition extends ModelDefinition = ModelDefinition> {\n get(modelId: string): Promise<TDefinition | undefined>\n list(): Promise<readonly TDefinition[]>\n}\n\nexport type LanguageModelDefinitionCatalog = ModelDefinitionCatalog<LanguageModelDefinition>\n",
|
|
13
|
+
"import { ModelProviderError } from \"../errors\"\nimport type { DecisionModelResponseMetadata } from \"./types\"\n\nexport class DecisionModelResponseError extends ModelProviderError {\n constructor(\n message: string,\n providerId: string,\n modelId: string,\n readonly metadata: DecisionModelResponseMetadata,\n options?: ErrorOptions\n ) {\n super(message, providerId, modelId, {\n ...options,\n code: \"invalid_decision_response\",\n retryable: false,\n })\n }\n}\n",
|
|
14
|
+
"import type { SchemaOrRef } from \"../../ontology/refs\"\nimport type {\n ChoiceQuestion,\n DecisionContent,\n DecisionQuestion,\n DecisionQuestions,\n ScoreQuestion,\n} from \"./types\"\nimport { assertDecisionQuestions } from \"./validation\"\n\ntype RequiredField<S extends SchemaOrRef> = { required: true; schema: S }\ntype ChoiceAnswerSchema<C extends Readonly<Record<string, DecisionContent | null>>> = {\n type: \"object\"\n properties: {\n choice: RequiredField<{\n type: \"enum\"\n valueType: \"string\"\n values: `${Extract<keyof C, string | number>}`[]\n }>\n probabilities: RequiredField<{\n type: \"object\"\n properties: { [K in keyof C]: RequiredField<\"double\"> }\n }>\n confidence: { schema: \"double\" }\n }\n}\nexport type DecisionAnswerSchema<Q extends DecisionQuestion> =\n Q extends ChoiceQuestion<infer C>\n ? ChoiceAnswerSchema<C>\n : Q extends ScoreQuestion\n ? {\n type: \"object\"\n properties: {\n score: RequiredField<\"double\">\n probabilities: RequiredField<{ type: \"array\"; items: \"double\" }>\n confidence: { schema: \"double\" }\n }\n }\n : { type: \"object\"; properties: { probability: RequiredField<\"double\"> } }\nexport type DecisionOutputShape<Q extends DecisionQuestions> = {\n -readonly [K in keyof Q]: DecisionAnswerSchema<Q[K]>\n}\n\n/** Ordinary Sixb output schemas for actions/workflow steps; evaluate() validates distributions. */\nexport function decisionOutput<const Q extends DecisionQuestions>(\n questions: Q\n): DecisionOutputShape<Q> {\n assertDecisionQuestions(questions)\n const result: Record<string, SchemaOrRef> = Object.fromEntries(\n Object.entries(questions).map(([key, q]) => {\n if (q.type === \"probability\")\n return [\n key,\n {\n type: \"object\",\n properties: { probability: { required: true, schema: \"double\" } },\n },\n ]\n const confidence = { schema: \"double\" as const }\n if (q.type === \"score\")\n return [\n key,\n {\n type: \"object\",\n properties: {\n score: { required: true, schema: \"double\" },\n probabilities: { required: true, schema: { type: \"array\", items: \"double\" } },\n confidence,\n },\n },\n ]\n return [\n key,\n {\n type: \"object\",\n properties: {\n choice: {\n required: true,\n schema: { type: \"enum\", valueType: \"string\", values: Object.keys(q.options) },\n },\n probabilities: {\n required: true,\n schema: {\n type: \"object\",\n properties: Object.fromEntries(\n Object.keys(q.options).map((option) => [\n option,\n { required: true, schema: \"double\" },\n ])\n ),\n },\n },\n confidence,\n },\n },\n ]\n })\n )\n // Each branch builds the corresponding schema while retaining literal option keys in the type.\n return result as DecisionOutputShape<Q>\n}\n",
|
|
15
|
+
"import type { ChoiceQuestion, DecisionContent, ProbabilityQuestion, ScoreQuestion } from \"./types\"\nimport { assertDecisionQuestions } from \"./validation\"\n\n/** Plain serializable descriptors; no registration or inference takes place here. */\nexport const question = {\n choice<const TOptions extends Readonly<Record<string, DecisionContent | null>>>(input: {\n readonly instructions: DecisionContent\n readonly options: TOptions\n }): ChoiceQuestion<TOptions> {\n const result = { ...input, type: \"choice\" as const }\n assertDecisionQuestions({ question: result })\n return result\n },\n score<\n const TLevels extends readonly [DecisionContent, DecisionContent, ...DecisionContent[]],\n >(input: {\n readonly instructions: DecisionContent\n readonly levels: TLevels\n }): ScoreQuestion<TLevels> {\n const result = { ...input, type: \"score\" as const }\n assertDecisionQuestions({ question: result })\n return result\n },\n probability(instructions: DecisionContent): ProbabilityQuestion {\n const result = { type: \"probability\" as const, instructions }\n assertDecisionQuestions({ question: result })\n return result\n },\n}\n",
|
|
16
|
+
"import type { ModelRoute, ModelUsage } from \"./events\"\nimport type { LanguageModelRateCard, ModelTokenPrice } from \"./rate-card\"\n\n/** Optional local financial enrichment cannot discard a completed, billable call. */\nexport function estimateModelCall(\n model: { readonly costEstimator?: Pick<ModelCostEstimator, \"estimate\"> },\n input: Parameters<ModelCostEstimator[\"estimate\"]>[0]\n): ModelCostEstimate {\n try {\n return model.costEstimator?.estimate(input) ?? rateModelCall({ usage: input.usage })\n } catch {\n console.warn(\n \"[Sixb] Model cost estimation failed; preserving usage and available provider cost.\"\n )\n return { status: \"unpriceable\", reason: \"missing-rate-card\" }\n }\n}\n\nexport interface ModelMoney {\n readonly currency: \"USD\"\n /** Billionths of one currency unit, serialized as an integer string. */\n readonly amountNanos: string\n}\n\nexport interface ModelReportedCost {\n readonly money: ModelMoney\n readonly providerId?: string\n}\n\n/** A local estimate is never a provider-reported charge. No financial API is required to run. */\nexport type ModelCostEstimate = Exclude<ModelCallCost, { status: \"reported\" }>\n\nexport interface ModelCostEstimator {\n /** Conservative token-cost reservation, including cache writes and pricing tiers.\n * Return undefined when routing or non-token charges prevent a safe local estimate. */\n estimateReservation?(input: {\n readonly inputTokens: number\n readonly outputTokens: number\n }): ModelMoney | undefined\n\n estimate(input: {\n readonly usage: ModelUsage\n readonly route?: ModelRoute\n readonly responseModelId?: string\n }): ModelCostEstimate\n}\n\nexport type ModelCostMeter =\n | \"audio.input.milliseconds\"\n | \"tokens.input.total\"\n | \"tokens.input.uncached\"\n | \"tokens.input.cacheRead\"\n | \"tokens.input.cacheWrite\"\n | \"tokens.input.cacheWrite5m\"\n | \"tokens.input.cacheWrite1h\"\n | \"tokens.output.total\"\n\nexport interface ModelCostComponent {\n readonly meter: ModelCostMeter\n readonly quantity: string\n readonly rateAmountNanosPerMillion: string\n readonly chargeAmountNanos: string\n}\n\nexport type ModelCallCost =\n | { readonly status: \"reported\"; readonly money: ModelMoney; readonly providerId?: string }\n | {\n readonly status: \"rated\"\n readonly money: ModelMoney\n readonly components: readonly ModelCostComponent[]\n }\n | {\n readonly status: \"unpriceable\"\n readonly reason: \"missing-rate-card\" | \"missing-usage\" | \"inconsistent-usage\"\n readonly missingMeters?: readonly ModelCostMeter[]\n }\n\n/** Reserve at the highest configured token rates, before cache usage and the final tier are known. */\nexport function estimateModelReservation(input: {\n readonly inputTokens: number\n readonly outputTokens: number\n readonly rateCard?: LanguageModelRateCard\n}): ModelMoney | undefined {\n if (!input.rateCard) return undefined\n if (![input.inputTokens, input.outputTokens].every((n) => Number.isSafeInteger(n) && n >= 0)) {\n throw new TypeError(\n \"[Sixb] Model reservation token estimates must be nonnegative safe integers.\"\n )\n }\n const maxRate = (prices: readonly (ModelTokenPrice | undefined)[]) => {\n const rates = prices.flatMap((price) =>\n price === undefined\n ? []\n : typeof price === \"string\"\n ? [price]\n : [price.default, ...price.tiers.map((tier) => tier.price)]\n )\n return rates.reduce((max, price) => {\n const rate = decimalDollarsToNanos(price)\n return rate > max ? rate : max\n }, 0n)\n }\n const card = input.rateCard\n const inputRate = maxRate([\n card.input,\n card.cacheReadInput,\n card.cacheWriteInput,\n card.cacheWriteInput5m,\n card.cacheWriteInput1h,\n ])\n const outputRate = maxRate([card.output])\n const charge = (tokens: number, rate: bigint) => (BigInt(tokens) * rate + 999_999n) / 1_000_000n\n return {\n currency: \"USD\",\n amountNanos: (\n charge(input.inputTokens, inputRate) + charge(input.outputTokens, outputRate)\n ).toString(),\n }\n}\n\n/** Prefer the provider's bill over rate-card estimates, then rate complete token meters locally. */\nexport function rateModelCall(input: {\n readonly usage: ModelUsage\n readonly rateCard?: LanguageModelRateCard\n readonly reported?: undefined\n}): ModelCostEstimate\nexport function rateModelCall(input: {\n readonly usage: ModelUsage\n readonly rateCard?: LanguageModelRateCard\n readonly reported?: ModelReportedCost\n}): ModelCallCost\nexport function rateModelCall(input: {\n readonly usage: ModelUsage\n readonly rateCard?: LanguageModelRateCard\n readonly reported?: ModelReportedCost\n}): ModelCallCost {\n if (input.reported) {\n assertAmountNanos(input.reported.money.amountNanos)\n return {\n status: \"reported\",\n money: input.reported.money,\n ...(input.reported.providerId === undefined ? {} : { providerId: input.reported.providerId }),\n }\n }\n if (!input.rateCard) return { status: \"unpriceable\", reason: \"missing-rate-card\" }\n const { usage, rateCard } = input\n if (!validUsageCounters(usage)) {\n return { status: \"unpriceable\", reason: \"inconsistent-usage\" }\n }\n if (usage.inputTokens === undefined || usage.outputTokens === undefined) {\n return {\n status: \"unpriceable\",\n reason: \"missing-usage\",\n missingMeters: [\n ...(usage.inputTokens === undefined ? ([\"tokens.input.total\"] as const) : []),\n ...(usage.outputTokens === undefined ? ([\"tokens.output.total\"] as const) : []),\n ],\n }\n }\n\n const partitioned = partitionInputUsage(usage, rateCard)\n if (partitioned.status !== \"rated\") return partitioned\n\n const components: ModelCostComponent[] = []\n if (!partitioned.partitioned) {\n components.push(\n component(\"tokens.input.total\", usage.inputTokens, rateCard.input, usage.inputTokens)\n )\n } else {\n components.push(\n component(\"tokens.input.uncached\", partitioned.uncached, rateCard.input, usage.inputTokens)\n )\n if (partitioned.cacheRead !== undefined) {\n components.push(\n component(\n \"tokens.input.cacheRead\",\n partitioned.cacheRead,\n rateCard.cacheReadInput!,\n usage.inputTokens\n )\n )\n }\n if (partitioned.cacheWrite !== undefined) {\n components.push(\n component(\n \"tokens.input.cacheWrite\",\n partitioned.cacheWrite,\n rateCard.cacheWriteInput!,\n usage.inputTokens\n )\n )\n }\n if (partitioned.cacheWrite5m !== undefined) {\n components.push(\n component(\n \"tokens.input.cacheWrite5m\",\n partitioned.cacheWrite5m,\n rateCard.cacheWriteInput5m ?? rateCard.cacheWriteInput!,\n usage.inputTokens\n )\n )\n }\n if (partitioned.cacheWrite1h !== undefined) {\n components.push(\n component(\n \"tokens.input.cacheWrite1h\",\n partitioned.cacheWrite1h,\n rateCard.cacheWriteInput1h ?? rateCard.cacheWriteInput!,\n usage.inputTokens\n )\n )\n }\n }\n components.push(\n component(\"tokens.output.total\", usage.outputTokens, rateCard.output, usage.inputTokens)\n )\n const total = components.reduce((sum, entry) => sum + BigInt(entry.chargeAmountNanos), 0n)\n return {\n status: \"rated\",\n money: { currency: rateCard.currency, amountNanos: total.toString() },\n components,\n }\n}\n\ntype PartitionResult =\n | { readonly status: \"rated\"; readonly partitioned: false }\n | {\n readonly status: \"rated\"\n readonly partitioned: true\n readonly uncached: number\n readonly cacheRead?: number\n readonly cacheWrite?: number\n readonly cacheWrite5m?: number\n readonly cacheWrite1h?: number\n }\n | Extract<ModelCallCost, { status: \"unpriceable\" }>\n\nfunction partitionInputUsage(usage: ModelUsage, rateCard: LanguageModelRateCard): PartitionResult {\n const hasSpecificWrites =\n usage.cacheWrite5mInputTokens !== undefined || usage.cacheWrite1hInputTokens !== undefined\n const cacheWriteSpecific =\n (usage.cacheWrite5mInputTokens ?? 0) + (usage.cacheWrite1hInputTokens ?? 0)\n if (\n hasSpecificWrites &&\n usage.cacheWriteInputTokens !== undefined &&\n usage.cacheWriteInputTokens !== cacheWriteSpecific\n ) {\n return { status: \"unpriceable\", reason: \"inconsistent-usage\" }\n }\n\n const partitioned =\n usage.uncachedInputTokens !== undefined ||\n usage.cacheReadInputTokens !== undefined ||\n usage.cacheWriteInputTokens !== undefined ||\n hasSpecificWrites ||\n rateCard.cacheReadInput !== undefined ||\n rateCard.cacheWriteInput !== undefined ||\n rateCard.cacheWriteInput5m !== undefined ||\n rateCard.cacheWriteInput1h !== undefined\n if (!partitioned) return { status: \"rated\", partitioned: false }\n\n const cacheRead = usage.cacheReadInputTokens ?? 0\n const totalWrite = usage.cacheWriteInputTokens ?? cacheWriteSpecific\n if (usage.inputTokens !== undefined && cacheRead + totalWrite > usage.inputTokens) {\n return { status: \"unpriceable\", reason: \"inconsistent-usage\" }\n }\n\n const missing: ModelCostMeter[] = []\n if (usage.uncachedInputTokens === undefined) missing.push(\"tokens.input.uncached\")\n if (rateCard.cacheReadInput !== undefined && usage.cacheReadInputTokens === undefined) {\n missing.push(\"tokens.input.cacheRead\")\n }\n if (\n rateCard.cacheWriteInput !== undefined &&\n rateCard.cacheWriteInput5m === undefined &&\n rateCard.cacheWriteInput1h === undefined &&\n usage.cacheWriteInputTokens === undefined\n ) {\n missing.push(\"tokens.input.cacheWrite\")\n }\n if (rateCard.cacheWriteInput5m !== undefined && usage.cacheWrite5mInputTokens === undefined) {\n missing.push(\"tokens.input.cacheWrite5m\")\n }\n if (rateCard.cacheWriteInput1h !== undefined && usage.cacheWrite1hInputTokens === undefined) {\n missing.push(\"tokens.input.cacheWrite1h\")\n }\n if (missing.length > 0) {\n return { status: \"unpriceable\", reason: \"missing-usage\", missingMeters: missing }\n }\n if (cacheRead > 0 && rateCard.cacheReadInput === undefined) {\n return {\n status: \"unpriceable\",\n reason: \"missing-rate-card\",\n missingMeters: [\"tokens.input.cacheRead\"],\n }\n }\n if (!hasSpecificWrites && totalWrite > 0 && rateCard.cacheWriteInput === undefined) {\n return {\n status: \"unpriceable\",\n reason: \"missing-rate-card\",\n missingMeters: [\"tokens.input.cacheWrite\"],\n }\n }\n if (\n (usage.cacheWrite5mInputTokens ?? 0) > 0 &&\n rateCard.cacheWriteInput5m === undefined &&\n rateCard.cacheWriteInput === undefined\n ) {\n return {\n status: \"unpriceable\",\n reason: \"missing-rate-card\",\n missingMeters: [\"tokens.input.cacheWrite5m\"],\n }\n }\n if (\n (usage.cacheWrite1hInputTokens ?? 0) > 0 &&\n rateCard.cacheWriteInput1h === undefined &&\n rateCard.cacheWriteInput === undefined\n ) {\n return {\n status: \"unpriceable\",\n reason: \"missing-rate-card\",\n missingMeters: [\"tokens.input.cacheWrite1h\"],\n }\n }\n\n const uncached = usage.uncachedInputTokens!\n if (uncached + cacheRead + totalWrite !== usage.inputTokens) {\n return { status: \"unpriceable\", reason: \"inconsistent-usage\" }\n }\n return {\n status: \"rated\",\n partitioned: true,\n uncached,\n ...(rateCard.cacheReadInput === undefined ? {} : { cacheRead }),\n ...(hasSpecificWrites\n ? {\n ...(rateCard.cacheWriteInput5m !== undefined || rateCard.cacheWriteInput !== undefined\n ? { cacheWrite5m: usage.cacheWrite5mInputTokens ?? 0 }\n : {}),\n ...(rateCard.cacheWriteInput1h !== undefined || rateCard.cacheWriteInput !== undefined\n ? { cacheWrite1h: usage.cacheWrite1hInputTokens ?? 0 }\n : {}),\n }\n : rateCard.cacheWriteInput === undefined\n ? {}\n : { cacheWrite: totalWrite }),\n }\n}\n\nfunction validUsageCounters(usage: ModelUsage): boolean {\n return Object.entries(usage)\n .filter(([key]) => key !== \"raw\")\n .every(([, value]) => value === undefined || (Number.isSafeInteger(value) && value >= 0))\n}\n\nfunction component(\n meter: ModelCostMeter,\n quantity: number,\n price: ModelTokenPrice,\n tierTokens: number\n): ModelCostComponent {\n const rate = decimalDollarsToNanos(resolvePrice(price, tierTokens))\n const charge = (BigInt(quantity) * rate + 500_000n) / 1_000_000n\n return {\n meter,\n quantity: quantity.toString(),\n rateAmountNanosPerMillion: rate.toString(),\n chargeAmountNanos: charge.toString(),\n }\n}\n\nfunction resolvePrice(price: ModelTokenPrice, tokens: number): string {\n if (typeof price === \"string\") return price\n return (\n price.tiers.find(\n (tier) =>\n tokens >= tier.minTokens && (tier.maxTokens === undefined || tokens < tier.maxTokens)\n )?.price ?? price.default\n )\n}\n\nfunction decimalDollarsToNanos(value: string): bigint {\n const [whole = \"0\", fraction = \"\"] = value.split(\".\")\n const nanos = fraction.slice(0, 9).padEnd(9, \"0\")\n const roundUp = Number(fraction[9] ?? \"0\") >= 5\n return BigInt(whole) * 1_000_000_000n + BigInt(nanos) + (roundUp ? 1n : 0n)\n}\n\nfunction assertAmountNanos(value: string): void {\n if (!/^(?:0|[1-9]\\d*)$/.test(value)) {\n throw new TypeError(\"[Sixb] Provider-reported model cost must use nonnegative amountNanos.\")\n }\n}\n",
|
|
17
|
+
"/** Decimal USD per million tokens. Strings keep provider prices exact. */\nexport type ModelUnitPrice = string\n\nexport interface ModelPricingTier {\n readonly minTokens: number\n readonly maxTokens?: number\n readonly price: ModelUnitPrice\n}\n\nexport type ModelTokenPrice =\n | ModelUnitPrice\n | { readonly default: ModelUnitPrice; readonly tiers: readonly ModelPricingTier[] }\n\nexport interface LanguageModelRateCard {\n readonly currency: \"USD\"\n readonly unit: \"million-tokens\"\n readonly input: ModelTokenPrice\n readonly output: ModelTokenPrice\n readonly cacheReadInput?: ModelTokenPrice\n readonly cacheWriteInput?: ModelTokenPrice\n readonly cacheWriteInput5m?: ModelTokenPrice\n readonly cacheWriteInput1h?: ModelTokenPrice\n}\n\n/** Validate and snapshot provider-owned pricing independently of operational metadata. */\nexport function defineModelRateCard(rateCard: LanguageModelRateCard): LanguageModelRateCard {\n assertRecord(rateCard, \"rate card\")\n if (rateCard.currency !== \"USD\" || rateCard.unit !== \"million-tokens\") {\n throw new TypeError(\"[Sixb] Model rate cards must use USD per million tokens.\")\n }\n return Object.freeze({\n currency: \"USD\",\n unit: \"million-tokens\",\n input: tokenPrice(rateCard.input),\n output: tokenPrice(rateCard.output),\n ...(rateCard.cacheReadInput === undefined\n ? {}\n : { cacheReadInput: tokenPrice(rateCard.cacheReadInput) }),\n ...(rateCard.cacheWriteInput === undefined\n ? {}\n : { cacheWriteInput: tokenPrice(rateCard.cacheWriteInput) }),\n ...(rateCard.cacheWriteInput5m === undefined\n ? {}\n : { cacheWriteInput5m: tokenPrice(rateCard.cacheWriteInput5m) }),\n ...(rateCard.cacheWriteInput1h === undefined\n ? {}\n : { cacheWriteInput1h: tokenPrice(rateCard.cacheWriteInput1h) }),\n })\n}\n\nfunction tokenPrice(value: ModelTokenPrice): ModelTokenPrice {\n if (typeof value === \"string\") return price(value)\n assertRecord(value, \"token price\")\n if (!Array.isArray(value.tiers)) throw new TypeError(\"[Sixb] Model price tiers must be an array.\")\n let previousMax = 0\n return Object.freeze({\n default: price(value.default),\n tiers: Object.freeze(\n value.tiers.map((tier, index) => {\n assertRecord(tier, \"price tier\")\n if (\n typeof tier.minTokens !== \"number\" ||\n !Number.isSafeInteger(tier.minTokens) ||\n tier.minTokens < 0\n ) {\n throw new TypeError(\"[Sixb] Model price tier has an invalid minimum.\")\n }\n if (index > 0 && tier.minTokens < previousMax) {\n throw new TypeError(\"[Sixb] Model price tiers must be ordered and nonoverlapping.\")\n }\n if (\n tier.maxTokens !== undefined &&\n (typeof tier.maxTokens !== \"number\" ||\n !Number.isSafeInteger(tier.maxTokens) ||\n tier.maxTokens <= tier.minTokens)\n ) {\n throw new TypeError(\"[Sixb] Model price tier has an invalid maximum.\")\n }\n previousMax = tier.maxTokens ?? Number.POSITIVE_INFINITY\n return Object.freeze({\n minTokens: tier.minTokens,\n ...(tier.maxTokens === undefined ? {} : { maxTokens: tier.maxTokens }),\n price: price(tier.price),\n })\n })\n ),\n })\n}\n\nfunction price(value: unknown): string {\n if (typeof value !== \"string\" || !/^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/.test(value)) {\n throw new TypeError(\"[Sixb] Model price must be a nonnegative decimal string.\")\n }\n return value\n}\n\nfunction assertRecord(value: unknown, field: string): asserts value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new TypeError(`[Sixb] Model ${field} must be an object.`)\n }\n}\n"
|
|
18
|
+
],
|
|
19
|
+
"mappings": "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",
|
|
20
|
+
"debugId": "728EDA0657BA3E0264756E2164756E21",
|
|
21
|
+
"names": []
|
|
22
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
isFileRef2
|
|
4
|
+
} from "./chunk-jhm3zsa7.js";
|
|
5
|
+
import {
|
|
6
|
+
BlobStorageError2
|
|
7
|
+
} from "./chunk-h8teetr0.js";
|
|
8
|
+
|
|
9
|
+
// src/blob-storage/download-urls.ts
|
|
10
|
+
import { createHash, randomBytes, randomUUID } from "crypto";
|
|
11
|
+
var FILE_DOWNLOAD_ROUTE_PREFIX2 = "/api/files/downloads/";
|
|
12
|
+
var DEFAULT_EXPIRY_MS = 60 * 60 * 1000;
|
|
13
|
+
var LATEST_EXPIRY_MS = Date.UTC(9999, 11, 31, 23, 59, 59, 999);
|
|
14
|
+
var TOKEN_PATTERN = /^[A-Za-z0-9_-]{43}$/;
|
|
15
|
+
async function createFileDownloadUrl(context, file, options = {}) {
|
|
16
|
+
if (!isFileRef2(file)) {
|
|
17
|
+
throw new Error("[Sixb] blobs.createDownloadUrl() requires a valid file reference.");
|
|
18
|
+
}
|
|
19
|
+
const createdAt = new Date;
|
|
20
|
+
const expiresAt = expiryFrom(createdAt, options.expiresInMs ?? DEFAULT_EXPIRY_MS);
|
|
21
|
+
const grants = requireGrantStorage(context.storage);
|
|
22
|
+
if (context.apiPublicOrigin === undefined) {
|
|
23
|
+
throw new Error("[Sixb] blobs.createDownloadUrl() needs the API's public origin. Set SIXB_API_PUBLIC_ORIGIN for the API and every worker.");
|
|
24
|
+
}
|
|
25
|
+
const stat = await context.blobStorage.stat(file.blobId);
|
|
26
|
+
if (!stat || stat.digest !== file.digest || stat.sizeBytes !== file.sizeBytes) {
|
|
27
|
+
throw new BlobStorageError2(`[Sixb] No stored blob matches file '${file.blobId}'.`);
|
|
28
|
+
}
|
|
29
|
+
const token = randomBytes(32).toString("base64url");
|
|
30
|
+
const { logicalPath: _logicalPath, ...served } = file;
|
|
31
|
+
const grant = {
|
|
32
|
+
id: `filedownload_${randomUUID()}`,
|
|
33
|
+
projectId: context.projectId,
|
|
34
|
+
tokenHash: hashToken(token),
|
|
35
|
+
file: served,
|
|
36
|
+
executionId: context.executionId,
|
|
37
|
+
createdAt,
|
|
38
|
+
expiresAt
|
|
39
|
+
};
|
|
40
|
+
await grants.create(grant);
|
|
41
|
+
return {
|
|
42
|
+
id: grant.id,
|
|
43
|
+
url: new URL(`${FILE_DOWNLOAD_ROUTE_PREFIX2}${token}`, context.apiPublicOrigin).toString(),
|
|
44
|
+
expiresAt: grant.expiresAt
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function revokeFileDownloadUrl(context, id) {
|
|
48
|
+
const revoked = await requireGrantStorage(context.storage).revoke({
|
|
49
|
+
projectId: context.projectId,
|
|
50
|
+
id,
|
|
51
|
+
revokedAt: new Date
|
|
52
|
+
});
|
|
53
|
+
if (!revoked) {
|
|
54
|
+
throw new Error(`[Sixb] Download URL '${id}' does not exist.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function resolveFileDownload2(host, token) {
|
|
58
|
+
const grants = host.storage.fileDownloadGrants;
|
|
59
|
+
if (!grants || !TOKEN_PATTERN.test(token))
|
|
60
|
+
return null;
|
|
61
|
+
const grant = await grants.findByTokenHash({ projectId: host.id, tokenHash: hashToken(token) });
|
|
62
|
+
if (!grant || grant.revokedAt || grant.expiresAt.getTime() <= Date.now())
|
|
63
|
+
return null;
|
|
64
|
+
return grant.file;
|
|
65
|
+
}
|
|
66
|
+
function hashToken(token) {
|
|
67
|
+
return createHash("sha256").update(token).digest("hex");
|
|
68
|
+
}
|
|
69
|
+
function requireGrantStorage(storage) {
|
|
70
|
+
if (!storage.fileDownloadGrants) {
|
|
71
|
+
throw new Error("[Sixb] Download URLs require storage.fileDownloadGrants.");
|
|
72
|
+
}
|
|
73
|
+
return storage.fileDownloadGrants;
|
|
74
|
+
}
|
|
75
|
+
function expiryFrom(createdAt, expiresInMs) {
|
|
76
|
+
if (!Number.isSafeInteger(expiresInMs) || expiresInMs <= 0) {
|
|
77
|
+
throw new Error("[Sixb] expiresInMs must be a positive integer.");
|
|
78
|
+
}
|
|
79
|
+
const expiresAt = createdAt.getTime() + expiresInMs;
|
|
80
|
+
if (expiresAt > LATEST_EXPIRY_MS) {
|
|
81
|
+
throw new Error("[Sixb] expiresInMs must end before the year 10000.");
|
|
82
|
+
}
|
|
83
|
+
return new Date(expiresAt);
|
|
84
|
+
}
|
|
85
|
+
// src/blob-storage/file-content.ts
|
|
86
|
+
function resolveFileRefAtPath2(root, path) {
|
|
87
|
+
const value = resolveJsonPointer(root, path);
|
|
88
|
+
return isFileRef2(value) ? value : null;
|
|
89
|
+
}
|
|
90
|
+
async function statFileRef2(blobStorage, fileRef) {
|
|
91
|
+
const stat = await blobStorage.stat(fileRef.blobId);
|
|
92
|
+
return stat && stat.blobId === fileRef.blobId && stat.digest === fileRef.digest && stat.sizeBytes === fileRef.sizeBytes ? stat : null;
|
|
93
|
+
}
|
|
94
|
+
async function openFileRef2(blobStorage, fileRef) {
|
|
95
|
+
const stat = await statFileRef2(blobStorage, fileRef);
|
|
96
|
+
if (!stat)
|
|
97
|
+
return null;
|
|
98
|
+
return { fileRef, body: openOnFirstRead(blobStorage, fileRef.blobId) };
|
|
99
|
+
}
|
|
100
|
+
function openOnFirstRead(blobStorage, blobId) {
|
|
101
|
+
let reader;
|
|
102
|
+
return new ReadableStream({
|
|
103
|
+
async pull(controller) {
|
|
104
|
+
reader ??= (await blobStorage.open(blobId)).getReader();
|
|
105
|
+
const { done, value } = await reader.read();
|
|
106
|
+
if (done)
|
|
107
|
+
controller.close();
|
|
108
|
+
else
|
|
109
|
+
controller.enqueue(value);
|
|
110
|
+
},
|
|
111
|
+
async cancel(reason) {
|
|
112
|
+
await reader?.cancel(reason);
|
|
113
|
+
}
|
|
114
|
+
}, { highWaterMark: 0 });
|
|
115
|
+
}
|
|
116
|
+
function jsonPointerSegment2(segment) {
|
|
117
|
+
return String(segment).replaceAll("~", "~0").replaceAll("/", "~1");
|
|
118
|
+
}
|
|
119
|
+
function resolveJsonPointer(root, pointer) {
|
|
120
|
+
if (pointer === "") {
|
|
121
|
+
return root;
|
|
122
|
+
}
|
|
123
|
+
if (!pointer.startsWith("/")) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
let current = root;
|
|
127
|
+
for (const rawSegment of pointer.slice(1).split("/")) {
|
|
128
|
+
const segment = decodeJsonPointerSegment(rawSegment);
|
|
129
|
+
if (Array.isArray(current)) {
|
|
130
|
+
const index = Number.parseInt(segment, 10);
|
|
131
|
+
if (!Number.isInteger(index) || index < 0 || index.toString() !== segment) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (!Object.hasOwn(current, segment)) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
current = current[index];
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (typeof current !== "object" || current === null || !Object.hasOwn(current, segment)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
current = current[segment];
|
|
144
|
+
}
|
|
145
|
+
return current;
|
|
146
|
+
}
|
|
147
|
+
function decodeJsonPointerSegment(segment) {
|
|
148
|
+
return segment.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
149
|
+
}
|
|
150
|
+
export { FILE_DOWNLOAD_ROUTE_PREFIX2, createFileDownloadUrl, revokeFileDownloadUrl, resolveFileDownload2, resolveFileRefAtPath2, statFileRef2, openFileRef2, jsonPointerSegment2 };
|
|
151
|
+
|
|
152
|
+
//# debugId=14717FDAE9DF0DDF64756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/blob-storage/download-urls.ts", "../src/blob-storage/file-content.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { createHash, randomBytes, randomUUID } from \"node:crypto\"\nimport type { FileDownloadGrantRecord, FileDownloadGrantStorage, Storage } from \"../storage\"\nimport { BlobStorageError } from \"./errors\"\nimport type { BlobStorage, FileRef } from \"./types\"\nimport { isFileRef } from \"./validation\"\n\n/**\n * Download URLs let a third party that cannot hold a Sixb session — a social network fetching\n * media to publish, for instance — read one file for a bounded time.\n *\n * Each URL carries a random token. Storage keeps only its SHA-256, with the file, the expiry, and\n * the execution that issued it. The API looks the token up on every request, so any process\n * sharing the storage can issue a URL, and a URL can be revoked before it expires.\n *\n * The API serves the bytes itself rather than redirecting to the blob provider: fetchers such as\n * TikTok refuse redirects and accept only hosts whose ownership the developer verified.\n */\n\n/** Path prefix of the public route that serves download URLs. */\nexport const FILE_DOWNLOAD_ROUTE_PREFIX = \"/api/files/downloads/\"\n\nconst DEFAULT_EXPIRY_MS = 60 * 60 * 1000\n// SQLite compares ISO timestamps as text, which orders them correctly only for four-digit years.\nconst LATEST_EXPIRY_MS = Date.UTC(9999, 11, 31, 23, 59, 59, 999)\n/** 32 random bytes in base64url. */\nconst TOKEN_PATTERN = /^[A-Za-z0-9_-]{43}$/\n\nexport interface CreateFileDownloadUrlOptions {\n /** How long the URL stays valid. Defaults to one hour. */\n readonly expiresInMs?: number\n}\n\nexport interface FileDownloadUrl {\n /** Pass to `blobs.revokeDownloadUrl()` to stop the URL before it expires. */\n readonly id: string\n readonly url: string\n readonly expiresAt: Date\n}\n\n/** What issuing and revoking need from the execution that asks. */\nexport interface FileDownloadUrlContext {\n readonly projectId: string\n readonly storage: Storage\n readonly blobStorage: BlobStorage\n readonly executionId: string\n readonly apiPublicOrigin: string | undefined\n}\n\nexport async function createFileDownloadUrl(\n context: FileDownloadUrlContext,\n file: FileRef,\n options: CreateFileDownloadUrlOptions = {}\n): Promise<FileDownloadUrl> {\n if (!isFileRef(file)) {\n throw new Error(\"[Sixb] blobs.createDownloadUrl() requires a valid file reference.\")\n }\n const createdAt = new Date()\n const expiresAt = expiryFrom(createdAt, options.expiresInMs ?? DEFAULT_EXPIRY_MS)\n const grants = requireGrantStorage(context.storage)\n if (context.apiPublicOrigin === undefined) {\n throw new Error(\n \"[Sixb] blobs.createDownloadUrl() needs the API's public origin. Set SIXB_API_PUBLIC_ORIGIN for the API and every worker.\"\n )\n }\n // Fail here, not when a third party fetches the URL minutes later and gets a bare 404.\n const stat = await context.blobStorage.stat(file.blobId)\n if (!stat || stat.digest !== file.digest || stat.sizeBytes !== file.sizeBytes) {\n throw new BlobStorageError(`[Sixb] No stored blob matches file '${file.blobId}'.`)\n }\n\n const token = randomBytes(32).toString(\"base64url\")\n const { logicalPath: _logicalPath, ...served } = file\n const grant: FileDownloadGrantRecord = {\n id: `filedownload_${randomUUID()}`,\n projectId: context.projectId,\n tokenHash: hashToken(token),\n file: served,\n executionId: context.executionId,\n createdAt,\n expiresAt,\n }\n await grants.create(grant)\n\n return {\n id: grant.id,\n url: new URL(`${FILE_DOWNLOAD_ROUTE_PREFIX}${token}`, context.apiPublicOrigin).toString(),\n expiresAt: grant.expiresAt,\n }\n}\n\nexport async function revokeFileDownloadUrl(\n context: FileDownloadUrlContext,\n id: string\n): Promise<void> {\n const revoked = await requireGrantStorage(context.storage).revoke({\n projectId: context.projectId,\n id,\n revokedAt: new Date(),\n })\n if (!revoked) {\n throw new Error(`[Sixb] Download URL '${id}' does not exist.`)\n }\n}\n\n/** The file a token serves, or `null` when the token is unknown, expired, or revoked. */\nexport async function resolveFileDownload(\n host: { readonly id: string; readonly storage: Storage },\n token: string\n): Promise<FileRef | null> {\n const grants = host.storage.fileDownloadGrants\n if (!grants || !TOKEN_PATTERN.test(token)) return null\n\n const grant = await grants.findByTokenHash({ projectId: host.id, tokenHash: hashToken(token) })\n if (!grant || grant.revokedAt || grant.expiresAt.getTime() <= Date.now()) return null\n return grant.file\n}\n\nfunction hashToken(token: string): string {\n return createHash(\"sha256\").update(token).digest(\"hex\")\n}\n\nfunction requireGrantStorage(storage: Storage): FileDownloadGrantStorage {\n if (!storage.fileDownloadGrants) {\n throw new Error(\"[Sixb] Download URLs require storage.fileDownloadGrants.\")\n }\n return storage.fileDownloadGrants\n}\n\nfunction expiryFrom(createdAt: Date, expiresInMs: number): Date {\n if (!Number.isSafeInteger(expiresInMs) || expiresInMs <= 0) {\n throw new Error(\"[Sixb] expiresInMs must be a positive integer.\")\n }\n const expiresAt = createdAt.getTime() + expiresInMs\n if (expiresAt > LATEST_EXPIRY_MS) {\n throw new Error(\"[Sixb] expiresInMs must end before the year 10000.\")\n }\n return new Date(expiresAt)\n}\n",
|
|
6
|
+
"import type { BlobInfo, BlobStorage, FileRef, OpenedFileRef } from \"./types\"\nimport { isFileRef } from \"./validation\"\n\n/**\n * A file is served only through the record that references it: the caller reads that record with\n * its own authority, resolves the FileRef inside it, then checks the FileRef against the stored\n * blob. File content routes and the SDK's `file().open()` share these steps.\n */\n\n/** The FileRef at a JSON Pointer in an authorized record, or null when none is there. */\nexport function resolveFileRefAtPath(root: unknown, path: string): FileRef | null {\n const value = resolveJsonPointer(root, path)\n return isFileRef(value) ? value : null\n}\n\n/** The stored blob a FileRef names, or null when it is absent or no longer matches it. */\nexport async function statFileRef(\n blobStorage: Pick<BlobStorage, \"stat\">,\n fileRef: FileRef\n): Promise<BlobInfo | null> {\n const stat = await blobStorage.stat(fileRef.blobId)\n return stat &&\n stat.blobId === fileRef.blobId &&\n stat.digest === fileRef.digest &&\n stat.sizeBytes === fileRef.sizeBytes\n ? stat\n : null\n}\n\n/**\n * Open a FileRef resolved from an authorized record, or return null when its blob is gone. The\n * blob itself is opened on the body's first read, so a body nobody reads holds nothing.\n */\nexport async function openFileRef(\n blobStorage: Pick<BlobStorage, \"stat\" | \"open\">,\n fileRef: FileRef\n): Promise<OpenedFileRef | null> {\n const stat = await statFileRef(blobStorage, fileRef)\n if (!stat) return null\n return { fileRef, body: openOnFirstRead(blobStorage, fileRef.blobId) }\n}\n\nfunction openOnFirstRead(\n blobStorage: Pick<BlobStorage, \"open\">,\n blobId: string\n): ReadableStream<Uint8Array> {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined\n return new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n reader ??= (await blobStorage.open(blobId)).getReader()\n const { done, value } = await reader.read()\n if (done) controller.close()\n else controller.enqueue(value)\n },\n async cancel(reason) {\n await reader?.cancel(reason)\n },\n },\n // No read-ahead: the first pull waits for the first read.\n { highWaterMark: 0 }\n )\n}\n\n/** Escape one segment of a JSON Pointer. */\nexport function jsonPointerSegment(segment: string | number): string {\n return String(segment).replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\")\n}\n\nfunction resolveJsonPointer(root: unknown, pointer: string): unknown {\n if (pointer === \"\") {\n return root\n }\n\n if (!pointer.startsWith(\"/\")) {\n return undefined\n }\n\n let current = root\n for (const rawSegment of pointer.slice(1).split(\"/\")) {\n const segment = decodeJsonPointerSegment(rawSegment)\n if (Array.isArray(current)) {\n const index = Number.parseInt(segment, 10)\n if (!Number.isInteger(index) || index < 0 || index.toString() !== segment) {\n return undefined\n }\n if (!Object.hasOwn(current, segment)) {\n return undefined\n }\n current = current[index]\n continue\n }\n\n if (typeof current !== \"object\" || current === null || !Object.hasOwn(current, segment)) {\n return undefined\n }\n\n current = (current as Record<string, unknown>)[segment]\n }\n\n return current\n}\n\nfunction decodeJsonPointerSegment(segment: string): string {\n return segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\")\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "14717FDAE9DF0DDF64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
assertValidSchema
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-vgk3hknm.js";
|
|
5
5
|
import {
|
|
6
6
|
normalizeParams,
|
|
7
7
|
coerceParamsToTyped
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-vx2yp45y.js";
|
|
9
9
|
import {
|
|
10
10
|
isPlainRecord
|
|
11
11
|
} from "./chunk-wy0qdqfm.js";
|
|
@@ -21,6 +21,10 @@ function aiLimitCalendarMonth2(at) {
|
|
|
21
21
|
|
|
22
22
|
// src/storage/ai-limits/provider.ts
|
|
23
23
|
var SIGNED_INT64_MAX = 9223372036854775807n;
|
|
24
|
+
var TOKENLESS_MODEL_KINDS = new Set(["transcription", "reranking"]);
|
|
25
|
+
function aiLimitMeterApplies2(meter, modelKind) {
|
|
26
|
+
return meter !== "tokens.total" || modelKind === undefined || !TOKENLESS_MODEL_KINDS.has(modelKind);
|
|
27
|
+
}
|
|
24
28
|
|
|
25
29
|
class AiLimitOperationLock2 {
|
|
26
30
|
tail = Promise.resolve();
|
|
@@ -169,6 +173,7 @@ function normalizeReserveAiModelCall2(input) {
|
|
|
169
173
|
identity,
|
|
170
174
|
subjects: normalizeAiLimitSubjects2(input.subjects),
|
|
171
175
|
estimates: normalizeAiLimitQuantities2(input.estimates, "estimates"),
|
|
176
|
+
...input.modelKind === undefined ? {} : { modelKind: input.modelKind },
|
|
172
177
|
period: aiLimitCalendarMonth2(reservedAt),
|
|
173
178
|
reservedAt
|
|
174
179
|
};
|
|
@@ -214,16 +219,17 @@ function aiLimitReservationRequestKey2(request) {
|
|
|
214
219
|
request.estimates.map((quantity) => {
|
|
215
220
|
const amount = normalizeAiLimitAmount2(quantity);
|
|
216
221
|
return [amount.meter, amount.currency, amount.amount.toString()];
|
|
217
|
-
})
|
|
222
|
+
}),
|
|
223
|
+
...request.modelKind === undefined ? [] : [request.modelKind]
|
|
218
224
|
]);
|
|
219
225
|
}
|
|
220
|
-
function aiLimitReservationBuckets2(policies, subjects, estimates) {
|
|
226
|
+
function aiLimitReservationBuckets2(policies, subjects, estimates, modelKind) {
|
|
221
227
|
const subjectKeys = new Set(subjects.map(aiLimitSubjectKey2));
|
|
222
228
|
const estimatesByDimension = new Map(estimates.map((estimate) => {
|
|
223
229
|
const amount = normalizeAiLimitAmount2(estimate);
|
|
224
230
|
return [aiLimitAmountKey2(amount), estimate];
|
|
225
231
|
}));
|
|
226
|
-
return policies.filter((policy) => subjectKeys.has(aiLimitSubjectKey2(policy.subject))).flatMap((policy) => {
|
|
232
|
+
return policies.filter((policy) => subjectKeys.has(aiLimitSubjectKey2(policy.subject)) && aiLimitMeterApplies2(policy.limit.meter, modelKind)).flatMap((policy) => {
|
|
227
233
|
const estimate = estimatesByDimension.get(aiLimitAmountKey2(normalizeAiLimitAmount2(policy.limit)));
|
|
228
234
|
return estimate ? [{ subject: policy.subject, estimate }] : [];
|
|
229
235
|
}).sort((left, right) => {
|
|
@@ -251,6 +257,8 @@ function resolveAiLimitActual2(entries, dimension) {
|
|
|
251
257
|
let accountingStatus = "complete";
|
|
252
258
|
for (const entry of entries) {
|
|
253
259
|
if (dimension.meter === "tokens.total") {
|
|
260
|
+
if (!aiLimitMeterApplies2(dimension.meter, entry.modelKind))
|
|
261
|
+
continue;
|
|
254
262
|
if (entry.totalTokens === undefined) {
|
|
255
263
|
accountingStatus = "unavailable";
|
|
256
264
|
} else {
|
|
@@ -302,6 +310,6 @@ function cloneValidDate2(value, label) {
|
|
|
302
310
|
return new Date(value);
|
|
303
311
|
}
|
|
304
312
|
|
|
305
|
-
export { AiLimitStorageError2, aiLimitCalendarMonth2, AiLimitOperationLock2, normalizeAiLimitSubject2, normalizeAiLimitSubjects2, aiLimitSubjectKey2, aiLimitSubjectParts2, aiLimitSubjectFromParts2, normalizeAiLimitQuantity2, normalizeAiLimitQuantities2, normalizeAiLimitAmount2, aiLimitQuantityFromAmount2, aiLimitAmountKey2, normalizeCreateAiLimitPolicy2, normalizeUpdateAiLimitPolicy2, normalizeReserveAiModelCall2, normalizeAiModelCallReservationIdentity2, aiModelCallReservationKey2, aiLimitPolicyDimensionKey2, aiLimitReservationRequestMatches2, aiLimitReservationRequestKey2, aiLimitReservationBuckets2, aiLimitAccountingEntryAppliesToSubject2, aiLimitSubjectsFromAccountingEntry2, resolveAiLimitActual2, assertAiLimitAccountingMatchesReservation2, cloneAiLimitPolicy2, assertNonBlank2, cloneValidDate2 };
|
|
313
|
+
export { AiLimitStorageError2, aiLimitCalendarMonth2, aiLimitMeterApplies2, AiLimitOperationLock2, normalizeAiLimitSubject2, normalizeAiLimitSubjects2, aiLimitSubjectKey2, aiLimitSubjectParts2, aiLimitSubjectFromParts2, normalizeAiLimitQuantity2, normalizeAiLimitQuantities2, normalizeAiLimitAmount2, aiLimitQuantityFromAmount2, aiLimitAmountKey2, normalizeCreateAiLimitPolicy2, normalizeUpdateAiLimitPolicy2, normalizeReserveAiModelCall2, normalizeAiModelCallReservationIdentity2, aiModelCallReservationKey2, aiLimitPolicyDimensionKey2, aiLimitReservationRequestMatches2, aiLimitReservationRequestKey2, aiLimitReservationBuckets2, aiLimitAccountingEntryAppliesToSubject2, aiLimitSubjectsFromAccountingEntry2, resolveAiLimitActual2, assertAiLimitAccountingMatchesReservation2, cloneAiLimitPolicy2, assertNonBlank2, cloneValidDate2 };
|
|
306
314
|
|
|
307
|
-
//# debugId=
|
|
315
|
+
//# debugId=DE130C8A66C4C32664756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/storage/ai-limits/errors.ts", "../src/storage/ai-limits/period.ts", "../src/storage/ai-limits/provider.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export type AiLimitStorageErrorCode =\n | \"duplicate_policy\"\n | \"missing_policy\"\n | \"missing_execution\"\n | \"missing_reservation\"\n | \"missing_usage_record\"\n | \"usage_mismatch\"\n | \"unavailable_actuals\"\n | \"reservation_conflict\"\n | \"reconciliation_conflict\"\n | \"invalid_reservation_state\"\n\n/** Stable storage failure for AI limit policies and reservations. */\nexport class AiLimitStorageError extends Error {\n readonly name = \"AiLimitStorageError\"\n\n constructor(\n readonly code: AiLimitStorageErrorCode,\n message: string\n ) {\n super(message)\n }\n}\n",
|
|
6
|
+
"import type { AiLimitPeriod } from \"./types\"\n\n/** Return the UTC calendar month containing `at`, with an inclusive start and exclusive end. */\nexport function aiLimitCalendarMonth(at: Date): AiLimitPeriod {\n if (!(at instanceof Date) || !Number.isFinite(at.getTime())) {\n throw new TypeError(\"[Sixb] AI limit period date must be a valid Date.\")\n }\n const start = new Date(Date.UTC(at.getUTCFullYear(), at.getUTCMonth(), 1))\n const end = new Date(Date.UTC(at.getUTCFullYear(), at.getUTCMonth() + 1, 1))\n return { kind: \"calendarMonth\", start, end, resetAt: new Date(end) }\n}\n",
|
|
7
|
+
"import type { ModelKind } from \"../../models/definitions\"\nimport type { AiMoney } from \"../ai-cost\"\nimport { AiLimitStorageError } from \"./errors\"\nimport { aiLimitCalendarMonth } from \"./period\"\nimport type {\n AiLimitMeter,\n AiLimitPeriod,\n AiLimitPolicy,\n AiLimitQuantity,\n AiLimitReservationBucket,\n AiLimitSubject,\n AiModelCallReservation,\n AiModelCallReservationIdentity,\n CreateAiLimitPolicyInput,\n ReserveAiModelCallInput,\n UpdateAiLimitPolicyInput,\n} from \"./types\"\n\nconst SIGNED_INT64_MAX = 9_223_372_036_854_775_807n\n\n// These calls are billed per audio second or per search, and their providers report no tokens.\n// Token limits neither admit nor count them; cost limits still do.\nconst TOKENLESS_MODEL_KINDS: ReadonlySet<ModelKind> = new Set([\"transcription\", \"reranking\"])\n\n/** @internal Whether a limit meter governs calls of this kind. Unclassified calls are metered. */\nexport function aiLimitMeterApplies(\n meter: AiLimitMeter,\n modelKind: ModelKind | undefined\n): boolean {\n return (\n meter !== \"tokens.total\" || modelKind === undefined || !TOKENLESS_MODEL_KINDS.has(modelKind)\n )\n}\n\n/** @internal Serialize compound limit operations, including within an existing transaction. */\nexport class AiLimitOperationLock {\n private tail: Promise<void> = Promise.resolve()\n\n /** Wait for already queued operations before the owning transaction commits or rolls back. */\n settle(): Promise<void> {\n return this.tail\n }\n\n async run<T>(operation: () => Promise<T> | T): Promise<T> {\n const previous = this.tail\n let release!: () => void\n this.tail = new Promise<void>((resolve) => {\n release = resolve\n })\n await previous\n try {\n return await operation()\n } finally {\n release()\n }\n }\n}\n\n/** @internal Canonical integer quantity used by storage providers. */\nexport interface NormalizedAiLimitAmount {\n readonly meter: AiLimitQuantity[\"meter\"]\n readonly currency: string\n readonly amount: bigint\n}\n\n/** @internal Minimal immutable accounting facts consumed by limit providers. */\nexport interface AiLimitAccountingEntry {\n readonly projectId: string\n readonly usageRecordId: string\n readonly executionId: string\n readonly attempt: number\n readonly callId: string\n readonly occurredAt: Date\n readonly modelKind?: ModelKind\n readonly totalTokens?: number\n readonly requesterGroupIds: readonly string[]\n readonly requester?:\n | { readonly type: \"user\"; readonly id: string }\n | { readonly type: \"serviceAccount\"; readonly id: string }\n readonly valuation?:\n | { readonly status: \"rated\"; readonly money: AiMoney }\n | { readonly status: \"unavailable\" }\n}\n\nexport interface ResolvedAiLimitActual {\n readonly amount: bigint\n readonly accountingStatus: \"complete\" | \"unavailable\"\n}\n\nexport function normalizeAiLimitSubject(subject: AiLimitSubject): AiLimitSubject {\n if (!subject || typeof subject !== \"object\") {\n throw new TypeError(\"[Sixb] AI limit subject must be an object.\")\n }\n if (subject.type === \"project\") return { type: \"project\" }\n if (subject.type === \"group\" || subject.type === \"user\" || subject.type === \"serviceAccount\") {\n assertNonBlank(subject.id, \"subject id\")\n return { type: subject.type, id: subject.id }\n }\n throw new TypeError(\"[Sixb] AI limit subject type is unsupported.\")\n}\n\nexport function normalizeAiLimitSubjects(\n subjects: readonly AiLimitSubject[]\n): readonly AiLimitSubject[] {\n if (!Array.isArray(subjects)) {\n throw new TypeError(\"[Sixb] AI limit subjects must be an array.\")\n }\n const normalized = [\n normalizeAiLimitSubject({ type: \"project\" }),\n ...subjects.map(normalizeAiLimitSubject),\n ]\n const byKey = new Map(normalized.map((subject) => [aiLimitSubjectKey(subject), subject]))\n return [...byKey.values()].sort((left, right) =>\n aiLimitSubjectKey(left).localeCompare(aiLimitSubjectKey(right))\n )\n}\n\nexport function aiLimitSubjectKey(subject: AiLimitSubject): string {\n return subject.type === \"project\" ? \"project:\" : `${subject.type}:${subject.id}`\n}\n\nexport function aiLimitSubjectParts(subject: AiLimitSubject): {\n readonly type: AiLimitSubject[\"type\"]\n readonly id: string\n} {\n return { type: subject.type, id: subject.type === \"project\" ? \"\" : subject.id }\n}\n\nexport function aiLimitSubjectFromParts(type: AiLimitSubject[\"type\"], id: string): AiLimitSubject {\n return normalizeAiLimitSubject(type === \"project\" ? { type } : { type, id })\n}\n\nexport function normalizeAiLimitQuantity(quantity: AiLimitQuantity): AiLimitQuantity {\n const normalized = normalizeAiLimitAmount(quantity)\n return aiLimitQuantityFromAmount(normalized)\n}\n\nexport function normalizeAiLimitQuantities(\n quantities: readonly AiLimitQuantity[],\n label: string\n): readonly AiLimitQuantity[] {\n if (!Array.isArray(quantities) || quantities.length === 0) {\n throw new TypeError(`[Sixb] AI limit ${label} must contain at least one quantity.`)\n }\n const byKey = new Map<string, AiLimitQuantity>()\n for (const quantity of quantities) {\n const normalized = normalizeAiLimitQuantity(quantity)\n const key = aiLimitAmountKey(normalizeAiLimitAmount(normalized))\n if (byKey.has(key)) {\n throw new TypeError(`[Sixb] AI limit ${label} contains duplicate meter '${key}'.`)\n }\n byKey.set(key, normalized)\n }\n return [...byKey.values()].sort((left, right) =>\n aiLimitAmountKey(normalizeAiLimitAmount(left)).localeCompare(\n aiLimitAmountKey(normalizeAiLimitAmount(right))\n )\n )\n}\n\nexport function normalizeAiLimitAmount(quantity: AiLimitQuantity): NormalizedAiLimitAmount {\n if (!quantity || typeof quantity !== \"object\") {\n throw new TypeError(\"[Sixb] AI limit quantity must be an object.\")\n }\n if (quantity.meter === \"tokens.total\") {\n if (!Number.isSafeInteger(quantity.amount) || quantity.amount < 0) {\n throw new TypeError(\"[Sixb] AI limit token amount must be a non-negative safe integer.\")\n }\n return { meter: quantity.meter, currency: \"\", amount: BigInt(quantity.amount) }\n }\n if (quantity.meter === \"cost.catalogEstimated\") {\n const money = normalizeAiMoney(quantity.amount)\n return { meter: quantity.meter, currency: money.currency, amount: BigInt(money.amountNanos) }\n }\n throw new TypeError(\"[Sixb] AI limit meter is unsupported.\")\n}\n\nexport function aiLimitQuantityFromAmount(amount: NormalizedAiLimitAmount): AiLimitQuantity {\n if (amount.amount < 0n) {\n throw new TypeError(\"[Sixb] AI limit amount cannot be negative.\")\n }\n if (amount.meter === \"tokens.total\") {\n const tokens = Number(amount.amount)\n if (!Number.isSafeInteger(tokens)) {\n throw new RangeError(\"[Sixb] AI limit token amount exceeds JavaScript's safe integer range.\")\n }\n return { meter: amount.meter, amount: tokens }\n }\n if (amount.currency !== \"USD\") {\n throw new TypeError(\"[Sixb] AI limit catalog-estimated cost currency must be 'USD'.\")\n }\n return {\n meter: amount.meter,\n amount: { currency: \"USD\", amountNanos: amount.amount.toString() },\n }\n}\n\nexport function aiLimitAmountKey(\n amount: Pick<NormalizedAiLimitAmount, \"meter\" | \"currency\">\n): string {\n return `${amount.meter}:${amount.currency}`\n}\n\nexport function normalizeCreateAiLimitPolicy(input: CreateAiLimitPolicyInput): AiLimitPolicy {\n assertNonBlank(input.id, \"policy id\")\n assertNonBlank(input.projectId, \"projectId\")\n const createdAt = cloneValidDate(input.createdAt ?? new Date(), \"createdAt\")\n return {\n id: input.id,\n projectId: input.projectId,\n subject: normalizeAiLimitSubject(input.subject),\n limit: normalizeAiLimitQuantity(input.limit),\n period: \"calendarMonth\",\n enabled: input.enabled ?? true,\n createdAt,\n updatedAt: new Date(createdAt),\n }\n}\n\nexport function normalizeUpdateAiLimitPolicy(input: UpdateAiLimitPolicyInput): {\n readonly projectId: string\n readonly id: string\n readonly limit?: AiLimitQuantity\n readonly enabled?: boolean\n readonly updatedAt: Date\n} {\n assertNonBlank(input.projectId, \"projectId\")\n assertNonBlank(input.id, \"policy id\")\n if (input.limit === undefined && input.enabled === undefined) {\n throw new TypeError(\"[Sixb] AI limit policy update must change limit or enabled.\")\n }\n if (input.enabled !== undefined && typeof input.enabled !== \"boolean\") {\n throw new TypeError(\"[Sixb] AI limit enabled must be a boolean.\")\n }\n return {\n projectId: input.projectId,\n id: input.id,\n ...(input.limit === undefined ? {} : { limit: normalizeAiLimitQuantity(input.limit) }),\n ...(input.enabled === undefined ? {} : { enabled: input.enabled }),\n updatedAt: cloneValidDate(input.updatedAt ?? new Date(), \"updatedAt\"),\n }\n}\n\nexport function normalizeReserveAiModelCall(input: ReserveAiModelCallInput): {\n readonly identity: AiModelCallReservationIdentity\n readonly subjects: readonly AiLimitSubject[]\n readonly estimates: readonly AiLimitQuantity[]\n readonly modelKind?: ModelKind\n readonly period: AiLimitPeriod\n readonly reservedAt: Date\n} {\n const identity = normalizeAiModelCallReservationIdentity(input)\n const reservedAt = cloneValidDate(input.reservedAt ?? new Date(), \"reservedAt\")\n return {\n identity,\n subjects: normalizeAiLimitSubjects(input.subjects),\n estimates: normalizeAiLimitQuantities(input.estimates, \"estimates\"),\n ...(input.modelKind === undefined ? {} : { modelKind: input.modelKind }),\n period: aiLimitCalendarMonth(reservedAt),\n reservedAt,\n }\n}\n\nexport function normalizeAiModelCallReservationIdentity(\n input: AiModelCallReservationIdentity\n): AiModelCallReservationIdentity {\n assertNonBlank(input.projectId, \"projectId\")\n assertNonBlank(input.executionId, \"executionId\")\n if (!Number.isSafeInteger(input.attempt) || input.attempt <= 0) {\n throw new TypeError(\"[Sixb] AI limit reservation attempt must be a positive safe integer.\")\n }\n assertNonBlank(input.callId, \"callId\")\n return {\n projectId: input.projectId,\n executionId: input.executionId,\n attempt: input.attempt,\n callId: input.callId,\n }\n}\n\nexport function aiModelCallReservationKey(identity: AiModelCallReservationIdentity): string {\n return JSON.stringify([\n identity.projectId,\n identity.executionId,\n identity.attempt,\n identity.callId,\n ])\n}\n\nexport function aiLimitPolicyDimensionKey(\n policy: Pick<AiLimitPolicy, \"projectId\" | \"subject\" | \"limit\">\n): string {\n const amount = normalizeAiLimitAmount(policy.limit)\n return JSON.stringify([\n policy.projectId,\n aiLimitSubjectKey(policy.subject),\n amount.meter,\n amount.currency,\n ])\n}\n\nexport function aiLimitReservationRequestMatches(\n reservation: AiModelCallReservation,\n request: ReturnType<typeof normalizeReserveAiModelCall>\n): boolean {\n return reservation.requestKey === aiLimitReservationRequestKey(request)\n}\n\nexport function aiLimitReservationRequestKey(\n request: ReturnType<typeof normalizeReserveAiModelCall>\n): string {\n return JSON.stringify([\n request.period.start.toISOString(),\n request.subjects.map(aiLimitSubjectKey),\n request.estimates.map((quantity) => {\n const amount = normalizeAiLimitAmount(quantity)\n return [amount.meter, amount.currency, amount.amount.toString()]\n }),\n // Appended only when present, so keys of reservations made before model kinds stay valid.\n ...(request.modelKind === undefined ? [] : [request.modelKind]),\n ])\n}\n\nexport function aiLimitReservationBuckets(\n policies: readonly AiLimitPolicy[],\n subjects: readonly AiLimitSubject[],\n estimates: readonly AiLimitQuantity[],\n modelKind?: ModelKind\n): readonly AiLimitReservationBucket[] {\n const subjectKeys = new Set(subjects.map(aiLimitSubjectKey))\n const estimatesByDimension = new Map(\n estimates.map((estimate) => {\n const amount = normalizeAiLimitAmount(estimate)\n return [aiLimitAmountKey(amount), estimate] as const\n })\n )\n return policies\n .filter(\n (policy) =>\n subjectKeys.has(aiLimitSubjectKey(policy.subject)) &&\n aiLimitMeterApplies(policy.limit.meter, modelKind)\n )\n .flatMap((policy) => {\n const estimate = estimatesByDimension.get(\n aiLimitAmountKey(normalizeAiLimitAmount(policy.limit))\n )\n return estimate ? [{ subject: policy.subject, estimate }] : []\n })\n .sort((left, right) => {\n const subject = aiLimitSubjectKey(left.subject).localeCompare(\n aiLimitSubjectKey(right.subject)\n )\n if (subject !== 0) return subject\n return aiLimitAmountKey(normalizeAiLimitAmount(left.estimate)).localeCompare(\n aiLimitAmountKey(normalizeAiLimitAmount(right.estimate))\n )\n })\n}\n\nexport function aiLimitAccountingEntryAppliesToSubject(\n entry: AiLimitAccountingEntry,\n subject: AiLimitSubject\n): boolean {\n if (subject.type === \"project\") return true\n if (subject.type === \"group\") return entry.requesterGroupIds.includes(subject.id)\n return entry.requester?.type === subject.type && entry.requester.id === subject.id\n}\n\nexport function aiLimitSubjectsFromAccountingEntry(\n entry: AiLimitAccountingEntry\n): readonly AiLimitSubject[] {\n return normalizeAiLimitSubjects([\n ...entry.requesterGroupIds.map((id) => ({ type: \"group\" as const, id })),\n ...(entry.requester ? [entry.requester] : []),\n ])\n}\n\nexport function resolveAiLimitActual(\n entries: readonly AiLimitAccountingEntry[],\n dimension: Pick<NormalizedAiLimitAmount, \"meter\" | \"currency\">\n): ResolvedAiLimitActual {\n let amount = 0n\n let accountingStatus: ResolvedAiLimitActual[\"accountingStatus\"] = \"complete\"\n for (const entry of entries) {\n if (dimension.meter === \"tokens.total\") {\n if (!aiLimitMeterApplies(dimension.meter, entry.modelKind)) continue\n if (entry.totalTokens === undefined) {\n accountingStatus = \"unavailable\"\n } else {\n amount += BigInt(entry.totalTokens)\n }\n continue\n }\n if (\n entry.valuation?.status !== \"rated\" ||\n entry.valuation.money.currency !== dimension.currency\n ) {\n accountingStatus = \"unavailable\"\n continue\n }\n amount += BigInt(entry.valuation.money.amountNanos)\n }\n return { amount, accountingStatus }\n}\n\nexport function assertAiLimitAccountingMatchesReservation(\n reservation: AiModelCallReservation,\n entry: AiLimitAccountingEntry\n): void {\n if (\n entry.projectId !== reservation.projectId ||\n entry.executionId !== reservation.executionId ||\n entry.attempt !== reservation.attempt ||\n entry.callId !== reservation.callId\n ) {\n throw new AiLimitStorageError(\n \"usage_mismatch\",\n `[Sixb] AI usage record '${entry.usageRecordId}' does not belong to reservation '${reservation.callId}'.`\n )\n }\n}\n\nexport function cloneAiLimitPolicy(policy: AiLimitPolicy): AiLimitPolicy {\n return structuredClone(policy)\n}\n\nfunction normalizeAiMoney(money: AiMoney): AiMoney & { readonly currency: \"USD\" } {\n if (!money || typeof money !== \"object\") {\n throw new TypeError(\"[Sixb] AI limit cost amount must be AiMoney.\")\n }\n assertNonBlank(money.currency, \"cost currency\")\n if (money.currency !== \"USD\") {\n throw new TypeError(\"[Sixb] AI limit catalog-estimated cost currency must be 'USD'.\")\n }\n if (!/^(0|[1-9][0-9]*)$/.test(money.amountNanos)) {\n throw new TypeError(\n \"[Sixb] AI limit cost amountNanos must be a canonical non-negative integer string.\"\n )\n }\n if (BigInt(money.amountNanos) > SIGNED_INT64_MAX) {\n throw new RangeError(\"[Sixb] AI limit cost amountNanos exceeds the supported range.\")\n }\n return { currency: \"USD\", amountNanos: money.amountNanos }\n}\n\nexport function assertNonBlank(value: string, label: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI limit ${label} must be nonblank.`)\n }\n}\n\nexport function cloneValidDate(value: Date, label: string): Date {\n if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {\n throw new TypeError(`[Sixb] AI limit ${label} must be a valid Date.`)\n }\n return new Date(value)\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "DE130C8A66C4C32664756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|