@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
@@ -0,0 +1,353 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type { Storage } from "../storage/types"
3
+ import { workflowAgentStepActorId } from "../workflows/agent-step-identity"
4
+ import { createTestAgentExecution } from "./agent-execution"
5
+ import type { AiStorageContractSuiteOptions } from "./ai-cost-storage-contract"
6
+ import { createTestWorkflowExecution } from "./workflow-execution"
7
+
8
+ export type AiModelCallGroupsContractStorage = Required<
9
+ Pick<Storage, "agents" | "aiUsage" | "aiCosts" | "executions" | "workflowRuns">
10
+ >
11
+
12
+ const projectId = "model-call-groups"
13
+ const range = {
14
+ projectId,
15
+ from: new Date("2026-09-01T00:00:00Z"),
16
+ to: new Date("2026-09-02T00:00:00Z"),
17
+ }
18
+
19
+ /** Regression: grouping the raw-call page instead of the full filtered set breaks these totals. */
20
+ export function runAiModelCallGroupsContractSuite<T extends AiModelCallGroupsContractStorage>(
21
+ name: string,
22
+ options: AiStorageContractSuiteOptions<T>
23
+ ): void {
24
+ describe(name, () => {
25
+ test("attributes workflow usage to step references and keeps same-named steps separate", async () => {
26
+ const storage = await options.createStorage()
27
+ try {
28
+ await options.setup?.(storage)
29
+ for (const [index, workflowId] of ["billing", "billing", "shipping"].entries()) {
30
+ await seedWorkflowCall(storage, workflowId, `workflow-run-${index}`)
31
+ }
32
+ const overview = await storage.aiCosts.queryProjectOverview({ ...range, bucket: "day" })
33
+ // Regression proof: grouping only by step id merges billing and shipping; exposing
34
+ // the actor id instead of the step references fails these exact projections.
35
+ expect(
36
+ overview.agents.map((entry) => ({
37
+ kind: entry.kind,
38
+ modelCallCount: entry.modelCallCount,
39
+ ...(entry.kind === "workflowAgent"
40
+ ? { workflowId: entry.workflowId, agentStepId: entry.agentStepId }
41
+ : {}),
42
+ }))
43
+ ).toEqual([
44
+ {
45
+ kind: "workflowAgent",
46
+ workflowId: "billing",
47
+ agentStepId: "review",
48
+ modelCallCount: 2,
49
+ },
50
+ {
51
+ kind: "workflowAgent",
52
+ workflowId: "shipping",
53
+ agentStepId: "review",
54
+ modelCallCount: 1,
55
+ },
56
+ ])
57
+ expect(overview.totals.costs.amounts).toEqual([{ currency: "USD", amountNanos: "30" }])
58
+ const calls = await storage.aiCosts.listModelCalls(range)
59
+ const groups = await storage.aiCosts.listModelCallGroups(range)
60
+ expect(calls.total).toBe(3)
61
+ expect(groups.total).toBe(3)
62
+ for (const call of calls.items) {
63
+ const runId = call.usage.callId
64
+ const workflowId = runId === "workflow-run-2" ? "shipping" : "billing"
65
+ const attribution = {
66
+ kind: "workflowAgent" as const,
67
+ workflowId,
68
+ agentStepId: "review",
69
+ workflowRunId: runId,
70
+ nodeRunId: `${runId}:node:0`,
71
+ }
72
+ expect(call.attribution).toEqual(attribution)
73
+ const group = groups.items.find((item) => item.executionId === call.usage.executionId)
74
+ expect(group?.attribution).toEqual(attribution)
75
+ expect(group?.executions[0]?.attribution).toEqual(attribution)
76
+ }
77
+ } finally {
78
+ await options.cleanup?.(storage)
79
+ }
80
+ })
81
+
82
+ test("paginates whole runs, keeps filtered parents, and preserves exact accounting", async () => {
83
+ const storage = await options.createStorage()
84
+ try {
85
+ await options.setup?.(storage)
86
+ await seed(storage)
87
+ const first = await storage.aiCosts.listModelCallGroups({ ...range, limit: 1 })
88
+ expect(first).toMatchObject({
89
+ total: 2,
90
+ hasMore: true,
91
+ items: [{ executionId: "exec_second", modelCallCount: 1 }],
92
+ })
93
+ const second = await storage.aiCosts.listModelCallGroups({ ...range, limit: 1, offset: 1 })
94
+ expect(second).toMatchObject({
95
+ total: 2,
96
+ hasMore: false,
97
+ items: [
98
+ {
99
+ executionId: "exec_parent",
100
+ modelCallCount: 32,
101
+ attribution: { kind: "agent", agentRunId: "parent", threadId: "thread" },
102
+ costs: {
103
+ amounts: [
104
+ { currency: "EUR", amountNanos: "0" },
105
+ { currency: "USD", amountNanos: "300" },
106
+ ],
107
+ ratedCallCount: 31,
108
+ unvaluedCallCount: 1,
109
+ },
110
+ executions: [
111
+ { executionId: "exec_parent", modelCallCount: 1, totalTokens: 3 },
112
+ {
113
+ executionId: "exec_child",
114
+ modelCallCount: 31,
115
+ attribution: { kind: "subagent", parentRunId: "parent", subagentRunId: "child" },
116
+ },
117
+ ],
118
+ },
119
+ ],
120
+ })
121
+ expect(second.items[0]?.totalTokens).toBeUndefined()
122
+ const filtered = await storage.aiCosts.listModelCallGroups({
123
+ ...range,
124
+ providerId: "child-provider",
125
+ modelId: "small",
126
+ valuationStatus: "rated",
127
+ })
128
+ expect(filtered).toMatchObject({
129
+ total: 1,
130
+ items: [
131
+ {
132
+ executionId: "exec_parent",
133
+ modelCallCount: 30,
134
+ totalTokens: 90,
135
+ costs: {
136
+ amounts: [{ currency: "USD", amountNanos: "300" }],
137
+ ratedCallCount: 30,
138
+ unvaluedCallCount: 0,
139
+ },
140
+ executions: [{ executionId: "exec_child", modelCallCount: 30 }],
141
+ },
142
+ ],
143
+ })
144
+ expect(filtered.items[0]?.executions).toHaveLength(1)
145
+ const late = await storage.aiCosts.listModelCallGroups({
146
+ ...range,
147
+ from: new Date("2026-09-01T12:00:01Z"),
148
+ to: new Date("2026-09-01T12:00:32Z"),
149
+ })
150
+ expect(late).toMatchObject({
151
+ total: 1,
152
+ items: [{ executionId: "exec_parent", modelCallCount: 31 }],
153
+ })
154
+ const unknown = await storage.aiCosts.listModelCallGroups({
155
+ ...range,
156
+ valuationStatus: "unvalued",
157
+ modelId: "small",
158
+ })
159
+ expect(unknown.items[0]?.costs.amounts).toEqual([])
160
+ expect(unknown.items[0]?.totalTokens).toBeUndefined()
161
+ expect(
162
+ await storage.aiCosts.listModelCallGroups({ ...range, projectId: "other-project" })
163
+ ).toEqual({ items: [], total: 0, hasMore: false })
164
+ expect(await storage.aiCosts.listModelCallGroups({ ...range, offset: 20 })).toEqual({
165
+ items: [],
166
+ total: 2,
167
+ hasMore: false,
168
+ })
169
+ await expect(
170
+ storage.aiCosts.listModelCallGroups({ ...range, limit: 201 })
171
+ ).rejects.toThrow()
172
+ await expect(
173
+ storage.aiCosts.listModelCallGroups({ ...range, to: range.from })
174
+ ).rejects.toThrow()
175
+ } finally {
176
+ await options.cleanup?.(storage)
177
+ }
178
+ })
179
+ })
180
+ }
181
+
182
+ async function seedWorkflowCall(
183
+ storage: AiModelCallGroupsContractStorage,
184
+ workflowId: string,
185
+ runId: string
186
+ ) {
187
+ const sourceExecutionId = await createTestWorkflowExecution(storage.executions, {
188
+ projectId,
189
+ workflowId,
190
+ runId,
191
+ })
192
+ await storage.workflowRuns.queue({
193
+ projectId,
194
+ id: runId,
195
+ workflowId,
196
+ executionId: sourceExecutionId,
197
+ input: {},
198
+ requesterGroupIds: [],
199
+ })
200
+ await storage.workflowRuns.start({ projectId, id: runId })
201
+ const nodeRunId = `${runId}:node:0`
202
+ await storage.workflowRuns.nodes.start({
203
+ projectId,
204
+ id: nodeRunId,
205
+ workflowId,
206
+ workflowRunId: runId,
207
+ nodeIndex: 0,
208
+ nodeType: "agent",
209
+ nodeId: "review",
210
+ nodeKey: "review",
211
+ input: {},
212
+ })
213
+ const actorId = workflowAgentStepActorId(workflowId, "review")
214
+ const executionId = await createTestAgentExecution(storage, {
215
+ projectId,
216
+ runId: nodeRunId,
217
+ actorId,
218
+ sourceExecutionId,
219
+ })
220
+ await storage.workflowRuns.agentNodes.create({
221
+ projectId,
222
+ nodeRunId,
223
+ executionId,
224
+ actorId,
225
+ prompt: "Review the task.",
226
+ })
227
+ const { record } = await storage.aiUsage.recordModelCall({
228
+ projectId,
229
+ id: `usage:${runId}`,
230
+ executionId,
231
+ attempt: 1,
232
+ callId: runId,
233
+ requesterGroupIds: [],
234
+ providerId: "test",
235
+ requestedModelId: "small",
236
+ responseId: runId,
237
+ usage: { inputTokens: 10, outputTokens: 5 },
238
+ occurredAt: new Date("2026-09-01T12:00:00Z"),
239
+ })
240
+ await storage.aiCosts.recordModelCallCost({
241
+ projectId,
242
+ usageRecordId: record.id,
243
+ status: "rated",
244
+ pricingContext: {},
245
+ priceSource: {
246
+ sourceId: "provider-reported",
247
+ sourceEntryId: runId,
248
+ sourceVersion: "1",
249
+ observedAt: new Date("2026-09-01T12:00:00Z"),
250
+ },
251
+ components: [],
252
+ billingIdentity: { providerId: "test", modelId: "small" },
253
+ money: { currency: "USD", amountNanos: "10" },
254
+ ratedAt: new Date("2026-09-01T12:00:00Z"),
255
+ })
256
+ }
257
+
258
+ async function seed(storage: AiModelCallGroupsContractStorage) {
259
+ await storage.agents.threads.create({
260
+ id: "thread",
261
+ projectId,
262
+ ownerPrincipal: { type: "user", id: "user" },
263
+ })
264
+ for (const runId of ["parent", "second"]) {
265
+ const executionId = await createTestAgentExecution(storage, {
266
+ projectId,
267
+ runId,
268
+ executionId: `exec_${runId}`,
269
+ authority: "inherited",
270
+ })
271
+ await storage.agents.runs.create({
272
+ id: runId,
273
+ projectId,
274
+ executionId,
275
+ threadId: "thread",
276
+ triggerMessageId: `message_${runId}`,
277
+ spec: { model: { provider: "parent-provider", modelId: "large" } },
278
+ requesterGroupIds: [],
279
+ })
280
+ await storage.agents.runs.start({
281
+ id: runId,
282
+ projectId,
283
+ execution: { token: runId, queueLeaseExpiresAt: new Date("2100-01-01T00:00:00Z") },
284
+ })
285
+ if (runId === "parent") {
286
+ const childExecution = await createTestAgentExecution(storage, {
287
+ projectId,
288
+ actorId: "child",
289
+ runId: "child",
290
+ executionId: "exec_child",
291
+ sourceExecutionId: executionId,
292
+ authority: "inherited",
293
+ })
294
+ await storage.agents.runs.createSubagent({
295
+ id: "child",
296
+ projectId,
297
+ executionId: childExecution,
298
+ parentRunId: runId,
299
+ parentExecutionToken: runId,
300
+ spawnKey: "research",
301
+ spec: {
302
+ model: { provider: "child-provider", modelId: "small" },
303
+ task: "Research",
304
+ toolNames: [],
305
+ maxSteps: 25,
306
+ },
307
+ maxActiveChildren: 4,
308
+ })
309
+ }
310
+ await storage.agents.runs.finish({
311
+ id: runId,
312
+ projectId,
313
+ executionToken: runId,
314
+ status: "succeeded",
315
+ })
316
+ }
317
+ for (let index = 0; index < 33; index++) {
318
+ const child = index > 0 && index < 32
319
+ const result = await storage.aiUsage.recordModelCall({
320
+ id: `usage_${index}`,
321
+ projectId,
322
+ executionId: index === 0 ? "exec_parent" : child ? "exec_child" : "exec_second",
323
+ attempt: 1,
324
+ callId: `call_${index}`,
325
+ requesterGroupIds: [],
326
+ providerId: child ? "child-provider" : "parent-provider",
327
+ requestedModelId: child ? "small" : "large",
328
+ responseId: `response_${index}`,
329
+ usage: index === 31 ? {} : { inputTokens: 1, outputTokens: 2 },
330
+ occurredAt: new Date(Date.parse("2026-09-01T12:00:00Z") + index * 1000),
331
+ })
332
+ if (index >= 31) continue
333
+ await storage.aiCosts.recordModelCallCost({
334
+ projectId,
335
+ usageRecordId: result.record.id,
336
+ status: "rated",
337
+ billingIdentity: {
338
+ providerId: child ? "child-provider" : "parent-provider",
339
+ modelId: child ? "small" : "large",
340
+ },
341
+ pricingContext: {},
342
+ priceSource: {
343
+ sourceId: "provider-reported",
344
+ sourceEntryId: `cost_${index}`,
345
+ sourceVersion: "test",
346
+ observedAt: new Date("2026-09-01T12:05:00Z"),
347
+ },
348
+ components: [],
349
+ money: { currency: index === 0 ? "EUR" : "USD", amountNanos: index === 0 ? "0" : "10" },
350
+ ratedAt: new Date("2026-09-01T12:05:00Z"),
351
+ })
352
+ }
353
+ }
@@ -34,6 +34,7 @@ function modelCallInput(overrides: Partial<RecordAiModelCallInput> = {}): Record
34
34
  requesterGroupIds: ["support", "engineering"],
