@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
@@ -1,4 +1,5 @@
1
1
  import type { ReadonlyJsonObject } from "../../json"
2
+ import type { ModelReasoning } from "../../models/language-model"
2
3
 
3
4
  /** How much normalized token usage a provider reported for one model call. */
4
5
  export type AiUsageReportingStatus = "complete" | "partial" | "unavailable"
@@ -31,22 +32,25 @@ export interface AiUsageExecutionSummary {
31
32
 
32
33
  /** Input for an idempotent model-call ledger append. */
33
34
  export interface RecordAiModelCallInput {
35
+ readonly providerIds?: import("../../models/events").ModelProviderIds
34
36
  readonly id: string
35
37
  readonly projectId: string
36
38
  /** Immutable execution-ledger record that owns this provider call. */
37
39
  readonly executionId: string
38
40
  /** Queue delivery attempt that made the provider call. */
39
41
  readonly attempt: number
40
- /** AI SDK generation ID. Tool-loop model calls share it and are distinguished by responseId. */
42
+ /** Stable call ID generated by the owned model loop. */
41
43
  readonly callId: string
42
44
  /**
43
45
  * Durable group memberships snapshotted when the parent run was admitted. The requester itself
44
46
  * is read from the immutable execution record.
45
47
  */
46
48
  readonly requesterGroupIds: readonly string[]
47
- /** AI SDK provider that handled the call, such as `openai`, `anthropic`, or `gateway`. */
49
+ /** Provider contract that handled the call, such as `anthropic` or `vercel-ai-gateway`. */
48
50
  readonly providerId: string
49
51
  readonly requestedModelId: string
52
+ /** Provider-neutral reasoning preference used for this call, when explicitly configured. */
53
+ readonly requestedReasoning?: ModelReasoning
50
54
  /** Provider-returned model identity when the capture path exposes it. */
51
55
  readonly responseModelId?: string
52
56
  /** Provider-returned response ID used for later usage and cost reconciliation. */
@@ -1,4 +1,7 @@
1
1
  export type AuthStorageErrorCode =
2
+ | "device_authorization_denied"
3
+ | "device_authorization_limit_exceeded"
4
+ | "duplicate_device_authorization"
2
5
  | "duplicate_access_token"
3
6
  | "duplicate_identity"
4
7
  | "duplicate_invitation"
@@ -13,10 +16,13 @@ export type AuthStorageErrorCode =
13
16
  | "invalid_input"
14
17
  | "invalid_magic_link"
15
18
  | "invalid_oidc_attempt"
19
+ | "invalid_device_authorization"
16
20
  | "missing_identity"
17
21
  | "missing_invitation"
18
22
  | "missing_magic_link"
19
23
  | "missing_oidc_attempt"
24
+ | "missing_device_authorization"
25
+ | "pending_device_authorization"
20
26
  | "missing_access_token"
21
27
  | "missing_service_account"
22
28
  | "missing_session"
@@ -1,6 +1,8 @@
1
1
  import { AuthStorageError } from "../errors"
2
2
  import type {
3
3
  AuthStorage,
4
+ CompleteDeviceAuthorizationInput,
5
+ CompleteDeviceAuthorizationResult,
4
6
  CompleteMagicLinkSignInInput,
5
7
  CompleteOidcSignInInput,
6
8
  CompleteSignInResult,
@@ -12,6 +14,7 @@ import type {
12
14
  UserRecord,
13
15
  } from "../types"
14
16
  import { InMemoryAuthAccessTokenStore } from "./access-tokens"
17
+ import { InMemoryAuthDeviceAuthorizationStore } from "./device-authorizations"
15
18
  import { InMemoryAuthGroupMembershipStore } from "./group-memberships"
16
19
  import { InMemoryAuthUserIdentityStore } from "./identities"
17
20
  import { InMemoryAuthInvitationStore } from "./invitations"
@@ -27,8 +30,10 @@ import {
27
30
  cloneRecord,
28
31
  consumeMagicLinkRecord,
29
32
  consumeOidcAttemptRecord,
33
+ createAccessTokenRecord,
30
34
  createAuthStorageState,
31
35
  createSessionRecord,
36
+ deviceAuthorizationKey,
32
37
  getActiveInvitationByEmail,
33
38
  getUserByEmail,
34
39
  identityKey,
@@ -60,6 +65,7 @@ export class InMemoryAuthStorage implements AuthStorage {
60
65
  readonly groupMemberships = new InMemoryAuthGroupMembershipStore(this.state)
61
66
  readonly magicLinks = new InMemoryAuthMagicLinkStore(this.state)
62
67
  readonly oidcAuthorizationAttempts = new InMemoryAuthOidcAuthorizationAttemptStore(this.state)
68
+ readonly deviceAuthorizations = new InMemoryAuthDeviceAuthorizationStore(this.state)
63
69
 
64
70
  snapshot(): InMemoryAuthStorageSnapshot {
65
71
  return {
@@ -73,6 +79,7 @@ export class InMemoryAuthStorage implements AuthStorage {
73
79
  groupMemberships: structuredClone(this.state.groupMemberships),
74
80
  magicLinks: structuredClone(this.state.magicLinks),
75
81
  oidcAuthorizationAttempts: structuredClone(this.state.oidcAuthorizationAttempts),
82
+ deviceAuthorizations: structuredClone(this.state.deviceAuthorizations),
76
83
  }
77
84
  }
78
85
 
@@ -87,6 +94,68 @@ export class InMemoryAuthStorage implements AuthStorage {
87
94
  restoreMap(this.state.groupMemberships, snapshot.groupMemberships)
88
95
  restoreMap(this.state.magicLinks, snapshot.magicLinks)
89
96
  restoreMap(this.state.oidcAuthorizationAttempts, snapshot.oidcAuthorizationAttempts)
97
+ restoreMap(this.state.deviceAuthorizations, snapshot.deviceAuthorizations)
98
+ }
99
+
100
+ async completeDeviceAuthorization(
101
+ input: CompleteDeviceAuthorizationInput
102
+ ): Promise<CompleteDeviceAuthorizationResult> {
103
+ const key = deviceAuthorizationKey(input.projectId, input.id)
104
+ const authorization = this.state.deviceAuthorizations.get(key)
105
+ if (!authorization) {
106
+ throw new AuthStorageError(
107
+ "missing_device_authorization",
108
+ `[Sixb] Device authorization '${input.id}' not found for project '${input.projectId}'.`
109
+ )
110
+ }
111
+ if (authorization.deviceCodeHash !== input.deviceCodeHash) {
112
+ throw new AuthStorageError(
113
+ "invalid_device_authorization",
114
+ "[Sixb] Invalid device authorization."
115
+ )
116
+ }
117
+ if (authorization.status === "pending") {
118
+ throw new AuthStorageError(
119
+ "pending_device_authorization",
120
+ "[Sixb] Device authorization is pending."
121
+ )
122
+ }
123
+ if (authorization.status === "denied") {
124
+ throw new AuthStorageError(
125
+ "device_authorization_denied",
126
+ "[Sixb] Device authorization was denied."
127
+ )
128
+ }
129
+ if (
130
+ authorization.status !== "approved" ||
131
+ !authorization.approvedUserId ||
132
+ !authorization.approvedSessionId ||
133
+ authorization.expiresAt <= input.completedAt
134
+ ) {
135
+ throw new AuthStorageError(
136
+ "invalid_device_authorization",
137
+ "[Sixb] Device authorization is invalid."
138
+ )
139
+ }
140
+ if (
141
+ input.accessToken.projectId !== input.projectId ||
142
+ input.accessToken.subjectType !== "user" ||
143
+ input.accessToken.subjectId !== authorization.approvedUserId ||
144
+ input.accessToken.createdBySessionId !== authorization.approvedSessionId
145
+ ) {
146
+ throw new AuthStorageError(
147
+ "invalid_device_authorization",
148
+ "[Sixb] Device access token is invalid."
149
+ )
150
+ }
151
+ const accessToken = createAccessTokenRecord(this.state, input.accessToken)
152
+ const consumed = {
153
+ ...authorization,
154
+ status: "consumed" as const,
155
+ consumedAt: new Date(input.completedAt),
156
+ }
157
+ this.state.deviceAuthorizations.set(key, cloneRecord(consumed))
158
+ return { authorization: cloneRecord(consumed), accessToken: cloneRecord(accessToken) }
90
159
  }
91
160
 
92
161
  async completeMagicLinkSignIn(
@@ -0,0 +1,145 @@
1
+ import { AuthStorageError } from "../errors"
2
+ import type {
3
+ AuthDeviceAuthorizationStore,
4
+ CreateDeviceAuthorizationInput,
5
+ DeviceAuthorizationRecord,
6
+ } from "../types"
7
+ import { MAX_PENDING_DEVICE_AUTHORIZATIONS } from "../types"
8
+ import type { AuthStorageState } from "./shared"
9
+ import {
10
+ assertNonEmpty,
11
+ cloneRecord,
12
+ deviceAuthorizationKey,
13
+ isActiveSession,
14
+ sessionKey,
15
+ userKey,
16
+ } from "./shared"
17
+
18
+ export class InMemoryAuthDeviceAuthorizationStore implements AuthDeviceAuthorizationStore {
19
+ constructor(private readonly state: AuthStorageState) {}
20
+
21
+ async create(input: CreateDeviceAuthorizationInput): Promise<DeviceAuthorizationRecord> {
22
+ const id = assertNonEmpty(input.id, "Device authorization id")
23
+ const projectId = assertNonEmpty(input.projectId, "Project id")
24
+ for (const [key, authorization] of this.state.deviceAuthorizations) {
25
+ if (authorization.projectId === projectId && authorization.expiresAt <= input.createdAt) {
26
+ this.state.deviceAuthorizations.delete(key)
27
+ }
28
+ }
29
+ const pending = [...this.state.deviceAuthorizations.values()].filter(
30
+ (authorization) => authorization.projectId === projectId && authorization.status === "pending"
31
+ ).length
32
+ if (pending >= MAX_PENDING_DEVICE_AUTHORIZATIONS) {
33
+ throw new AuthStorageError(
34
+ "device_authorization_limit_exceeded",
35
+ `[Sixb] Project '${projectId}' has too many pending device authorizations.`
36
+ )
37
+ }
38
+ const key = deviceAuthorizationKey(projectId, id)
39
+ if (this.state.deviceAuthorizations.has(key)) {
40
+ throw duplicateAuthorization(id, projectId)
41
+ }
42
+ const record: DeviceAuthorizationRecord = {
43
+ id,
44
+ projectId,
45
+ deviceCodeHash: assertNonEmpty(input.deviceCodeHash, "Device code hash"),
46
+ userCode: assertNonEmpty(input.userCode, "User code"),
47
+ clientName: assertNonEmpty(input.clientName, "Client name"),
48
+ tokenName: assertNonEmpty(input.tokenName, "Token name"),
49
+ tokenExpiresAt: new Date(input.tokenExpiresAt),
50
+ status: "pending",
51
+ createdAt: new Date(input.createdAt),
52
+ expiresAt: new Date(input.expiresAt),
53
+ }
54
+ this.state.deviceAuthorizations.set(key, cloneRecord(record))
55
+ return cloneRecord(record)
56
+ }
57
+
58
+ async getById(params: { readonly projectId: string; readonly id: string }) {
59
+ const record = this.state.deviceAuthorizations.get(
60
+ deviceAuthorizationKey(params.projectId, params.id)
61
+ )
62
+ return record ? cloneRecord(record) : null
63
+ }
64
+
65
+ async getByUserCode(params: { readonly projectId: string; readonly userCode: string }) {
66
+ for (const record of this.state.deviceAuthorizations.values()) {
67
+ if (record.projectId === params.projectId && record.userCode === params.userCode) {
68
+ return cloneRecord(record)
69
+ }
70
+ }
71
+ return null
72
+ }
73
+
74
+ async approve(params: {
75
+ readonly projectId: string
76
+ readonly id: string
77
+ readonly userId: string
78
+ readonly sessionId: string
79
+ readonly approvedAt: Date
80
+ }): Promise<DeviceAuthorizationRecord> {
81
+ const record = this.requirePending(params.projectId, params.id, params.approvedAt)
82
+ const user = this.state.users.get(userKey(params.projectId, params.userId))
83
+ const session = this.state.sessions.get(sessionKey(params.projectId, params.sessionId))
84
+ if (
85
+ !user ||
86
+ user.status !== "active" ||
87
+ !session ||
88
+ session.userId !== user.id ||
89
+ !isActiveSession(session, params.approvedAt)
90
+ ) {
91
+ throw new AuthStorageError(
92
+ "invalid_device_authorization",
93
+ "[Sixb] Device authorization requires an active user session."
94
+ )
95
+ }
96
+ const next: DeviceAuthorizationRecord = {
97
+ ...record,
98
+ status: "approved",
99
+ approvedUserId: assertNonEmpty(params.userId, "Approved user id"),
100
+ approvedSessionId: assertNonEmpty(params.sessionId, "Approved session id"),
101
+ approvedAt: new Date(params.approvedAt),
102
+ }
103
+ this.state.deviceAuthorizations.set(deviceAuthorizationKey(params.projectId, params.id), next)
104
+ return cloneRecord(next)
105
+ }
106
+
107
+ async deny(params: {
108
+ readonly projectId: string
109
+ readonly id: string
110
+ readonly deniedAt: Date
111
+ }): Promise<DeviceAuthorizationRecord> {
112
+ const record = this.requirePending(params.projectId, params.id, params.deniedAt)
113
+ const next: DeviceAuthorizationRecord = {
114
+ ...record,
115
+ status: "denied",
116
+ deniedAt: new Date(params.deniedAt),
117
+ }
118
+ this.state.deviceAuthorizations.set(deviceAuthorizationKey(params.projectId, params.id), next)
119
+ return cloneRecord(next)
120
+ }
121
+
122
+ private requirePending(projectId: string, id: string, now: Date): DeviceAuthorizationRecord {
123
+ const record = this.state.deviceAuthorizations.get(deviceAuthorizationKey(projectId, id))
124
+ if (!record) {
125
+ throw new AuthStorageError(
126
+ "missing_device_authorization",
127
+ `[Sixb] Device authorization '${id}' not found for project '${projectId}'.`
128
+ )
129
+ }
130
+ if (record.status !== "pending" || record.expiresAt <= now) {
131
+ throw new AuthStorageError(
132
+ "invalid_device_authorization",
133
+ `[Sixb] Device authorization '${id}' is no longer pending for project '${projectId}'.`
134
+ )
135
+ }
136
+ return record
137
+ }
138
+ }
139
+
140
+ function duplicateAuthorization(id: string, projectId: string): AuthStorageError {
141
+ return new AuthStorageError(
142
+ "duplicate_device_authorization",
143
+ `[Sixb] Device authorization '${id}' already exists for project '${projectId}'.`
144
+ )
145
+ }
@@ -6,6 +6,7 @@ import type {
6
6
  CreateAuthAccessTokenInput,
7
7
  CreateAuthServiceAccountInput,
8
8
  CreateAuthSessionInput,
9
+ DeviceAuthorizationRecord,
9
10
  GroupMembershipRecord,
10
11
  InvitationRecord,
11
12
  MagicLinkRecord,
@@ -30,6 +31,7 @@ export interface AuthStorageState {
30
31
  readonly groupMemberships: Map<string, GroupMembershipRecord>
31
32
  readonly magicLinks: Map<string, MagicLinkRecord>
32
33
  readonly oidcAuthorizationAttempts: Map<string, OidcAuthorizationAttemptRecord>
34
+ readonly deviceAuthorizations: Map<string, DeviceAuthorizationRecord>
33
35
  }
34
36
 
35
37
  export function createAuthStorageState(): AuthStorageState {
@@ -44,6 +46,7 @@ export function createAuthStorageState(): AuthStorageState {
44
46
  groupMemberships: new Map(),
45
47
  magicLinks: new Map(),
46
48
  oidcAuthorizationAttempts: new Map(),
49
+ deviceAuthorizations: new Map(),
47
50
  }
48
51
  }
49
52
 
@@ -75,6 +78,10 @@ export function sessionKey(projectId: string, id: string): string {
75
78
  return scopedKey(projectId, id)
76
79
  }
77
80
 
81
+ export function deviceAuthorizationKey(projectId: string, id: string): string {
82
+ return scopedKey(projectId, id)
83
+ }
84
+
78
85
  export function accessTokenKey(projectId: string, id: string): string {
79
86
  return scopedKey(projectId, id)
80
87
  }
@@ -5,6 +5,7 @@ export type {
5
5
  AccessTokenRecord,
6
6
  AccessTokenSubjectType,
7
7
  AuthAccessTokenStore,
8
+ AuthDeviceAuthorizationStore,
8
9
  AuthGroupMembershipStore,
9
10
  AuthInvitationStore,
10
11
  AuthMagicLinkStore,
@@ -16,6 +17,8 @@ export type {
16
17
  AuthUserIdentityStore,
17
18
  AuthUserStore,
18
19
  CompleteAuthSessionInput,
20
+ CompleteDeviceAuthorizationInput,
21
+ CompleteDeviceAuthorizationResult,
19
22
  CompleteMagicLinkSignInInput,
20
23
  CompleteOidcSignInInput,
21
24
  CompleteSignInResult,
@@ -24,8 +27,11 @@ export type {
24
27
  CreateAuthServiceAccountInput,
25
28
  CreateAuthSessionInput,
26
29
  CreateAuthUserInput,
30
+ CreateDeviceAuthorizationInput,
27
31
  CreateOidcAuthorizationAttemptInput,
28
32
  CreateOrUpdateAuthInvitationInput,
33
+ DeviceAuthorizationRecord,
34
+ DeviceAuthorizationStatus,
29
35
  GroupMembershipRecord,
30
36
  GroupMembershipSource,
31
37
  InvitationRecord,
@@ -56,3 +62,4 @@ export type {
56
62
  UserRecord,
57
63
  UserStatus,
58
64
  } from "./types"
65
+ export { MAX_PENDING_DEVICE_AUTHORIZATIONS } from "./types"
@@ -5,6 +5,8 @@ export type ServiceAccountStatus = "active" | "suspended"
5
5
  export type InvitationStatus = "pending" | "accepted" | "revoked"
6
6
  export type GroupMembershipSource = "invitation" | "manual" | "agent"
7
7
  export type AccessTokenSubjectType = "user" | "serviceAccount"
8
+ export type DeviceAuthorizationStatus = "pending" | "approved" | "denied" | "consumed"
9
+ export const MAX_PENDING_DEVICE_AUTHORIZATIONS = 100
8
10
 
9
11
  export interface UserRecord {
10
12
  readonly id: string
@@ -140,6 +142,24 @@ export interface OidcAuthorizationAttemptRecord {
140
142
  readonly consumedAt?: Date
141
143
  }
142
144
 
145
+ export interface DeviceAuthorizationRecord {
146
+ readonly id: string
147
+ readonly projectId: string
148
+ readonly deviceCodeHash: string
149
+ readonly userCode: string
150
+ readonly clientName: string
151
+ readonly tokenName: string
152
+ readonly tokenExpiresAt: Date
153
+ readonly status: DeviceAuthorizationStatus
154
+ readonly approvedUserId?: string
155
+ readonly approvedSessionId?: string
156
+ readonly createdAt: Date
157
+ readonly expiresAt: Date
158
+ readonly approvedAt?: Date
159
+ readonly deniedAt?: Date
160
+ readonly consumedAt?: Date
161
+ }
162
+
143
163
  export interface CreateAuthUserInput {
144
164
  readonly id: string
145
165
  readonly projectId: string
@@ -359,6 +379,31 @@ export interface CreateOidcAuthorizationAttemptInput {
359
379
  readonly expiresAt: Date
360
380
  }
361
381
 
382
+ export interface CreateDeviceAuthorizationInput {
383
+ readonly id: string
384
+ readonly projectId: string
385
+ readonly deviceCodeHash: string
386
+ readonly userCode: string
387
+ readonly clientName: string
388
+ readonly tokenName: string
389
+ readonly tokenExpiresAt: Date
390
+ readonly createdAt: Date
391
+ readonly expiresAt: Date
392
+ }
393
+
394
+ export interface CompleteDeviceAuthorizationInput {
395
+ readonly projectId: string
396
+ readonly id: string
397
+ readonly deviceCodeHash: string
398
+ readonly accessToken: CreateAuthAccessTokenInput
399
+ readonly completedAt: Date
400
+ }
401
+
402
+ export interface CompleteDeviceAuthorizationResult {
403
+ readonly authorization: DeviceAuthorizationRecord
404
+ readonly accessToken: AccessTokenRecord
405
+ }
406
+
362
407
  export interface CompleteMagicLinkSignInInput {
363
408
  readonly projectId: string
364
409
  readonly magicLinkId: string
@@ -622,6 +667,30 @@ export interface AuthOidcAuthorizationAttemptStore {
622
667
  }): Promise<OidcAuthorizationAttemptRecord>
623
668
  }
624
669
 
670
+ export interface AuthDeviceAuthorizationStore {
671
+ create(input: CreateDeviceAuthorizationInput): Promise<DeviceAuthorizationRecord>
672
+ getById(params: {
673
+ readonly projectId: string
674
+ readonly id: string
675
+ }): Promise<DeviceAuthorizationRecord | null>
676
+ getByUserCode(params: {
677
+ readonly projectId: string
678
+ readonly userCode: string
679
+ }): Promise<DeviceAuthorizationRecord | null>
680
+ approve(params: {
681
+ readonly projectId: string
682
+ readonly id: string
683
+ readonly userId: string
684
+ readonly sessionId: string
685
+ readonly approvedAt: Date
686
+ }): Promise<DeviceAuthorizationRecord>
687
+ deny(params: {
688
+ readonly projectId: string
689
+ readonly id: string
690
+ readonly deniedAt: Date
691
+ }): Promise<DeviceAuthorizationRecord>
692
+ }
693
+
625
694
  export interface AuthStorage {
626
695
  readonly users: AuthUserStore
627
696
  readonly identities: AuthUserIdentityStore
@@ -633,8 +702,12 @@ export interface AuthStorage {
633
702
  readonly groupMemberships: AuthGroupMembershipStore
634
703
  readonly magicLinks: AuthMagicLinkStore
635
704
  readonly oidcAuthorizationAttempts: AuthOidcAuthorizationAttemptStore
705
+ readonly deviceAuthorizations: AuthDeviceAuthorizationStore
636
706
 
637
707
  completeMagicLinkSignIn(input: CompleteMagicLinkSignInInput): Promise<CompleteSignInResult>
638
708
  completeOidcSignIn(input: CompleteOidcSignInInput): Promise<CompleteSignInResult>
709
+ completeDeviceAuthorization(
710
+ input: CompleteDeviceAuthorizationInput
711
+ ): Promise<CompleteDeviceAuthorizationResult>
639
712
  suspendUserAndRevokeSessions(input: SuspendUserAndRevokeSessionsInput): Promise<UserRecord>
640
713
  }
@@ -41,28 +41,38 @@ export async function findPrimitiveRunExecution(input: {
41
41
  return execution
42
42
  }
43
43
 
44
- /** Find the immutable execution and service-account authority owned by one Agent run. */
44
+ /** Find the immutable execution and authority owned by one Agent run. */
45
45
  export async function findAgentRunExecution(input: {
46
46
  readonly executions: ExecutionStorage
47
47
  readonly projectId: string
48
48
  readonly executionId: string
49
49
  readonly runId: string
50
- readonly serviceAccountId: string
50
+ readonly authority:
51
+ | { readonly type: "managed"; readonly serviceAccountId: string }
52
+ | { readonly type: "inherited" }
51
53
  }): Promise<ExecutionRecord | null> {
52
54
  const execution = await input.executions.getById({
53
55
  projectId: input.projectId,
54
56
  id: input.executionId,
55
57
  })
56
58
  const authority = execution?.authorizationRef
59
+ const validAuthority =
60
+ input.authority.type === "managed"
61
+ ? authority?.type === "principal" &&
62
+ authority.principal.type === "serviceAccount" &&
63
+ authority.principal.id === input.authority.serviceAccountId &&
64
+ authority.credential === undefined
65
+ : authority?.type === "disabled" ||
66
+ (authority?.type === "principal" &&
67
+ authority.principal.type === "user" &&
68
+ authority.credential !== undefined)
69
+
57
70
  if (
58
71
  !execution ||
59
72
  execution.source.type !== "execution" ||
60
73
  execution.executor.type !== "agent" ||
61
74
  execution.executor.runId !== input.runId ||
62
- authority?.type !== "principal" ||
63
- authority.principal.type !== "serviceAccount" ||
64
- authority.principal.id !== input.serviceAccountId ||
65
- authority.credential !== undefined
75
+ !validAuthority
66
76
  ) {
67
77
  return null
68
78
  }
@@ -1,3 +1,4 @@
1
+ import { isDeepStrictEqual } from "node:util"
1
2
  import type {
2
3
  AuthorizablePrincipal,
3
4
  AuthorizationRef,
@@ -190,16 +191,28 @@ function assertExecutorAuthority(record: ExecutionRecord): void {
190
191
  return
191
192
  }
192
193
  case "agent": {
194
+ if (source.type !== "execution") {
195
+ invalid("Agent executions require a parent execution source.")
196
+ }
193
197
  if (
194
- authorizationRef.type !== "principal" ||
195
- authorizationRef.principal.type !== "serviceAccount"
198
+ authorizationRef.type === "principal" &&
199
+ authorizationRef.principal.type === "serviceAccount" &&
200
+ authorizationRef.credential === undefined
196
201
  ) {
197
- invalid("Agent executions require service-account authority.")
202
+ return
198
203
  }
199
- if (authorizationRef.credential !== undefined) {
200
- invalid("Agent execution authority cannot carry an external credential.")
204
+ if (
205
+ authorizationRef.type === "principal" &&
206
+ authorizationRef.principal.type === "user" &&
207
+ authorizationRef.credential !== undefined
208
+ ) {
209
+ return
201
210
  }
202
- return
211
+ if (authorizationRef.type === "disabled") return
212
+ invalid(
213
+ "Agent executions require managed service-account, credentialed user, or explicitly disabled authority."
214
+ )
215
+ break
203
216
  }
204
217
  case "kernel": {
205
218
  if (
@@ -310,6 +323,23 @@ async function validateParent(
310
323
  `[Sixb] Child execution '${record.id}' must preserve its parent requested-by principal.`
311
324
  )
312
325
  }
326
+ if (
327
+ record.executor.type === "agent" &&
328
+ isInheritedAgentAuthority(record.authorizationRef) &&
329
+ !isDeepStrictEqual(parent.authorizationRef, record.authorizationRef)
330
+ ) {
331
+ throw new ExecutionStorageError(
332
+ "invalid_parent_execution",
333
+ `[Sixb] Child Agent execution '${record.id}' must inherit its parent's authorization reference.`
334
+ )
335
+ }
336
+ }
337
+
338
+ function isInheritedAgentAuthority(ref: AuthorizationRef): boolean {
339
+ return (
340
+ ref.type === "disabled" ||
341
+ (ref.type === "principal" && ref.principal.type === "user" && ref.credential !== undefined)
342
+ )
313
343
  }
314
344
 
315
345
  function assertPrincipal(principal: AuthorizablePrincipal, label: string): void {