@sixb/core 0.1.6 → 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.
Files changed (535) hide show
  1. package/dist/actions/index.js +37 -33
  2. package/dist/actions/index.js.map +1 -1
  3. package/dist/actions/worker.js +3 -3
  4. package/dist/agents/adapters.d.ts +33 -76
  5. package/dist/agents/adapters.d.ts.map +1 -1
  6. package/dist/agents/authority.d.ts +22 -6
  7. package/dist/agents/authority.d.ts.map +1 -1
  8. package/dist/agents/builders.d.ts +3 -11
  9. package/dist/agents/builders.d.ts.map +1 -1
  10. package/dist/agents/context.js +2 -2
  11. package/dist/agents/dispatch.d.ts +9 -1
  12. package/dist/agents/dispatch.d.ts.map +1 -1
  13. package/dist/agents/errors.d.ts +2 -2
  14. package/dist/agents/errors.d.ts.map +1 -1
  15. package/dist/agents/execution.d.ts +9 -10
  16. package/dist/agents/execution.d.ts.map +1 -1
  17. package/dist/agents/ids.d.ts +4 -0
  18. package/dist/agents/ids.d.ts.map +1 -1
  19. package/dist/agents/index.d.ts +13 -9
  20. package/dist/agents/index.d.ts.map +1 -1
  21. package/dist/agents/index.js +80 -68
  22. package/dist/agents/index.js.map +1 -1
  23. package/dist/agents/message.d.ts +17 -10
  24. package/dist/agents/message.d.ts.map +1 -1
  25. package/dist/agents/model-loop.d.ts +56 -0
  26. package/dist/agents/model-loop.d.ts.map +1 -0
  27. package/dist/agents/reference.d.ts +4 -0
  28. package/dist/agents/reference.d.ts.map +1 -0
  29. package/dist/agents/request.d.ts +10 -8
  30. package/dist/agents/request.d.ts.map +1 -1
  31. package/dist/agents/retired-config.d.ts +4 -0
  32. package/dist/agents/retired-config.d.ts.map +1 -0
  33. package/dist/agents/streams.d.ts +13 -8
  34. package/dist/agents/streams.d.ts.map +1 -1
  35. package/dist/agents/streams.js +7 -5
  36. package/dist/agents/streams.js.map +1 -1
  37. package/dist/agents/tool-catalog.d.ts +9 -0
  38. package/dist/agents/tool-catalog.d.ts.map +1 -0
  39. package/dist/agents/tool-definition.d.ts +1 -0
  40. package/dist/agents/tool-definition.d.ts.map +1 -1
  41. package/dist/agents/types.d.ts +31 -68
  42. package/dist/agents/types.d.ts.map +1 -1
  43. package/dist/agents/validation.d.ts +4 -10
  44. package/dist/agents/validation.d.ts.map +1 -1
  45. package/dist/ai-usage/execution.d.ts +53 -0
  46. package/dist/ai-usage/execution.d.ts.map +1 -0
  47. package/dist/ai-usage/index.d.ts +3 -0
  48. package/dist/ai-usage/index.d.ts.map +1 -0
  49. package/dist/auth/index.js +7 -7
  50. package/dist/authorization/decision.d.ts +5 -2
  51. package/dist/authorization/decision.d.ts.map +1 -1
  52. package/dist/authorization/grant-kinds.d.ts +24 -8
  53. package/dist/authorization/grant-kinds.d.ts.map +1 -1
  54. package/dist/authorization/index.d.ts +1 -1
  55. package/dist/authorization/index.d.ts.map +1 -1
  56. package/dist/authorization/index.js +8 -6
  57. package/dist/authorization/index.js.map +1 -1
  58. package/dist/authorization/resolve.d.ts +3 -3
  59. package/dist/authorization/resolve.d.ts.map +1 -1
  60. package/dist/authorization/types.d.ts +7 -5
  61. package/dist/authorization/types.d.ts.map +1 -1
  62. package/dist/blob-storage/browser.js +2 -2
  63. package/dist/blob-storage/index.js +3 -3
  64. package/dist/bootstrap/discovery.d.ts +1 -7
  65. package/dist/bootstrap/discovery.d.ts.map +1 -1
  66. package/dist/bootstrap/index.js +52 -48
  67. package/dist/bootstrap/index.js.map +1 -1
  68. package/dist/broker/index.js +2 -2
  69. package/dist/{chunk-zqysyfjt.js → chunk-08m3b6w8.js} +1 -1
  70. package/dist/{chunk-1g8negke.js → chunk-08twe8m6.js} +93 -8
  71. package/dist/chunk-08twe8m6.js.map +12 -0
  72. package/dist/{chunk-xkthy56g.js → chunk-1kamz6j0.js} +1 -1
  73. package/dist/{chunk-dy311asx.js → chunk-2b5qtban.js} +12 -12
  74. package/dist/{chunk-dy311asx.js.map → chunk-2b5qtban.js.map} +3 -3
  75. package/dist/{chunk-0172wgm9.js → chunk-2xns679x.js} +10 -2
  76. package/dist/{chunk-0172wgm9.js.map → chunk-2xns679x.js.map} +3 -3
  77. package/dist/{chunk-f83ka50g.js → chunk-37wk412q.js} +86 -28
  78. package/dist/{chunk-f83ka50g.js.map → chunk-37wk412q.js.map} +8 -8
  79. package/dist/{chunk-md8k0r54.js → chunk-3fqt22c4.js} +4 -4
  80. package/dist/{chunk-t9xghkva.js → chunk-3kv70xwp.js} +3 -2
  81. package/dist/{chunk-t9xghkva.js.map → chunk-3kv70xwp.js.map} +3 -3
  82. package/dist/{chunk-z3zp0bj1.js → chunk-407j3msh.js} +1 -1
  83. package/dist/{chunk-rhrbz7d4.js → chunk-4a849fr1.js} +1 -1
  84. package/dist/{chunk-62c7t4jc.js → chunk-4nxeacx7.js} +1 -1
  85. package/dist/{chunk-cy0n5dms.js → chunk-5jcdmjam.js} +1 -1
  86. package/dist/{chunk-819wnjz8.js → chunk-64sr682n.js} +7 -7
  87. package/dist/{chunk-t624af60.js → chunk-6ed5bwnd.js} +646 -67
  88. package/dist/{chunk-t624af60.js.map → chunk-6ed5bwnd.js.map} +10 -9
  89. package/dist/{chunk-x2yw73hy.js → chunk-7ds9620f.js} +1 -1
  90. package/dist/{chunk-dm72y8wt.js → chunk-7y0f6rf1.js} +29 -16
  91. package/dist/chunk-7y0f6rf1.js.map +10 -0
  92. package/dist/{chunk-72q2y8hn.js → chunk-8tsf6dmc.js} +2 -2
  93. package/dist/{chunk-nkbfrt0c.js → chunk-9aehf39w.js} +7 -7
  94. package/dist/{chunk-ezake7g1.js → chunk-agsvg9ar.js} +1 -1
  95. package/dist/{chunk-rdeagz6b.js → chunk-atmkaf60.js} +1 -1
  96. package/dist/{chunk-rdeagz6b.js.map → chunk-atmkaf60.js.map} +2 -2
  97. package/dist/chunk-c15dr03f.js +43 -0
  98. package/dist/chunk-c15dr03f.js.map +10 -0
  99. package/dist/{chunk-0hc5j867.js → chunk-d2ndstdf.js} +8 -6
  100. package/dist/{chunk-0hc5j867.js.map → chunk-d2ndstdf.js.map} +2 -2
  101. package/dist/{chunk-rnshztfq.js → chunk-d63tybny.js} +2 -2
  102. package/dist/{chunk-t0jjkep3.js → chunk-d8qkxt2v.js} +4 -2
  103. package/dist/chunk-d8qkxt2v.js.map +10 -0
  104. package/dist/{chunk-vybf6pkp.js → chunk-dbc80ad7.js} +1 -1
  105. package/dist/{chunk-4gz41why.js → chunk-dqn23610.js} +1 -1
  106. package/dist/{chunk-5sxb1168.js → chunk-e4rvtvpw.js} +13 -11
  107. package/dist/{chunk-5sxb1168.js.map → chunk-e4rvtvpw.js.map} +2 -2
  108. package/dist/{chunk-h9kxd41f.js → chunk-gbrpsx4m.js} +19 -6
  109. package/dist/chunk-gbrpsx4m.js.map +11 -0
  110. package/dist/{chunk-nva1xkjz.js → chunk-h0knpbz5.js} +468 -1236
  111. package/dist/chunk-h0knpbz5.js.map +38 -0
  112. package/dist/{chunk-tg5mee00.js → chunk-ha58tjtt.js} +6 -6
  113. package/dist/{chunk-f6erf2vv.js → chunk-hdz94br2.js} +2 -2
  114. package/dist/chunk-jecn6t54.js +307 -0
  115. package/dist/chunk-jecn6t54.js.map +12 -0
  116. package/dist/{chunk-dsrkgtnh.js → chunk-jq43kdvk.js} +1 -1
  117. package/dist/{chunk-wtmzkcht.js → chunk-k34z5rvh.js} +1 -1
  118. package/dist/{chunk-htq0qh7z.js → chunk-ka3a2ft3.js} +2 -2
  119. package/dist/{chunk-znagycq7.js → chunk-kt81c11h.js} +2 -2
  120. package/dist/chunk-n2arzn6e.js +1745 -0
  121. package/dist/chunk-n2arzn6e.js.map +20 -0
  122. package/dist/{chunk-f2rt4vkh.js → chunk-n2w475r0.js} +3 -3
  123. package/dist/{chunk-t8t39h7v.js → chunk-n6jxh8sw.js} +10 -2
  124. package/dist/chunk-n6jxh8sw.js.map +10 -0
  125. package/dist/{chunk-drjqm1aa.js → chunk-p03r0h5s.js} +310 -28
  126. package/dist/chunk-p03r0h5s.js.map +16 -0
  127. package/dist/chunk-p2vqaxkc.js +528 -0
  128. package/dist/chunk-p2vqaxkc.js.map +15 -0
  129. package/dist/{chunk-n4spznws.js → chunk-qjycjdj6.js} +84 -11
  130. package/dist/chunk-qjycjdj6.js.map +12 -0
  131. package/dist/chunk-qjzp9xyb.js +286 -0
  132. package/dist/chunk-qjzp9xyb.js.map +12 -0
  133. package/dist/{chunk-5gynx4xn.js → chunk-qv38twt8.js} +50 -69
  134. package/dist/{chunk-5gynx4xn.js.map → chunk-qv38twt8.js.map} +8 -8
  135. package/dist/{chunk-bhxaq2nn.js → chunk-qw9gvjv5.js} +1 -1
  136. package/dist/{chunk-8gv5z0zm.js → chunk-rp1mvzb4.js} +6 -6
  137. package/dist/{chunk-1e8m6yn3.js → chunk-rre42skh.js} +182 -18
  138. package/dist/chunk-rre42skh.js.map +39 -0
  139. package/dist/{chunk-ghteq96b.js → chunk-s5y30bc9.js} +2 -2
  140. package/dist/{chunk-a31h57d5.js → chunk-tn7xcs2n.js} +2 -2
  141. package/dist/{chunk-6gjqgd3d.js → chunk-tpnd31c1.js} +2 -1
  142. package/dist/chunk-tpnd31c1.js.map +11 -0
  143. package/dist/chunk-trxxmgnf.js +68 -0
  144. package/dist/chunk-trxxmgnf.js.map +11 -0
  145. package/dist/{chunk-e42bc6m3.js → chunk-vjjv9mrb.js} +2 -2
  146. package/dist/{chunk-8b55ygje.js → chunk-w3e09qqk.js} +1 -1
  147. package/dist/{chunk-ckxfnx7f.js → chunk-wjgm6jjt.js} +2 -2
  148. package/dist/{chunk-3j7573mj.js → chunk-x0qhkqje.js} +2 -2
  149. package/dist/{chunk-dysw7nsm.js → chunk-xdpwpkha.js} +2 -2
  150. package/dist/{chunk-a44d5zgd.js → chunk-y35ma3mj.js} +11 -16
  151. package/dist/{chunk-a44d5zgd.js.map → chunk-y35ma3mj.js.map} +3 -4
  152. package/dist/{chunk-qewtks41.js → chunk-z2sery1b.js} +64 -1
  153. package/dist/{chunk-qewtks41.js.map → chunk-z2sery1b.js.map} +3 -3
  154. package/dist/error-reporting/internal.js +4 -4
  155. package/dist/error-reporting/types.d.ts +7 -2
  156. package/dist/error-reporting/types.d.ts.map +1 -1
  157. package/dist/errors/catalog.d.ts +8 -0
  158. package/dist/errors/catalog.d.ts.map +1 -1
  159. package/dist/errors/internal.js +2 -2
  160. package/dist/events/index.js +4 -4
  161. package/dist/execution/agent.d.ts +18 -9
  162. package/dist/execution/agent.d.ts.map +1 -1
  163. package/dist/execution/agent.js +52 -43
  164. package/dist/execution/agent.js.map +1 -1
  165. package/dist/execution/authorization.d.ts +14 -4
  166. package/dist/execution/authorization.d.ts.map +1 -1
  167. package/dist/execution/primitive.js +45 -43
  168. package/dist/execution/primitive.js.map +2 -2
  169. package/dist/execution/request.d.ts +3 -1
  170. package/dist/execution/request.d.ts.map +1 -1
  171. package/dist/execution/request.js +46 -44
  172. package/dist/execution/request.js.map +3 -3
  173. package/dist/execution/types.d.ts +1 -1
  174. package/dist/execution/types.d.ts.map +1 -1
  175. package/dist/http/api-routes.d.ts.map +1 -1
  176. package/dist/http/index.js +1 -1
  177. package/dist/index.d.ts +9 -6
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +82 -77
  180. package/dist/index.js.map +1 -1
  181. package/dist/json.d.ts +2 -0
  182. package/dist/json.d.ts.map +1 -1
  183. package/dist/lake-storage/index.js +5 -5
  184. package/dist/logging/index.js +3 -3
  185. package/dist/logging/types.js +2 -2
  186. package/dist/materialization/index.js +2 -2
  187. package/dist/materializer/index.js +33 -29
  188. package/dist/materializer/index.js.map +1 -1
  189. package/dist/models/catalog.d.ts +40 -0
  190. package/dist/models/catalog.d.ts.map +1 -0
  191. package/dist/models/definitions.d.ts +25 -0
  192. package/dist/models/definitions.d.ts.map +1 -0
  193. package/dist/models/errors.d.ts +52 -0
  194. package/dist/models/errors.d.ts.map +1 -0
  195. package/dist/models/events.d.ts +192 -0
  196. package/dist/models/events.d.ts.map +1 -0
  197. package/dist/models/index.d.ts +17 -39
  198. package/dist/models/index.d.ts.map +1 -1
  199. package/dist/models/index.js +50 -0
  200. package/dist/models/index.js.map +9 -0
  201. package/dist/models/language-model.d.ts +90 -0
  202. package/dist/models/language-model.d.ts.map +1 -0
  203. package/dist/models/messages.d.ts +74 -0
  204. package/dist/models/messages.d.ts.map +1 -0
  205. package/dist/models/pricing.d.ts +69 -0
  206. package/dist/models/pricing.d.ts.map +1 -0
  207. package/dist/models/rate-card.d.ts +24 -0
  208. package/dist/models/rate-card.d.ts.map +1 -0
  209. package/dist/models/tools.d.ts +24 -0
  210. package/dist/models/tools.d.ts.map +1 -0
  211. package/dist/objects/index.js +38 -34
  212. package/dist/objects/index.js.map +1 -1
  213. package/dist/objects/query/index.js +32 -28
  214. package/dist/objects/query/index.js.map +1 -1
  215. package/dist/ontology/index.js +5 -5
  216. package/dist/ontology/internal.js +4 -4
  217. package/dist/pipelines/index.js +37 -35
  218. package/dist/pipelines/index.js.map +1 -1
  219. package/dist/projections/internal.js +35 -31
  220. package/dist/projections/internal.js.map +1 -1
  221. package/dist/queues/in-memory.d.ts +3 -2
  222. package/dist/queues/in-memory.d.ts.map +1 -1
  223. package/dist/queues/index.d.ts +3 -1
  224. package/dist/queues/index.d.ts.map +1 -1
  225. package/dist/queues/index.js +1 -1
  226. package/dist/queues/types.d.ts +15 -3
  227. package/dist/queues/types.d.ts.map +1 -1
  228. package/dist/runtime/create.d.ts +4 -4
  229. package/dist/runtime/create.d.ts.map +1 -1
  230. package/dist/runtime/definitions.d.ts +2 -2
  231. package/dist/runtime/definitions.d.ts.map +1 -1
  232. package/dist/runtime/host.d.ts +3 -2
  233. package/dist/runtime/host.d.ts.map +1 -1
  234. package/dist/runtime/resolve-definitions.d.ts +2 -2
  235. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  236. package/dist/runtime/sixb.d.ts +4 -2
  237. package/dist/runtime/sixb.d.ts.map +1 -1
  238. package/dist/security/every.d.ts +1 -4
  239. package/dist/security/every.d.ts.map +1 -1
  240. package/dist/security/grants.d.ts +6 -5
  241. package/dist/security/grants.d.ts.map +1 -1
  242. package/dist/security/index.d.ts +1 -1
  243. package/dist/security/index.d.ts.map +1 -1
  244. package/dist/security/registry.d.ts +1 -1
  245. package/dist/security/registry.d.ts.map +1 -1
  246. package/dist/security/types.d.ts +13 -5
  247. package/dist/security/types.d.ts.map +1 -1
  248. package/dist/security/validation.d.ts +4 -2
  249. package/dist/security/validation.d.ts.map +1 -1
  250. package/dist/storage/action-runs/failure.js +3 -3
  251. package/dist/storage/action-runs/provider.js +2 -2
  252. package/dist/storage/agents/errors.d.ts +1 -1
  253. package/dist/storage/agents/errors.d.ts.map +1 -1
  254. package/dist/storage/agents/in-memory.d.ts +3 -2
  255. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  256. package/dist/storage/agents/index.d.ts +1 -1
  257. package/dist/storage/agents/index.d.ts.map +1 -1
  258. package/dist/storage/agents/provider.d.ts +11 -4
  259. package/dist/storage/agents/provider.d.ts.map +1 -1
  260. package/dist/storage/agents/provider.js +18 -15
  261. package/dist/storage/agents/provider.js.map +1 -1
  262. package/dist/storage/agents/types.d.ts +65 -17
  263. package/dist/storage/agents/types.d.ts.map +1 -1
  264. package/dist/storage/ai-cost/analytics.d.ts +2 -1
  265. package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
  266. package/dist/storage/ai-cost/codec.d.ts +3 -2
  267. package/dist/storage/ai-cost/codec.d.ts.map +1 -1
  268. package/dist/storage/ai-cost/groups.d.ts +51 -0
  269. package/dist/storage/ai-cost/groups.d.ts.map +1 -0
  270. package/dist/storage/ai-cost/in-memory.d.ts +11 -1
  271. package/dist/storage/ai-cost/in-memory.d.ts.map +1 -1
  272. package/dist/storage/ai-cost/index.d.ts +1 -1
  273. package/dist/storage/ai-cost/index.d.ts.map +1 -1
  274. package/dist/storage/ai-cost/provider.d.ts +2 -0
  275. package/dist/storage/ai-cost/provider.d.ts.map +1 -1
  276. package/dist/storage/ai-cost/provider.js +29 -13
  277. package/dist/storage/ai-cost/provider.js.map +3 -3
  278. package/dist/storage/ai-cost/types.d.ts +64 -15
  279. package/dist/storage/ai-cost/types.d.ts.map +1 -1
  280. package/dist/storage/ai-cost/validation.d.ts +2 -1
  281. package/dist/storage/ai-cost/validation.d.ts.map +1 -1
  282. package/dist/storage/ai-limits/enforcement.d.ts +14 -0
  283. package/dist/storage/ai-limits/enforcement.d.ts.map +1 -0
  284. package/dist/storage/ai-limits/enforcement.js +21 -0
  285. package/dist/storage/ai-limits/enforcement.js.map +9 -0
  286. package/dist/storage/ai-limits/errors.d.ts +8 -0
  287. package/dist/storage/ai-limits/errors.d.ts.map +1 -0
  288. package/dist/storage/ai-limits/in-memory.d.ts +78 -0
  289. package/dist/storage/ai-limits/in-memory.d.ts.map +1 -0
  290. package/dist/storage/ai-limits/index.d.ts +7 -0
  291. package/dist/storage/ai-limits/index.d.ts.map +1 -0
  292. package/dist/storage/ai-limits/period.d.ts +4 -0
  293. package/dist/storage/ai-limits/period.d.ts.map +1 -0
  294. package/dist/storage/ai-limits/provider.d.ts +85 -0
  295. package/dist/storage/ai-limits/provider.d.ts.map +1 -0
  296. package/dist/storage/ai-limits/provider.js +62 -0
  297. package/dist/storage/ai-limits/provider.js.map +9 -0
  298. package/dist/storage/ai-limits/types.d.ts +175 -0
  299. package/dist/storage/ai-limits/types.d.ts.map +1 -0
  300. package/dist/storage/ai-usage/in-memory.d.ts +4 -0
  301. package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
  302. package/dist/storage/ai-usage/record.d.ts.map +1 -1
  303. package/dist/storage/ai-usage/types.d.ts +6 -2
  304. package/dist/storage/ai-usage/types.d.ts.map +1 -1
  305. package/dist/storage/auth/errors.d.ts +1 -1
  306. package/dist/storage/auth/errors.d.ts.map +1 -1
  307. package/dist/storage/auth/in-memory/auth-storage.d.ts +4 -1
  308. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  309. package/dist/storage/auth/in-memory/device-authorizations.d.ts +29 -0
  310. package/dist/storage/auth/in-memory/device-authorizations.d.ts.map +1 -0
  311. package/dist/storage/auth/in-memory/shared.d.ts +3 -1
  312. package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
  313. package/dist/storage/auth/index.d.ts +2 -1
  314. package/dist/storage/auth/index.d.ts.map +1 -1
  315. package/dist/storage/auth/types.d.ts +66 -0
  316. package/dist/storage/auth/types.d.ts.map +1 -1
  317. package/dist/storage/connector-connections/provider.js +2 -2
  318. package/dist/storage/executions/provider.js +1 -1
  319. package/dist/storage/executions/run-link.d.ts +7 -2
  320. package/dist/storage/executions/run-link.d.ts.map +1 -1
  321. package/dist/storage/executions/validation.d.ts.map +1 -1
  322. package/dist/storage/in-memory/index.d.ts +4 -0
  323. package/dist/storage/in-memory/index.d.ts.map +1 -1
  324. package/dist/storage/index.d.ts +7 -4
  325. package/dist/storage/index.d.ts.map +1 -1
  326. package/dist/storage/index.js +51 -38
  327. package/dist/storage/index.js.map +1 -1
  328. package/dist/storage/ontology/provider.js +3 -3
  329. package/dist/storage/pipeline-runs/provider.js +2 -2
  330. package/dist/storage/projection-runs/provider.js +4 -4
  331. package/dist/storage/sync-runs/provider.js +2 -2
  332. package/dist/storage/types.d.ts +5 -1
  333. package/dist/storage/types.d.ts.map +1 -1
  334. package/dist/storage/webhook-runs/provider.js +2 -2
  335. package/dist/storage/workflow-runs/provider.d.ts +1 -1
  336. package/dist/storage/workflow-runs/provider.js +10 -11
  337. package/dist/storage/workflow-runs/provider.js.map +1 -1
  338. package/dist/storage/workflow-runs/types.d.ts +5 -4
  339. package/dist/storage/workflow-runs/types.d.ts.map +1 -1
  340. package/dist/syncs/index.js +37 -35
  341. package/dist/syncs/index.js.map +1 -1
  342. package/dist/testing/agent-execution.d.ts +3 -1
  343. package/dist/testing/agent-execution.d.ts.map +1 -1
  344. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  345. package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
  346. package/dist/testing/ai-limit-storage-contract.d.ts +18 -0
  347. package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -0
  348. package/dist/testing/ai-model-call-groups-contract.d.ts +6 -0
  349. package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -0
  350. package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
  351. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  352. package/dist/testing/index.d.ts +2 -0
  353. package/dist/testing/index.d.ts.map +1 -1
  354. package/dist/testing/index.js +3637 -1962
  355. package/dist/testing/index.js.map +14 -12
  356. package/dist/testing/queues-contract.d.ts.map +1 -1
  357. package/dist/webhooks/internal.js +32 -28
  358. package/dist/webhooks/internal.js.map +2 -2
  359. package/dist/workers/index.js +2 -2
  360. package/dist/workflows/agent-step-identity.d.ts +3 -0
  361. package/dist/workflows/agent-step-identity.d.ts.map +1 -0
  362. package/dist/workflows/builders.d.ts +2 -3
  363. package/dist/workflows/builders.d.ts.map +1 -1
  364. package/dist/workflows/execution.d.ts +1 -1
  365. package/dist/workflows/execution.d.ts.map +1 -1
  366. package/dist/workflows/failure.d.ts +1 -1
  367. package/dist/workflows/failure.d.ts.map +1 -1
  368. package/dist/workflows/index.d.ts +3 -2
  369. package/dist/workflows/index.d.ts.map +1 -1
  370. package/dist/workflows/index.js +53 -45
  371. package/dist/workflows/index.js.map +1 -1
  372. package/dist/workflows/types.d.ts +26 -11
  373. package/dist/workflows/types.d.ts.map +1 -1
  374. package/dist/workflows/validation.d.ts +7 -1
  375. package/dist/workflows/validation.d.ts.map +1 -1
  376. package/package.json +19 -4
  377. package/src/agents/adapters.ts +109 -115
  378. package/src/agents/authority.ts +214 -32
  379. package/src/agents/builders.ts +3 -50
  380. package/src/agents/context-compaction.ts +4 -0
  381. package/src/agents/dispatch.ts +59 -2
  382. package/src/agents/errors.ts +5 -2
  383. package/src/agents/execution.ts +53 -52
  384. package/src/agents/ids.ts +16 -1
  385. package/src/agents/index.ts +23 -11
  386. package/src/agents/message.ts +18 -9
  387. package/src/agents/model-loop.ts +1023 -0
  388. package/src/agents/reference.ts +7 -0
  389. package/src/agents/request.ts +141 -74
  390. package/src/agents/retired-config.ts +20 -0
  391. package/src/agents/streams.ts +45 -19
  392. package/src/agents/tool-catalog.ts +21 -0
  393. package/src/agents/tool-definition.ts +23 -0
  394. package/src/agents/types.ts +39 -81
  395. package/src/agents/validation.ts +34 -180
  396. package/src/ai-usage/execution.ts +196 -0
  397. package/src/ai-usage/index.ts +15 -0
  398. package/src/authorization/decision.ts +27 -10
  399. package/src/authorization/grant-kinds.ts +62 -15
  400. package/src/authorization/index.ts +1 -0
  401. package/src/authorization/resolve.ts +12 -5
  402. package/src/authorization/types.ts +7 -5
  403. package/src/bootstrap/discovery.ts +0 -3
  404. package/src/error-reporting/types.ts +4 -2
  405. package/src/errors/catalog.ts +8 -0
  406. package/src/execution/agent.ts +129 -22
  407. package/src/execution/authorization.ts +48 -18
  408. package/src/execution/request.ts +4 -1
  409. package/src/execution/types.ts +1 -1
  410. package/src/http/api-routes.ts +63 -0
  411. package/src/index.ts +36 -7
  412. package/src/json.ts +9 -0
  413. package/src/models/catalog.ts +137 -0
  414. package/src/models/definitions.ts +202 -0
  415. package/src/models/errors.ts +83 -0
  416. package/src/models/events.ts +198 -0
  417. package/src/models/index.ts +89 -71
  418. package/src/models/language-model.ts +143 -0
  419. package/src/models/messages.ts +78 -0
  420. package/src/models/pricing.ts +390 -0
  421. package/src/models/rate-card.ts +101 -0
  422. package/src/models/tools.ts +29 -0
  423. package/src/queues/in-memory.ts +5 -0
  424. package/src/queues/index.ts +11 -0
  425. package/src/queues/types.ts +20 -3
  426. package/src/runtime/create.ts +7 -5
  427. package/src/runtime/definitions.ts +2 -2
  428. package/src/runtime/host.ts +3 -2
  429. package/src/runtime/resolve-definitions.ts +13 -36
  430. package/src/runtime/sixb.ts +6 -8
  431. package/src/security/every.ts +0 -4
  432. package/src/security/grants.ts +55 -11
  433. package/src/security/index.ts +2 -0
  434. package/src/security/registry.ts +6 -5
  435. package/src/security/types.ts +15 -4
  436. package/src/security/validation.ts +30 -9
  437. package/src/storage/agents/errors.ts +1 -0
  438. package/src/storage/agents/in-memory.ts +121 -11
  439. package/src/storage/agents/index.ts +7 -0
  440. package/src/storage/agents/provider.ts +150 -6
  441. package/src/storage/agents/types.ts +73 -16
  442. package/src/storage/ai-cost/analytics.ts +63 -6
  443. package/src/storage/ai-cost/codec.ts +37 -12
  444. package/src/storage/ai-cost/groups.ts +248 -0
  445. package/src/storage/ai-cost/in-memory.ts +42 -0
  446. package/src/storage/ai-cost/index.ts +6 -0
  447. package/src/storage/ai-cost/provider.ts +7 -0
  448. package/src/storage/ai-cost/types.ts +76 -14
  449. package/src/storage/ai-cost/validation.ts +147 -17
  450. package/src/storage/ai-limits/enforcement.ts +68 -0
  451. package/src/storage/ai-limits/errors.ts +23 -0
  452. package/src/storage/ai-limits/in-memory.ts +671 -0
  453. package/src/storage/ai-limits/index.ts +31 -0
  454. package/src/storage/ai-limits/period.ts +11 -0
  455. package/src/storage/ai-limits/provider.ts +430 -0
  456. package/src/storage/ai-limits/types.ts +195 -0
  457. package/src/storage/ai-usage/in-memory.ts +13 -0
  458. package/src/storage/ai-usage/record.ts +17 -0
  459. package/src/storage/ai-usage/types.ts +6 -2
  460. package/src/storage/auth/errors.ts +6 -0
  461. package/src/storage/auth/in-memory/auth-storage.ts +69 -0
  462. package/src/storage/auth/in-memory/device-authorizations.ts +145 -0
  463. package/src/storage/auth/in-memory/shared.ts +7 -0
  464. package/src/storage/auth/index.ts +7 -0
  465. package/src/storage/auth/types.ts +73 -0
  466. package/src/storage/executions/run-link.ts +16 -6
  467. package/src/storage/executions/validation.ts +36 -6
  468. package/src/storage/in-memory/index.ts +48 -4
  469. package/src/storage/index.ts +51 -1
  470. package/src/storage/types.ts +37 -0
  471. package/src/storage/workflow-runs/in-memory.ts +3 -3
  472. package/src/storage/workflow-runs/provider.ts +2 -2
  473. package/src/storage/workflow-runs/types.ts +6 -3
  474. package/src/testing/agent-execution.ts +40 -28
  475. package/src/testing/agent-storage-contract.ts +249 -28
  476. package/src/testing/ai-cost-storage-contract.ts +96 -8
  477. package/src/testing/ai-limit-storage-contract.ts +1134 -0
  478. package/src/testing/ai-model-call-groups-contract.ts +353 -0
  479. package/src/testing/ai-usage-storage-contract.ts +31 -0
  480. package/src/testing/auth-storage-contract.ts +85 -0
  481. package/src/testing/execution-storage-contract.ts +2 -2
  482. package/src/testing/index.ts +10 -0
  483. package/src/testing/queues-contract.ts +36 -1
  484. package/src/workflows/agent-step-identity.ts +4 -0
  485. package/src/workflows/builders.ts +95 -9
  486. package/src/workflows/execution.ts +2 -2
  487. package/src/workflows/failure.ts +2 -2
  488. package/src/workflows/index.ts +3 -0
  489. package/src/workflows/types.ts +23 -11
  490. package/src/workflows/validation.ts +100 -7
  491. package/dist/chunk-1e8m6yn3.js.map +0 -37
  492. package/dist/chunk-1g8negke.js.map +0 -11
  493. package/dist/chunk-6gjqgd3d.js.map +0 -11
  494. package/dist/chunk-dm72y8wt.js.map +0 -10
  495. package/dist/chunk-drjqm1aa.js.map +0 -15
  496. package/dist/chunk-fe5ev6mr.js +0 -55
  497. package/dist/chunk-fe5ev6mr.js.map +0 -11
  498. package/dist/chunk-h9kxd41f.js.map +0 -11
  499. package/dist/chunk-hceck7dq.js +0 -137
  500. package/dist/chunk-hceck7dq.js.map +0 -10
  501. package/dist/chunk-n4spznws.js.map +0 -11
  502. package/dist/chunk-nva1xkjz.js.map +0 -46
  503. package/dist/chunk-t0jjkep3.js.map +0 -10
  504. package/dist/chunk-t8t39h7v.js.map +0 -10
  505. /package/dist/{chunk-zqysyfjt.js.map → chunk-08m3b6w8.js.map} +0 -0
  506. /package/dist/{chunk-xkthy56g.js.map → chunk-1kamz6j0.js.map} +0 -0
  507. /package/dist/{chunk-md8k0r54.js.map → chunk-3fqt22c4.js.map} +0 -0
  508. /package/dist/{chunk-z3zp0bj1.js.map → chunk-407j3msh.js.map} +0 -0
  509. /package/dist/{chunk-rhrbz7d4.js.map → chunk-4a849fr1.js.map} +0 -0
  510. /package/dist/{chunk-62c7t4jc.js.map → chunk-4nxeacx7.js.map} +0 -0
  511. /package/dist/{chunk-cy0n5dms.js.map → chunk-5jcdmjam.js.map} +0 -0
  512. /package/dist/{chunk-819wnjz8.js.map → chunk-64sr682n.js.map} +0 -0
  513. /package/dist/{chunk-x2yw73hy.js.map → chunk-7ds9620f.js.map} +0 -0
  514. /package/dist/{chunk-72q2y8hn.js.map → chunk-8tsf6dmc.js.map} +0 -0
  515. /package/dist/{chunk-nkbfrt0c.js.map → chunk-9aehf39w.js.map} +0 -0
  516. /package/dist/{chunk-ezake7g1.js.map → chunk-agsvg9ar.js.map} +0 -0
  517. /package/dist/{chunk-rnshztfq.js.map → chunk-d63tybny.js.map} +0 -0
  518. /package/dist/{chunk-vybf6pkp.js.map → chunk-dbc80ad7.js.map} +0 -0
  519. /package/dist/{chunk-4gz41why.js.map → chunk-dqn23610.js.map} +0 -0
  520. /package/dist/{chunk-tg5mee00.js.map → chunk-ha58tjtt.js.map} +0 -0
  521. /package/dist/{chunk-f6erf2vv.js.map → chunk-hdz94br2.js.map} +0 -0
  522. /package/dist/{chunk-dsrkgtnh.js.map → chunk-jq43kdvk.js.map} +0 -0
  523. /package/dist/{chunk-wtmzkcht.js.map → chunk-k34z5rvh.js.map} +0 -0
  524. /package/dist/{chunk-htq0qh7z.js.map → chunk-ka3a2ft3.js.map} +0 -0
  525. /package/dist/{chunk-znagycq7.js.map → chunk-kt81c11h.js.map} +0 -0
  526. /package/dist/{chunk-f2rt4vkh.js.map → chunk-n2w475r0.js.map} +0 -0
  527. /package/dist/{chunk-bhxaq2nn.js.map → chunk-qw9gvjv5.js.map} +0 -0
  528. /package/dist/{chunk-8gv5z0zm.js.map → chunk-rp1mvzb4.js.map} +0 -0
  529. /package/dist/{chunk-ghteq96b.js.map → chunk-s5y30bc9.js.map} +0 -0
  530. /package/dist/{chunk-a31h57d5.js.map → chunk-tn7xcs2n.js.map} +0 -0
  531. /package/dist/{chunk-e42bc6m3.js.map → chunk-vjjv9mrb.js.map} +0 -0
  532. /package/dist/{chunk-8b55ygje.js.map → chunk-w3e09qqk.js.map} +0 -0
  533. /package/dist/{chunk-ckxfnx7f.js.map → chunk-wjgm6jjt.js.map} +0 -0
  534. /package/dist/{chunk-3j7573mj.js.map → chunk-x0qhkqje.js.map} +0 -0
  535. /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 the deterministic local catalog rater. */
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 key in a pricing catalog. */
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 compact catalog entry applied to a valuation. */
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: string
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
- | "missingCatalogEntry"
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
- /** Exact arithmetic under one immutable catalog snapshot; not a provider-settled charge. */
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 the compact catalog cannot completely and safely value a call. */
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 interface AiAccountingAgentBreakdown extends AiAccountingAggregate {
137
- readonly agentId: string
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 agentId: string
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
- /** Immutable model-call costs plus execution and project accounting reads. */
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.output.total": 4,
25
- "tokens.output.text": 5,
26
- "tokens.output.reasoning": 6,
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
- "missingCatalogEntry",
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") return normalizeRatedCost(input, base)
89
- if (input.status === "unpriceable") return normalizeUnpriceableCost(input, base)
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 partitions = [
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 presentPartitions = partitions.filter(([meter]) => components.has(meter))
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 presentPartitions.length === 0 && BigInt(total.quantity) === BigInt(usage.inputTokens)
159
+ return (
160
+ presentDirect.length === 0 &&
161
+ specificWrites.length === 0 &&
162
+ BigInt(total.quantity) === BigInt(usage.inputTokens)
163
+ )
125
164
  }
126
- if (presentPartitions.length === 0) return false
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 presentPartitions) {
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) throw new TypeError("[Sixb] AI rated cost requires components.")
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 { ...input, observedAt: cloneDate(input.observedAt, "price source observedAt") }
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
+ }