@sixb/core 0.1.5 → 0.1.7
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 +37 -33
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/types/definitions.d.ts +8 -2
- package/dist/actions/types/definitions.d.ts.map +1 -1
- package/dist/actions/worker.js +3 -3
- package/dist/agents/adapters.d.ts +33 -76
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +22 -6
- package/dist/agents/authority.d.ts.map +1 -1
- package/dist/agents/builders.d.ts +3 -11
- package/dist/agents/builders.d.ts.map +1 -1
- package/dist/agents/context.js +2 -2
- package/dist/agents/dispatch.d.ts +9 -1
- package/dist/agents/dispatch.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +2 -2
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +9 -10
- package/dist/agents/execution.d.ts.map +1 -1
- package/dist/agents/ids.d.ts +4 -0
- package/dist/agents/ids.d.ts.map +1 -1
- package/dist/agents/index.d.ts +13 -9
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +80 -68
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +17 -10
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/model-loop.d.ts +56 -0
- package/dist/agents/model-loop.d.ts.map +1 -0
- package/dist/agents/reference.d.ts +4 -0
- package/dist/agents/reference.d.ts.map +1 -0
- package/dist/agents/request.d.ts +10 -8
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/retired-config.d.ts +4 -0
- package/dist/agents/retired-config.d.ts.map +1 -0
- package/dist/agents/streams.d.ts +13 -8
- package/dist/agents/streams.d.ts.map +1 -1
- package/dist/agents/streams.js +7 -5
- package/dist/agents/streams.js.map +1 -1
- package/dist/agents/tool-catalog.d.ts +9 -0
- package/dist/agents/tool-catalog.d.ts.map +1 -0
- package/dist/agents/tool-definition.d.ts +1 -0
- package/dist/agents/tool-definition.d.ts.map +1 -1
- package/dist/agents/types.d.ts +31 -68
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +4 -10
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/ai-usage/execution.d.ts +53 -0
- package/dist/ai-usage/execution.d.ts.map +1 -0
- package/dist/ai-usage/index.d.ts +3 -0
- package/dist/ai-usage/index.d.ts.map +1 -0
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +7 -7
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/strategy.d.ts +1 -1
- package/dist/auth/strategy.d.ts.map +1 -1
- package/dist/auth/types.d.ts +13 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/authorization/decision.d.ts +5 -2
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +24 -8
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +8 -6
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +3 -3
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/authorization/types.d.ts +7 -5
- package/dist/authorization/types.d.ts.map +1 -1
- package/dist/blob-storage/browser.js +2 -2
- package/dist/blob-storage/index.js +3 -3
- package/dist/bootstrap/discovery.d.ts +1 -7
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.js +52 -48
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/broker/index.js +2 -2
- package/dist/{chunk-zqysyfjt.js → chunk-08m3b6w8.js} +1 -1
- package/dist/{chunk-xdf9yswn.js → chunk-08twe8m6.js} +93 -8
- package/dist/chunk-08twe8m6.js.map +12 -0
- package/dist/{chunk-xkthy56g.js → chunk-1kamz6j0.js} +1 -1
- package/dist/{chunk-h6h91mfy.js → chunk-2b5qtban.js} +12 -12
- package/dist/{chunk-h6h91mfy.js.map → chunk-2b5qtban.js.map} +3 -3
- package/dist/{chunk-0172wgm9.js → chunk-2xns679x.js} +10 -2
- package/dist/{chunk-0172wgm9.js.map → chunk-2xns679x.js.map} +3 -3
- package/dist/{chunk-f83ka50g.js → chunk-37wk412q.js} +86 -28
- package/dist/{chunk-f83ka50g.js.map → chunk-37wk412q.js.map} +8 -8
- package/dist/{chunk-6d5xdj1q.js → chunk-3fqt22c4.js} +4 -4
- package/dist/{chunk-t9xghkva.js → chunk-3kv70xwp.js} +3 -2
- package/dist/{chunk-t9xghkva.js.map → chunk-3kv70xwp.js.map} +3 -3
- package/dist/{chunk-z3zp0bj1.js → chunk-407j3msh.js} +1 -1
- package/dist/{chunk-rhrbz7d4.js → chunk-4a849fr1.js} +1 -1
- package/dist/{chunk-62c7t4jc.js → chunk-4nxeacx7.js} +1 -1
- package/dist/{chunk-cy0n5dms.js → chunk-5jcdmjam.js} +1 -1
- package/dist/{chunk-819wnjz8.js → chunk-64sr682n.js} +7 -7
- package/dist/{chunk-v0egge8b.js → chunk-6ed5bwnd.js} +666 -81
- package/dist/chunk-6ed5bwnd.js.map +57 -0
- package/dist/{chunk-x2yw73hy.js → chunk-7ds9620f.js} +1 -1
- package/dist/{chunk-dm72y8wt.js → chunk-7y0f6rf1.js} +29 -16
- package/dist/chunk-7y0f6rf1.js.map +10 -0
- package/dist/{chunk-72q2y8hn.js → chunk-8tsf6dmc.js} +2 -2
- package/dist/{chunk-72q2y8hn.js.map → chunk-8tsf6dmc.js.map} +3 -3
- package/dist/{chunk-tbv03sx2.js → chunk-9aehf39w.js} +7 -7
- package/dist/{chunk-ezake7g1.js → chunk-agsvg9ar.js} +1 -1
- package/dist/{chunk-rdeagz6b.js → chunk-atmkaf60.js} +1 -1
- package/dist/{chunk-rdeagz6b.js.map → chunk-atmkaf60.js.map} +2 -2
- package/dist/chunk-c15dr03f.js +43 -0
- package/dist/chunk-c15dr03f.js.map +10 -0
- package/dist/{chunk-78c6xvyr.js → chunk-d2ndstdf.js} +8 -6
- package/dist/{chunk-78c6xvyr.js.map → chunk-d2ndstdf.js.map} +2 -2
- package/dist/{chunk-rnshztfq.js → chunk-d63tybny.js} +2 -2
- package/dist/{chunk-t0jjkep3.js → chunk-d8qkxt2v.js} +4 -2
- package/dist/chunk-d8qkxt2v.js.map +10 -0
- package/dist/{chunk-vybf6pkp.js → chunk-dbc80ad7.js} +1 -1
- package/dist/{chunk-4gz41why.js → chunk-dqn23610.js} +1 -1
- package/dist/{chunk-z3ga9q5m.js → chunk-e4rvtvpw.js} +13 -11
- package/dist/{chunk-z3ga9q5m.js.map → chunk-e4rvtvpw.js.map} +2 -2
- package/dist/{chunk-h9kxd41f.js → chunk-gbrpsx4m.js} +19 -6
- package/dist/chunk-gbrpsx4m.js.map +11 -0
- package/dist/{chunk-84h6qhmp.js → chunk-h0knpbz5.js} +468 -1236
- package/dist/chunk-h0knpbz5.js.map +38 -0
- package/dist/{chunk-zp2v2rv6.js → chunk-ha58tjtt.js} +6 -6
- package/dist/{chunk-f6erf2vv.js → chunk-hdz94br2.js} +2 -2
- package/dist/chunk-jecn6t54.js +307 -0
- package/dist/chunk-jecn6t54.js.map +12 -0
- package/dist/{chunk-dsrkgtnh.js → chunk-jq43kdvk.js} +1 -1
- package/dist/{chunk-wtmzkcht.js → chunk-k34z5rvh.js} +1 -1
- package/dist/{chunk-htq0qh7z.js → chunk-ka3a2ft3.js} +2 -2
- package/dist/{chunk-4h947jd8.js → chunk-kt81c11h.js} +2 -2
- package/dist/chunk-n2arzn6e.js +1745 -0
- package/dist/chunk-n2arzn6e.js.map +20 -0
- package/dist/{chunk-f2rt4vkh.js → chunk-n2w475r0.js} +3 -3
- package/dist/{chunk-t8t39h7v.js → chunk-n6jxh8sw.js} +10 -2
- package/dist/chunk-n6jxh8sw.js.map +10 -0
- package/dist/{chunk-drjqm1aa.js → chunk-p03r0h5s.js} +310 -28
- package/dist/chunk-p03r0h5s.js.map +16 -0
- package/dist/chunk-p2vqaxkc.js +528 -0
- package/dist/chunk-p2vqaxkc.js.map +15 -0
- package/dist/{chunk-gadsm794.js → chunk-qjycjdj6.js} +84 -11
- package/dist/chunk-qjycjdj6.js.map +12 -0
- package/dist/chunk-qjzp9xyb.js +286 -0
- package/dist/chunk-qjzp9xyb.js.map +12 -0
- package/dist/{chunk-am6eczah.js → chunk-qv38twt8.js} +50 -69
- package/dist/{chunk-am6eczah.js.map → chunk-qv38twt8.js.map} +8 -8
- package/dist/{chunk-bhxaq2nn.js → chunk-qw9gvjv5.js} +1 -1
- package/dist/{chunk-r0rry8dn.js → chunk-rp1mvzb4.js} +6 -6
- package/dist/{chunk-tkdscva6.js → chunk-rre42skh.js} +187 -18
- package/dist/chunk-rre42skh.js.map +39 -0
- package/dist/{chunk-ghteq96b.js → chunk-s5y30bc9.js} +2 -2
- package/dist/{chunk-a31h57d5.js → chunk-tn7xcs2n.js} +2 -2
- package/dist/{chunk-6gjqgd3d.js → chunk-tpnd31c1.js} +2 -1
- package/dist/chunk-tpnd31c1.js.map +11 -0
- package/dist/chunk-trxxmgnf.js +68 -0
- package/dist/chunk-trxxmgnf.js.map +11 -0
- package/dist/{chunk-ea73pzk7.js → chunk-vjjv9mrb.js} +2 -2
- package/dist/{chunk-8b55ygje.js → chunk-w3e09qqk.js} +1 -1
- package/dist/{chunk-ckxfnx7f.js → chunk-wjgm6jjt.js} +2 -2
- package/dist/{chunk-3j7573mj.js → chunk-x0qhkqje.js} +2 -2
- package/dist/{chunk-dysw7nsm.js → chunk-xdpwpkha.js} +2 -2
- package/dist/{chunk-1q02e95s.js → chunk-y35ma3mj.js} +11 -16
- package/dist/{chunk-1q02e95s.js.map → chunk-y35ma3mj.js.map} +3 -4
- package/dist/{chunk-qewtks41.js → chunk-z2sery1b.js} +64 -1
- package/dist/{chunk-qewtks41.js.map → chunk-z2sery1b.js.map} +3 -3
- package/dist/error-reporting/internal.js +4 -4
- package/dist/error-reporting/types.d.ts +7 -2
- package/dist/error-reporting/types.d.ts.map +1 -1
- package/dist/errors/catalog.d.ts +8 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/internal.js +2 -2
- package/dist/events/index.js +4 -4
- package/dist/execution/agent.d.ts +18 -9
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +52 -43
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts +14 -4
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/primitive.js +45 -43
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.d.ts +3 -1
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +46 -44
- package/dist/execution/request.js.map +3 -3
- package/dist/execution/types.d.ts +1 -1
- package/dist/execution/types.d.ts.map +1 -1
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +82 -77
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +2 -0
- package/dist/json.d.ts.map +1 -1
- package/dist/lake-storage/index.js +5 -5
- package/dist/logging/index.js +3 -3
- package/dist/logging/types.js +2 -2
- package/dist/materialization/index.js +2 -2
- package/dist/materializer/index.js +33 -29
- package/dist/materializer/index.js.map +1 -1
- package/dist/models/catalog.d.ts +40 -0
- package/dist/models/catalog.d.ts.map +1 -0
- package/dist/models/definitions.d.ts +25 -0
- package/dist/models/definitions.d.ts.map +1 -0
- package/dist/models/errors.d.ts +52 -0
- package/dist/models/errors.d.ts.map +1 -0
- package/dist/models/events.d.ts +192 -0
- package/dist/models/events.d.ts.map +1 -0
- package/dist/models/index.d.ts +17 -39
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +50 -0
- package/dist/models/index.js.map +9 -0
- package/dist/models/language-model.d.ts +90 -0
- package/dist/models/language-model.d.ts.map +1 -0
- package/dist/models/messages.d.ts +74 -0
- package/dist/models/messages.d.ts.map +1 -0
- package/dist/models/pricing.d.ts +69 -0
- package/dist/models/pricing.d.ts.map +1 -0
- package/dist/models/rate-card.d.ts +24 -0
- package/dist/models/rate-card.d.ts.map +1 -0
- package/dist/models/tools.d.ts +24 -0
- package/dist/models/tools.d.ts.map +1 -0
- package/dist/objects/index.js +38 -34
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/query/index.js +32 -28
- package/dist/objects/query/index.js.map +1 -1
- package/dist/ontology/index.js +5 -5
- package/dist/ontology/internal.js +4 -4
- package/dist/pipelines/index.js +37 -35
- package/dist/pipelines/index.js.map +1 -1
- package/dist/projections/internal.js +35 -31
- package/dist/projections/internal.js.map +1 -1
- package/dist/queues/in-memory.d.ts +3 -2
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.d.ts +3 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/types.d.ts +15 -3
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/runtime/create.d.ts +4 -4
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +2 -2
- package/dist/runtime/definitions.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +3 -2
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts +2 -2
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +4 -2
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/security/every.d.ts +1 -4
- package/dist/security/every.d.ts.map +1 -1
- package/dist/security/grants.d.ts +6 -5
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/registry.d.ts +1 -1
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +13 -5
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +4 -2
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/storage/action-runs/failure.js +3 -3
- package/dist/storage/action-runs/provider.js +2 -2
- package/dist/storage/agents/errors.d.ts +1 -1
- package/dist/storage/agents/errors.d.ts.map +1 -1
- package/dist/storage/agents/in-memory.d.ts +3 -2
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/index.d.ts +1 -1
- package/dist/storage/agents/index.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts +11 -4
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +18 -15
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +65 -17
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/analytics.d.ts +2 -1
- package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
- package/dist/storage/ai-cost/codec.d.ts +3 -2
- package/dist/storage/ai-cost/codec.d.ts.map +1 -1
- package/dist/storage/ai-cost/groups.d.ts +51 -0
- package/dist/storage/ai-cost/groups.d.ts.map +1 -0
- package/dist/storage/ai-cost/in-memory.d.ts +11 -1
- package/dist/storage/ai-cost/in-memory.d.ts.map +1 -1
- package/dist/storage/ai-cost/index.d.ts +1 -1
- package/dist/storage/ai-cost/index.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.d.ts +2 -0
- package/dist/storage/ai-cost/provider.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.js +29 -13
- package/dist/storage/ai-cost/provider.js.map +3 -3
- package/dist/storage/ai-cost/types.d.ts +64 -15
- package/dist/storage/ai-cost/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/validation.d.ts +2 -1
- package/dist/storage/ai-cost/validation.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.d.ts +14 -0
- package/dist/storage/ai-limits/enforcement.d.ts.map +1 -0
- package/dist/storage/ai-limits/enforcement.js +21 -0
- package/dist/storage/ai-limits/enforcement.js.map +9 -0
- package/dist/storage/ai-limits/errors.d.ts +8 -0
- package/dist/storage/ai-limits/errors.d.ts.map +1 -0
- package/dist/storage/ai-limits/in-memory.d.ts +78 -0
- package/dist/storage/ai-limits/in-memory.d.ts.map +1 -0
- package/dist/storage/ai-limits/index.d.ts +7 -0
- package/dist/storage/ai-limits/index.d.ts.map +1 -0
- package/dist/storage/ai-limits/period.d.ts +4 -0
- package/dist/storage/ai-limits/period.d.ts.map +1 -0
- package/dist/storage/ai-limits/provider.d.ts +85 -0
- package/dist/storage/ai-limits/provider.d.ts.map +1 -0
- package/dist/storage/ai-limits/provider.js +62 -0
- package/dist/storage/ai-limits/provider.js.map +9 -0
- package/dist/storage/ai-limits/types.d.ts +175 -0
- package/dist/storage/ai-limits/types.d.ts.map +1 -0
- package/dist/storage/ai-usage/in-memory.d.ts +4 -0
- package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
- package/dist/storage/ai-usage/record.d.ts.map +1 -1
- package/dist/storage/ai-usage/types.d.ts +6 -2
- package/dist/storage/ai-usage/types.d.ts.map +1 -1
- package/dist/storage/auth/errors.d.ts +1 -1
- package/dist/storage/auth/errors.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/auth-storage.d.ts +4 -1
- package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/device-authorizations.d.ts +29 -0
- package/dist/storage/auth/in-memory/device-authorizations.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/shared.d.ts +3 -1
- package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
- package/dist/storage/auth/index.d.ts +2 -1
- package/dist/storage/auth/index.d.ts.map +1 -1
- package/dist/storage/auth/types.d.ts +66 -0
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +2 -2
- package/dist/storage/executions/provider.js +1 -1
- package/dist/storage/executions/run-link.d.ts +7 -2
- package/dist/storage/executions/run-link.d.ts.map +1 -1
- package/dist/storage/executions/validation.d.ts.map +1 -1
- package/dist/storage/in-memory/index.d.ts +4 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +8 -5
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +51 -38
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +4 -3
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +1 -1
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/materializations.d.ts +7 -3
- package/dist/storage/ontology/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +2 -2
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +3 -3
- package/dist/storage/pipeline-runs/provider.js +2 -2
- package/dist/storage/projection-runs/provider.js +4 -4
- package/dist/storage/sync-runs/provider.js +2 -2
- package/dist/storage/types.d.ts +5 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/webhook-runs/provider.js +2 -2
- package/dist/storage/workflow-runs/provider.d.ts +1 -1
- package/dist/storage/workflow-runs/provider.js +10 -11
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/types.d.ts +5 -4
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/index.js +37 -35
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/agent-execution.d.ts +3 -1
- package/dist/testing/agent-execution.d.ts.map +1 -1
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-limit-storage-contract.d.ts +18 -0
- package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -0
- package/dist/testing/ai-model-call-groups-contract.d.ts +6 -0
- package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -0
- package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3758 -1945
- package/dist/testing/index.js.map +15 -13
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/webhooks/internal.js +32 -28
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +2 -2
- package/dist/workflows/agent-step-identity.d.ts +3 -0
- package/dist/workflows/agent-step-identity.d.ts.map +1 -0
- package/dist/workflows/builders.d.ts +2 -3
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/execution.d.ts +1 -1
- package/dist/workflows/execution.d.ts.map +1 -1
- package/dist/workflows/failure.d.ts +1 -1
- package/dist/workflows/failure.d.ts.map +1 -1
- package/dist/workflows/index.d.ts +3 -2
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +53 -45
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/types.d.ts +26 -11
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts +7 -1
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +19 -4
- package/src/actions/types/definitions.ts +24 -2
- package/src/agents/adapters.ts +109 -115
- package/src/agents/authority.ts +214 -32
- package/src/agents/builders.ts +3 -50
- package/src/agents/context-compaction.ts +4 -0
- package/src/agents/dispatch.ts +59 -2
- package/src/agents/errors.ts +5 -2
- package/src/agents/execution.ts +53 -52
- package/src/agents/ids.ts +16 -1
- package/src/agents/index.ts +23 -11
- package/src/agents/message.ts +18 -9
- package/src/agents/model-loop.ts +1023 -0
- package/src/agents/reference.ts +7 -0
- package/src/agents/request.ts +141 -74
- package/src/agents/retired-config.ts +20 -0
- package/src/agents/streams.ts +45 -19
- package/src/agents/tool-catalog.ts +21 -0
- package/src/agents/tool-definition.ts +23 -0
- package/src/agents/types.ts +39 -81
- package/src/agents/validation.ts +34 -180
- package/src/ai-usage/execution.ts +196 -0
- package/src/ai-usage/index.ts +15 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/runtime.ts +8 -0
- package/src/auth/strategy.ts +1 -0
- package/src/auth/types.ts +14 -0
- package/src/authorization/decision.ts +27 -10
- package/src/authorization/grant-kinds.ts +62 -15
- package/src/authorization/index.ts +1 -0
- package/src/authorization/resolve.ts +12 -5
- package/src/authorization/types.ts +7 -5
- package/src/bootstrap/discovery.ts +0 -3
- package/src/error-reporting/types.ts +4 -2
- package/src/errors/catalog.ts +8 -0
- package/src/execution/agent.ts +129 -22
- package/src/execution/authorization.ts +48 -18
- package/src/execution/request.ts +4 -1
- package/src/execution/types.ts +1 -1
- package/src/http/api-routes.ts +63 -0
- package/src/index.ts +36 -7
- package/src/json.ts +9 -0
- package/src/models/catalog.ts +137 -0
- package/src/models/definitions.ts +202 -0
- package/src/models/errors.ts +83 -0
- package/src/models/events.ts +198 -0
- package/src/models/index.ts +89 -71
- package/src/models/language-model.ts +143 -0
- package/src/models/messages.ts +78 -0
- package/src/models/pricing.ts +390 -0
- package/src/models/rate-card.ts +101 -0
- package/src/models/tools.ts +29 -0
- package/src/queues/in-memory.ts +5 -0
- package/src/queues/index.ts +11 -0
- package/src/queues/types.ts +20 -3
- package/src/runtime/create.ts +7 -5
- package/src/runtime/definitions.ts +2 -2
- package/src/runtime/host.ts +3 -2
- package/src/runtime/resolve-definitions.ts +13 -36
- package/src/runtime/sixb.ts +6 -8
- package/src/security/every.ts +0 -4
- package/src/security/grants.ts +55 -11
- package/src/security/index.ts +2 -0
- package/src/security/registry.ts +6 -5
- package/src/security/types.ts +15 -4
- package/src/security/validation.ts +30 -9
- package/src/storage/agents/errors.ts +1 -0
- package/src/storage/agents/in-memory.ts +121 -11
- package/src/storage/agents/index.ts +7 -0
- package/src/storage/agents/provider.ts +150 -6
- package/src/storage/agents/types.ts +73 -16
- package/src/storage/ai-cost/analytics.ts +63 -6
- package/src/storage/ai-cost/codec.ts +37 -12
- package/src/storage/ai-cost/groups.ts +248 -0
- package/src/storage/ai-cost/in-memory.ts +42 -0
- package/src/storage/ai-cost/index.ts +6 -0
- package/src/storage/ai-cost/provider.ts +7 -0
- package/src/storage/ai-cost/types.ts +76 -14
- package/src/storage/ai-cost/validation.ts +147 -17
- package/src/storage/ai-limits/enforcement.ts +68 -0
- package/src/storage/ai-limits/errors.ts +23 -0
- package/src/storage/ai-limits/in-memory.ts +671 -0
- package/src/storage/ai-limits/index.ts +31 -0
- package/src/storage/ai-limits/period.ts +11 -0
- package/src/storage/ai-limits/provider.ts +430 -0
- package/src/storage/ai-limits/types.ts +195 -0
- package/src/storage/ai-usage/in-memory.ts +13 -0
- package/src/storage/ai-usage/record.ts +17 -0
- package/src/storage/ai-usage/types.ts +6 -2
- package/src/storage/auth/errors.ts +6 -0
- package/src/storage/auth/in-memory/auth-storage.ts +69 -0
- package/src/storage/auth/in-memory/device-authorizations.ts +145 -0
- package/src/storage/auth/in-memory/shared.ts +7 -0
- package/src/storage/auth/index.ts +7 -0
- package/src/storage/auth/types.ts +73 -0
- package/src/storage/executions/run-link.ts +16 -6
- package/src/storage/executions/validation.ts +36 -6
- package/src/storage/in-memory/index.ts +48 -4
- package/src/storage/index.ts +52 -1
- package/src/storage/ontology/in-memory/materializations.ts +34 -22
- package/src/storage/ontology/index.ts +1 -0
- package/src/storage/ontology/materializations.ts +8 -3
- package/src/storage/ontology/provider.ts +2 -2
- package/src/storage/types.ts +37 -0
- package/src/storage/workflow-runs/in-memory.ts +3 -3
- package/src/storage/workflow-runs/provider.ts +2 -2
- package/src/storage/workflow-runs/types.ts +6 -3
- package/src/testing/agent-execution.ts +40 -28
- package/src/testing/agent-storage-contract.ts +249 -28
- package/src/testing/ai-cost-storage-contract.ts +96 -8
- package/src/testing/ai-limit-storage-contract.ts +1134 -0
- package/src/testing/ai-model-call-groups-contract.ts +353 -0
- package/src/testing/ai-usage-storage-contract.ts +31 -0
- package/src/testing/auth-storage-contract.ts +85 -0
- package/src/testing/execution-storage-contract.ts +2 -2
- package/src/testing/index.ts +10 -0
- package/src/testing/materializer-storage-contract.ts +170 -2
- package/src/testing/queues-contract.ts +36 -1
- package/src/workflows/agent-step-identity.ts +4 -0
- package/src/workflows/builders.ts +95 -9
- package/src/workflows/execution.ts +2 -2
- package/src/workflows/failure.ts +2 -2
- package/src/workflows/index.ts +3 -0
- package/src/workflows/types.ts +23 -11
- package/src/workflows/validation.ts +100 -7
- package/dist/chunk-6gjqgd3d.js.map +0 -11
- package/dist/chunk-84h6qhmp.js.map +0 -46
- package/dist/chunk-a09jx26t.js +0 -55
- package/dist/chunk-a09jx26t.js.map +0 -11
- package/dist/chunk-dm72y8wt.js.map +0 -10
- package/dist/chunk-drjqm1aa.js.map +0 -15
- package/dist/chunk-gadsm794.js.map +0 -11
- package/dist/chunk-h9kxd41f.js.map +0 -11
- package/dist/chunk-nzw7sm3b.js +0 -137
- package/dist/chunk-nzw7sm3b.js.map +0 -10
- package/dist/chunk-t0jjkep3.js.map +0 -10
- package/dist/chunk-t8t39h7v.js.map +0 -10
- package/dist/chunk-tkdscva6.js.map +0 -37
- package/dist/chunk-v0egge8b.js.map +0 -56
- package/dist/chunk-xdf9yswn.js.map +0 -11
- /package/dist/{chunk-zqysyfjt.js.map → chunk-08m3b6w8.js.map} +0 -0
- /package/dist/{chunk-xkthy56g.js.map → chunk-1kamz6j0.js.map} +0 -0
- /package/dist/{chunk-6d5xdj1q.js.map → chunk-3fqt22c4.js.map} +0 -0
- /package/dist/{chunk-z3zp0bj1.js.map → chunk-407j3msh.js.map} +0 -0
- /package/dist/{chunk-rhrbz7d4.js.map → chunk-4a849fr1.js.map} +0 -0
- /package/dist/{chunk-62c7t4jc.js.map → chunk-4nxeacx7.js.map} +0 -0
- /package/dist/{chunk-cy0n5dms.js.map → chunk-5jcdmjam.js.map} +0 -0
- /package/dist/{chunk-819wnjz8.js.map → chunk-64sr682n.js.map} +0 -0
- /package/dist/{chunk-x2yw73hy.js.map → chunk-7ds9620f.js.map} +0 -0
- /package/dist/{chunk-tbv03sx2.js.map → chunk-9aehf39w.js.map} +0 -0
- /package/dist/{chunk-ezake7g1.js.map → chunk-agsvg9ar.js.map} +0 -0
- /package/dist/{chunk-rnshztfq.js.map → chunk-d63tybny.js.map} +0 -0
- /package/dist/{chunk-vybf6pkp.js.map → chunk-dbc80ad7.js.map} +0 -0
- /package/dist/{chunk-4gz41why.js.map → chunk-dqn23610.js.map} +0 -0
- /package/dist/{chunk-zp2v2rv6.js.map → chunk-ha58tjtt.js.map} +0 -0
- /package/dist/{chunk-f6erf2vv.js.map → chunk-hdz94br2.js.map} +0 -0
- /package/dist/{chunk-dsrkgtnh.js.map → chunk-jq43kdvk.js.map} +0 -0
- /package/dist/{chunk-wtmzkcht.js.map → chunk-k34z5rvh.js.map} +0 -0
- /package/dist/{chunk-htq0qh7z.js.map → chunk-ka3a2ft3.js.map} +0 -0
- /package/dist/{chunk-4h947jd8.js.map → chunk-kt81c11h.js.map} +0 -0
- /package/dist/{chunk-f2rt4vkh.js.map → chunk-n2w475r0.js.map} +0 -0
- /package/dist/{chunk-bhxaq2nn.js.map → chunk-qw9gvjv5.js.map} +0 -0
- /package/dist/{chunk-r0rry8dn.js.map → chunk-rp1mvzb4.js.map} +0 -0
- /package/dist/{chunk-ghteq96b.js.map → chunk-s5y30bc9.js.map} +0 -0
- /package/dist/{chunk-a31h57d5.js.map → chunk-tn7xcs2n.js.map} +0 -0
- /package/dist/{chunk-ea73pzk7.js.map → chunk-vjjv9mrb.js.map} +0 -0
- /package/dist/{chunk-8b55ygje.js.map → chunk-w3e09qqk.js.map} +0 -0
- /package/dist/{chunk-ckxfnx7f.js.map → chunk-wjgm6jjt.js.map} +0 -0
- /package/dist/{chunk-3j7573mj.js.map → chunk-x0qhkqje.js.map} +0 -0
- /package/dist/{chunk-dysw7nsm.js.map → chunk-xdpwpkha.js.map} +0 -0
|
@@ -2,6 +2,7 @@ import type { AiModelCallUsageRecord, InMemoryAiUsageStorageSnapshot } from "../
|
|
|
2
2
|
import type { AiAccountingRecordSetItem } from "./analytics"
|
|
3
3
|
import { buildAiAccountingOverview, buildAiModelCallAccountingList } from "./analytics"
|
|
4
4
|
import { AiCostStorageError } from "./errors"
|
|
5
|
+
import { type AiAccountingGroupIdentity, buildAiModelCallGroups } from "./groups"
|
|
5
6
|
import type {
|
|
6
7
|
AiAccountingAttribution,
|
|
7
8
|
AiAccountingOverview,
|
|
@@ -11,6 +12,8 @@ import type {
|
|
|
11
12
|
AiMoney,
|
|
12
13
|
ListAiModelCallAccountingInput,
|
|
13
14
|
ListAiModelCallAccountingResult,
|
|
15
|
+
ListAiModelCallGroupsInput,
|
|
16
|
+
ListAiModelCallGroupsResult,
|
|
14
17
|
QueryAiAccountingOverviewInput,
|
|
15
18
|
SummarizeAiCostExecutionsInput,
|
|
16
19
|
} from "./types"
|
|
@@ -25,6 +28,10 @@ interface InMemoryAiCostUsageSource {
|
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
export interface InMemoryAiAccountingAttributionSource {
|
|
31
|
+
resolveGroup?(input: {
|
|
32
|
+
readonly projectId: string
|
|
33
|
+
readonly executionId: string
|
|
34
|
+
}): Promise<{ readonly executionId: string; readonly attribution?: AiAccountingAttribution }>
|
|
28
35
|
resolve(input: {
|
|
29
36
|
readonly projectId: string
|
|
30
37
|
readonly executionId: string
|
|
@@ -85,10 +92,45 @@ export class InMemoryAiCostStorage implements AiCostStorage {
|
|
|
85
92
|
return structuredClone({ recordsByUsage: this.recordsByUsage })
|
|
86
93
|
}
|
|
87
94
|
|
|
95
|
+
async listModelCallGroups(
|
|
96
|
+
input: ListAiModelCallGroupsInput
|
|
97
|
+
): Promise<ListAiModelCallGroupsResult> {
|
|
98
|
+
const items = await this.accountingItems()
|
|
99
|
+
const roots = new Map<string, Promise<AiAccountingGroupIdentity>>()
|
|
100
|
+
return buildAiModelCallGroups(
|
|
101
|
+
input,
|
|
102
|
+
await Promise.all(
|
|
103
|
+
items.map(async (item) => {
|
|
104
|
+
const key = usageRecordKey(item.usage.projectId, item.usage.executionId)
|
|
105
|
+
let root = roots.get(key)
|
|
106
|
+
if (!root) {
|
|
107
|
+
root =
|
|
108
|
+
this.attribution?.resolveGroup?.({
|
|
109
|
+
projectId: item.usage.projectId,
|
|
110
|
+
executionId: item.usage.executionId,
|
|
111
|
+
}) ??
|
|
112
|
+
Promise.resolve({
|
|
113
|
+
executionId: item.usage.executionId,
|
|
114
|
+
attribution: item.attribution,
|
|
115
|
+
})
|
|
116
|
+
roots.set(key, root)
|
|
117
|
+
}
|
|
118
|
+
return { ...item, root: await root }
|
|
119
|
+
})
|
|
120
|
+
)
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
88
124
|
restore(snapshot: InMemoryAiCostStorageSnapshot): void {
|
|
89
125
|
replaceMap(this.recordsByUsage, snapshot.recordsByUsage)
|
|
90
126
|
}
|
|
91
127
|
|
|
128
|
+
/** @internal Immutable accounting source used by in-memory AI limit enforcement. */
|
|
129
|
+
getRecord(projectId: string, usageRecordId: string): AiModelCallCostRecord | null {
|
|
130
|
+
const record = this.recordsByUsage.get(usageRecordKey(projectId, usageRecordId))
|
|
131
|
+
return record ? structuredClone(record) : null
|
|
132
|
+
}
|
|
133
|
+
|
|
92
134
|
private usageRecord(projectId: string, id: string): AiModelCallUsageRecord | undefined {
|
|
93
135
|
return [...this.usage.snapshot().records.values()].find(
|
|
94
136
|
(record) => record.projectId === projectId && record.id === id
|
|
@@ -18,10 +18,14 @@ export type {
|
|
|
18
18
|
AiBillableMeter,
|
|
19
19
|
AiBillingIdentity,
|
|
20
20
|
AiCostComponent,
|
|
21
|
+
AiCostEstimate,
|
|
21
22
|
AiCostStorage,
|
|
22
23
|
AiCostSummary,
|
|
23
24
|
AiModelCallAccountingItem,
|
|
24
25
|
AiModelCallCostRecord,
|
|
26
|
+
AiModelCallExecutionSummary,
|
|
27
|
+
AiModelCallGroup,
|
|
28
|
+
AiModelCallGroupSummary,
|
|
25
29
|
AiMoney,
|
|
26
30
|
AiPriceSource,
|
|
27
31
|
AiPricingContext,
|
|
@@ -30,6 +34,8 @@ export type {
|
|
|
30
34
|
AiUnpriceableReason,
|
|
31
35
|
ListAiModelCallAccountingInput,
|
|
32
36
|
ListAiModelCallAccountingResult,
|
|
37
|
+
ListAiModelCallGroupsInput,
|
|
38
|
+
ListAiModelCallGroupsResult,
|
|
33
39
|
QueryAiAccountingOverviewInput,
|
|
34
40
|
SummarizeAiCostExecutionsInput,
|
|
35
41
|
} from "./types"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** @internal Storage-provider helpers; not part of the app-author API. */
|
|
2
|
+
|
|
2
3
|
export type {
|
|
3
4
|
AiAccountingAggregateFragment,
|
|
4
5
|
AiAccountingRecordSetItem,
|
|
@@ -13,6 +14,12 @@ export {
|
|
|
13
14
|
} from "./analytics"
|
|
14
15
|
export type { AiModelCallCostDetails } from "./codec"
|
|
15
16
|
export { aiModelCallCostDetails, parseAiModelCallCostDetails } from "./codec"
|
|
17
|
+
export type {
|
|
18
|
+
AiAccountingGroupIdentity,
|
|
19
|
+
AiModelCallGroupFragment,
|
|
20
|
+
AiModelCallGroupRow,
|
|
21
|
+
} from "./groups"
|
|
22
|
+
export { aiModelCallGroupFragmentFromRow, buildAiModelCallGroupsFromFragments } from "./groups"
|
|
16
23
|
export {
|
|
17
24
|
aiModelCallCostMatchesUsage,
|
|
18
25
|
normalizeAiModelCallCostRecord,
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { AiModelCallUsageRecord } from "../ai-usage"
|
|
2
2
|
|
|
3
|
-
/** Token meters supported by
|
|
3
|
+
/** Token meters supported by deterministic local rate cards. */
|
|
4
4
|
export type AiBillableMeter =
|
|
5
5
|
| "tokens.input.total"
|
|
6
6
|
| "tokens.input.uncached"
|
|
7
7
|
| "tokens.input.cacheRead"
|
|
8
8
|
| "tokens.input.cacheWrite"
|
|
9
|
+
| "tokens.input.cacheWrite5m"
|
|
10
|
+
| "tokens.input.cacheWrite1h"
|
|
9
11
|
| "tokens.output.total"
|
|
10
12
|
| "tokens.output.text"
|
|
11
13
|
| "tokens.output.reasoning"
|
|
@@ -17,7 +19,7 @@ export interface AiMoney {
|
|
|
17
19
|
readonly amountNanos: string
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
/** Provider and model
|
|
22
|
+
/** Provider and model identity used for billing. */
|
|
21
23
|
export interface AiBillingIdentity {
|
|
22
24
|
readonly providerId: string
|
|
23
25
|
readonly modelId: string
|
|
@@ -30,18 +32,19 @@ export interface AiPricingContext {
|
|
|
30
32
|
readonly region?: string
|
|
31
33
|
readonly inferenceGeo?: string
|
|
32
34
|
readonly routedProviderId?: string
|
|
35
|
+
readonly routedModelId?: string
|
|
33
36
|
readonly deploymentId?: string
|
|
34
37
|
readonly inferenceProfileId?: string
|
|
35
38
|
readonly cacheWriteTtlSeconds?: number
|
|
36
39
|
readonly mode?: string
|
|
37
40
|
}
|
|
38
41
|
|
|
39
|
-
/** Immutable provenance of the
|
|
42
|
+
/** Immutable provenance of the provider report or rate card applied to a valuation. */
|
|
40
43
|
export interface AiPriceSource {
|
|
41
44
|
readonly sourceId: string
|
|
42
45
|
readonly sourceEntryId: string
|
|
43
46
|
readonly sourceVersion: string
|
|
44
|
-
readonly sourceUrl
|
|
47
|
+
readonly sourceUrl?: string
|
|
45
48
|
readonly observedAt: Date
|
|
46
49
|
}
|
|
47
50
|
|
|
@@ -54,31 +57,46 @@ export interface AiCostComponent {
|
|
|
54
57
|
|
|
55
58
|
export type AiUnpriceableReason =
|
|
56
59
|
| "missingBillingIdentity"
|
|
57
|
-
| "
|
|
60
|
+
| "missingRateCard"
|
|
58
61
|
| "missingUsageMeter"
|
|
59
62
|
| "unsupportedPricingDimension"
|
|
60
63
|
| "invalidUsageForFormula"
|
|
61
64
|
|
|
62
65
|
interface AiModelCallCostRecordBase {
|
|
66
|
+
/** Local estimate retained independently when an inline provider cost is selected. */
|
|
67
|
+
readonly estimate?: AiCostEstimate
|
|
63
68
|
readonly projectId: string
|
|
64
69
|
readonly usageRecordId: string
|
|
65
70
|
readonly pricingContext: AiPricingContext
|
|
66
|
-
readonly priceSource: AiPriceSource
|
|
67
71
|
readonly ratedAt: Date
|
|
68
72
|
}
|
|
69
73
|
|
|
70
|
-
|
|
74
|
+
export type AiCostEstimate =
|
|
75
|
+
| {
|
|
76
|
+
readonly status: "rated"
|
|
77
|
+
readonly money: AiMoney
|
|
78
|
+
readonly components: readonly AiCostComponent[]
|
|
79
|
+
}
|
|
80
|
+
| {
|
|
81
|
+
readonly status: "unpriceable"
|
|
82
|
+
readonly reason: AiUnpriceableReason
|
|
83
|
+
readonly missingMeters?: readonly AiBillableMeter[]
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Selected monetary valuation; its observation/provenance distinguishes estimates from reports. */
|
|
71
87
|
export interface AiRatedModelCallCostRecord extends AiModelCallCostRecordBase {
|
|
72
88
|
readonly status: "rated"
|
|
73
89
|
readonly billingIdentity: AiBillingIdentity
|
|
90
|
+
readonly priceSource: AiPriceSource
|
|
74
91
|
readonly money: AiMoney
|
|
75
92
|
readonly components: readonly AiCostComponent[]
|
|
76
93
|
}
|
|
77
94
|
|
|
78
|
-
/** Explicit result when
|
|
95
|
+
/** Explicit result when a call cannot be completely and safely valued. */
|
|
79
96
|
export interface AiUnpriceableModelCallCostRecord extends AiModelCallCostRecordBase {
|
|
80
97
|
readonly status: "unpriceable"
|
|
81
98
|
readonly billingIdentity?: AiBillingIdentity
|
|
99
|
+
readonly priceSource?: AiPriceSource
|
|
82
100
|
readonly reason: AiUnpriceableReason
|
|
83
101
|
readonly missingMeters?: readonly AiBillableMeter[]
|
|
84
102
|
}
|
|
@@ -91,6 +109,7 @@ export interface SummarizeAiCostExecutionsInput {
|
|
|
91
109
|
}
|
|
92
110
|
|
|
93
111
|
export interface AiCostSummary {
|
|
112
|
+
/** Selected request valuations, never the sum of competing observations or period reports. */
|
|
94
113
|
readonly amounts: readonly AiMoney[]
|
|
95
114
|
readonly ratedCallCount: number
|
|
96
115
|
readonly unpriceableCallCount: number
|
|
@@ -133,9 +152,15 @@ export interface AiAccountingTimeBucket extends AiAccountingAggregate {
|
|
|
133
152
|
readonly end: Date
|
|
134
153
|
}
|
|
135
154
|
|
|
136
|
-
export
|
|
137
|
-
|
|
138
|
-
}
|
|
155
|
+
export type AiAccountingAgentBreakdown = AiAccountingAggregate &
|
|
156
|
+
(
|
|
157
|
+
| { readonly kind: "agent" }
|
|
158
|
+
| {
|
|
159
|
+
readonly kind: "workflowAgent"
|
|
160
|
+
readonly workflowId: string
|
|
161
|
+
readonly agentStepId: string
|
|
162
|
+
}
|
|
163
|
+
)
|
|
139
164
|
|
|
140
165
|
export interface AiAccountingWorkflowBreakdown extends AiAccountingAggregate {
|
|
141
166
|
readonly workflowId: string
|
|
@@ -159,17 +184,21 @@ export interface AiAccountingOverview {
|
|
|
159
184
|
export type AiAccountingAttribution =
|
|
160
185
|
| {
|
|
161
186
|
readonly kind: "agent"
|
|
162
|
-
readonly agentId: string
|
|
163
187
|
readonly agentRunId: string
|
|
164
188
|
readonly threadId: string
|
|
165
189
|
}
|
|
166
190
|
| {
|
|
167
191
|
readonly kind: "workflowAgent"
|
|
168
|
-
readonly
|
|
192
|
+
readonly agentStepId: string
|
|
169
193
|
readonly nodeRunId: string
|
|
170
194
|
readonly workflowId: string
|
|
171
195
|
readonly workflowRunId: string
|
|
172
196
|
}
|
|
197
|
+
| {
|
|
198
|
+
readonly kind: "subagent"
|
|
199
|
+
readonly subagentRunId: string
|
|
200
|
+
readonly parentRunId: string
|
|
201
|
+
}
|
|
173
202
|
|
|
174
203
|
export interface AiModelCallAccountingItem {
|
|
175
204
|
readonly usage: AiModelCallUsageRecord
|
|
@@ -184,10 +213,43 @@ export interface ListAiModelCallAccountingResult {
|
|
|
184
213
|
readonly total: number
|
|
185
214
|
}
|
|
186
215
|
|
|
187
|
-
|
|
216
|
+
export type ListAiModelCallGroupsInput = Omit<ListAiModelCallAccountingInput, "executionId">
|
|
217
|
+
|
|
218
|
+
/** Filtered usage; an absent token total means at least one call did not report it. */
|
|
219
|
+
export interface AiModelCallGroupSummary {
|
|
220
|
+
readonly modelCallCount: number
|
|
221
|
+
readonly totalTokens?: number
|
|
222
|
+
readonly costs: AiCostSummary
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export interface AiModelCallExecutionSummary extends AiModelCallGroupSummary {
|
|
226
|
+
readonly executionId: string
|
|
227
|
+
readonly attribution?: AiAccountingAttribution
|
|
228
|
+
readonly firstCallAt: Date
|
|
229
|
+
readonly lastCallAt: Date
|
|
230
|
+
readonly models: readonly AiBillingIdentity[]
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** One initiating execution, including only calls matching the accounting filters. */
|
|
234
|
+
export interface AiModelCallGroup extends AiModelCallGroupSummary {
|
|
235
|
+
readonly executionId: string
|
|
236
|
+
readonly attribution?: AiAccountingAttribution
|
|
237
|
+
readonly firstCallAt: Date
|
|
238
|
+
readonly lastCallAt: Date
|
|
239
|
+
readonly executions: readonly AiModelCallExecutionSummary[]
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export interface ListAiModelCallGroupsResult {
|
|
243
|
+
readonly items: readonly AiModelCallGroup[]
|
|
244
|
+
readonly total: number
|
|
245
|
+
readonly hasMore: boolean
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/** Immutable call-time costs. Inline provider costs take precedence over local estimates. */
|
|
188
249
|
export interface AiCostStorage {
|
|
189
250
|
recordModelCallCost(input: AiModelCallCostRecord): Promise<void>
|
|
190
251
|
summarizeExecutions(input: SummarizeAiCostExecutionsInput): Promise<readonly AiCostSummary[]>
|
|
191
252
|
queryProjectOverview(input: QueryAiAccountingOverviewInput): Promise<AiAccountingOverview>
|
|
192
253
|
listModelCalls(input: ListAiModelCallAccountingInput): Promise<ListAiModelCallAccountingResult>
|
|
254
|
+
listModelCallGroups(input: ListAiModelCallGroupsInput): Promise<ListAiModelCallGroupsResult>
|
|
193
255
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { assertJsonObject } from "../../json"
|
|
1
2
|
import type { AiModelCallUsage, AiModelCallUsageRecord } from "../ai-usage"
|
|
2
3
|
import { normalizeAiModelCallUsage } from "../ai-usage"
|
|
3
4
|
import type {
|
|
4
5
|
AiBillableMeter,
|
|
5
6
|
AiBillingIdentity,
|
|
6
7
|
AiCostComponent,
|
|
8
|
+
AiCostEstimate,
|
|
7
9
|
AiModelCallCostRecord,
|
|
8
10
|
AiPriceSource,
|
|
9
11
|
AiPricingContext,
|
|
@@ -21,14 +23,16 @@ const METER_ORDER: Readonly<Record<AiBillableMeter, number>> = {
|
|
|
21
23
|
"tokens.input.uncached": 1,
|
|
22
24
|
"tokens.input.cacheRead": 2,
|
|
23
25
|
"tokens.input.cacheWrite": 3,
|
|
24
|
-
"tokens.
|
|
25
|
-
"tokens.
|
|
26
|
-
"tokens.output.
|
|
26
|
+
"tokens.input.cacheWrite5m": 4,
|
|
27
|
+
"tokens.input.cacheWrite1h": 5,
|
|
28
|
+
"tokens.output.total": 6,
|
|
29
|
+
"tokens.output.text": 7,
|
|
30
|
+
"tokens.output.reasoning": 8,
|
|
27
31
|
}
|
|
28
|
-
const METERS = new Set(Object.keys(METER_ORDER))
|
|
32
|
+
const METERS = new Set(Object.keys(METER_ORDER) as AiBillableMeter[])
|
|
29
33
|
const UNPRICEABLE_REASONS = new Set<AiUnpriceableReason>([
|
|
30
34
|
"missingBillingIdentity",
|
|
31
|
-
"
|
|
35
|
+
"missingRateCard",
|
|
32
36
|
"missingUsageMeter",
|
|
33
37
|
"unsupportedPricingDimension",
|
|
34
38
|
"invalidUsageForFormula",
|
|
@@ -38,6 +42,7 @@ const CONTEXT_STRING_FIELDS = [
|
|
|
38
42
|
"region",
|
|
39
43
|
"inferenceGeo",
|
|
40
44
|
"routedProviderId",
|
|
45
|
+
"routedModelId",
|
|
41
46
|
"deploymentId",
|
|
42
47
|
"inferenceProfileId",
|
|
43
48
|
"mode",
|
|
@@ -78,15 +83,27 @@ export function normalizeAiModelCallCostRecord(
|
|
|
78
83
|
assertNonBlank(input.projectId, "cost record projectId")
|
|
79
84
|
assertNonBlank(input.usageRecordId, "cost record usageRecordId")
|
|
80
85
|
const base = {
|
|
86
|
+
...(input.estimate === undefined ? {} : { estimate: normalizeAiCostEstimate(input.estimate) }),
|
|
81
87
|
projectId: input.projectId,
|
|
82
88
|
usageRecordId: input.usageRecordId,
|
|
83
89
|
pricingContext: normalizeAiPricingContext(input.pricingContext),
|
|
84
|
-
priceSource: normalizePriceSource(input.priceSource),
|
|
85
90
|
ratedAt: cloneDate(input.ratedAt, "cost record ratedAt"),
|
|
86
91
|
}
|
|
87
92
|
|
|
88
|
-
if (input.status === "rated")
|
|
89
|
-
|
|
93
|
+
if (input.status === "rated") {
|
|
94
|
+
return normalizeRatedCost(input, {
|
|
95
|
+
...base,
|
|
96
|
+
priceSource: normalizePriceSource(input.priceSource),
|
|
97
|
+
})
|
|
98
|
+
}
|
|
99
|
+
if (input.status === "unpriceable") {
|
|
100
|
+
return normalizeUnpriceableCost(input, {
|
|
101
|
+
...base,
|
|
102
|
+
...(input.priceSource === undefined
|
|
103
|
+
? {}
|
|
104
|
+
: { priceSource: normalizePriceSource(input.priceSource) }),
|
|
105
|
+
})
|
|
106
|
+
}
|
|
90
107
|
throw new TypeError("[Sixb] AI cost status is invalid.")
|
|
91
108
|
}
|
|
92
109
|
|
|
@@ -98,7 +115,21 @@ export function aiModelCallCostMatchesUsage(
|
|
|
98
115
|
if (record.projectId !== usageRecord.projectId || record.usageRecordId !== usageRecord.id) {
|
|
99
116
|
return false
|
|
100
117
|
}
|
|
118
|
+
if (record.estimate?.status === "rated") {
|
|
119
|
+
const usage = normalizeAiModelCallUsage(usageRecord.usage)
|
|
120
|
+
const components = new Map(
|
|
121
|
+
record.estimate.components.map((component) => [component.meter, component])
|
|
122
|
+
)
|
|
123
|
+
if (
|
|
124
|
+
!inputComponentsMatchUsage(components, usage) ||
|
|
125
|
+
!outputComponentsMatchUsage(components, usage)
|
|
126
|
+
)
|
|
127
|
+
return false
|
|
128
|
+
}
|
|
101
129
|
if (record.status === "unpriceable") return true
|
|
130
|
+
if (record.components.length === 0 && isExternalValuationSource(record.priceSource.sourceId)) {
|
|
131
|
+
return true
|
|
132
|
+
}
|
|
102
133
|
|
|
103
134
|
const usage = normalizeAiModelCallUsage(usageRecord.usage)
|
|
104
135
|
const components = new Map(record.components.map((component) => [component.meter, component]))
|
|
@@ -113,25 +144,43 @@ function inputComponentsMatchUsage(
|
|
|
113
144
|
): boolean {
|
|
114
145
|
if (usage.inputTokens === undefined) return false
|
|
115
146
|
const total = components.get("tokens.input.total")
|
|
116
|
-
const
|
|
147
|
+
const directPartitions = [
|
|
117
148
|
["tokens.input.uncached", usage.uncachedInputTokens],
|
|
118
149
|
["tokens.input.cacheRead", usage.cacheReadInputTokens],
|
|
119
150
|
["tokens.input.cacheWrite", usage.cacheWriteInputTokens],
|
|
120
151
|
] as const
|
|
121
|
-
const
|
|
152
|
+
const presentDirect = directPartitions.filter(([meter]) => components.has(meter))
|
|
153
|
+
const specificWrites = [
|
|
154
|
+
components.get("tokens.input.cacheWrite5m"),
|
|
155
|
+
components.get("tokens.input.cacheWrite1h"),
|
|
156
|
+
].filter((component): component is AiCostComponent => component !== undefined)
|
|
122
157
|
|
|
123
158
|
if (total) {
|
|
124
|
-
return
|
|
159
|
+
return (
|
|
160
|
+
presentDirect.length === 0 &&
|
|
161
|
+
specificWrites.length === 0 &&
|
|
162
|
+
BigInt(total.quantity) === BigInt(usage.inputTokens)
|
|
163
|
+
)
|
|
125
164
|
}
|
|
126
|
-
if (
|
|
165
|
+
if (presentDirect.length === 0 && specificWrites.length === 0) return false
|
|
166
|
+
if (components.has("tokens.input.cacheWrite") && specificWrites.length > 0) return false
|
|
127
167
|
|
|
128
168
|
let quantity = 0n
|
|
129
|
-
for (const [meter, expected] of
|
|
169
|
+
for (const [meter, expected] of presentDirect) {
|
|
130
170
|
if (expected === undefined) return false
|
|
131
171
|
const component = components.get(meter)!
|
|
132
172
|
if (BigInt(component.quantity) !== BigInt(expected)) return false
|
|
133
173
|
quantity += BigInt(component.quantity)
|
|
134
174
|
}
|
|
175
|
+
if (specificWrites.length > 0) {
|
|
176
|
+
if (usage.cacheWriteInputTokens === undefined) return false
|
|
177
|
+
const specificWriteQuantity = specificWrites.reduce(
|
|
178
|
+
(sum, component) => sum + BigInt(component.quantity),
|
|
179
|
+
0n
|
|
180
|
+
)
|
|
181
|
+
if (specificWriteQuantity !== BigInt(usage.cacheWriteInputTokens)) return false
|
|
182
|
+
quantity += specificWriteQuantity
|
|
183
|
+
}
|
|
135
184
|
return quantity === BigInt(usage.inputTokens)
|
|
136
185
|
}
|
|
137
186
|
|
|
@@ -171,12 +220,14 @@ function normalizeRatedCost(
|
|
|
171
220
|
): AiRatedModelCallCostRecord {
|
|
172
221
|
const billingIdentity = normalizeBillingIdentity(input.billingIdentity)
|
|
173
222
|
const components = input.components.map(normalizeCostComponent).sort(compareComponents)
|
|
174
|
-
if (components.length === 0
|
|
223
|
+
if (components.length === 0 && !isExternalValuationSource(base.priceSource.sourceId)) {
|
|
224
|
+
throw new TypeError("[Sixb] AI rated cost requires components.")
|
|
225
|
+
}
|
|
175
226
|
if (new Set(components.map((component) => component.meter)).size !== components.length) {
|
|
176
227
|
throw new TypeError("[Sixb] AI rated cost cannot contain duplicate meters.")
|
|
177
228
|
}
|
|
178
229
|
const amountNanos = parseNonnegativeInt64(input.money.amountNanos, "money amountNanos").toString()
|
|
179
|
-
if (amountNanos !== sumComponents(components)) {
|
|
230
|
+
if (components.length > 0 && amountNanos !== sumComponents(components)) {
|
|
180
231
|
throw new TypeError("[Sixb] AI cost total does not equal its component charges.")
|
|
181
232
|
}
|
|
182
233
|
return {
|
|
@@ -188,6 +239,79 @@ function normalizeRatedCost(
|
|
|
188
239
|
}
|
|
189
240
|
}
|
|
190
241
|
|
|
242
|
+
export function normalizeAiCostEstimate(value: unknown): AiCostEstimate {
|
|
243
|
+
assertJsonObject(value, "AI cost estimate")
|
|
244
|
+
if (value.status === "rated") {
|
|
245
|
+
assertJsonObject(value.money, "estimate money")
|
|
246
|
+
const { currency, amountNanos } = value.money
|
|
247
|
+
if (
|
|
248
|
+
typeof currency !== "string" ||
|
|
249
|
+
typeof amountNanos !== "string" ||
|
|
250
|
+
!Array.isArray(value.components)
|
|
251
|
+
)
|
|
252
|
+
throw new TypeError("[Sixb] Invalid cost estimate money or components.")
|
|
253
|
+
const components = value.components
|
|
254
|
+
.map((component) => {
|
|
255
|
+
assertJsonObject(component, "estimate component")
|
|
256
|
+
const meter = [...METERS].find((meter) => meter === component.meter)
|
|
257
|
+
if (
|
|
258
|
+
!meter ||
|
|
259
|
+
typeof component.quantity !== "string" ||
|
|
260
|
+
typeof component.rateAmountNanosPerMillion !== "string" ||
|
|
261
|
+
typeof component.chargeAmountNanos !== "string"
|
|
262
|
+
)
|
|
263
|
+
throw new TypeError("[Sixb] Invalid cost estimate component.")
|
|
264
|
+
return normalizeCostComponent({
|
|
265
|
+
meter,
|
|
266
|
+
quantity: component.quantity,
|
|
267
|
+
rateAmountNanosPerMillion: component.rateAmountNanosPerMillion,
|
|
268
|
+
chargeAmountNanos: component.chargeAmountNanos,
|
|
269
|
+
})
|
|
270
|
+
})
|
|
271
|
+
.sort(compareComponents)
|
|
272
|
+
if (
|
|
273
|
+
!components.length ||
|
|
274
|
+
new Set(components.map((c) => c.meter)).size !== components.length ||
|
|
275
|
+
parseNonnegativeInt64(amountNanos, "estimate amountNanos").toString() !==
|
|
276
|
+
sumComponents(components)
|
|
277
|
+
)
|
|
278
|
+
throw new TypeError(
|
|
279
|
+
"[Sixb] Estimate must contain unique meters whose charges equal its total."
|
|
280
|
+
)
|
|
281
|
+
return {
|
|
282
|
+
status: "rated",
|
|
283
|
+
money: { currency: normalizeCurrency(currency), amountNanos },
|
|
284
|
+
components,
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const reason = [...UNPRICEABLE_REASONS].find((reason) => reason === value.reason)
|
|
288
|
+
if (value.status !== "unpriceable" || !reason)
|
|
289
|
+
throw new TypeError("[Sixb] Invalid cost estimate status or reason.")
|
|
290
|
+
let missingMeters: readonly AiBillableMeter[] | undefined
|
|
291
|
+
if (value.missingMeters !== undefined) {
|
|
292
|
+
if (!Array.isArray(value.missingMeters))
|
|
293
|
+
throw new TypeError("[Sixb] Invalid estimate missing meters.")
|
|
294
|
+
missingMeters = normalizeMissingMeters(
|
|
295
|
+
value.missingMeters.map((input) => {
|
|
296
|
+
const meter = [...METERS].find((meter) => meter === input)
|
|
297
|
+
if (!meter) throw new TypeError("[Sixb] Invalid estimate missing meter.")
|
|
298
|
+
return meter
|
|
299
|
+
})
|
|
300
|
+
)
|
|
301
|
+
}
|
|
302
|
+
if (reason === "missingUsageMeter" && !missingMeters)
|
|
303
|
+
throw new TypeError("[Sixb] Missing usage estimate requires missingMeters.")
|
|
304
|
+
return {
|
|
305
|
+
status: "unpriceable",
|
|
306
|
+
reason,
|
|
307
|
+
...(missingMeters === undefined ? {} : { missingMeters }),
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function isExternalValuationSource(sourceId: string): boolean {
|
|
312
|
+
return sourceId === "provider-reported"
|
|
313
|
+
}
|
|
314
|
+
|
|
191
315
|
function normalizeUnpriceableCost(
|
|
192
316
|
input: AiUnpriceableModelCallCostRecord,
|
|
193
317
|
base: Pick<
|
|
@@ -252,8 +376,14 @@ function normalizePriceSource(input: AiPriceSource): AiPriceSource {
|
|
|
252
376
|
assertNonBlank(input.sourceId, "price sourceId")
|
|
253
377
|
assertNonBlank(input.sourceEntryId, "price sourceEntryId")
|
|
254
378
|
assertNonBlank(input.sourceVersion, "price sourceVersion")
|
|
255
|
-
assertNonBlank(input.sourceUrl, "price sourceUrl")
|
|
256
|
-
return {
|
|
379
|
+
if (input.sourceUrl !== undefined) assertNonBlank(input.sourceUrl, "price sourceUrl")
|
|
380
|
+
return {
|
|
381
|
+
sourceId: input.sourceId,
|
|
382
|
+
sourceEntryId: input.sourceEntryId,
|
|
383
|
+
sourceVersion: input.sourceVersion,
|
|
384
|
+
...(input.sourceUrl === undefined ? {} : { sourceUrl: input.sourceUrl }),
|
|
385
|
+
observedAt: cloneDate(input.observedAt, "price source observedAt"),
|
|
386
|
+
}
|
|
257
387
|
}
|
|
258
388
|
|
|
259
389
|
function normalizeBillingIdentity(input: AiBillingIdentity): AiBillingIdentity {
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createSixbError, type SixbCodedError } from "../../errors/internal"
|
|
2
|
+
import type { AuthorizablePrincipal } from "../../execution/types"
|
|
3
|
+
import type { ReadonlyJsonValue } from "../../json"
|
|
4
|
+
import { aiLimitSubjectKey } from "./provider"
|
|
5
|
+
import type { AiLimitPolicy, AiLimitPolicyStatus, AiLimitSubject } from "./types"
|
|
6
|
+
|
|
7
|
+
/** @internal Resolve the immutable attribution dimensions enforced for one model call. */
|
|
8
|
+
export function aiLimitSubjectsFromAttribution(
|
|
9
|
+
requestedBy: AuthorizablePrincipal | undefined,
|
|
10
|
+
requesterGroupIds: readonly string[]
|
|
11
|
+
): readonly AiLimitSubject[] {
|
|
12
|
+
const subjects: AiLimitSubject[] = [
|
|
13
|
+
{ type: "project" },
|
|
14
|
+
...requesterGroupIds.map((id): AiLimitSubject => ({ type: "group", id })),
|
|
15
|
+
]
|
|
16
|
+
if (requestedBy) subjects.push(requestedBy)
|
|
17
|
+
|
|
18
|
+
const byKey = new Map(subjects.map((subject) => [aiLimitSubjectKey(subject), subject]))
|
|
19
|
+
return [...byKey.values()].sort((left, right) =>
|
|
20
|
+
aiLimitSubjectKey(left).localeCompare(aiLimitSubjectKey(right))
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** @internal Select every policy that applies to the call's immutable attribution snapshot. */
|
|
25
|
+
export function applicableAiLimitPolicyStatuses(
|
|
26
|
+
statuses: readonly AiLimitPolicyStatus[],
|
|
27
|
+
subjects: readonly AiLimitSubject[]
|
|
28
|
+
): readonly AiLimitPolicyStatus[] {
|
|
29
|
+
const keys = new Set(subjects.map(aiLimitSubjectKey))
|
|
30
|
+
return statuses.filter((status) => keys.has(aiLimitSubjectKey(status.policy.subject)))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** @internal Cheap policy-only counterpart used before the authoritative atomic reservation. */
|
|
34
|
+
export function applicableAiLimitPolicies(
|
|
35
|
+
policies: readonly AiLimitPolicy[],
|
|
36
|
+
subjects: readonly AiLimitSubject[]
|
|
37
|
+
): readonly AiLimitPolicy[] {
|
|
38
|
+
const keys = new Set(subjects.map(aiLimitSubjectKey))
|
|
39
|
+
return policies.filter((policy) => keys.has(aiLimitSubjectKey(policy.subject)))
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** @internal Stable failure safe for callers that may only hold run authority. */
|
|
43
|
+
export function aiUsageLimitExceededError(resetAt: Date): SixbCodedError {
|
|
44
|
+
return createSixbError(
|
|
45
|
+
"ai.usage_limit_exceeded",
|
|
46
|
+
"[Sixb] An applicable AI usage limit has no capacity for this model call.",
|
|
47
|
+
{ details: aiLimitFailureDetails({ resetAt }) }
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** @internal Fail closed when an applicable policy cannot be measured or reserved safely. */
|
|
52
|
+
export function aiUsageLimitUnavailableError(reasons: readonly string[]): SixbCodedError {
|
|
53
|
+
return createSixbError(
|
|
54
|
+
"ai.usage_limit_unavailable",
|
|
55
|
+
"[Sixb] An applicable AI usage limit could not be evaluated safely.",
|
|
56
|
+
{ details: aiLimitFailureDetails({ reasons }) }
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function aiLimitFailureDetails(input: {
|
|
61
|
+
readonly resetAt?: Date
|
|
62
|
+
readonly reasons?: readonly string[]
|
|
63
|
+
}): ReadonlyJsonValue {
|
|
64
|
+
return {
|
|
65
|
+
...(input.resetAt === undefined ? {} : { resetAt: input.resetAt.toISOString() }),
|
|
66
|
+
...(input.reasons === undefined ? {} : { reasons: [...input.reasons] }),
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type AiLimitStorageErrorCode =
|
|
2
|
+
| "duplicate_policy"
|
|
3
|
+
| "missing_policy"
|
|
4
|
+
| "missing_execution"
|
|
5
|
+
| "missing_reservation"
|
|
6
|
+
| "missing_usage_record"
|
|
7
|
+
| "usage_mismatch"
|
|
8
|
+
| "unavailable_actuals"
|
|
9
|
+
| "reservation_conflict"
|
|
10
|
+
| "reconciliation_conflict"
|
|
11
|
+
| "invalid_reservation_state"
|
|
12
|
+
|
|
13
|
+
/** Stable storage failure for AI limit policies and reservations. */
|
|
14
|
+
export class AiLimitStorageError extends Error {
|
|
15
|
+
readonly name = "AiLimitStorageError"
|
|
16
|
+
|
|
17
|
+
constructor(
|
|
18
|
+
readonly code: AiLimitStorageErrorCode,
|
|
19
|
+
message: string
|
|
20
|
+
) {
|
|
21
|
+
super(message)
|
|
22
|
+
}
|
|
23
|
+
}
|