35
35
  providerId: "gateway",
36
36
  requestedModelId: "openai/gpt-5",
37
+ requestedReasoning: { budgetTokens: 4_096 },
37
38
  responseModelId: "gpt-5-2026-06-01",
38
39
  responseId: "response_1",
39
40
  usage: {
@@ -68,6 +69,35 @@ export function runAiUsageStorageContractSuite<TStorage extends AiUsageStorage>(
68
69
  }
69
70
 
70
71
  describe(label, () => {
72
+ test("retains native provider IDs across reads and replay", async () => {
73
+ // Regression proof: omit providerIds in normalization or a storage row codec.
74
+ await withStorage(async (storage) => {
75
+ const providerIds = {
76
+ requestId: "request-native",
77
+ responseId: "response-native",
78
+ generationId: "gen_native",
79
+ }
80
+ await storage.recordModelCall(modelCallInput({ providerIds }))
81
+ const latest = await storage.getLatestForExecution({
82
+ projectId,
83
+ executionId: agentExecutionId,
84
+ })
85
+ expect(latest?.providerIds).toEqual(providerIds)
86
+ const replay = await storage.recordModelCall(modelCallInput())
87
+ expect(replay.created).toBe(false)
88
+ expect(replay.record.providerIds).toEqual(providerIds)
89
+ await storage.recordModelCall(
90
+ modelCallInput({ id: "legacy", callId: "legacy", occurredAt: at("2026-06-24T00:00:00Z") })
91
+ )
92
+ expect(
93
+ (await storage.getLatestForExecution({ projectId, executionId: agentExecutionId }))
94
+ ?.providerIds
95
+ ).toBeUndefined()
96
+ await expect(
97
+ storage.recordModelCall(modelCallInput({ providerIds: { requestId: " " } }))
98
+ ).rejects.toThrow("requestId")
99
+ })
100
+ })
71
101
  test("records normalized usage and one canonical row per requester group", async () => {
72
102
  await withStorage(async (storage) => {
73
103
  const result = await storage.recordModelCall(
@@ -508,6 +538,7 @@ export function runAiUsageStorageContractSuite<TStorage extends AiUsageStorage>(
508
538
  modelCallInput({ usage: { inputTokens: -1 } }),
509
539
  modelCallInput({ occurredAt: new Date(Number.NaN) }),
510
540
  modelCallInput({ rawUsage: { invalid: undefined } as never }),
541
+ modelCallInput({ requestedReasoning: { budgetTokens: -1 } }),
511
542
  modelCallInput({ executionId: "" }),
512
543
  ]
513
544
 
@@ -1316,6 +1316,91 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
1316
1316
  })
1317
1317
  })
1318
1318
 
1319
+ test("authorizes a device and atomically creates its one-time access token", async () => {
1320
+ await withStorage(async (storage) => {
1321
+ await createUser(storage)
1322
+ await storage.sessions.create({
1323
+ id: "ses_device",
1324
+ projectId,
1325
+ userId: "usr_1",
1326
+ strategyId: "magic-link",
1327
+ audience: "atlas",
1328
+ tokenHash: "session-hash",
1329
+ createdAt: at("2026-05-14T10:00:00.000Z"),
1330
+ expiresAt: at("2026-05-21T10:00:00.000Z"),
1331
+ })
1332
+ await storage.deviceAuthorizations.create({
1333
+ id: "dva_1",
1334
+ projectId,
1335
+ deviceCodeHash: "device-code-hash",
1336
+ userCode: "BCDF-HJKM",
1337
+ clientName: "sixb CLI",
1338
+ tokenName: "codex",
1339
+ tokenExpiresAt: at("2026-08-12T10:00:00.000Z"),
1340
+ createdAt: at("2026-05-14T10:00:00.000Z"),
1341
+ expiresAt: at("2026-05-14T10:10:00.000Z"),
1342
+ })
1343
+
1344
+ await expect(
1345
+ storage.deviceAuthorizations.getByUserCode({ projectId, userCode: "BCDF-HJKM" })
1346
+ ).resolves.toMatchObject({ id: "dva_1", status: "pending" })
1347
+ await storage.deviceAuthorizations.approve({
1348
+ projectId,
1349
+ id: "dva_1",
1350
+ userId: "usr_1",
1351
+ sessionId: "ses_device",
1352
+ approvedAt: at("2026-05-14T10:01:00.000Z"),
1353
+ })
1354
+
1355
+ const completed = await storage.completeDeviceAuthorization({
1356
+ projectId,
1357
+ id: "dva_1",
1358
+ deviceCodeHash: "device-code-hash",
1359
+ completedAt: at("2026-05-14T10:02:00.000Z"),
1360
+ accessToken: {
1361
+ id: "tok_device",
1362
+ projectId,
1363
+ name: "codex",
1364
+ kind: "personal",
1365
+ subjectType: "user",
1366
+ subjectId: "usr_1",
1367
+ tokenHash: "access-token-hash",
1368
+ createdByPrincipal: { type: "user", id: "usr_1" },
1369
+ createdBySessionId: "ses_device",
1370
+ createdAt: at("2026-05-14T10:02:00.000Z"),
1371
+ expiresAt: at("2026-08-12T10:00:00.000Z"),
1372
+ },
1373
+ })
1374
+
1375
+ expect(completed.authorization).toMatchObject({ status: "consumed" })
1376
+ expect(completed.accessToken).toMatchObject({ id: "tok_device", subjectId: "usr_1" })
1377
+ await expectAuthError(
1378
+ storage.completeDeviceAuthorization({
1379
+ projectId,
1380
+ id: "dva_1",
1381
+ deviceCodeHash: "device-code-hash",
1382
+ completedAt: at("2026-05-14T10:03:00.000Z"),
1383
+ accessToken: {
1384
+ id: "tok_device_2",
1385
+ projectId,
1386
+ name: "codex",
1387
+ kind: "personal",
1388
+ subjectType: "user",
1389
+ subjectId: "usr_1",
1390
+ tokenHash: "access-token-hash-2",
1391
+ createdBySessionId: "ses_device",
1392
+ createdAt: at("2026-05-14T10:03:00.000Z"),
1393
+ expiresAt: at("2026-08-12T10:00:00.000Z"),
1394
+ },
1395
+ }),
1396
+ "invalid_device_authorization"
1397
+ )
1398
+ await expect(
1399
+ storage.accessTokens.getById({ projectId, id: "tok_device_2" })
1400
+ ).resolves.toBeNull()
1401
+ })
1402
+ })
1403
+
1319
1404
  test("completes magic-link sign-in for an existing user", async () => {
1320
1405
  await withStorage(async (storage) => {
1321
1406
  await createUser(storage)
@@ -413,8 +413,8 @@ function agentExecution(id: string): CreateExecutionInput {
413
413
  projectId,
414
414
  requestedBy: { type: "user", id: "user-one" },
415
415
  executor: { type: "agent", runId: `run-${id}` },
416
- source: { type: "event", eventId: `event-${id}` },
417
- correlationId: `correlation-${id}`,
416
+ source: { type: "execution", executionId: "principal-request" },
417
+ correlationId: "correlation-principal-request",
418
418
  authorizationRef: {
419
419
  type: "principal",
420
420
  principal: { type: "serviceAccount", id: "service-one" },
@@ -12,6 +12,16 @@ export {
12
12
  runAiCostStorageContractSuite,
13
13
  seedAiCostStorageContractUsage,
14
14
  } from "./ai-cost-storage-contract"
15
+ export {
16
+ type AiLimitStorageContractStorage,
17
+ type AiLimitStorageContractSuiteOptions,
18
+ runAiLimitStorageContractSuite,
19
+ seedAiLimitStorageContractExecution,
20
+ } from "./ai-limit-storage-contract"
21
+ export {
22
+ type AiModelCallGroupsContractStorage,
23
+ runAiModelCallGroupsContractSuite,
24
+ } from "./ai-model-call-groups-contract"
15
25
  export {
16
26
  type AiUsageStorageContractSuiteOptions,
17
27
  runAiUsageStorageContractSuite,
@@ -270,7 +270,7 @@ export function runQueueContractSuite(label: string, options: QueueContractSuite
270
270
  })
271
271
  })
272
272
 
273
- test("keeps syncRuns, pipelines, projections, workflows, and actions lanes independent", async () => {
273
+ test("keeps every worker lane independent", async () => {
274
274
  await withQueues(async (queues) => {
275
275
  await queues.syncRuns.enqueue({
276
276
  projectId: "project-a",
@@ -309,6 +309,24 @@ export function runQueueContractSuite(label: string, options: QueueContractSuite
309
309
  },
310
310
  ],
311
311
  })
312
+ await queues.agents.enqueue({
313
+ projectId: "project-a",
314
+ jobs: [
315
+ {
316
+ type: "agent.run.requested",
317
+ payload: { runId: "agent-run-1" },
318
+ },
319
+ ],
320
+ })
321
+ await queues.agentChildren.enqueue({
322
+ projectId: "project-a",
323
+ jobs: [
324
+ {
325
+ type: "agent.subagent-run.requested",
326
+ payload: { runId: "child-run-1" },
327
+ },
328
+ ],
329
+ })
312
330
 
313
331
  const crossLane = await queues.pipelines.claim({
314
332
  projectId: "project-a",
@@ -330,6 +348,16 @@ export function runQueueContractSuite(label: string, options: QueueContractSuite
330
348
  workerId: "action-worker-1",
331
349
  limit: 10,
332
350
  })
351
+ const agentLane = await queues.agents.claim({
352
+ projectId: "project-a",
353
+ workerId: "agent-worker-1",
354
+ limit: 10,
355
+ })
356
+ const childLane = await queues.agentChildren.claim({
357
+ projectId: "project-a",
358
+ workerId: "child-agent-worker-1",
359
+ limit: 10,
360
+ })
333
361
  const sameLane = await queues.syncRuns.claim({
334
362
  projectId: "project-a",
335
363
  workerId: "sync-worker-1",
@@ -344,6 +372,13 @@ export function runQueueContractSuite(label: string, options: QueueContractSuite
344
372
  expect(workflowLane[0]?.job.payload.runId).toBe("workflow-run-1")
345
373
  expect(actionLane).toHaveLength(1)
346
374
  expect(actionLane[0]?.job.payload.runId).toBe("act_1")
375
+ expect(agentLane).toHaveLength(1)
376
+ expect(agentLane[0]?.job).toMatchObject({
377
+ type: "agent.run.requested",
378
+ payload: { runId: "agent-run-1" },
379
+ })
380
+ expect(childLane).toHaveLength(1)
381
+ expect(childLane[0]?.job.payload.runId).toBe("child-run-1")
347
382
  expect(sameLane).toHaveLength(1)
348
383
  })
349
384
  })
@@ -0,0 +1,4 @@
1
+ /** Stable internal actor id for one workflow Agent step. */
2
+ export function workflowAgentStepActorId(workflowId: string, stepId: string): string {
3
+ return `workflow:${encodeURIComponent(workflowId)}:step:${encodeURIComponent(stepId)}`
4
+ }