@sixb/core 0.1.16 → 0.1.17
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 +25 -25
- package/dist/actions/types/context.d.ts +2 -2
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/worker.js +1 -1
- package/dist/agents/index.js +41 -40
- package/dist/agents/index.js.map +1 -1
- package/dist/auth/index.js +5 -5
- package/dist/authorization/index.js +2 -2
- 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/index.js +5 -3
- package/dist/blob-storage/index.js.map +1 -1
- package/dist/blob-storage/internal.d.ts +2 -0
- package/dist/blob-storage/internal.d.ts.map +1 -0
- package/dist/blob-storage/internal.js +11 -0
- package/dist/blob-storage/internal.js.map +9 -0
- package/dist/bootstrap/index.js +45 -44
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/{chunk-8x74221e.js → chunk-10styjgk.js} +18 -13
- package/dist/{chunk-8x74221e.js.map → chunk-10styjgk.js.map} +3 -3
- package/dist/{chunk-hgqpcmyr.js → chunk-1hqwggsn.js} +47 -19
- package/dist/chunk-1hqwggsn.js.map +12 -0
- package/dist/{chunk-zb47r1c8.js → chunk-23xs4qp9.js} +2 -2
- package/dist/{chunk-gmdvns8f.js → chunk-2am3db31.js} +2 -2
- package/dist/{chunk-fj1dvp37.js → chunk-2vhg6ysa.js} +1 -1
- package/dist/{chunk-dp7yk20b.js → chunk-33saed7g.js} +1 -1
- package/dist/{chunk-mdnw7nj8.js → chunk-3rrezgyc.js} +33 -8
- package/dist/chunk-3rrezgyc.js.map +15 -0
- package/dist/{chunk-jgwb25gc.js → chunk-4as3wt1c.js} +13 -5
- package/dist/chunk-4as3wt1c.js.map +12 -0
- package/dist/chunk-4ra628t7.js +88 -0
- package/dist/chunk-4ra628t7.js.map +10 -0
- package/dist/{chunk-chdg6eqq.js → chunk-52c5zb0z.js} +2 -2
- package/dist/{chunk-69kt9q43.js → chunk-5be2ath4.js} +1 -1
- package/dist/{chunk-qnd7ehe5.js → chunk-5thzcb8g.js} +2 -2
- package/dist/{chunk-6z1q7j19.js → chunk-5yd8cchh.js} +1126 -780
- package/dist/chunk-5yd8cchh.js.map +66 -0
- package/dist/{chunk-3q7z9hd4.js → chunk-6wbm6ymz.js} +234 -40
- package/dist/{chunk-3q7z9hd4.js.map → chunk-6wbm6ymz.js.map} +8 -6
- package/dist/{chunk-kvysp909.js → chunk-7ecp4v7a.js} +26 -19
- package/dist/chunk-7ecp4v7a.js.map +17 -0
- 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-dsv8kdgk.js → chunk-9g6jz9kk.js} +5 -5
- package/dist/{chunk-39tqv9hz.js → chunk-9se093qz.js} +5 -6
- package/dist/{chunk-39tqv9hz.js.map → chunk-9se093qz.js.map} +3 -4
- package/dist/{chunk-7g2gjvah.js → chunk-a7er86jd.js} +1 -1
- package/dist/{chunk-zdkcdshk.js → chunk-aq39q04r.js} +41 -3
- package/dist/{chunk-zdkcdshk.js.map → chunk-aq39q04r.js.map} +4 -3
- package/dist/chunk-b9affek3.js +261 -0
- package/dist/chunk-b9affek3.js.map +12 -0
- package/dist/{chunk-b9y8hcm2.js → chunk-c2rga5cx.js} +1 -1
- package/dist/{chunk-f72rbvsb.js → chunk-cnb5kv05.js} +2 -2
- package/dist/chunk-d62kjtbg.js.map +2 -2
- package/dist/{chunk-vjqt7q3a.js → chunk-dam456ve.js} +233 -34
- package/dist/{chunk-vjqt7q3a.js.map → chunk-dam456ve.js.map} +7 -5
- package/dist/{chunk-sbcm1b92.js → chunk-e67ynxcr.js} +3 -3
- 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-cq44v1a6.js → chunk-f1xh7a32.js} +3 -3
- package/dist/{chunk-h4138ww2.js → chunk-fggq3d9k.js} +450 -799
- package/dist/chunk-fggq3d9k.js.map +49 -0
- package/dist/{chunk-kttr5ftm.js → chunk-gf7yht60.js} +3 -3
- package/dist/chunk-h8teetr0.js +9 -0
- package/dist/chunk-h8teetr0.js.map +10 -0
- package/dist/chunk-hn2r7z41.js.map +1 -1
- package/dist/{chunk-nj0020ay.js → chunk-jjrn5v0p.js} +1 -1
- package/dist/{chunk-nvymebc1.js → chunk-jnfxmr3f.js} +1 -1
- package/dist/{chunk-nkbev3tr.js → chunk-k4g51s47.js} +3 -3
- package/dist/{chunk-a0073121.js → chunk-kpx7jrmn.js} +3 -1
- package/dist/chunk-kpx7jrmn.js.map +12 -0
- package/dist/{chunk-h044jb97.js → chunk-pja9jfz6.js} +172 -10
- package/dist/chunk-pja9jfz6.js.map +19 -0
- package/dist/chunk-pqajwytd.js.map +1 -1
- 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-s3csryxe.js → chunk-rj69qcrd.js} +8 -2
- package/dist/chunk-rj69qcrd.js.map +11 -0
- package/dist/{chunk-swxzncrv.js → chunk-rpxz486p.js} +32 -5
- package/dist/{chunk-swxzncrv.js.map → chunk-rpxz486p.js.map} +4 -4
- package/dist/{chunk-tkdbge6v.js → chunk-rx7h5fdx.js} +1 -1
- package/dist/{chunk-tnvafr7g.js → chunk-s7ftxrdr.js} +105 -7
- package/dist/chunk-s7ftxrdr.js.map +22 -0
- package/dist/{chunk-h866d223.js → chunk-sk0hcjsz.js} +1 -1
- package/dist/{chunk-2xvgy3x5.js → chunk-svabwqdq.js} +2 -2
- package/dist/{chunk-667x4drs.js → chunk-t9shqx3w.js} +2 -2
- package/dist/{chunk-40qb8wpe.js → chunk-tjjgy3z4.js} +26 -23
- package/dist/{chunk-40qb8wpe.js.map → chunk-tjjgy3z4.js.map} +3 -3
- package/dist/{chunk-gkxsenvp.js → chunk-vp3z1ckh.js} +31 -7
- package/dist/{chunk-gkxsenvp.js.map → chunk-vp3z1ckh.js.map} +5 -4
- package/dist/{chunk-cxj8y8t0.js → chunk-vre348sb.js} +2 -2
- package/dist/{chunk-vsvrv7n8.js → chunk-w9yycd3t.js} +1 -1
- package/dist/{chunk-g4rbm4a6.js → chunk-wt4szfec.js} +379 -331
- package/dist/chunk-wt4szfec.js.map +14 -0
- package/dist/{chunk-a7ne02hk.js → chunk-xcy5ddha.js} +6 -6
- package/dist/{chunk-zvmr2hqk.js → chunk-xyvy73tj.js} +4 -3
- package/dist/{chunk-zvmr2hqk.js.map → chunk-xyvy73tj.js.map} +3 -3
- package/dist/datasets/write.js +1 -1
- package/dist/execution/agent.js +38 -37
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +3 -1
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/primitive.js +36 -35
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.js +37 -36
- package/dist/execution/request.js.map +2 -2
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +62 -59
- 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 +2 -2
- 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 +31 -32
- 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 +23 -1
- 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/index.js +22 -22
- 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.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/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/index.js +25 -25
- package/dist/objects/query/executor.d.ts +2 -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 +22 -22
- 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.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.map +1 -1
- package/dist/ontology/index.d.ts +1 -1
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +3 -3
- package/dist/ontology/internal.js +2 -2
- package/dist/ontology/query-capabilities.d.ts +1 -0
- package/dist/ontology/query-capabilities.d.ts.map +1 -1
- package/dist/ontology/types.d.ts +20 -0
- package/dist/ontology/types.d.ts.map +1 -1
- package/dist/ontology/validation/query.d.ts.map +1 -1
- package/dist/pipelines/index.js +23 -23
- package/dist/projections/internal.js +22 -22
- 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/host.d.ts +1 -0
- 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 +28 -26
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/public-origin.d.ts +10 -0
- package/dist/runtime/public-origin.d.ts.map +1 -0
- package/dist/runtime/sixb.d.ts +1 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +12 -2
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandboxes/index.js +5 -5
- package/dist/shares/internal.js +19 -19
- package/dist/storage/agents/provider.js +2 -2
- 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 +6 -6
- 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 +5 -3
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +30 -30
- 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 +8 -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 +2 -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 +6 -6
- package/dist/syncs/index.js +24 -24
- 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 +2549 -1490
- 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 +20 -20
- 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/index.js +42 -41
- package/dist/workflows/index.js.map +1 -1
- package/package.json +7 -1
- package/src/actions/types/context.ts +5 -2
- package/src/blob-storage/download-urls.ts +138 -0
- package/src/blob-storage/execution.ts +32 -1
- package/src/blob-storage/internal.ts +1 -0
- package/src/execution/authorized-object-reader.ts +8 -1
- package/src/index.ts +25 -0
- 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 +52 -5
- package/src/models/definitions.ts +8 -1
- package/src/models/events.ts +3 -0
- package/src/models/execution/README.md +20 -1
- 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 +1 -0
- package/src/models/execution/model-call-recovery.ts +1 -0
- package/src/models/execution/reranking.ts +137 -0
- package/src/models/execution/usage.ts +1 -0
- package/src/models/execution.ts +5 -1
- package/src/models/generation-types.ts +2 -0
- package/src/models/index.ts +32 -0
- package/src/models/pricing.ts +2 -1
- package/src/models/reranking-model.ts +114 -0
- package/src/objects/query/executor.ts +42 -2
- 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 +33 -1
- 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 +1 -0
- package/src/ontology/index.ts +2 -0
- package/src/ontology/query-capabilities.ts +1 -1
- package/src/ontology/types.ts +21 -0
- package/src/ontology/validation/query.ts +57 -0
- package/src/query.ts +4 -0
- package/src/queues/in-memory.ts +54 -19
- package/src/queues/types.ts +4 -0
- package/src/runtime/host.ts +28 -1
- package/src/runtime/index.ts +1 -0
- package/src/runtime/internal.ts +1 -0
- package/src/runtime/public-origin.ts +33 -0
- package/src/runtime/sixb.ts +13 -2
- package/src/runtime/types.ts +12 -2
- 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 +31 -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 +2 -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/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-a0073121.js.map +0 -12
- package/dist/chunk-g4rbm4a6.js.map +0 -15
- package/dist/chunk-h044jb97.js.map +0 -15
- 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-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-xnx96gfy.js.map +0 -15
- 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-zb47r1c8.js.map → chunk-23xs4qp9.js.map} +0 -0
- /package/dist/{chunk-gmdvns8f.js.map → chunk-2am3db31.js.map} +0 -0
- /package/dist/{chunk-fj1dvp37.js.map → chunk-2vhg6ysa.js.map} +0 -0
- /package/dist/{chunk-dp7yk20b.js.map → chunk-33saed7g.js.map} +0 -0
- /package/dist/{chunk-chdg6eqq.js.map → chunk-52c5zb0z.js.map} +0 -0
- /package/dist/{chunk-69kt9q43.js.map → chunk-5be2ath4.js.map} +0 -0
- /package/dist/{chunk-qnd7ehe5.js.map → chunk-5thzcb8g.js.map} +0 -0
- /package/dist/{chunk-dsv8kdgk.js.map → chunk-9g6jz9kk.js.map} +0 -0
- /package/dist/{chunk-7g2gjvah.js.map → chunk-a7er86jd.js.map} +0 -0
- /package/dist/{chunk-b9y8hcm2.js.map → chunk-c2rga5cx.js.map} +0 -0
- /package/dist/{chunk-f72rbvsb.js.map → chunk-cnb5kv05.js.map} +0 -0
- /package/dist/{chunk-sbcm1b92.js.map → chunk-e67ynxcr.js.map} +0 -0
- /package/dist/{chunk-cq44v1a6.js.map → chunk-f1xh7a32.js.map} +0 -0
- /package/dist/{chunk-kttr5ftm.js.map → chunk-gf7yht60.js.map} +0 -0
- /package/dist/{chunk-nj0020ay.js.map → chunk-jjrn5v0p.js.map} +0 -0
- /package/dist/{chunk-nvymebc1.js.map → chunk-jnfxmr3f.js.map} +0 -0
- /package/dist/{chunk-nkbev3tr.js.map → chunk-k4g51s47.js.map} +0 -0
- /package/dist/{chunk-tkdbge6v.js.map → chunk-rx7h5fdx.js.map} +0 -0
- /package/dist/{chunk-h866d223.js.map → chunk-sk0hcjsz.js.map} +0 -0
- /package/dist/{chunk-2xvgy3x5.js.map → chunk-svabwqdq.js.map} +0 -0
- /package/dist/{chunk-667x4drs.js.map → chunk-t9shqx3w.js.map} +0 -0
- /package/dist/{chunk-cxj8y8t0.js.map → chunk-vre348sb.js.map} +0 -0
- /package/dist/{chunk-vsvrv7n8.js.map → chunk-w9yycd3t.js.map} +0 -0
- /package/dist/{chunk-a7ne02hk.js.map → chunk-xcy5ddha.js.map} +0 -0
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/models/catalog-index.ts", "../src/models/decision/validation.ts", "../src/models/decision/catalog.ts", "../src/models/definitions.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 { 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",
|
|
6
|
-
"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",
|
|
7
|
-
"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",
|
|
8
|
-
"import {\n MODEL_REASONING_EFFORTS,\n type ModelCapabilities,\n type ModelReasoningBudgetCapabilities,\n type ModelReasoningCapabilities,\n} from \"./language-model\"\n\nexport type ModelKind = \"language\" | \"image\" | \"video\" | \"embedding\" | \"decision\"\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",
|
|
9
|
-
"import { RuntimeError } from \"../runtime/errors\"\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 type { LanguageModel } from \"./language-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\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 language?: LanguageModelCatalog\n readonly decision?: DecisionModelCatalog\n readonly embedding: EmbeddingModelCatalog\n}\n\nexport interface ModelCatalogInput {\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}\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\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\n if (!language && !decision && embedding.list().length === 0) {\n throw new RuntimeError(\"[Sixb] Configure at least one language, embedding or decision model.\")\n }\n\n return Object.freeze({ language, embedding, decision })\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\", assertLanguageModel)\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\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",
|
|
10
|
-
"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",
|
|
11
|
-
"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",
|
|
12
|
-
"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",
|
|
13
|
-
"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?: ModelCostEstimator },\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 | \"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",
|
|
14
|
-
"/** 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"
|
|
15
|
-
],
|
|
16
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAaO,SAAS,kBAA+C,CAC7D,QACA,MACA,UACA;AAAA,EACA,MAAM,QAAQ,IAAI;AAAA,EAElB,YAAY,OAAO,UAAU,OAAO,QAAQ,GAAG;AAAA,IAC7C,SAAS,OAAO,KAAK;AAAA,IACrB,MAAM,MAAM,KAAK,UAAU,CAAC,MAAM,YAAY,MAAM,OAAO,CAAC;AAAA,IAC5D,IAAI,MAAM,IAAI,GAAG,GAAG;AAAA,MAClB,MAAM,IAAI,cACR,oBAAoB,eAAe,MAAM,cAAc,MAAM,uBAAuB,gEACtF;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,KAAK,OAAO,OAAO,EAAE,UAAU,MAAM,YAAY,SAAS,MAAM,SAAS,MAAM,CAAC,CAAC;AAAA,EAC7F;AAAA,EAEA,MAAM,UAAU,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,EACjD,OAAO,OAAO,OAAO;AAAA,IACnB,MAAM,MAAM;AAAA,IACZ,UAAU,CAAC,QAAkB,MAAM,IAAI,KAAK,UAAU,CAAC,IAAI,UAAU,IAAI,OAAO,CAAC,CAAC,KAAK;AAAA,EACzF,CAAC;AAAA;;;ACpBH,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AAElB,SAAS,qBAAqB,CACnC,OACA,MACkC;AAAA,EAClC,iBAAgB,OAAO,IAAI;AAAA,EAC3B,IAAI,UAAU,QAAS,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW;AAAA,IAC9E,MAAM,IAAI,UAAU,gBAAgB,+CAA+C;AAAA,EACrF;AAAA;AAGK,SAAS,uBAAuB,CAAC,OAAoD;AAAA,EAC1F,iBAAgB,OAAO,WAAW;AAAA,EAClC,MAAM,YAAY,WAAW,OAAO,WAAW;AAAA,EAC/C,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,QAAQ;AAAA,IAClC,KAAK,6BAA6B;AAAA,EACpC;AAAA,EAEA,YAAY,KAAK,aAAa,OAAO,QAAQ,SAAS,GAAG;AAAA,IACvD,IAAI,CAAC,IAAI,KAAK,GAAG;AAAA,MACf,KAAK,kCAAkC;AAAA,IACzC;AAAA,IACA,eAAe,UAAU,aAAa,KAAK;AAAA,EAC7C;AAAA;AAGF,SAAS,cAAc,CAAC,OAAgB,MAAoB;AAAA,EAC1D,MAAM,WAAW,WAAW,OAAO,IAAI;AAAA,EACvC,sBAAsB,SAAS,cAAc,GAAG,mBAAmB;AAAA,EACnE,IAAI,OAAO,SAAS,iBAAiB,YAAY,CAAC,SAAS,aAAa,KAAK,GAAG;AAAA,IAC9E,KAAK,GAAG,qCAAqC;AAAA,EAC/C;AAAA,EAEA,QAAQ,SAAS;AAAA,SACV;AAAA,MACH,eAAe,UAAU,CAAC,QAAQ,gBAAgB,SAAS,GAAG,IAAI;AAAA,MAClE,oBAAoB,SAAS,SAAS,GAAG,cAAc;AAAA,MACvD;AAAA,SACG;AAAA,MACH,eAAe,UAAU,CAAC,QAAQ,gBAAgB,QAAQ,GAAG,IAAI;AAAA,MACjE,kBAAkB,SAAS,QAAQ,GAAG,aAAa;AAAA,MACnD;AAAA,SACG;AAAA,MACH,eAAe,UAAU,CAAC,QAAQ,cAAc,GAAG,IAAI;AAAA,MACvD;AAAA;AAAA,MAEA,KAAK,GAAG,iDAAiD;AAAA;AAAA;AAI/D,SAAS,mBAAmB,CAAC,OAAgB,MAAoB;AAAA,EAC/D,MAAM,UAAU,WAAW,OAAO,IAAI;AAAA,EACtC,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,QAAQ;AAAA,IAChC,KAAK,GAAG,wBAAwB;AAAA,EAClC;AAAA,EAEA,YAAY,QAAQ,gBAAgB,OAAO,QAAQ,OAAO,GAAG;AAAA,IAC3D,IAAI,CAAC,OAAO,KAAK,GAAG;AAAA,MAClB,KAAK,GAAG,8BAA8B;AAAA,IACxC;AAAA,IACA,IAAI,gBAAgB,MAAM;AAAA,MACxB,sBAAsB,aAAa,GAAG,QAAQ,QAAQ;AAAA,IACxD;AAAA,EACF;AAAA;AAGF,SAAS,iBAAiB,CAAC,OAAgB,MAAoB;AAAA,EAC7D,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,IAC7C,KAAK,GAAG,gCAAgC;AAAA,EAC1C;AAAA,EAEA,WAAW,SAAS,OAAO;AAAA,IACzB,sBAAsB,OAAO,IAAI;AAAA,EACnC;AAAA;AAGK,SAAS,mBAAmB,CAAC,OAA4B;AAAA,EAC9D,MAAM,aAAa,OAAO;AAAA,EAC1B,IACE,CAAC,SACD,OAAO,MAAM,aAAa,cAC1B,CAAC,UAAU,MAAM,UAAU,KAC3B,CAAC,UAAU,MAAM,OAAO,KACxB,YAAY,SAAS,cACrB,WAAW,eAAe,MAAM,cAChC,WAAW,YAAY,MAAM,SAC7B;AAAA,IACA,KAAK,gEAAgE;AAAA,EACvE;AAAA,EAEA,MAAM,eAAe,WAAW;AAAA,EAChC,IACE,CAAC,gBACD,CAAC,MAAM,QAAQ,aAAa,SAAS,KACrC,CAAC,aAAa,UAAU,UACxB,aAAa,UAAU,KAAK,CAAC,SAAS,CAAC,CAAC,UAAU,SAAS,aAAa,EAAE,SAAS,IAAI,CAAC,KACxF,IAAI,IAAI,aAAa,SAAS,EAAE,SAAS,aAAa,UAAU,QAChE;AAAA,IACA,KAAK,yEAAyE;AAAA,EAChF;AAAA,EAEA,sBAAsB,aAAa,YAAY,cAAc,CAAC;AAAA,EAC9D,sBAAsB,aAAa,gBAAgB,kBAAkB,CAAC;AAAA,EACtE,MAAM,WAAW,aAAa;AAAA,EAC9B,IACE,aAAa,cACZ,CAAC,OAAO,cAAc,QAAQ,KAAK,WAAW,KAAK,WAAW,KAC/D;AAAA,IACA,KAAK,2DAAsD;AAAA,EAC7D;AAAA;AAGF,SAAS,qBAAqB,CAAC,OAA2B,MAAc,SAAuB;AAAA,EAC7F,IAAI,UAAU,cAAc,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,UAAU;AAAA,IAC5E,KAAK,gCAAgC,OAAO;AAAA,EAC9C;AAAA;AAGK,SAAS,qBAAqB,CAAC,OAAsB,WAAoC;AAAA,EAC9F,YAAY,KAAK,aAAa,OAAO,QAAQ,SAAS,GAAG;AAAA,IACvD,IAAI,CAAC,iBAAiB,MAAM,WAAW,cAAc,QAAQ,GAAG;AAAA,MAC9D,MAAM,IAAI,8BACR,uBAAuB,MAAM,cAAc,MAAM,uCAAuC,MAC1F;AAAA,IACF;AAAA,EACF;AAAA;AAGF,SAAS,gBAAgB,CAAC,cAAoC,UAAqC;AAAA,EACjG,IAAI,CAAC,aAAa,UAAU,SAAS,SAAS,IAAI;AAAA,IAAG,OAAO;AAAA,EAE5D,QAAQ,SAAS;AAAA,SACV;AAAA,MACH,OAAO,OAAO,KAAK,SAAS,OAAO,EAAE,WAAW,aAAa,cAAc;AAAA,SACxE;AAAA,MACH,OAAO,SAAS,OAAO,WAAW,aAAa,kBAAkB;AAAA,SAC9D;AAAA,MACH,OAAO;AAAA;AAAA;AAIN,SAAS,uBAA0D,CACxE,WACA,OACA,qBACoB;AAAA,EACpB,iBAAgB,OAAO,iBAAiB;AAAA,EACxC,MAAM,UAAU,WAAW,OAAO,iBAAiB;AAAA,EACnD,gBAAgB,SAAS,OAAO,KAAK,SAAS,GAAG,iBAAiB;AAAA,EAElE,MAAM,gBAAgB,wBAAwB,YAAY,IAAI,MAAM,MAAM,CAAC;AAAA,EAC3E,YAAY,KAAK,aAAa,OAAO,QAAQ,SAAS,GAAG;AAAA,IACvD,aAAa,UAAU,QAAQ,MAAM,UAAU,OAAO,aAAa;AAAA,EACrE;AAAA,EAGA,OAAO,gBAAe,KAAK;AAAA;AAG7B,SAAS,YAAY,CACnB,UACA,OACA,MACA,eACM;AAAA,EACN,MAAM,SAAS,WAAW,OAAO,IAAI;AAAA,EACrC,IAAI,SAAS,SAAS,eAAe;AAAA,IACnC,gBAAgB,QAAQ,CAAC,aAAa,GAAG,IAAI;AAAA,IAC7C,gBAAgB,OAAO,aAAa,IAAI;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,eAAe,QAAQ,CAAC,SAAS,MAAM,iBAAiB,YAAY,GAAG,IAAI;AAAA,EAC3E,IAAI,OAAO,eAAe,WAAW;AAAA,IACnC,gBAAgB,OAAO,YAAY,GAAG,iBAAiB;AAAA,EACzD;AAAA,EAEA,MAAM,eACJ,SAAS,SAAS,WACd,qBAAqB,UAAU,QAAQ,IAAI,IAC3C,oBAAoB,UAAU,QAAQ,MAAM,aAAa;AAAA,EAE/D,MAAM,QAAQ,aAAa,OAAO,CAAC,KAAK,gBAAgB,MAAM,aAAa,CAAC;AAAA,EAC5E,MAAM,YAAY,KAAK,IAAI,wBAAwB,aAAa,SAAS,aAAa;AAAA,EACtF,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,YAAY,OAAO,UAAU,aAAa,QAAQ;AAAA,IAC1E,KAAK,GAAG,oCAAoC;AAAA,EAC9C;AAAA;AAGF,SAAS,oBAAoB,CAC3B,UACA,QACA,MACU;AAAA,EACV,MAAM,gBAAgB,WAAW,OAAO,eAAe,GAAG,oBAAoB;AAAA,EAC9E,gBAAgB,eAAe,OAAO,KAAK,SAAS,OAAO,GAAG,GAAG,oBAAoB;AAAA,EACrF,MAAM,eAAe,OAAO,OAAO,aAAa,EAAE,IAAI,CAAC,UAAU,gBAAgB,OAAO,IAAI,CAAC;AAAA,EAE7F,IAAI,OAAO,OAAO,WAAW,YAAY,CAAC,OAAO,OAAO,SAAS,SAAS,OAAO,MAAM,GAAG;AAAA,IACxF,KAAK,GAAG,sCAAsC;AAAA,EAChD;AAAA,EAEA,MAAM,SAAS,gBAAgB,cAAc,OAAO,SAAS,IAAI;AAAA,EACjE,IAAI,SAAS,mBAAmB,KAAK,IAAI,GAAG,YAAY,GAAG;AAAA,IACzD,KAAK,GAAG,iDAAiD;AAAA,EAC3D;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,mBAAmB,CAC1B,UACA,QACA,MACA,eACU;AAAA,EACV,IACE,CAAC,MAAM,QAAQ,OAAO,aAAa,KACnC,OAAO,cAAc,WAAW,SAAS,OAAO,QAChD;AAAA,IACA,KAAK,GAAG,gDAAgD;AAAA,EAC1D;AAAA,EAEA,MAAM,eAAe,OAAO,cAAc,IAAI,CAAC,UAAU,gBAAgB,OAAO,IAAI,CAAC;AAAA,EACrF,MAAM,WAAW,aAAa,OAAO,CAAC,KAAK,aAAa,UAAU,MAAM,cAAc,OAAO,CAAC;AAAA,EAC9F,MAAM,SAAS,SAAS,OAAO;AAAA,EAC/B,OAAO,SAAS,WAAW,gBACvB,mBAAmB,cAAc,eAAe,IAAI,IACpD,CAAC,UAAU,QAAQ;AAAA,EACvB,MAAM,YAAY,iBAAiB,yBAAyB;AAAA,EAC5D,IACE,OAAO,OAAO,UAAU,YACxB,CAAC,OAAO,SAAS,OAAO,KAAK,KAC7B,OAAO,QAAQ,KACf,OAAO,QAAQ,SAAS,OAAO,SAAS,KACxC,OAAO,QAAQ,UAAU,YAAY,OAAO,UAAU,UAAU,KAChE,OAAO,QAAQ,UAAU,YAAY,OAAO,UAAU,UAAU,GAChE;AAAA,IACA,KAAK,GAAG,kDAAkD;AAAA,EAC5D;AAAA,EAEA,OAAO;AAAA;AAIT,SAAS,kBAAkB,CACzB,cACA,eACA,MAC2B;AAAA,EAC3B,MAAM,QAAQ,aAAa,IAAI,CAAC,UAAU,KAAK,IAAI,GAAG,QAAQ,aAAa,CAAC;AAAA,EAC5E,MAAM,QAAQ,aAAa,IAAI,CAAC,UAAU,KAAK,IAAI,GAAG,QAAQ,aAAa,CAAC;AAAA,EAC5E,MAAM,YAAY,IAAI,MAAM,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,EACjE,MAAM,UAAU,OAAO,UAAU,aAAa;AAAA,EAC9C,IAAI,YAAY,CAAC,WAAW,MAAM,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,IAAI,SAAS;AAAA,IACtF,KAAK,GAAG,oCAAoC;AAAA,EAC9C;AAAA,EAEA,MAAM,OAAO,MAAM,OAAO,CAAC,KAAK,OAAO,UAAU,MAAM,QAAQ,OAAO,CAAC;AAAA,EACvE,SAAS,OAAO,CAAC,cAA+B;AAAA,IAC9C,IAAI,OAAO,KAAK,IAAI,GAAG,SAAS;AAAA,IAChC,IAAI,OAAO;AAAA,IAGX,SAAS,SAAS,EAAG,SAAS,aAAa,UAAU,OAAO,GAAG,UAAU;AAAA,MACvE,MAAM,QAAQ,eAAe,aAAa,SAAS,IAAI,SAAS;AAAA,MAChE,MAAM,QAAQ,KAAK,IAAI,MAAM,MAAM,SAAU,MAAM,MAAO;AAAA,MAC1D,QAAQ,QAAQ;AAAA,MAChB,QAAQ;AAAA,IACV;AAAA,IACA,OAAO;AAAA;AAAA,EAET,OAAO,CAAC,QAAQ,KAAK,GAAG,QAAQ,IAAI,CAAC;AAAA;AAGvC,SAAS,eAAe,CAAC,OAAgB,MAAsB;AAAA,EAC7D,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,KAAK,QAAQ,GAAG;AAAA,IAClF,KAAK,GAAG,sDAAsD;AAAA,EAChE;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,UAAU,CAAC,OAAgB,MAAuC;AAAA,EACzE,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAAA,IACvE,KAAK,GAAG,wBAAwB;AAAA,EAClC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,cAAc,CACrB,OACA,MACA,MACM;AAAA,EACN,IAAI,OAAO,KAAK,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG;AAAA,IACzD,KAAK,GAAG,gCAAgC;AAAA,EAC1C;AAAA;AAGF,SAAS,eAAe,CACtB,OACA,MACA,MACM;AAAA,EACN,eAAe,OAAO,MAAM,IAAI;AAAA,EAChC,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,OAAO,OAAO,OAAO,GAAG,CAAC,GAAG;AAAA,IAClD,KAAK,GAAG,mCAAmC;AAAA,EAC7C;AAAA;AAGF,SAAS,SAAS,CAAC,OAAiC;AAAA,EAClD,OAAO,OAAO,UAAU,YAAY,CAAC,CAAC,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM;AAAA;AAGzE,SAAS,IAAI,CAAC,QAAuB;AAAA,EACnC,MAAM,IAAI,UAAU,gBAAgB,SAAS;AAAA;;;AC7TxC,SAAS,qBAAqB,CACnC,QACkC;AAAA,EAClC,IAAI,WAAW;AAAA,IAAW;AAAA,EAC1B,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,IAC1B,MAAM,IAAI,cAAa,qEAAqE;AAAA,EAC9F;AAAA,EAEA,MAAM,QAAQ,mBAAmB,QAAQ,YAAY,mBAAmB;AAAA,EACxE,OAAO,gBAAgB,MAAM,KAAK;AAAA,EAClC,IAAI,CAAC,cAAc;AAAA,IACjB,MAAM,IAAI,cAAa,qEAAqE;AAAA,EAC9F;AAAA,EAEA,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,aAAa,CAAC;AAAA;;;ACMnD,SAAS,oBAAmB,CAAC,YAA8D;AAAA,EAChG,IAAI,WAAW,SAAS,YAAY;AAAA,IAClC,MAAM,IAAI,UAAU,6DAA6D;AAAA,EACnF;AAAA,EACA,cAAc,WAAW,YAAY,YAAY;AAAA,EACjD,cAAc,WAAW,SAAS,SAAS;AAAA,EAC3C,qBAAqB,WAAW,MAAM,MAAM;AAAA,EAC5C,qBAAqB,WAAW,aAAa,aAAa;AAAA,EAC1D,qBAAqB,WAAW,KAAK,KAAK;AAAA,EAC1C,IAAI,WAAW,QAAQ,aAAa,CAAC,WAAW,IAAI,KAAK;AAAA,IACvD,MAAM,IAAI,UAAU,qCAAqC;AAAA,EAC3D,MAAM,YAAY,WAAW;AAAA,EAC7B,IAAI,cAAc,WAAW;AAAA,IAC3B,aAAa,WAAW,WAAW;AAAA,IACnC,YAAY,OAAO,UAAU,OAAO,QAAQ,EAAE,IAAI,UAAU,IAAI,MAAM,UAAU,KAAK,CAAC,GAAG;AAAA,MACvF,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,KAAK,UAAU,MAAM,KAAK;AAAA,QACrE,MAAM,IAAI,UAAU,0BAA0B,0CAA0C;AAAA,IAC5F;AAAA,EACF;AAAA,EACA,qBAAqB,WAAW,QAAQ,QAAQ;AAAA,EAChD,qBAAqB,WAAW,aAAa,aAAa;AAAA,EAC1D,qBAAqB,WAAW,iBAAiB,iBAAiB;AAAA,EAClE,MAAM,OAAO,cAAc,WAAW,MAAM,MAAM;AAAA,EAClD,MAAM,eAAe,wBAAwB,WAAW,YAAY;AAAA,EACpE,8BAA8B,WAAW,eAAe,eAAe;AAAA,EACvE,8BAA8B,WAAW,gBAAgB,gBAAgB;AAAA,EACzE,8BAA8B,WAAW,iBAAiB,iBAAiB;AAAA,EAC3E,OAAO,OAAO,OAAO;AAAA,IACnB,MAAM;AAAA,IACN,YAAY,WAAW;AAAA,IACvB,SAAS,WAAW;AAAA,OAChB,WAAW,SAAS,YAAY,CAAC,IAAI,EAAE,MAAM,WAAW,KAAK;AAAA,OAC7D,WAAW,gBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,WAAW,YAAY;AAAA,OAClF,cAAc,YACd,CAAC,IACD,EAAE,WAAW,OAAO,OAAO,EAAE,IAAI,UAAU,IAAI,MAAM,UAAU,KAAK,CAAC,EAAE;AAAA,OACvE,WAAW,QAAQ,YAAY,CAAC,IAAI,EAAE,KAAK,WAAW,IAAI;AAAA,OAC1D,WAAW,WAAW,YAAY,CAAC,IAAI,EAAE,QAAQ,WAAW,OAAO;AAAA,OACnE,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK;AAAA,OACjC,WAAW,gBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,WAAW,YAAY;AAAA,OAClF,WAAW,oBAAoB,YAC/B,CAAC,IACD,EAAE,iBAAiB,WAAW,gBAAgB;AAAA,OAC9C,WAAW,kBAAkB,YAAY,CAAC,IAAI,EAAE,eAAe,WAAW,cAAc;AAAA,OACxF,WAAW,mBAAmB,YAC9B,CAAC,IACD,EAAE,gBAAgB,WAAW,eAAe;AAAA,OAC5C,WAAW,oBAAoB,YAC/B,CAAC,IACD,EAAE,iBAAiB,WAAW,gBAAgB;AAAA,IAClD;AAAA,EACF,CAAC;AAAA;AAGH,SAAS,uBAAuB,CAAC,cAA0C;AAAA,EACzE,aAAa,cAAc,cAAc;AAAA,EACzC,MAAM,kBACJ,aAAa,oBAAoB,QAC7B,QACA,cAAc,aAAa,iBAAiB,8BAA8B;AAAA,EAChF,YAAY,OAAO,UAAU,OAAO,QAAQ,YAAY,GAAG;AAAA,IACzD,IAAI,UAAU,qBAAqB,UAAU;AAAA,MAAa;AAAA,IAC1D,IAAI,UAAU,aAAa,OAAO,UAAU,WAAW;AAAA,MACrD,MAAM,IAAI,UAAU,4BAA4B,yBAAyB;AAAA,IAC3E;AAAA,EACF;AAAA,EACA,MAAM,YAAY,4BAA4B,aAAa,SAAS;AAAA,EACpE,MAAM,QAKF,CAAC;AAAA,EACL,WAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AAAA,IACV,MAAM,QAAQ,aAAa;AAAA,IAC3B,IAAI,OAAO,UAAU;AAAA,MAAW,MAAM,OAAO;AAAA,EAC/C;AAAA,EACA,OAAO,OAAO,OAAO;AAAA,OACf,oBAAoB,YAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,OACvD,cAAc,YAAY,CAAC,IAAI,EAAE,UAAU;AAAA,OAC5C;AAAA,EACL,CAAC;AAAA;AAGH,SAAS,2BAA2B,CAAC,WAAoD;AAAA,EACvF,IAAI,cAAc,aAAa,cAAc;AAAA,IAAO,OAAO;AAAA,EAC3D,aAAa,WAAW,WAAW;AAAA,EACnC,IAAI,UAAU,eAAe,aAAa,OAAO,UAAU,eAAe,WAAW;AAAA,IACnF,MAAM,IAAI,UAAU,iEAAiE;AAAA,EACvF;AAAA,EACA,MAAM,UAAU,uBAAuB,UAAU,OAAO;AAAA,EACxD,MAAM,eAAe,kCAAkC,UAAU,YAAY;AAAA,EAC7E,OAAO,OAAO,OAAO;AAAA,OACf,UAAU,eAAe,YAAY,CAAC,IAAI,EAAE,YAAY,UAAU,WAAW;AAAA,OAC7E,YAAY,YAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,OACvC,iBAAiB,YAAY,CAAC,IAAI,EAAE,aAAa;AAAA,EACvD,CAAsC;AAAA;AAGxC,SAAS,sBAAsB,CAC7B,SACiE;AAAA,EACjE,IAAI,YAAY;AAAA,IAAW;AAAA,EAC3B,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC3B,MAAM,IAAI,UAAU,+DAA+D;AAAA,EACrF;AAAA,EACA,MAAM,OAAO,IAAI;AAAA,EACjB,OAAO,OAAO,OACZ,QAAQ,IAAI,CAAC,UAAmB;AAAA,IAC9B,MAAM,SAAS,yBAAwB,KAAK,CAAC,YAAY,YAAY,KAAK;AAAA,IAC1E,IAAI,WAAW,WAAW;AAAA,MACxB,MAAM,IAAI,UAAU,kCAAkC,OAAO,KAAK,gBAAgB;AAAA,IACpF;AAAA,IACA,IAAI,KAAK,IAAI,MAAM,GAAG;AAAA,MACpB,MAAM,IAAI,UAAU,kCAAkC,wBAAwB;AAAA,IAChF;AAAA,IACA,KAAK,IAAI,MAAM;AAAA,IACf,OAAO;AAAA,GACR,CACH;AAAA;AAGF,SAAS,iCAAiC,CACxC,QAC8C;AAAA,EAC9C,IAAI,WAAW;AAAA,IAAW;AAAA,EAC1B,aAAa,QAAQ,wBAAwB;AAAA,EAC7C,iCAAiC,OAAO,KAAK,yCAAyC;AAAA,EACtF,iCAAiC,OAAO,KAAK,yCAAyC;AAAA,EACtF,IAAI,OAAO,QAAQ,aAAa,OAAO,QAAQ,aAAa,OAAO,MAAM,OAAO,KAAK;AAAA,IACnF,MAAM,IAAI,UACR,4EACF;AAAA,EACF;AAAA,EACA,OAAO,OAAO,OAAO;AAAA,OACf,OAAO,QAAQ,YAAY,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI;AAAA,OAClD,OAAO,QAAQ,YAAY,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI;AAAA,EACxD,CAAC;AAAA;AAGH,SAAS,aAAa,CAAC,OAAe,OAAqB;AAAA,EACzD,IAAI,CAAC,MAAM,KAAK;AAAA,IAAG,MAAM,IAAI,UAAU,gBAAgB,0BAA0B;AAAA;AAGnF,SAAS,6BAA6B,CAAC,OAA2B,OAAqB;AAAA,EACrF,IAAI,UAAU,cAAc,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,IAAI;AAAA,IACvE,MAAM,IAAI,UAAU,gBAAgB,wCAAwC;AAAA,EAC9E;AAAA;AAGF,SAAS,gCAAgC,CACvC,OACA,OACqC;AAAA,EACrC,IACE,UAAU,cACT,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,IACtE;AAAA,IACA,MAAM,IAAI,UAAU,gBAAgB,2CAA2C;AAAA,EACjF;AAAA;AAGF,SAAS,oBAAoB,CAAC,OAA2B,OAAqB;AAAA,EAC5E,IAAI,UAAU,aAAa,OAAO,UAAU,UAAU;AAAA,IACpD,MAAM,IAAI,UAAU,gBAAgB,yBAAyB;AAAA,EAC/D;AAAA;AAGF,SAAS,aAAa,CAAC,OAAgB,OAA8C;AAAA,EACnF,IAAI,UAAU;AAAA,IAAW;AAAA,EACzB,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,UAAU,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,CAAC,GAAG;AAAA,IAC9F,MAAM,IAAI,UAAU,gBAAgB,sCAAsC;AAAA,EAC5E;AAAA,EACA,OAAO,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC;AAAA;AAGjC,SAAS,YAAY,CAAC,OAAgB,OAAyD;AAAA,EAC7F,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK;AAAA,IACpE,MAAM,IAAI,UAAU,gBAAgB,0BAA0B;AAAA;;;ACjJ3D,SAAS,mBAAkB,CAAC,OAAwC;AAAA,EACzE,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAAA,IAC/D,MAAM,IAAI,cAAa,wDAAwD;AAAA,EACjF;AAAA,EAEA,MAAM,WAAW,sBAAsB,MAAM,QAAQ;AAAA,EACrD,MAAM,YAAY,uBAAuB,MAAM,SAAS;AAAA,EACxD,MAAM,WAAW,sBAAsB,MAAM,QAAQ;AAAA,EAErD,IAAI,CAAC,YAAY,CAAC,YAAY,UAAU,KAAK,EAAE,WAAW,GAAG;AAAA,IAC3D,MAAM,IAAI,cAAa,sEAAsE;AAAA,EAC/F;AAAA,EAEA,OAAO,OAAO,OAAO,EAAE,UAAU,WAAW,SAAS,CAAC;AAAA;AAGxD,SAAS,qBAAqB,CAC5B,QACkC;AAAA,EAClC,IAAI,WAAW;AAAA,IAAW;AAAA,EAC1B,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,IAC1B,MAAM,IAAI,cAAa,oEAAoE;AAAA,EAC7F;AAAA,EAEA,MAAM,QAAQ,mBAAmB,QAAQ,YAAY,mBAAmB;AAAA,EACxE,OAAO,gBAAgB,MAAM,KAAK;AAAA,EAClC,IAAI,CAAC,cAAc;AAAA,IACjB,MAAM,IAAI,cACR,6FACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,aAAa,CAAC;AAAA;AAG1D,SAAS,sBAAsB,CAC7B,QACuB;AAAA,EACvB,IAAI,WAAW,aAAa,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,IAClD,MAAM,IAAI,cAAa,+DAA+D;AAAA,EACxF;AAAA,EAEA,OAAO,mBAAmB,UAAU,CAAC,GAAG,aAAa,oBAAoB;AAAA;AAG3E,SAAS,mBAAmB,CAAC,OAAgB,OAA+C;AAAA,EAC1F,IAAK,OAAO,UAAU,YAAY,OAAO,UAAU,cAAe,UAAU,MAAM;AAAA,IAChF,MAAM,qBAAqB,OAAO,wCAAwC;AAAA,EAC5E;AAAA,EAEA,MAAM,YAAY;AAAA,EAClB,sBAAsB,UAAU,YAAY,YAAY,KAAK;AAAA,EAC7D,sBAAsB,UAAU,SAAS,WAAW,KAAK;AAAA,EACzD,IAAI,OAAO,UAAU,WAAW,YAAY;AAAA,IAC1C,MAAM,qBAAqB,OAAO,oCAAoC;AAAA,EACxE;AAAA,EACA,IAAI;AAAA,IACF,MAAM,aAAa,qBAAoB,UAAU,UAAqC;AAAA,IACtF,IACE,WAAW,eAAe,UAAU,cACpC,WAAW,YAAY,UAAU,SACjC;AAAA,MACA,MAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAAA,IACA,OAAO,OAAO;AAAA,IACd,MAAM,qBAAqB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,oBAAoB;AAAA;AAAA;AAInG,SAAS,qBAAqB,CAAC,OAAgB,OAA+B,OAAqB;AAAA,EACjG,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AAAA,IACnD,MAAM,qBAAqB,OAAO,aAAa,iCAAiC;AAAA,EAClF;AAAA,EACA,IAAI,MAAM,KAAK,MAAM,OAAO;AAAA,IAC1B,MAAM,qBAAqB,OAAO,aAAa,2CAA2C;AAAA,EAC5F;AAAA;AAGF,SAAS,oBAAoB,CAAC,OAAe,QAA8B;AAAA,EACzE,OAAO,IAAI,cACT,qDAAqD,YAAY,SACnE;AAAA;;ACxJK,MAAM,oCAAmC,oBAAmB;AAAA,EAKtD;AAAA,EAJX,WAAW,CACT,SACA,YACA,SACS,UACT,SACA;AAAA,IACA,MAAM,SAAS,YAAY,SAAS;AAAA,SAC/B;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,IACb,CAAC;AAAA,IAPQ;AAAA;AASb;;AC2BO,SAAS,eAAiD,CAC/D,WACwB;AAAA,EACxB,wBAAwB,SAAS;AAAA,EACjC,MAAM,SAAsC,OAAO,YACjD,OAAO,QAAQ,SAAS,EAAE,IAAI,EAAE,KAAK,OAAO;AAAA,IAC1C,IAAI,EAAE,SAAS;AAAA,MACb,OAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,YAAY,EAAE,aAAa,EAAE,UAAU,MAAM,QAAQ,SAAS,EAAE;AAAA,QAClE;AAAA,MACF;AAAA,IACF,MAAM,aAAa,EAAE,QAAQ,SAAkB;AAAA,IAC/C,IAAI,EAAE,SAAS;AAAA,MACb,OAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,YACV,OAAO,EAAE,UAAU,MAAM,QAAQ,SAAS;AAAA,YAC1C,eAAe,EAAE,UAAU,MAAM,QAAQ,EAAE,MAAM,SAAS,OAAO,SAAS,EAAE;AAAA,YAC5E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,UAAU;AAAA,YACV,QAAQ,EAAE,MAAM,QAAQ,WAAW,UAAU,QAAQ,OAAO,KAAK,EAAE,OAAO,EAAE;AAAA,UAC9E;AAAA,UACA,eAAe;AAAA,YACb,UAAU;AAAA,YACV,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,YAAY,OAAO,YACjB,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW;AAAA,gBACrC;AAAA,gBACA,EAAE,UAAU,MAAM,QAAQ,SAAS;AAAA,cACrC,CAAC,CACH;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,GACD,CACH;AAAA,EAEA,OAAO;AAAA;;AC/FF,IAAM,YAAW;AAAA,EACtB,MAA+E,CAAC,OAGnD;AAAA,IAC3B,MAAM,SAAS,KAAK,OAAO,MAAM,SAAkB;AAAA,IACnD,wBAAwB,EAAE,UAAU,OAAO,CAAC;AAAA,IAC5C,OAAO;AAAA;AAAA,EAET,KAEC,CAAC,OAGyB;AAAA,IACzB,MAAM,SAAS,KAAK,OAAO,MAAM,QAAiB;AAAA,IAClD,wBAAwB,EAAE,UAAU,OAAO,CAAC;AAAA,IAC5C,OAAO;AAAA;AAAA,EAET,WAAW,CAAC,cAAoD;AAAA,IAC9D,MAAM,SAAS,EAAE,MAAM,eAAwB,aAAa;AAAA,IAC5D,wBAAwB,EAAE,UAAU,OAAO,CAAC;AAAA,IAC5C,OAAO;AAAA;AAEX;;ACxBO,SAAS,iBAAiB,CAC/B,OACA,OACmB;AAAA,EACnB,IAAI;AAAA,IACF,OAAO,MAAM,eAAe,SAAS,KAAK,KAAK,eAAc,EAAE,OAAO,MAAM,MAAM,CAAC;AAAA,IACnF,MAAM;AAAA,IACN,QAAQ,KACN,oFACF;AAAA,IACA,OAAO,EAAE,QAAQ,eAAe,QAAQ,oBAAoB;AAAA;AAAA;AA+DzD,SAAS,yBAAwB,CAAC,OAId;AAAA,EACzB,IAAI,CAAC,MAAM;AAAA,IAAU;AAAA,EACrB,IAAI,CAAC,CAAC,MAAM,aAAa,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,OAAO,cAAc,CAAC,KAAK,KAAK,CAAC,GAAG;AAAA,IAC5F,MAAM,IAAI,UACR,6EACF;AAAA,EACF;AAAA,EACA,MAAM,UAAU,CAAC,WAAqD;AAAA,IACpE,MAAM,QAAQ,OAAO,QAAQ,CAAC,UAC5B,UAAU,YACN,CAAC,IACD,OAAO,UAAU,WACf,CAAC,KAAK,IACN,CAAC,MAAM,SAAS,GAAG,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,CAChE;AAAA,IACA,OAAO,MAAM,OAAO,CAAC,KAAK,UAAU;AAAA,MAClC,MAAM,OAAO,sBAAsB,KAAK;AAAA,MACxC,OAAO,OAAO,MAAM,OAAO;AAAA,OAC1B,EAAE;AAAA;AAAA,EAEP,MAAM,OAAO,MAAM;AAAA,EACnB,MAAM,YAAY,QAAQ;AAAA,IACxB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP,CAAC;AAAA,EACD,MAAM,aAAa,QAAQ,CAAC,KAAK,MAAM,CAAC;AAAA,EACxC,MAAM,SAAS,CAAC,QAAgB,UAAkB,OAAO,MAAM,IAAI,OAAO,WAAY;AAAA,EACtF,OAAO;AAAA,IACL,UAAU;AAAA,IACV,cACE,OAAO,MAAM,aAAa,SAAS,IAAI,OAAO,MAAM,cAAc,UAAU,GAC5E,SAAS;AAAA,EACb;AAAA;AAcK,SAAS,cAAa,CAAC,OAIZ;AAAA,EAChB,IAAI,MAAM,UAAU;AAAA,IAClB,kBAAkB,MAAM,SAAS,MAAM,WAAW;AAAA,IAClD,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,MAAM,SAAS;AAAA,SAClB,MAAM,SAAS,eAAe,YAAY,CAAC,IAAI,EAAE,YAAY,MAAM,SAAS,WAAW;AAAA,IAC7F;AAAA,EACF;AAAA,EACA,IAAI,CAAC,MAAM;AAAA,IAAU,OAAO,EAAE,QAAQ,eAAe,QAAQ,oBAAoB;AAAA,EACjF,QAAQ,OAAO,aAAa;AAAA,EAC5B,IAAI,CAAC,mBAAmB,KAAK,GAAG;AAAA,IAC9B,OAAO,EAAE,QAAQ,eAAe,QAAQ,qBAAqB;AAAA,EAC/D;AAAA,EACA,IAAI,MAAM,gBAAgB,aAAa,MAAM,iBAAiB,WAAW;AAAA,IACvE,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe;AAAA,QACb,GAAI,MAAM,gBAAgB,YAAa,CAAC,oBAAoB,IAAc,CAAC;AAAA,QAC3E,GAAI,MAAM,iBAAiB,YAAa,CAAC,qBAAqB,IAAc,CAAC;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,oBAAoB,OAAO,QAAQ;AAAA,EACvD,IAAI,YAAY,WAAW;AAAA,IAAS,OAAO;AAAA,EAE3C,MAAM,aAAmC,CAAC;AAAA,EAC1C,IAAI,CAAC,YAAY,aAAa;AAAA,IAC5B,WAAW,KACT,UAAU,sBAAsB,MAAM,aAAa,SAAS,OAAO,MAAM,WAAW,CACtF;AAAA,EACF,EAAO;AAAA,IACL,WAAW,KACT,UAAU,yBAAyB,YAAY,UAAU,SAAS,OAAO,MAAM,WAAW,CAC5F;AAAA,IACA,IAAI,YAAY,cAAc,WAAW;AAAA,MACvC,WAAW,KACT,UACE,0BACA,YAAY,WACZ,SAAS,gBACT,MAAM,WACR,CACF;AAAA,IACF;AAAA,IACA,IAAI,YAAY,eAAe,WAAW;AAAA,MACxC,WAAW,KACT,UACE,2BACA,YAAY,YACZ,SAAS,iBACT,MAAM,WACR,CACF;AAAA,IACF;AAAA,IACA,IAAI,YAAY,iBAAiB,WAAW;AAAA,MAC1C,WAAW,KACT,UACE,6BACA,YAAY,cACZ,SAAS,qBAAqB,SAAS,iBACvC,MAAM,WACR,CACF;AAAA,IACF;AAAA,IACA,IAAI,YAAY,iBAAiB,WAAW;AAAA,MAC1C,WAAW,KACT,UACE,6BACA,YAAY,cACZ,SAAS,qBAAqB,SAAS,iBACvC,MAAM,WACR,CACF;AAAA,IACF;AAAA;AAAA,EAEF,WAAW,KACT,UAAU,uBAAuB,MAAM,cAAc,SAAS,QAAQ,MAAM,WAAW,CACzF;AAAA,EACA,MAAM,QAAQ,WAAW,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,MAAM,iBAAiB,GAAG,EAAE;AAAA,EACzF,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,EAAE,UAAU,SAAS,UAAU,aAAa,MAAM,SAAS,EAAE;AAAA,IACpE;AAAA,EACF;AAAA;AAgBF,SAAS,mBAAmB,CAAC,OAAmB,UAAkD;AAAA,EAChG,MAAM,oBACJ,MAAM,4BAA4B,aAAa,MAAM,4BAA4B;AAAA,EACnF,MAAM,sBACH,MAAM,2BAA2B,MAAM,MAAM,2BAA2B;AAAA,EAC3E,IACE,qBACA,MAAM,0BAA0B,aAChC,MAAM,0BAA0B,oBAChC;AAAA,IACA,OAAO,EAAE,QAAQ,eAAe,QAAQ,qBAAqB;AAAA,EAC/D;AAAA,EAEA,MAAM,cACJ,MAAM,wBAAwB,aAC9B,MAAM,yBAAyB,aAC/B,MAAM,0BAA0B,aAChC,qBACA,SAAS,mBAAmB,aAC5B,SAAS,oBAAoB,aAC7B,SAAS,sBAAsB,aAC/B,SAAS,sBAAsB;AAAA,EACjC,IAAI,CAAC;AAAA,IAAa,OAAO,EAAE,QAAQ,SAAS,aAAa,MAAM;AAAA,EAE/D,MAAM,YAAY,MAAM,wBAAwB;AAAA,EAChD,MAAM,aAAa,MAAM,yBAAyB;AAAA,EAClD,IAAI,MAAM,gBAAgB,aAAa,YAAY,aAAa,MAAM,aAAa;AAAA,IACjF,OAAO,EAAE,QAAQ,eAAe,QAAQ,qBAAqB;AAAA,EAC/D;AAAA,EAEA,MAAM,UAA4B,CAAC;AAAA,EACnC,IAAI,MAAM,wBAAwB;AAAA,IAAW,QAAQ,KAAK,uBAAuB;AAAA,EACjF,IAAI,SAAS,mBAAmB,aAAa,MAAM,yBAAyB,WAAW;AAAA,IACrF,QAAQ,KAAK,wBAAwB;AAAA,EACvC;AAAA,EACA,IACE,SAAS,oBAAoB,aAC7B,SAAS,sBAAsB,aAC/B,SAAS,sBAAsB,aAC/B,MAAM,0BAA0B,WAChC;AAAA,IACA,QAAQ,KAAK,yBAAyB;AAAA,EACxC;AAAA,EACA,IAAI,SAAS,sBAAsB,aAAa,MAAM,4BAA4B,WAAW;AAAA,IAC3F,QAAQ,KAAK,2BAA2B;AAAA,EAC1C;AAAA,EACA,IAAI,SAAS,sBAAsB,aAAa,MAAM,4BAA4B,WAAW;AAAA,IAC3F,QAAQ,KAAK,2BAA2B;AAAA,EAC1C;AAAA,EACA,IAAI,QAAQ,SAAS,GAAG;AAAA,IACtB,OAAO,EAAE,QAAQ,eAAe,QAAQ,iBAAiB,eAAe,QAAQ;AAAA,EAClF;AAAA,EACA,IAAI,YAAY,KAAK,SAAS,mBAAmB,WAAW;AAAA,IAC1D,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe,CAAC,wBAAwB;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,IAAI,CAAC,qBAAqB,aAAa,KAAK,SAAS,oBAAoB,WAAW;AAAA,IAClF,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe,CAAC,yBAAyB;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,KACG,MAAM,2BAA2B,KAAK,KACvC,SAAS,sBAAsB,aAC/B,SAAS,oBAAoB,WAC7B;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe,CAAC,2BAA2B;AAAA,IAC7C;AAAA,EACF;AAAA,EACA,KACG,MAAM,2BAA2B,KAAK,KACvC,SAAS,sBAAsB,aAC/B,SAAS,oBAAoB,WAC7B;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe,CAAC,2BAA2B;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAM;AAAA,EACvB,IAAI,WAAW,YAAY,eAAe,MAAM,aAAa;AAAA,IAC3D,OAAO,EAAE,QAAQ,eAAe,QAAQ,qBAAqB;AAAA,EAC/D;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,aAAa;AAAA,IACb;AAAA,OACI,SAAS,mBAAmB,YAAY,CAAC,IAAI,EAAE,UAAU;AAAA,OACzD,oBACA;AAAA,SACM,SAAS,sBAAsB,aAAa,SAAS,oBAAoB,YACzE,EAAE,cAAc,MAAM,2BAA2B,EAAE,IACnD,CAAC;AAAA,SACD,SAAS,sBAAsB,aAAa,SAAS,oBAAoB,YACzE,EAAE,cAAc,MAAM,2BAA2B,EAAE,IACnD,CAAC;AAAA,IACP,IACA,SAAS,oBAAoB,YAC3B,CAAC,IACD,EAAE,YAAY,WAAW;AAAA,EACjC;AAAA;AAGF,SAAS,kBAAkB,CAAC,OAA4B;AAAA,EACtD,OAAO,OAAO,QAAQ,KAAK,EACxB,OAAO,EAAE,SAAS,QAAQ,KAAK,EAC/B,MAAM,IAAI,WAAW,UAAU,aAAc,OAAO,cAAc,KAAK,KAAK,SAAS,CAAE;AAAA;AAG5F,SAAS,SAAS,CAChB,OACA,UACA,OACA,YACoB;AAAA,EACpB,MAAM,OAAO,sBAAsB,aAAa,OAAO,UAAU,CAAC;AAAA,EAClE,MAAM,UAAU,OAAO,QAAQ,IAAI,OAAO,WAAY;AAAA,EACtD,OAAO;AAAA,IACL;AAAA,IACA,UAAU,SAAS,SAAS;AAAA,IAC5B,2BAA2B,KAAK,SAAS;AAAA,IACzC,mBAAmB,OAAO,SAAS;AAAA,EACrC;AAAA;AAGF,SAAS,YAAY,CAAC,OAAwB,QAAwB;AAAA,EACpE,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,OACE,MAAM,MAAM,KACV,CAAC,SACC,UAAU,KAAK,cAAc,KAAK,cAAc,aAAa,SAAS,KAAK,UAC/E,GAAG,SAAS,MAAM;AAAA;AAItB,SAAS,qBAAqB,CAAC,OAAuB;AAAA,EACpD,OAAO,QAAQ,KAAK,WAAW,MAAM,MAAM,MAAM,GAAG;AAAA,EACpD,MAAM,QAAQ,SAAS,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG;AAAA,EAChD,MAAM,UAAU,OAAO,SAAS,MAAM,GAAG,KAAK;AAAA,EAC9C,OAAO,OAAO,KAAK,IAAI,cAAiB,OAAO,KAAK,KAAK,UAAU,KAAK;AAAA;AAG1E,SAAS,iBAAiB,CAAC,OAAqB;AAAA,EAC9C,IAAI,CAAC,mBAAmB,KAAK,KAAK,GAAG;AAAA,IACnC,MAAM,IAAI,UAAU,uEAAuE;AAAA,EAC7F;AAAA;;AC9WK,SAAS,oBAAmB,CAAC,UAAwD;AAAA,EAC1F,cAAa,UAAU,WAAW;AAAA,EAClC,IAAI,SAAS,aAAa,SAAS,SAAS,SAAS,kBAAkB;AAAA,IACrE,MAAM,IAAI,UAAU,0DAA0D;AAAA,EAChF;AAAA,EACA,OAAO,OAAO,OAAO;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO,WAAW,SAAS,KAAK;AAAA,IAChC,QAAQ,WAAW,SAAS,MAAM;AAAA,OAC9B,SAAS,mBAAmB,YAC5B,CAAC,IACD,EAAE,gBAAgB,WAAW,SAAS,cAAc,EAAE;AAAA,OACtD,SAAS,oBAAoB,YAC7B,CAAC,IACD,EAAE,iBAAiB,WAAW,SAAS,eAAe,EAAE;AAAA,OACxD,SAAS,sBAAsB,YAC/B,CAAC,IACD,EAAE,mBAAmB,WAAW,SAAS,iBAAiB,EAAE;AAAA,OAC5D,SAAS,sBAAsB,YAC/B,CAAC,IACD,EAAE,mBAAmB,WAAW,SAAS,iBAAiB,EAAE;AAAA,EAClE,CAAC;AAAA;AAGH,SAAS,UAAU,CAAC,OAAyC;AAAA,EAC3D,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,MAAM,KAAK;AAAA,EACjD,cAAa,OAAO,aAAa;AAAA,EACjC,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK;AAAA,IAAG,MAAM,IAAI,UAAU,4CAA4C;AAAA,EACjG,IAAI,cAAc;AAAA,EAClB,OAAO,OAAO,OAAO;AAAA,IACnB,SAAS,MAAM,MAAM,OAAO;AAAA,IAC5B,OAAO,OAAO,OACZ,MAAM,MAAM,IAAI,CAAC,MAAM,UAAU;AAAA,MAC/B,cAAa,MAAM,YAAY;AAAA,MAC/B,IACE,OAAO,KAAK,cAAc,YAC1B,CAAC,OAAO,cAAc,KAAK,SAAS,KACpC,KAAK,YAAY,GACjB;AAAA,QACA,MAAM,IAAI,UAAU,iDAAiD;AAAA,MACvE;AAAA,MACA,IAAI,QAAQ,KAAK,KAAK,YAAY,aAAa;AAAA,QAC7C,MAAM,IAAI,UAAU,8DAA8D;AAAA,MACpF;AAAA,MACA,IACE,KAAK,cAAc,cAClB,OAAO,KAAK,cAAc,YACzB,CAAC,OAAO,cAAc,KAAK,SAAS,KACpC,KAAK,aAAa,KAAK,YACzB;AAAA,QACA,MAAM,IAAI,UAAU,iDAAiD;AAAA,MACvE;AAAA,MACA,cAAc,KAAK,aAAa,OAAO;AAAA,MACvC,OAAO,OAAO,OAAO;AAAA,QACnB,WAAW,KAAK;AAAA,WACZ,KAAK,cAAc,YAAY,CAAC,IAAI,EAAE,WAAW,KAAK,UAAU;AAAA,QACpE,OAAO,MAAM,KAAK,KAAK;AAAA,MACzB,CAAC;AAAA,KACF,CACH;AAAA,EACF,CAAC;AAAA;AAGH,SAAS,KAAK,CAAC,OAAwB;AAAA,EACrC,IAAI,OAAO,UAAU,YAAY,CAAC,6BAA6B,KAAK,KAAK,GAAG;AAAA,IAC1E,MAAM,IAAI,UAAU,0DAA0D;AAAA,EAChF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAY,CAAC,OAAgB,OAAyD;AAAA,EAC7F,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAAA,IACvE,MAAM,IAAI,UAAU,gBAAgB,0BAA0B;AAAA,EAChE;AAAA;",
|
|
17
|
-
"debugId": "E1F1340E09DE933964756E2164756E21",
|
|
18
|
-
"names": []
|
|
19
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/storage/ai-usage/errors.ts", "../src/storage/ai-usage/in-memory.ts", "../src/storage/ai-cost/analytics.ts", "../src/storage/ai-cost/attribution.ts", "../src/storage/ai-cost/groups.ts", "../src/storage/ai-cost/validation.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"export type AiUsageStorageErrorCode = \"duplicate_id\" | \"missing_execution\"\n\n/** Storage failure specific to the AI model-call usage ledger. */\nexport class AiUsageStorageError extends Error {\n readonly name = \"AiUsageStorageError\"\n\n constructor(\n readonly code: AiUsageStorageErrorCode,\n message: string\n ) {\n super(message)\n }\n}\n",
|
|
6
|
-
"import type { ExecutionStorage } from \"../executions\"\nimport { AiUsageStorageError } from \"./errors\"\nimport { assertAiUsageExecutionId, normalizeAiModelCallRecord } from \"./record\"\nimport type {\n AiModelCallUsageRecord,\n AiUsageExecutionSummary,\n AiUsageStorage,\n GetLatestAiModelCallForExecutionInput,\n RecordAiModelCallInput,\n RecordAiModelCallResult,\n SummarizeAiUsageExecutionInput,\n SummarizeAiUsageExecutionsInput,\n} from \"./types\"\nimport { aggregateAiModelCallUsage } from \"./usage\"\n\nexport interface InMemoryAiUsageGroupRow {\n readonly projectId: string\n readonly usageRecordId: string\n readonly groupId: string\n readonly occurredAt: Date\n}\n\nexport interface InMemoryAiUsageStorageSnapshot {\n readonly records: Map<string, AiModelCallUsageRecord>\n readonly recordKeysByIdempotencyKey: Map<string, string>\n readonly groupRows: Map<string, InMemoryAiUsageGroupRow>\n}\n\n/** In-memory model-call ledger used by development runtimes and storage contract tests. */\nexport class InMemoryAiUsageStorage implements AiUsageStorage {\n private readonly records = new Map<string, AiModelCallUsageRecord>()\n private readonly recordKeysByIdempotencyKey = new Map<string, string>()\n private readonly groupRows = new Map<string, InMemoryAiUsageGroupRow>()\n\n constructor(private readonly executions: Pick<ExecutionStorage, \"getById\">) {}\n\n async recordModelCall(input: RecordAiModelCallInput): Promise<RecordAiModelCallResult> {\n const record = normalizeAiModelCallRecord(input)\n await this.assertExecutionExists(record.projectId, record.executionId)\n const idempotencyKey = modelCallIdempotencyKey(record)\n const existingRecordKey = this.recordKeysByIdempotencyKey.get(idempotencyKey)\n if (existingRecordKey !== undefined) {\n const existing = this.records.get(existingRecordKey)\n if (!existing) {\n throw new Error(\"[Sixb] In-memory AI usage idempotency index is inconsistent.\")\n }\n return { record: structuredClone(existing), created: false }\n }\n\n const recordKey = modelCallRecordKey(record.projectId, record.id)\n if (this.records.has(recordKey)) {\n throw new AiUsageStorageError(\n \"duplicate_id\",\n `[Sixb] AI usage record '${record.id}' already exists for project '${record.projectId}'.`\n )\n }\n\n this.records.set(recordKey, structuredClone(record))\n this.recordKeysByIdempotencyKey.set(idempotencyKey, recordKey)\n for (const groupId of record.requesterGroupIds) {\n const row: InMemoryAiUsageGroupRow = {\n projectId: record.projectId,\n usageRecordId: record.id,\n groupId,\n occurredAt: record.occurredAt,\n }\n this.groupRows.set(groupRowKey(row), row)\n }\n\n return { record: structuredClone(record), created: true }\n }\n\n async getLatestForExecution(\n input: GetLatestAiModelCallForExecutionInput\n ): Promise<AiModelCallUsageRecord | null> {\n assertAiUsageExecutionId(input.executionId)\n if (typeof input.projectId !== \"string\" || input.projectId.trim().length === 0) {\n throw new TypeError(\"[Sixb] AI usage projectId must be nonblank.\")\n }\n\n let latest: AiModelCallUsageRecord | null = null\n for (const record of this.records.values()) {\n if (record.projectId !== input.projectId || record.executionId !== input.executionId) continue\n if (\n !latest ||\n record.occurredAt.getTime() > latest.occurredAt.getTime() ||\n (record.occurredAt.getTime() === latest.occurredAt.getTime() && record.id > latest.id)\n ) {\n latest = record\n }\n }\n return latest ? structuredClone(latest) : null\n }\n\n async summarizeExecution(\n input: SummarizeAiUsageExecutionInput\n ): Promise<AiUsageExecutionSummary> {\n const [summary] = await this.summarizeExecutions({\n projectId: input.projectId,\n executionIds: [input.executionId],\n })\n return summary!\n }\n\n async summarizeExecutions(\n input: SummarizeAiUsageExecutionsInput\n ): Promise<readonly AiUsageExecutionSummary[]> {\n if (typeof input.projectId !== \"string\" || input.projectId.trim().length === 0) {\n throw new TypeError(\"[Sixb] AI usage projectId must be nonblank.\")\n }\n\n const usageByExecutionId = new Map<string, AiModelCallUsageRecord[\"usage\"][]>()\n for (const executionId of input.executionIds) {\n assertAiUsageExecutionId(executionId)\n usageByExecutionId.set(executionId, [])\n }\n if (usageByExecutionId.size === 0) return []\n\n for (const record of this.records.values()) {\n if (record.projectId !== input.projectId) continue\n usageByExecutionId.get(record.executionId)?.push(record.usage)\n }\n\n return input.executionIds.map((executionId) => {\n const usages = usageByExecutionId.get(executionId) ?? []\n return {\n modelCallCount: usages.length,\n usage: aggregateAiModelCallUsage(usages),\n }\n })\n }\n\n snapshot(): InMemoryAiUsageStorageSnapshot {\n return structuredClone({\n records: this.records,\n recordKeysByIdempotencyKey: this.recordKeysByIdempotencyKey,\n groupRows: this.groupRows,\n })\n }\n\n restore(snapshot: InMemoryAiUsageStorageSnapshot): void {\n replaceMap(this.records, snapshot.records)\n replaceMap(this.recordKeysByIdempotencyKey, snapshot.recordKeysByIdempotencyKey)\n replaceMap(this.groupRows, snapshot.groupRows)\n }\n\n /** @internal Immutable accounting source used by in-memory AI limit enforcement. */\n getRecord(projectId: string, id: string): AiModelCallUsageRecord | null {\n const record = this.records.get(modelCallRecordKey(projectId, id))\n return record ? structuredClone(record) : null\n }\n\n /** @internal Immutable accounting source used by in-memory AI limit status reads. */\n listRecords(projectId: string): readonly AiModelCallUsageRecord[] {\n return [...this.records.values()]\n .filter((record) => record.projectId === projectId)\n .map((record) => structuredClone(record))\n }\n\n private async assertExecutionExists(projectId: string, executionId: string): Promise<void> {\n const execution = await this.executions.getById({ projectId, id: executionId })\n if (execution) return\n throw new AiUsageStorageError(\n \"missing_execution\",\n `[Sixb] AI usage execution '${executionId}' does not exist in project '${projectId}'.`\n )\n }\n}\n\nfunction modelCallRecordKey(projectId: string, id: string): string {\n return JSON.stringify([projectId, id])\n}\n\nfunction modelCallIdempotencyKey(\n record: Pick<\n AiModelCallUsageRecord,\n \"projectId\" | \"executionId\" | \"attempt\" | \"callId\" | \"responseId\"\n >\n): string {\n return JSON.stringify([\n record.projectId,\n record.executionId,\n record.attempt,\n record.callId,\n record.responseId,\n ])\n}\n\nfunction groupRowKey(row: InMemoryAiUsageGroupRow): string {\n return JSON.stringify([row.projectId, row.usageRecordId, row.groupId])\n}\n\nfunction replaceMap<TKey, TValue>(target: Map<TKey, TValue>, source: Map<TKey, TValue>): void {\n target.clear()\n for (const [key, value] of structuredClone(source)) {\n target.set(key, value)\n }\n}\n",
|
|
7
|
-
"import { type AiModelCallUsageRecord, normalizeAiModelCallUsage } from \"../ai-usage\"\nimport type {\n AiAccountingAgentBreakdown,\n AiAccountingAggregate,\n AiAccountingAttribution,\n AiAccountingBucket,\n AiAccountingModelBreakdown,\n AiAccountingOverview,\n AiAccountingTimeBucket,\n AiAccountingWorkflowBreakdown,\n AiCostSummary,\n AiModelCallAccountingItem,\n AiModelCallCostRecord,\n AiMoney,\n ListAiModelCallAccountingInput,\n ListAiModelCallAccountingResult,\n QueryAiAccountingOverviewInput,\n} from \"./types\"\n\nconst DEFAULT_MODEL_CALL_PAGE_SIZE = 50\nconst MAX_MODEL_CALL_PAGE_SIZE = 200\nconst MAX_CHART_BUCKETS = 10_000\n\n/** One joined immutable model-call row used by in-memory analytics and bounded SQL pages. */\nexport interface AiAccountingRecordSetItem {\n readonly usage: AiModelCallUsageRecord\n readonly attribution?: AiAccountingAttribution\n readonly cost?: AiModelCallCostRecord\n}\n\nexport interface NormalizedAiAccountingQuery {\n readonly projectId: string\n readonly from: Date\n readonly to: Date\n readonly providerId?: string\n readonly modelId?: string\n}\n\nexport interface NormalizedAiModelCallAccountingQuery extends NormalizedAiAccountingQuery {\n readonly executionId?: string\n readonly valuationStatus?: ListAiModelCallAccountingInput[\"valuationStatus\"]\n readonly limit: number\n readonly offset: number\n}\n\ninterface AiAccountingUsageMeterFragment {\n readonly presentCallCount: string\n readonly total: string | null\n}\n\n/** One SQL-aggregated currency fragment; providers merge fragments without loading model calls. */\nexport interface AiAccountingAggregateFragment {\n readonly dimension: \"totals\" | \"series\" | \"model\" | \"agent\" | \"workflow\"\n readonly start?: Date\n readonly providerId?: string\n readonly modelId?: string\n readonly agentKind?: \"agent\" | \"workflowAgent\"\n readonly agentStepId?: string\n readonly workflowId?: string\n readonly modelCallCount: string\n readonly usage: {\n readonly reportedCallCount: string\n readonly completeCallCount: string\n readonly inputTokens: AiAccountingUsageMeterFragment\n readonly outputTokens: AiAccountingUsageMeterFragment\n readonly uncachedInputTokens: AiAccountingUsageMeterFragment\n readonly cacheReadInputTokens: AiAccountingUsageMeterFragment\n readonly cacheWriteInputTokens: AiAccountingUsageMeterFragment\n readonly textOutputTokens: AiAccountingUsageMeterFragment\n readonly reasoningOutputTokens: AiAccountingUsageMeterFragment\n }\n readonly costs: {\n readonly amount?: AiMoney\n readonly ratedCallCount: string\n readonly unpriceableCallCount: string\n readonly unvaluedCallCount: string\n }\n}\n\nexport function normalizeAiAccountingQuery(\n input: Omit<QueryAiAccountingOverviewInput, \"bucket\"> | ListAiModelCallAccountingInput\n): NormalizedAiAccountingQuery {\n assertNonBlank(input.projectId, \"accounting projectId\")\n assertDate(input.from, \"accounting from\")\n assertDate(input.to, \"accounting to\")\n if (input.from.getTime() >= input.to.getTime()) {\n throw new TypeError(\"[Sixb] AI accounting from must be before to.\")\n }\n if (input.providerId !== undefined) assertNonBlank(input.providerId, \"accounting providerId\")\n if (input.modelId !== undefined) assertNonBlank(input.modelId, \"accounting modelId\")\n return {\n projectId: input.projectId,\n from: new Date(input.from),\n to: new Date(input.to),\n ...(input.providerId === undefined ? {} : { providerId: input.providerId }),\n ...(input.modelId === undefined ? {} : { modelId: input.modelId }),\n }\n}\n\nexport function normalizeAiModelCallAccountingQuery(\n input: ListAiModelCallAccountingInput\n): NormalizedAiModelCallAccountingQuery {\n const query = normalizeAiAccountingQuery(input)\n if (input.executionId !== undefined) {\n assertNonBlank(input.executionId, \"accounting executionId\")\n }\n const { limit, offset } = normalizePage(input.limit, input.offset)\n return {\n ...query,\n ...(input.executionId === undefined ? {} : { executionId: input.executionId }),\n ...(input.valuationStatus === undefined ? {} : { valuationStatus: input.valuationStatus }),\n limit,\n offset,\n }\n}\n\nexport function aiAccountingItemMatchesQuery(\n item: AiAccountingRecordSetItem,\n query: NormalizedAiAccountingQuery\n): boolean {\n const occurredAt = item.usage.occurredAt.getTime()\n return (\n item.usage.projectId === query.projectId &&\n occurredAt >= query.from.getTime() &&\n occurredAt < query.to.getTime() &&\n (query.providerId === undefined || item.usage.providerId === query.providerId) &&\n (query.modelId === undefined || item.usage.requestedModelId === query.modelId)\n )\n}\n\nexport function buildAiAccountingOverview(\n input: QueryAiAccountingOverviewInput,\n source: Iterable<AiAccountingRecordSetItem>\n): AiAccountingOverview {\n const query = normalizeAiAccountingQuery(input)\n assertAiAccountingBucket(input.bucket)\n const items = Array.from(source).filter((item) => aiAccountingItemMatchesQuery(item, query))\n const periods = accountingPeriods(query.from, query.to, input.bucket)\n const periodItems = new Map<number, AiAccountingRecordSetItem[]>(\n periods.map((period) => [period.start.getTime(), []])\n )\n const modelItems = new Map<string, AiAccountingRecordSetItem[]>()\n const agentItems = new Map<string, AiAccountingRecordSetItem[]>()\n const workflowItems = new Map<string, AiAccountingRecordSetItem[]>()\n\n for (const item of items) {\n const periodStart = aiAccountingBucketStart(item.usage.occurredAt, input.bucket).getTime()\n periodItems.get(periodStart)?.push(item)\n appendGrouped(\n modelItems,\n JSON.stringify([item.usage.providerId, item.usage.requestedModelId]),\n item\n )\n if (item.attribution?.kind === \"agent\") {\n appendGrouped(agentItems, JSON.stringify([\"agent\"]), item)\n } else if (item.attribution?.kind === \"workflowAgent\") {\n appendGrouped(\n agentItems,\n JSON.stringify([\n \"workflowAgent\",\n item.attribution.workflowId,\n item.attribution.agentStepId,\n ]),\n item\n )\n }\n if (item.attribution?.kind === \"workflowAgent\" || item.attribution?.kind === \"workflow\") {\n appendGrouped(workflowItems, item.attribution.workflowId, item)\n }\n }\n\n const series: AiAccountingTimeBucket[] = periods.map((period) => ({\n ...period,\n ...aggregateAccountingItems(periodItems.get(period.start.getTime()) ?? []),\n }))\n const models: AiAccountingModelBreakdown[] = [...modelItems]\n .map(([key, grouped]) => {\n const [providerId, modelId] = JSON.parse(key) as [string, string]\n return { providerId, modelId, ...aggregateAccountingItems(grouped) }\n })\n .sort(compareModelBreakdowns)\n const agents: AiAccountingAgentBreakdown[] = [...agentItems]\n .map(([key, grouped]) => {\n const [kind, workflowId, agentStepId] = JSON.parse(key) as [\n \"agent\" | \"workflowAgent\",\n string?,\n string?,\n ]\n return kind === \"agent\"\n ? { kind, ...aggregateAccountingItems(grouped) }\n : {\n kind,\n workflowId: requiredFragmentString(workflowId, \"workflowId\"),\n agentStepId: requiredFragmentString(agentStepId, \"agentStepId\"),\n ...aggregateAccountingItems(grouped),\n }\n })\n .sort(compareAgentBreakdowns)\n const workflows: AiAccountingWorkflowBreakdown[] = [...workflowItems]\n .map(([workflowId, grouped]) => ({ workflowId, ...aggregateAccountingItems(grouped) }))\n .sort(compareWorkflowBreakdowns)\n\n return structuredClone({\n range: { from: query.from, to: query.to },\n bucket: input.bucket,\n totals: aggregateAccountingItems(items),\n series,\n models,\n agents,\n workflows,\n })\n}\n\nexport function buildAiAccountingOverviewFromFragments(\n input: QueryAiAccountingOverviewInput,\n fragments: Iterable<AiAccountingAggregateFragment>\n): AiAccountingOverview {\n const query = normalizeAiAccountingQuery(input)\n const periods = accountingPeriods(query.from, query.to, input.bucket)\n const totals = aggregateFragmentAccumulator()\n const series = new Map<number, AggregateFragmentAccumulator>(\n periods.map((period) => [period.start.getTime(), aggregateFragmentAccumulator()])\n )\n const models = new Map<string, AggregateFragmentAccumulator>()\n const agents = new Map<string, AggregateFragmentAccumulator>()\n const workflows = new Map<string, AggregateFragmentAccumulator>()\n\n for (const fragment of fragments) {\n let target: AggregateFragmentAccumulator\n switch (fragment.dimension) {\n case \"totals\":\n target = totals\n break\n case \"series\": {\n const start = requiredFragmentDate(fragment.start, \"series start\")\n const existing = series.get(start.getTime())\n if (!existing) {\n throw new TypeError(\"[Sixb] AI accounting SQL series returned an unexpected bucket.\")\n }\n target = existing\n break\n }\n case \"model\":\n target = getFragmentAccumulator(\n models,\n JSON.stringify([\n requiredFragmentString(fragment.providerId, \"providerId\"),\n requiredFragmentString(fragment.modelId, \"modelId\"),\n ])\n )\n break\n case \"agent\":\n target = getFragmentAccumulator(\n agents,\n JSON.stringify([\n requiredFragmentString(fragment.agentKind, \"agentKind\"),\n fragment.workflowId,\n fragment.agentStepId,\n ])\n )\n break\n case \"workflow\":\n target = getFragmentAccumulator(\n workflows,\n requiredFragmentString(fragment.workflowId, \"workflowId\")\n )\n break\n }\n appendAggregateFragment(target, fragment)\n }\n\n return structuredClone({\n range: { from: query.from, to: query.to },\n bucket: input.bucket,\n totals: finishAggregateFragment(totals),\n series: periods.map((period) => ({\n ...period,\n ...finishAggregateFragment(series.get(period.start.getTime())!),\n })),\n models: [...models]\n .map(([key, value]) => {\n const [providerId, modelId] = JSON.parse(key) as [string, string]\n return { providerId, modelId, ...finishAggregateFragment(value) }\n })\n .sort(compareModelBreakdowns),\n agents: [...agents]\n .map(([key, value]) => {\n const [kind, workflowId, agentStepId] = JSON.parse(key) as [\n \"agent\" | \"workflowAgent\",\n string?,\n string?,\n ]\n return kind === \"agent\"\n ? { kind, ...finishAggregateFragment(value) }\n : {\n kind,\n workflowId: requiredFragmentString(workflowId, \"workflowId\"),\n agentStepId: requiredFragmentString(agentStepId, \"agentStepId\"),\n ...finishAggregateFragment(value),\n }\n })\n .sort(compareAgentBreakdowns),\n workflows: [...workflows]\n .map(([workflowId, value]) => ({ workflowId, ...finishAggregateFragment(value) }))\n .sort(compareWorkflowBreakdowns),\n })\n}\n\nexport function buildAiModelCallAccountingList(\n input: ListAiModelCallAccountingInput,\n source: Iterable<AiAccountingRecordSetItem>\n): ListAiModelCallAccountingResult {\n const query = normalizeAiModelCallAccountingQuery(input)\n const { limit, offset } = query\n const items = Array.from(source)\n .filter((item) => aiAccountingItemMatchesQuery(item, query))\n .map(toAccountingItem)\n .filter(\n (item) =>\n (input.executionId === undefined || item.usage.executionId === input.executionId) &&\n (input.valuationStatus === undefined || item.valuationStatus === input.valuationStatus)\n )\n .sort(compareAccountingItems)\n const page = items.slice(offset, offset + limit)\n return structuredClone({\n items: page,\n hasMore: offset + page.length < items.length,\n total: items.length,\n })\n}\n\nexport function toAccountingItem(item: AiAccountingRecordSetItem): AiModelCallAccountingItem {\n return {\n usage: item.usage,\n ...(item.attribution === undefined ? {} : { attribution: item.attribution }),\n ...(item.cost === undefined ? {} : { cost: item.cost }),\n valuationStatus: item.cost?.status ?? \"unvalued\",\n }\n}\n\nexport function aiAccountingBucketStart(at: Date, bucket: AiAccountingBucket): Date {\n assertDate(at, \"accounting bucket timestamp\")\n assertAiAccountingBucket(bucket)\n const start = new Date(at)\n start.setUTCMinutes(0, 0, 0)\n if (bucket === \"hour\") return start\n start.setUTCHours(0)\n if (bucket === \"day\") return start\n const mondayOffset = (start.getUTCDay() + 6) % 7\n start.setUTCDate(start.getUTCDate() - mondayOffset)\n return start\n}\n\nfunction aggregateAccountingItems(\n items: readonly AiAccountingRecordSetItem[]\n): AiAccountingAggregate {\n const value = aggregateFragmentAccumulator()\n value.modelCallCount = BigInt(items.length)\n for (const item of items) {\n const usage = normalizeAiModelCallUsage(item.usage.usage)\n if (usage.reportingStatus !== \"unavailable\") value.reportedUsageCallCount += 1n\n if (usage.reportingStatus === \"complete\") value.completeUsageCallCount += 1n\n for (const field of AGGREGATE_USAGE_FIELDS) {\n if (usage[field] === undefined) continue\n value.usage[field].presentCallCount += 1n\n value.usage[field].total += BigInt(usage[field])\n }\n }\n return {\n modelCallCount: items.length,\n ...finishAggregateUsage(value),\n costs: aggregateCosts(items),\n }\n}\n\nfunction aggregateCosts(items: readonly AiAccountingRecordSetItem[]): AiCostSummary {\n const amounts = new Map<string, bigint>()\n let ratedCallCount = 0\n let unpriceableCallCount = 0\n let unvaluedCallCount = 0\n for (const item of items) {\n if (item.cost?.status === \"rated\") {\n ratedCallCount += 1\n addAmount(amounts, item.cost.money.currency, item.cost.money.amountNanos)\n } else if (item.cost?.status === \"unpriceable\") {\n unpriceableCallCount += 1\n } else {\n unvaluedCallCount += 1\n }\n }\n return {\n amounts: [...amounts]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amountNanos]) => ({ currency, amountNanos: amountNanos.toString() })),\n ratedCallCount,\n unpriceableCallCount,\n unvaluedCallCount,\n }\n}\n\nconst AGGREGATE_USAGE_FIELDS = [\n \"inputTokens\",\n \"outputTokens\",\n \"uncachedInputTokens\",\n \"cacheReadInputTokens\",\n \"cacheWriteInputTokens\",\n \"textOutputTokens\",\n \"reasoningOutputTokens\",\n] as const\n\ntype AggregateUsageField = (typeof AGGREGATE_USAGE_FIELDS)[number]\n\ninterface AggregateFragmentAccumulator {\n modelCallCount: bigint\n reportedUsageCallCount: bigint\n completeUsageCallCount: bigint\n usage: Record<AggregateUsageField, { presentCallCount: bigint; total: bigint }>\n amounts: Map<string, bigint>\n ratedCallCount: bigint\n unpriceableCallCount: bigint\n unvaluedCallCount: bigint\n}\n\nfunction aggregateFragmentAccumulator(): AggregateFragmentAccumulator {\n return {\n modelCallCount: 0n,\n reportedUsageCallCount: 0n,\n completeUsageCallCount: 0n,\n usage: Object.fromEntries(\n AGGREGATE_USAGE_FIELDS.map((field) => [field, { presentCallCount: 0n, total: 0n }])\n ) as AggregateFragmentAccumulator[\"usage\"],\n amounts: new Map(),\n ratedCallCount: 0n,\n unpriceableCallCount: 0n,\n unvaluedCallCount: 0n,\n }\n}\n\nfunction getFragmentAccumulator(\n values: Map<string, AggregateFragmentAccumulator>,\n key: string\n): AggregateFragmentAccumulator {\n const existing = values.get(key)\n if (existing) return existing\n const created = aggregateFragmentAccumulator()\n values.set(key, created)\n return created\n}\n\nfunction appendAggregateFragment(\n target: AggregateFragmentAccumulator,\n fragment: AiAccountingAggregateFragment\n): void {\n target.modelCallCount += naturalBigInt(fragment.modelCallCount, \"modelCallCount\")\n target.reportedUsageCallCount += naturalBigInt(\n fragment.usage.reportedCallCount,\n \"reported usage call count\"\n )\n target.completeUsageCallCount += naturalBigInt(\n fragment.usage.completeCallCount,\n \"complete usage call count\"\n )\n for (const field of AGGREGATE_USAGE_FIELDS) {\n const source = fragment.usage[field]\n const presentCallCount = naturalBigInt(source.presentCallCount, `${field} call count`)\n target.usage[field].presentCallCount += presentCallCount\n if (source.total !== null) {\n target.usage[field].total += naturalBigInt(source.total, `${field} total`)\n } else if (presentCallCount !== 0n) {\n throw new TypeError(`[Sixb] AI accounting SQL ${field} total is missing.`)\n }\n }\n target.ratedCallCount += naturalBigInt(fragment.costs.ratedCallCount, \"rated call count\")\n target.unpriceableCallCount += naturalBigInt(\n fragment.costs.unpriceableCallCount,\n \"unpriceable call count\"\n )\n target.unvaluedCallCount += naturalBigInt(fragment.costs.unvaluedCallCount, \"unvalued call count\")\n if (fragment.costs.amount) {\n addAmount(target.amounts, fragment.costs.amount.currency, fragment.costs.amount.amountNanos)\n }\n}\n\nfunction finishAggregateFragment(value: AggregateFragmentAccumulator): AiAccountingAggregate {\n const classifiedCallCount =\n value.ratedCallCount + value.unpriceableCallCount + value.unvaluedCallCount\n if (\n classifiedCallCount !== value.modelCallCount ||\n value.reportedUsageCallCount > value.modelCallCount ||\n value.completeUsageCallCount > value.reportedUsageCallCount ||\n AGGREGATE_USAGE_FIELDS.some(\n (field) => value.usage[field].presentCallCount > value.modelCallCount\n )\n ) {\n throw new TypeError(\"[Sixb] AI accounting SQL aggregate counts are inconsistent.\")\n }\n const modelCallCount = safeAggregateNumber(value.modelCallCount, \"model-call count\")\n return {\n modelCallCount,\n ...finishAggregateUsage(value),\n costs: {\n amounts: [...value.amounts]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amountNanos]) => ({ currency, amountNanos: amountNanos.toString() })),\n ratedCallCount: safeAggregateNumber(value.ratedCallCount, \"rated call count\"),\n unpriceableCallCount: safeAggregateNumber(\n value.unpriceableCallCount,\n \"unpriceable call count\"\n ),\n unvaluedCallCount: safeAggregateNumber(value.unvaluedCallCount, \"unvalued call count\"),\n },\n }\n}\n\nfunction finishAggregateUsage(\n value: AggregateFragmentAccumulator\n): Pick<AiAccountingAggregate, \"usage\" | \"usageCoverage\"> {\n const counts: Partial<Record<AggregateUsageField | \"totalTokens\", number>> = {}\n const fieldCallCounts = {} as Record<AggregateUsageField, number>\n for (const field of AGGREGATE_USAGE_FIELDS) {\n const aggregate = value.usage[field]\n fieldCallCounts[field] = safeAggregateNumber(aggregate.presentCallCount, `${field} call count`)\n if (aggregate.presentCallCount > 0n) {\n counts[field] = safeAggregateNumber(aggregate.total, field)\n }\n }\n // Only the top-level meters contribute: cache/reasoning partitions overlap them.\n if (counts.inputTokens !== undefined || counts.outputTokens !== undefined) {\n counts.totalTokens = safeAggregateNumber(\n value.usage.inputTokens.total + value.usage.outputTokens.total,\n \"totalTokens\"\n )\n }\n return {\n usage: {\n ...counts,\n reportingStatus:\n value.reportedUsageCallCount === 0n\n ? \"unavailable\"\n : value.completeUsageCallCount === value.modelCallCount\n ? \"complete\"\n : \"partial\",\n },\n usageCoverage: {\n completeCallCount: safeAggregateNumber(value.completeUsageCallCount, \"complete call count\"),\n fieldCallCounts,\n },\n }\n}\n\nfunction naturalBigInt(value: string, field: string): bigint {\n if (!/^(0|[1-9]\\d*)$/.test(value)) {\n throw new TypeError(`[Sixb] AI accounting SQL ${field} must be a natural integer.`)\n }\n return BigInt(value)\n}\n\nfunction safeAggregateNumber(value: bigint, field: string): number {\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new TypeError(`[Sixb] AI accounting ${field} exceeds the safe integer range.`)\n }\n return Number(value)\n}\n\nfunction requiredFragmentString(value: string | undefined, field: string): string {\n if (value === undefined || value.length === 0) {\n throw new TypeError(`[Sixb] AI accounting SQL ${field} is missing.`)\n }\n return value\n}\n\nfunction requiredFragmentDate(value: Date | undefined, field: string): Date {\n if (value === undefined) throw new TypeError(`[Sixb] AI accounting SQL ${field} is missing.`)\n assertDate(value, field)\n return value\n}\n\nfunction accountingPeriods(\n from: Date,\n to: Date,\n bucket: AiAccountingBucket\n): Array<{ start: Date; end: Date }> {\n const result: Array<{ start: Date; end: Date }> = []\n let cursor = aiAccountingBucketStart(from, bucket)\n while (cursor.getTime() < to.getTime()) {\n if (result.length >= MAX_CHART_BUCKETS) {\n throw new RangeError(`[Sixb] AI accounting query exceeds ${MAX_CHART_BUCKETS} chart buckets.`)\n }\n const next = nextBucket(cursor, bucket)\n result.push({ start: new Date(cursor), end: next })\n cursor = next\n }\n return result\n}\n\nfunction nextBucket(start: Date, bucket: AiAccountingBucket): Date {\n const next = new Date(start)\n if (bucket === \"hour\") next.setUTCHours(next.getUTCHours() + 1)\n else if (bucket === \"day\") next.setUTCDate(next.getUTCDate() + 1)\n else next.setUTCDate(next.getUTCDate() + 7)\n return next\n}\n\nfunction appendGrouped(\n groups: Map<string, AiAccountingRecordSetItem[]>,\n key: string,\n item: AiAccountingRecordSetItem\n): void {\n const existing = groups.get(key)\n if (existing) existing.push(item)\n else groups.set(key, [item])\n}\n\nfunction addAmount(amounts: Map<string, bigint>, currency: string, amountNanos: string): void {\n amounts.set(currency, (amounts.get(currency) ?? 0n) + BigInt(amountNanos))\n}\n\nfunction normalizePage(\n requestedLimit: number | undefined,\n requestedOffset: number | undefined\n): { limit: number; offset: number } {\n const limit = requestedLimit ?? DEFAULT_MODEL_CALL_PAGE_SIZE\n const offset = requestedOffset ?? 0\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_MODEL_CALL_PAGE_SIZE) {\n throw new TypeError(\n `[Sixb] AI accounting list limit must be an integer between 1 and ${MAX_MODEL_CALL_PAGE_SIZE}.`\n )\n }\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new TypeError(\"[Sixb] AI accounting list offset must be a non-negative integer.\")\n }\n return { limit, offset }\n}\n\nfunction compareAccountingItems(\n left: AiModelCallAccountingItem,\n right: AiModelCallAccountingItem\n): number {\n return (\n right.usage.occurredAt.getTime() - left.usage.occurredAt.getTime() ||\n left.usage.id.localeCompare(right.usage.id)\n )\n}\n\nfunction compareAgentBreakdowns(\n left: AiAccountingAgentBreakdown,\n right: AiAccountingAgentBreakdown\n): number {\n return (\n right.modelCallCount - left.modelCallCount ||\n agentBreakdownKey(left).localeCompare(agentBreakdownKey(right))\n )\n}\n\nfunction agentBreakdownKey(value: AiAccountingAgentBreakdown): string {\n return value.kind === \"agent\"\n ? \"agent\"\n : JSON.stringify([\"workflowAgent\", value.workflowId, value.agentStepId])\n}\n\nfunction compareWorkflowBreakdowns(\n left: AiAccountingWorkflowBreakdown,\n right: AiAccountingWorkflowBreakdown\n): number {\n return (\n right.modelCallCount - left.modelCallCount || left.workflowId.localeCompare(right.workflowId)\n )\n}\n\nfunction compareModelBreakdowns(\n left: AiAccountingModelBreakdown,\n right: AiAccountingModelBreakdown\n): number {\n return (\n right.modelCallCount - left.modelCallCount ||\n left.providerId.localeCompare(right.providerId) ||\n left.modelId.localeCompare(right.modelId)\n )\n}\n\nfunction assertAiAccountingBucket(bucket: AiAccountingBucket): void {\n if (bucket !== \"hour\" && bucket !== \"day\" && bucket !== \"week\") {\n throw new TypeError(\"[Sixb] AI accounting bucket must be hour, day, or week.\")\n }\n}\n\nfunction assertDate(value: Date, label: string): void {\n if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {\n throw new TypeError(`[Sixb] AI ${label} must be a valid Date.`)\n }\n}\n\nfunction assertNonBlank(value: string, label: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI ${label} must be nonblank.`)\n }\n}\n",
|
|
8
|
-
"import type { AiAccountingAttribution } from \"./types\"\n\n/** Direct calls are identified by durable provenance, even when their run has been removed. */\nexport function directModelCallAttribution(\n kind: string | null,\n id: string | null,\n primitiveId: string | null\n): AiAccountingAttribution | undefined {\n if (!id) return undefined\n if (kind === \"request\") return { kind, requestId: id }\n if (kind === \"action\" && primitiveId) return { kind, actionId: primitiveId, actionRunId: id }\n if (kind === \"workflow\" && primitiveId)\n return { kind, workflowId: primitiveId, workflowRunId: id }\n return undefined\n}\n",
|
|
9
|
-
"import type { AiAccountingRecordSetItem } from \"./analytics\"\nimport { aiAccountingItemMatchesQuery, normalizeAiModelCallAccountingQuery } from \"./analytics\"\nimport { directModelCallAttribution } from \"./attribution\"\nimport type {\n AiAccountingAttribution,\n AiBillingIdentity,\n AiCostSummary,\n AiModelCallExecutionSummary,\n AiModelCallGroup,\n AiModelCallGroupSummary,\n AiMoney,\n ListAiModelCallGroupsInput,\n ListAiModelCallGroupsResult,\n} from \"./types\"\n\nexport interface AiAccountingGroupIdentity {\n readonly executionId: string\n readonly attribution?: AiAccountingAttribution\n}\n\n/** A compact SQL aggregate, never the raw provider response or a page of individual calls. */\nexport interface AiModelCallGroupFragment {\n readonly root: AiAccountingGroupIdentity\n readonly execution: AiAccountingGroupIdentity\n readonly model: AiBillingIdentity\n readonly firstCallAt: Date\n readonly lastCallAt: Date\n readonly callCount: string\n readonly tokenCount: string\n readonly totalTokens: string | null\n readonly valuationStatus: \"rated\" | \"unpriceable\" | \"unvalued\"\n readonly money?: AiMoney\n}\n\n/** Common provider projection; SQL groups meters before returning rows to the runtime. */\nexport interface AiModelCallGroupRow {\n readonly root_execution_id: string\n readonly execution_id: string\n readonly provider_id: string\n readonly requested_model_id: string\n readonly first_call_at: Date | string\n readonly last_call_at: Date | string\n readonly call_count: string\n readonly token_count: string\n readonly total_tokens: string | null\n readonly valuation_status: AiModelCallGroupFragment[\"valuationStatus\"]\n readonly amount_currency: string | null\n readonly amount_high: string | null\n readonly amount_middle: string | null\n readonly amount_low: string | null\n readonly root_agent_run_id: string | null\n readonly root_thread_id: string | null\n readonly direct_kind: string | null\n readonly direct_run_id: string | null\n readonly parent_run_id: string | null\n readonly workflow_agent_step_id: string | null\n readonly workflow_node_run_id: string | null\n readonly workflow_id: string | null\n readonly workflow_run_id: string | null\n readonly executor_kind: string | null\n readonly executor_id: string | null\n readonly primitive_id: string | null\n}\n\nexport function aiModelCallGroupFragmentFromRow(\n row: AiModelCallGroupRow\n): AiModelCallGroupFragment {\n let attribution = directModelCallAttribution(row.executor_kind, row.executor_id, row.primitive_id)\n if (row.root_agent_run_id && row.root_thread_id) {\n attribution = {\n kind: \"agent\",\n agentRunId: row.root_agent_run_id,\n threadId: row.root_thread_id,\n }\n } else if (\n row.workflow_agent_step_id &&\n row.workflow_node_run_id &&\n row.workflow_id &&\n row.workflow_run_id\n ) {\n attribution = {\n kind: \"workflowAgent\",\n agentStepId: row.workflow_agent_step_id,\n nodeRunId: row.workflow_node_run_id,\n workflowId: row.workflow_id,\n workflowRunId: row.workflow_run_id,\n }\n }\n const executionAttribution: AiAccountingAttribution | undefined =\n row.direct_kind === \"subagent\" && row.direct_run_id && row.parent_run_id\n ? { kind: \"subagent\", subagentRunId: row.direct_run_id, parentRunId: row.parent_run_id }\n : attribution\n return {\n root: { executionId: row.root_execution_id, attribution },\n execution: { executionId: row.execution_id, attribution: executionAttribution },\n model: { providerId: row.provider_id, modelId: row.requested_model_id },\n firstCallAt: new Date(row.first_call_at),\n lastCallAt: new Date(row.last_call_at),\n callCount: row.call_count,\n tokenCount: row.token_count,\n totalTokens: row.total_tokens,\n valuationStatus: row.valuation_status,\n ...(row.amount_currency === null\n ? {}\n : {\n money: {\n currency: row.amount_currency,\n amountNanos: (\n BigInt(row.amount_high ?? \"0\") * 1_000_000_000_000n +\n BigInt(row.amount_middle ?? \"0\") * 1_000_000n +\n BigInt(row.amount_low ?? \"0\")\n ).toString(),\n },\n }),\n }\n}\n\nexport function buildAiModelCallGroupsFromFragments(\n fragments: readonly AiModelCallGroupFragment[]\n): readonly AiModelCallGroup[] {\n const roots = new Map<string, AiModelCallGroupFragment[]>()\n for (const fragment of fragments) append(roots, fragment.root.executionId, fragment)\n return [...roots.values()]\n .map((rootFragments): AiModelCallGroup => {\n const first = rootFragments[0]!\n const executions = new Map<string, AiModelCallGroupFragment[]>()\n for (const fragment of rootFragments)\n append(executions, fragment.execution.executionId, fragment)\n return {\n ...first.root,\n ...summarize(rootFragments),\n ...timeRange(rootFragments),\n executions: [...executions.values()]\n .map(\n (items): AiModelCallExecutionSummary => ({\n ...items[0]!.execution,\n ...summarize(items),\n ...timeRange(items),\n models: [\n ...new Map(items.map(({ model }) => [JSON.stringify(model), model])).values(),\n ].sort(\n (a, b) =>\n compareText(a.providerId, b.providerId) || compareText(a.modelId, b.modelId)\n ),\n })\n )\n .sort(\n (a, b) =>\n a.firstCallAt.getTime() - b.firstCallAt.getTime() ||\n compareText(a.executionId, b.executionId)\n ),\n }\n })\n .sort(\n (a, b) =>\n b.lastCallAt.getTime() - a.lastCallAt.getTime() || compareText(a.executionId, b.executionId)\n )\n}\n\nexport function buildAiModelCallGroups(\n input: ListAiModelCallGroupsInput,\n source: readonly (AiAccountingRecordSetItem & { readonly root: AiAccountingGroupIdentity })[]\n): ListAiModelCallGroupsResult {\n const query = normalizeAiModelCallAccountingQuery(input)\n const fragments = source\n .filter(\n (item) =>\n aiAccountingItemMatchesQuery(item, query) &&\n (query.valuationStatus === undefined ||\n (item.cost?.status ?? \"unvalued\") === query.valuationStatus)\n )\n .map(\n (item): AiModelCallGroupFragment => ({\n root: item.root,\n execution: { executionId: item.usage.executionId, attribution: item.attribution },\n model: { providerId: item.usage.providerId, modelId: item.usage.requestedModelId },\n firstCallAt: item.usage.occurredAt,\n lastCallAt: item.usage.occurredAt,\n callCount: \"1\",\n tokenCount: item.usage.usage.totalTokens === undefined ? \"0\" : \"1\",\n totalTokens: item.usage.usage.totalTokens?.toString() ?? null,\n valuationStatus: item.cost?.status ?? \"unvalued\",\n ...(item.cost && item.cost.status !== \"unpriceable\" ? { money: item.cost.money } : {}),\n })\n )\n const groups = buildAiModelCallGroupsFromFragments(fragments)\n const items = groups.slice(query.offset, query.offset + query.limit)\n return structuredClone({\n items,\n total: groups.length,\n hasMore: query.offset + items.length < groups.length,\n })\n}\n\nfunction summarize(items: readonly AiModelCallGroupFragment[]): AiModelCallGroupSummary {\n let calls = 0n\n let tokenCount = 0n\n let tokens = 0n\n const counts = { rated: 0n, unpriceable: 0n, unvalued: 0n }\n const money = new Map<string, bigint>()\n for (const item of items) {\n const count = BigInt(item.callCount)\n calls += count\n tokenCount += BigInt(item.tokenCount)\n tokens += BigInt(item.totalTokens ?? \"0\")\n counts[item.valuationStatus] += count\n if (item.money)\n money.set(\n item.money.currency,\n (money.get(item.money.currency) ?? 0n) + BigInt(item.money.amountNanos)\n )\n }\n const costs: AiCostSummary = {\n amounts: [...money]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([currency, amount]) => ({ currency, amountNanos: amount.toString() })),\n ratedCallCount: safeCount(counts.rated),\n unpriceableCallCount: safeCount(counts.unpriceable),\n unvaluedCallCount: safeCount(counts.unvalued),\n }\n return {\n modelCallCount: safeCount(calls),\n ...(calls === tokenCount ? { totalTokens: safeCount(tokens) } : {}),\n costs,\n }\n}\n\nfunction timeRange(items: readonly AiModelCallGroupFragment[]) {\n let first = items[0]!.firstCallAt.getTime()\n let last = items[0]!.lastCallAt.getTime()\n for (const item of items) {\n first = Math.min(first, item.firstCallAt.getTime())\n last = Math.max(last, item.lastCallAt.getTime())\n }\n return { firstCallAt: new Date(first), lastCallAt: new Date(last) }\n}\n\nfunction compareText(a: string, b: string): number {\n return a === b ? 0 : a < b ? -1 : 1\n}\n\nfunction safeCount(value: bigint): number {\n if (value < 0n || value > BigInt(Number.MAX_SAFE_INTEGER))\n throw new RangeError(\"[Sixb] AI accounting group count exceeds the safe integer range.\")\n return Number(value)\n}\n\nfunction append<T>(map: Map<string, T[]>, key: string, item: T): void {\n const items = map.get(key)\n if (items) items.push(item)\n else map.set(key, [item])\n}\n",
|
|
10
|
-
"import { assertJsonObject } from \"../../json\"\nimport type { AiModelCallUsage, AiModelCallUsageRecord } from \"../ai-usage\"\nimport { normalizeAiModelCallUsage } from \"../ai-usage\"\nimport type {\n AiBillableMeter,\n AiBillingIdentity,\n AiCostComponent,\n AiCostEstimate,\n AiModelCallCostRecord,\n AiPriceSource,\n AiPricingContext,\n AiRatedModelCallCostRecord,\n AiUnpriceableModelCallCostRecord,\n AiUnpriceableReason,\n} from \"./types\"\n\nconst SIGNED_INT64_MAX = 9_223_372_036_854_775_807n\nconst TOKENS_PER_MILLION = 1_000_000n\nconst HALF_MILLION = TOKENS_PER_MILLION / 2n\nconst MAX_NUMERIC_TEXT_LENGTH = 128\nconst METER_ORDER: Readonly<Record<AiBillableMeter, number>> = {\n \"tokens.input.total\": 0,\n \"tokens.input.uncached\": 1,\n \"tokens.input.cacheRead\": 2,\n \"tokens.input.cacheWrite\": 3,\n \"tokens.input.cacheWrite5m\": 4,\n \"tokens.input.cacheWrite1h\": 5,\n \"tokens.output.total\": 6,\n \"tokens.output.text\": 7,\n \"tokens.output.reasoning\": 8,\n}\nconst METERS = new Set(Object.keys(METER_ORDER) as AiBillableMeter[])\nconst UNPRICEABLE_REASONS = new Set<AiUnpriceableReason>([\n \"missingBillingIdentity\",\n \"missingRateCard\",\n \"missingUsageMeter\",\n \"unsupportedPricingDimension\",\n \"invalidUsageForFormula\",\n])\nconst CONTEXT_STRING_FIELDS = [\n \"serviceTier\",\n \"region\",\n \"inferenceGeo\",\n \"routedProviderId\",\n \"routedModelId\",\n \"deploymentId\",\n \"inferenceProfileId\",\n \"mode\",\n] as const\n\nexport function normalizeAiPricingContext(input: AiPricingContext): AiPricingContext {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new TypeError(\"[Sixb] AI pricing context must be an object.\")\n }\n const result: Record<string, string | boolean | number> = {}\n for (const field of CONTEXT_STRING_FIELDS) {\n const value = input[field]\n if (value !== undefined) {\n assertNonBlank(value, `pricingContext.${field}`)\n result[field] = value\n }\n }\n if (input.batch !== undefined) {\n if (typeof input.batch !== \"boolean\") {\n throw new TypeError(\"[Sixb] AI pricingContext.batch must be boolean.\")\n }\n result.batch = input.batch\n }\n if (input.cacheWriteTtlSeconds !== undefined) {\n if (!Number.isSafeInteger(input.cacheWriteTtlSeconds) || input.cacheWriteTtlSeconds <= 0) {\n throw new TypeError(\n \"[Sixb] AI pricingContext.cacheWriteTtlSeconds must be a positive safe integer.\"\n )\n }\n result.cacheWriteTtlSeconds = input.cacheWriteTtlSeconds\n }\n return result\n}\n\nexport function normalizeAiModelCallCostRecord(\n input: AiModelCallCostRecord\n): AiModelCallCostRecord {\n assertNonBlank(input.projectId, \"cost record projectId\")\n assertNonBlank(input.usageRecordId, \"cost record usageRecordId\")\n const base = {\n ...(input.estimate === undefined ? {} : { estimate: normalizeAiCostEstimate(input.estimate) }),\n projectId: input.projectId,\n usageRecordId: input.usageRecordId,\n pricingContext: normalizeAiPricingContext(input.pricingContext),\n ratedAt: cloneDate(input.ratedAt, \"cost record ratedAt\"),\n }\n\n if (input.status === \"rated\") {\n return normalizeRatedCost(input, {\n ...base,\n priceSource: normalizePriceSource(input.priceSource),\n })\n }\n if (input.status === \"unpriceable\") {\n return normalizeUnpriceableCost(input, {\n ...base,\n ...(input.priceSource === undefined\n ? {}\n : { priceSource: normalizePriceSource(input.priceSource) }),\n })\n }\n throw new TypeError(\"[Sixb] AI cost status is invalid.\")\n}\n\n/** Verify that a normalized valuation's billed quantities describe its usage record. */\nexport function aiModelCallCostMatchesUsage(\n record: AiModelCallCostRecord,\n usageRecord: AiModelCallUsageRecord\n): boolean {\n if (record.projectId !== usageRecord.projectId || record.usageRecordId !== usageRecord.id) {\n return false\n }\n if (record.estimate?.status === \"rated\") {\n const usage = normalizeAiModelCallUsage(usageRecord.usage)\n const components = new Map(\n record.estimate.components.map((component) => [component.meter, component])\n )\n if (\n !inputComponentsMatchUsage(components, usage) ||\n !outputComponentsMatchUsage(components, usage)\n )\n return false\n }\n if (record.status === \"unpriceable\") return true\n if (record.components.length === 0 && isExternalValuationSource(record.priceSource.sourceId)) {\n return true\n }\n\n const usage = normalizeAiModelCallUsage(usageRecord.usage)\n const components = new Map(record.components.map((component) => [component.meter, component]))\n return (\n inputComponentsMatchUsage(components, usage) && outputComponentsMatchUsage(components, usage)\n )\n}\n\nfunction inputComponentsMatchUsage(\n components: ReadonlyMap<AiBillableMeter, AiCostComponent>,\n usage: AiModelCallUsage\n): boolean {\n if (usage.inputTokens === undefined) return false\n const total = components.get(\"tokens.input.total\")\n const directPartitions = [\n [\"tokens.input.uncached\", usage.uncachedInputTokens],\n [\"tokens.input.cacheRead\", usage.cacheReadInputTokens],\n [\"tokens.input.cacheWrite\", usage.cacheWriteInputTokens],\n ] as const\n const presentDirect = directPartitions.filter(([meter]) => components.has(meter))\n const specificWrites = [\n components.get(\"tokens.input.cacheWrite5m\"),\n components.get(\"tokens.input.cacheWrite1h\"),\n ].filter((component): component is AiCostComponent => component !== undefined)\n\n if (total) {\n return (\n presentDirect.length === 0 &&\n specificWrites.length === 0 &&\n BigInt(total.quantity) === BigInt(usage.inputTokens)\n )\n }\n if (presentDirect.length === 0 && specificWrites.length === 0) return false\n if (components.has(\"tokens.input.cacheWrite\") && specificWrites.length > 0) return false\n\n let quantity = 0n\n for (const [meter, expected] of presentDirect) {\n if (expected === undefined) return false\n const component = components.get(meter)!\n if (BigInt(component.quantity) !== BigInt(expected)) return false\n quantity += BigInt(component.quantity)\n }\n if (specificWrites.length > 0) {\n if (usage.cacheWriteInputTokens === undefined) return false\n const specificWriteQuantity = specificWrites.reduce(\n (sum, component) => sum + BigInt(component.quantity),\n 0n\n )\n if (specificWriteQuantity !== BigInt(usage.cacheWriteInputTokens)) return false\n quantity += specificWriteQuantity\n }\n return quantity === BigInt(usage.inputTokens)\n}\n\nfunction outputComponentsMatchUsage(\n components: ReadonlyMap<AiBillableMeter, AiCostComponent>,\n usage: AiModelCallUsage\n): boolean {\n if (usage.outputTokens === undefined) return false\n const total = components.get(\"tokens.output.total\")\n const partitions = [\n [\"tokens.output.text\", usage.textOutputTokens],\n [\"tokens.output.reasoning\", usage.reasoningOutputTokens],\n ] as const\n const presentPartitions = partitions.filter(([meter]) => components.has(meter))\n\n if (total) {\n return presentPartitions.length === 0 && BigInt(total.quantity) === BigInt(usage.outputTokens)\n }\n if (presentPartitions.length === 0) return false\n\n let quantity = 0n\n for (const [meter, expected] of presentPartitions) {\n if (expected === undefined) return false\n const component = components.get(meter)!\n if (BigInt(component.quantity) !== BigInt(expected)) return false\n quantity += BigInt(component.quantity)\n }\n return quantity === BigInt(usage.outputTokens)\n}\n\nfunction normalizeRatedCost(\n input: AiRatedModelCallCostRecord,\n base: Pick<\n AiRatedModelCallCostRecord,\n \"projectId\" | \"usageRecordId\" | \"pricingContext\" | \"priceSource\" | \"ratedAt\"\n >\n): AiRatedModelCallCostRecord {\n const billingIdentity = normalizeBillingIdentity(input.billingIdentity)\n const components = input.components.map(normalizeCostComponent).sort(compareComponents)\n if (components.length === 0 && !isExternalValuationSource(base.priceSource.sourceId)) {\n throw new TypeError(\"[Sixb] AI rated cost requires components.\")\n }\n if (new Set(components.map((component) => component.meter)).size !== components.length) {\n throw new TypeError(\"[Sixb] AI rated cost cannot contain duplicate meters.\")\n }\n const amountNanos = parseNonnegativeInt64(input.money.amountNanos, \"money amountNanos\").toString()\n if (components.length > 0 && amountNanos !== sumComponents(components)) {\n throw new TypeError(\"[Sixb] AI cost total does not equal its component charges.\")\n }\n return {\n ...base,\n status: \"rated\",\n billingIdentity,\n money: { currency: normalizeCurrency(input.money.currency), amountNanos },\n components,\n }\n}\n\nexport function normalizeAiCostEstimate(value: unknown): AiCostEstimate {\n assertJsonObject(value, \"AI cost estimate\")\n if (value.status === \"rated\") {\n assertJsonObject(value.money, \"estimate money\")\n const { currency, amountNanos } = value.money\n if (\n typeof currency !== \"string\" ||\n typeof amountNanos !== \"string\" ||\n !Array.isArray(value.components)\n )\n throw new TypeError(\"[Sixb] Invalid cost estimate money or components.\")\n const components = value.components\n .map((component) => {\n assertJsonObject(component, \"estimate component\")\n const meter = [...METERS].find((meter) => meter === component.meter)\n if (\n !meter ||\n typeof component.quantity !== \"string\" ||\n typeof component.rateAmountNanosPerMillion !== \"string\" ||\n typeof component.chargeAmountNanos !== \"string\"\n )\n throw new TypeError(\"[Sixb] Invalid cost estimate component.\")\n return normalizeCostComponent({\n meter,\n quantity: component.quantity,\n rateAmountNanosPerMillion: component.rateAmountNanosPerMillion,\n chargeAmountNanos: component.chargeAmountNanos,\n })\n })\n .sort(compareComponents)\n if (\n !components.length ||\n new Set(components.map((c) => c.meter)).size !== components.length ||\n parseNonnegativeInt64(amountNanos, \"estimate amountNanos\").toString() !==\n sumComponents(components)\n )\n throw new TypeError(\n \"[Sixb] Estimate must contain unique meters whose charges equal its total.\"\n )\n return {\n status: \"rated\",\n money: { currency: normalizeCurrency(currency), amountNanos },\n components,\n }\n }\n const reason = [...UNPRICEABLE_REASONS].find((reason) => reason === value.reason)\n if (value.status !== \"unpriceable\" || !reason)\n throw new TypeError(\"[Sixb] Invalid cost estimate status or reason.\")\n let missingMeters: readonly AiBillableMeter[] | undefined\n if (value.missingMeters !== undefined) {\n if (!Array.isArray(value.missingMeters))\n throw new TypeError(\"[Sixb] Invalid estimate missing meters.\")\n missingMeters = normalizeMissingMeters(\n value.missingMeters.map((input) => {\n const meter = [...METERS].find((meter) => meter === input)\n if (!meter) throw new TypeError(\"[Sixb] Invalid estimate missing meter.\")\n return meter\n })\n )\n }\n if (reason === \"missingUsageMeter\" && !missingMeters)\n throw new TypeError(\"[Sixb] Missing usage estimate requires missingMeters.\")\n return {\n status: \"unpriceable\",\n reason,\n ...(missingMeters === undefined ? {} : { missingMeters }),\n }\n}\n\nfunction isExternalValuationSource(sourceId: string): boolean {\n return sourceId === \"provider-reported\"\n}\n\nfunction normalizeUnpriceableCost(\n input: AiUnpriceableModelCallCostRecord,\n base: Pick<\n AiUnpriceableModelCallCostRecord,\n \"projectId\" | \"usageRecordId\" | \"pricingContext\" | \"priceSource\" | \"ratedAt\"\n >\n): AiUnpriceableModelCallCostRecord {\n if (!UNPRICEABLE_REASONS.has(input.reason)) {\n throw new TypeError(`[Sixb] AI unpriceable reason '${String(input.reason)}' is invalid.`)\n }\n const billingIdentity = input.billingIdentity\n ? normalizeBillingIdentity(input.billingIdentity)\n : undefined\n if (input.reason === \"missingBillingIdentity\" && billingIdentity !== undefined) {\n throw new TypeError(\"[Sixb] AI missingBillingIdentity cannot contain a billing identity.\")\n }\n if (input.reason !== \"missingBillingIdentity\" && billingIdentity === undefined) {\n throw new TypeError(`[Sixb] AI ${input.reason} requires a billing identity.`)\n }\n const missingMeters = normalizeMissingMeters(input.missingMeters)\n if (input.reason === \"missingUsageMeter\" && !missingMeters) {\n throw new TypeError(\"[Sixb] AI missingUsageMeter requires missingMeters.\")\n }\n return {\n ...base,\n status: \"unpriceable\",\n ...(billingIdentity ? { billingIdentity } : {}),\n reason: input.reason,\n ...(missingMeters ? { missingMeters } : {}),\n }\n}\n\nfunction normalizeCostComponent(input: AiCostComponent): AiCostComponent {\n if (!METERS.has(input.meter)) {\n throw new TypeError(`[Sixb] AI cost meter '${String(input.meter)}' is invalid.`)\n }\n const expected = calculateComponent(input.meter, input.quantity, input.rateAmountNanosPerMillion)\n if (expected.chargeAmountNanos !== input.chargeAmountNanos) {\n throw new TypeError(`[Sixb] AI cost component '${input.meter}' charge is invalid.`)\n }\n return expected\n}\n\nfunction calculateComponent(\n meter: AiBillableMeter,\n quantity: number | string,\n rateAmountNanosPerMillion: string\n): AiCostComponent {\n const normalizedQuantity = parseQuantity(quantity, `${meter} quantity`)\n const rate = parseNonnegativeInt64(rateAmountNanosPerMillion, `${meter} rate`)\n const charge = (normalizedQuantity * rate + HALF_MILLION) / TOKENS_PER_MILLION\n assertSignedInt64(charge, `${meter} charge`)\n return {\n meter,\n quantity: normalizedQuantity.toString(),\n rateAmountNanosPerMillion: rate.toString(),\n chargeAmountNanos: charge.toString(),\n }\n}\n\nfunction normalizePriceSource(input: AiPriceSource): AiPriceSource {\n assertNonBlank(input.sourceId, \"price sourceId\")\n assertNonBlank(input.sourceEntryId, \"price sourceEntryId\")\n assertNonBlank(input.sourceVersion, \"price sourceVersion\")\n if (input.sourceUrl !== undefined) assertNonBlank(input.sourceUrl, \"price sourceUrl\")\n return {\n sourceId: input.sourceId,\n sourceEntryId: input.sourceEntryId,\n sourceVersion: input.sourceVersion,\n ...(input.sourceUrl === undefined ? {} : { sourceUrl: input.sourceUrl }),\n observedAt: cloneDate(input.observedAt, \"price source observedAt\"),\n }\n}\n\nfunction normalizeBillingIdentity(input: AiBillingIdentity): AiBillingIdentity {\n assertNonBlank(input.providerId, \"billingIdentity.providerId\")\n assertNonBlank(input.modelId, \"billingIdentity.modelId\")\n return { providerId: input.providerId, modelId: input.modelId }\n}\n\nfunction normalizeMissingMeters(\n input: readonly AiBillableMeter[] | undefined\n): readonly AiBillableMeter[] | undefined {\n if (!input?.length) return undefined\n const result = [...new Set(input)]\n for (const meter of result) {\n if (!METERS.has(meter)) throw new TypeError(`[Sixb] AI missing meter '${meter}' is invalid.`)\n }\n return result.sort((left, right) => METER_ORDER[left] - METER_ORDER[right])\n}\n\nfunction sumComponents(components: readonly AiCostComponent[]): string {\n let total = 0n\n for (const component of components) {\n total += parseNonnegativeInt64(component.chargeAmountNanos, \"component charge\")\n assertSignedInt64(total, \"cost total\")\n }\n return total.toString()\n}\n\nfunction parseQuantity(value: number | string, field: string): bigint {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`[Sixb] AI ${field} must be a non-negative safe integer.`)\n }\n return BigInt(value)\n }\n return parseNonnegativeInt64(value, field)\n}\n\nfunction parseNonnegativeInt64(value: string, field: string): bigint {\n if (\n typeof value !== \"string\" ||\n value.length === 0 ||\n value.length > MAX_NUMERIC_TEXT_LENGTH ||\n !/^\\d+$/.test(value)\n ) {\n throw new TypeError(`[Sixb] AI ${field} must be a non-negative integer string.`)\n }\n const parsed = BigInt(value)\n assertSignedInt64(parsed, field)\n return parsed\n}\n\nfunction compareComponents(left: AiCostComponent, right: AiCostComponent): number {\n return METER_ORDER[left.meter] - METER_ORDER[right.meter]\n}\n\nfunction normalizeCurrency(value: string): string {\n if (!/^[A-Z]{3}$/.test(value)) {\n throw new TypeError(\"[Sixb] AI currency must be a three-letter uppercase code.\")\n }\n return value\n}\n\nfunction assertSignedInt64(value: bigint, field: string): void {\n if (value < 0n || value > SIGNED_INT64_MAX) {\n throw new TypeError(`[Sixb] AI ${field} exceeds the signed 64-bit range.`)\n }\n}\n\nfunction assertNonBlank(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI ${field} must be nonblank.`)\n }\n}\n\nfunction cloneDate(value: Date, field: string): Date {\n if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {\n throw new TypeError(`[Sixb] AI ${field} must be a valid Date.`)\n }\n return new Date(value)\n}\n"
|
|
11
|
-
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "09D39788C52B304E64756E2164756E21",
|
|
14
|
-
"names": []
|
|
15
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { MaterializationPlanChunk, MaterializationPlanWorkItem, OntologyOutboxWrite } from "../../storage/ontology";
|
|
2
|
-
import type { MaterializationBatching } from "../shared/batching";
|
|
3
|
-
export type MaterializationPlanItem = MaterializationPlanWorkItem | {
|
|
4
|
-
readonly kind: "outbox";
|
|
5
|
-
readonly value: OntologyOutboxWrite;
|
|
6
|
-
};
|
|
7
|
-
export declare function planStream(items: Iterable<MaterializationPlanItem> | AsyncIterable<MaterializationPlanItem>, batching: MaterializationBatching): AsyncIterable<MaterializationPlanChunk>;
|
|
8
|
-
//# sourceMappingURL=plan-stream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan-stream.d.ts","sourceRoot":"","sources":["../../../src/materializer/execution/plan-stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAYV,wBAAwB,EACxB,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAGjE,MAAM,MAAM,uBAAuB,GAC/B,2BAA2B,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAA;AAEpE,wBAAuB,UAAU,CAC/B,KAAK,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,aAAa,CAAC,uBAAuB,CAAC,EACjF,QAAQ,EAAE,uBAAuB,GAChC,aAAa,CAAC,wBAAwB,CAAC,CAUzC"}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { utf8JsonByteLength } from "../../materialization/refs"
|
|
2
|
-
import type {
|
|
3
|
-
ExactEffectiveLinkDelete,
|
|
4
|
-
ExactEffectiveLinkWrite,
|
|
5
|
-
ExactEffectiveObjectDelete,
|
|
6
|
-
ExactEffectiveObjectWrite,
|
|
7
|
-
ExactLinkOverrideDelete,
|
|
8
|
-
ExactLinkOverrideWrite,
|
|
9
|
-
ExactLinkSlotOverrideDelete,
|
|
10
|
-
ExactLinkSlotOverrideWrite,
|
|
11
|
-
ExactObjectOverrideDelete,
|
|
12
|
-
ExactObjectOverrideWrite,
|
|
13
|
-
ExactTimeseriesPointWrite,
|
|
14
|
-
MaterializationPlanChunk,
|
|
15
|
-
MaterializationPlanWorkItem,
|
|
16
|
-
OntologyOutboxWrite,
|
|
17
|
-
} from "../../storage/ontology"
|
|
18
|
-
import type { MaterializationBatching } from "../shared/batching"
|
|
19
|
-
import { chunkBySize } from "../shared/chunking"
|
|
20
|
-
|
|
21
|
-
export type MaterializationPlanItem =
|
|
22
|
-
| MaterializationPlanWorkItem
|
|
23
|
-
| { readonly kind: "outbox"; readonly value: OntologyOutboxWrite }
|
|
24
|
-
|
|
25
|
-
export async function* planStream(
|
|
26
|
-
items: Iterable<MaterializationPlanItem> | AsyncIterable<MaterializationPlanItem>,
|
|
27
|
-
batching: MaterializationBatching
|
|
28
|
-
): AsyncIterable<MaterializationPlanChunk> {
|
|
29
|
-
for await (const itemsChunk of chunkBySize(items, {
|
|
30
|
-
maxRows: batching.planChunkRows,
|
|
31
|
-
maxBytes: batching.planChunkBytes,
|
|
32
|
-
byteLength: utf8JsonByteLength,
|
|
33
|
-
})) {
|
|
34
|
-
const chunk = mutableChunk()
|
|
35
|
-
for (const item of itemsChunk) appendItem(chunk, item)
|
|
36
|
-
yield chunk
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
type MutableChunk = {
|
|
41
|
-
overrides: {
|
|
42
|
-
objects: {
|
|
43
|
-
upserts: ExactObjectOverrideWrite[]
|
|
44
|
-
deletes: ExactObjectOverrideDelete[]
|
|
45
|
-
}
|
|
46
|
-
links: {
|
|
47
|
-
edges: {
|
|
48
|
-
upserts: ExactLinkOverrideWrite[]
|
|
49
|
-
deletes: ExactLinkOverrideDelete[]
|
|
50
|
-
}
|
|
51
|
-
slots: {
|
|
52
|
-
upserts: ExactLinkSlotOverrideWrite[]
|
|
53
|
-
deletes: ExactLinkSlotOverrideDelete[]
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
effective: {
|
|
58
|
-
objectUpserts: ExactEffectiveObjectWrite[]
|
|
59
|
-
objectDeletes: ExactEffectiveObjectDelete[]
|
|
60
|
-
linkUpserts: ExactEffectiveLinkWrite[]
|
|
61
|
-
linkDeletes: ExactEffectiveLinkDelete[]
|
|
62
|
-
}
|
|
63
|
-
timeseries: { pointUpserts: ExactTimeseriesPointWrite[] }
|
|
64
|
-
outbox: OntologyOutboxWrite[]
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function mutableChunk(): MutableChunk {
|
|
68
|
-
return {
|
|
69
|
-
overrides: {
|
|
70
|
-
objects: { upserts: [], deletes: [] },
|
|
71
|
-
links: {
|
|
72
|
-
edges: { upserts: [], deletes: [] },
|
|
73
|
-
slots: { upserts: [], deletes: [] },
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
effective: { objectUpserts: [], objectDeletes: [], linkUpserts: [], linkDeletes: [] },
|
|
77
|
-
timeseries: { pointUpserts: [] },
|
|
78
|
-
outbox: [],
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function appendItem(chunk: MutableChunk, item: MaterializationPlanItem): void {
|
|
83
|
-
switch (item.kind) {
|
|
84
|
-
case "object-override-upsert":
|
|
85
|
-
chunk.overrides.objects.upserts.push(item.value)
|
|
86
|
-
break
|
|
87
|
-
case "object-override-delete":
|
|
88
|
-
chunk.overrides.objects.deletes.push(item.value)
|
|
89
|
-
break
|
|
90
|
-
case "link-override-upsert":
|
|
91
|
-
chunk.overrides.links.edges.upserts.push(item.value)
|
|
92
|
-
break
|
|
93
|
-
case "link-override-delete":
|
|
94
|
-
chunk.overrides.links.edges.deletes.push(item.value)
|
|
95
|
-
break
|
|
96
|
-
case "link-slot-override-upsert":
|
|
97
|
-
chunk.overrides.links.slots.upserts.push(item.value)
|
|
98
|
-
break
|
|
99
|
-
case "link-slot-override-delete":
|
|
100
|
-
chunk.overrides.links.slots.deletes.push(item.value)
|
|
101
|
-
break
|
|
102
|
-
case "object-upsert":
|
|
103
|
-
chunk.effective.objectUpserts.push(item.value)
|
|
104
|
-
break
|
|
105
|
-
case "object-delete":
|
|
106
|
-
chunk.effective.objectDeletes.push(item.value)
|
|
107
|
-
break
|
|
108
|
-
case "link-upsert":
|
|
109
|
-
chunk.effective.linkUpserts.push(item.value)
|
|
110
|
-
break
|
|
111
|
-
case "link-delete":
|
|
112
|
-
chunk.effective.linkDeletes.push(item.value)
|
|
113
|
-
break
|
|
114
|
-
case "point-upsert":
|
|
115
|
-
chunk.timeseries.pointUpserts.push(item.value)
|
|
116
|
-
break
|
|
117
|
-
case "outbox":
|
|
118
|
-
chunk.outbox.push(item.value)
|
|
119
|
-
break
|
|
120
|
-
}
|
|
121
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|