@sixb/core 0.1.11 → 0.1.13

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 (910) hide show
  1. package/dist/actions/builders/params.d.ts +1 -22
  2. package/dist/actions/builders/params.d.ts.map +1 -1
  3. package/dist/actions/index.d.ts +2 -2
  4. package/dist/actions/index.d.ts.map +1 -1
  5. package/dist/actions/index.js +33 -30
  6. package/dist/actions/index.js.map +1 -1
  7. package/dist/actions/read-facade.d.ts +14 -16
  8. package/dist/actions/read-facade.d.ts.map +1 -1
  9. package/dist/actions/request.d.ts.map +1 -1
  10. package/dist/actions/run-dispatch.d.ts +2 -0
  11. package/dist/actions/run-dispatch.d.ts.map +1 -1
  12. package/dist/actions/types/context.d.ts +18 -31
  13. package/dist/actions/types/context.d.ts.map +1 -1
  14. package/dist/actions/types/params.d.ts +11 -44
  15. package/dist/actions/types/params.d.ts.map +1 -1
  16. package/dist/actions/validation.d.ts.map +1 -1
  17. package/dist/actions/worker.js +3 -2
  18. package/dist/actions/worker.js.map +2 -2
  19. package/dist/agents/errors.d.ts +1 -1
  20. package/dist/agents/errors.d.ts.map +1 -1
  21. package/dist/agents/execution.d.ts +15 -9
  22. package/dist/agents/execution.d.ts.map +1 -1
  23. package/dist/agents/ids.d.ts +2 -0
  24. package/dist/agents/ids.d.ts.map +1 -1
  25. package/dist/agents/index.d.ts +1 -1
  26. package/dist/agents/index.d.ts.map +1 -1
  27. package/dist/agents/index.js +52 -44
  28. package/dist/agents/index.js.map +1 -1
  29. package/dist/agents/request.d.ts.map +1 -1
  30. package/dist/agents/sandbox.d.ts +5 -0
  31. package/dist/agents/sandbox.d.ts.map +1 -0
  32. package/dist/agents/streams/index.js +4 -3
  33. package/dist/agents/streams/index.js.map +1 -1
  34. package/dist/agents/streams/internal.js +4 -3
  35. package/dist/agents/streams/internal.js.map +1 -1
  36. package/dist/agents/validation.d.ts.map +1 -1
  37. package/dist/assert-never.d.ts +6 -0
  38. package/dist/assert-never.d.ts.map +1 -0
  39. package/dist/auth/client-address.d.ts +3 -0
  40. package/dist/auth/client-address.d.ts.map +1 -0
  41. package/dist/auth/csrf.d.ts +5 -1
  42. package/dist/auth/csrf.d.ts.map +1 -1
  43. package/dist/auth/index.d.ts +3 -2
  44. package/dist/auth/index.d.ts.map +1 -1
  45. package/dist/auth/index.js +15 -7
  46. package/dist/auth/index.js.map +1 -1
  47. package/dist/auth/runtime.d.ts +58 -41
  48. package/dist/auth/runtime.d.ts.map +1 -1
  49. package/dist/auth/session-cache.d.ts +10 -3
  50. package/dist/auth/session-cache.d.ts.map +1 -1
  51. package/dist/auth/sessions.d.ts +12 -0
  52. package/dist/auth/sessions.d.ts.map +1 -1
  53. package/dist/auth/strategy.js +1 -1
  54. package/dist/auth/types.d.ts +8 -15
  55. package/dist/auth/types.d.ts.map +1 -1
  56. package/dist/authorization/index.js +5 -4
  57. package/dist/authorization/index.js.map +1 -1
  58. package/dist/bootstrap/index.d.ts +1 -1
  59. package/dist/bootstrap/index.d.ts.map +1 -1
  60. package/dist/bootstrap/index.js +54 -48
  61. package/dist/bootstrap/index.js.map +1 -1
  62. package/dist/bootstrap/ontology-type-manifest.d.ts +8 -0
  63. package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
  64. package/dist/{chunk-q5gz3g2j.js → chunk-0321g649.js} +2 -16
  65. package/dist/{chunk-q5gz3g2j.js.map → chunk-0321g649.js.map} +2 -2
  66. package/dist/{chunk-d63nnr5b.js → chunk-04h4t2b5.js} +39 -53
  67. package/dist/{chunk-d63nnr5b.js.map → chunk-04h4t2b5.js.map} +5 -6
  68. package/dist/chunk-2fv8sajb.js +84 -0
  69. package/dist/chunk-2fv8sajb.js.map +10 -0
  70. package/dist/{chunk-1yefycb1.js → chunk-2hbhn1ff.js} +2 -2
  71. package/dist/{chunk-ap0g1g74.js → chunk-3nx8vj5a.js} +43 -6
  72. package/dist/chunk-3nx8vj5a.js.map +12 -0
  73. package/dist/{chunk-wjasrj67.js → chunk-3qpcrcj8.js} +1 -1
  74. package/dist/{chunk-0y39rgsb.js → chunk-4tnrzqqh.js} +1 -1
  75. package/dist/chunk-58geavnf.js +29 -0
  76. package/dist/chunk-58geavnf.js.map +10 -0
  77. package/dist/{chunk-01kj2pbh.js → chunk-63fp9x3q.js} +97 -67
  78. package/dist/chunk-63fp9x3q.js.map +20 -0
  79. package/dist/{chunk-7bs40fe1.js → chunk-69266efg.js} +83 -2
  80. package/dist/chunk-69266efg.js.map +12 -0
  81. package/dist/{chunk-sepyxgpc.js → chunk-693f3zn8.js} +70 -28
  82. package/dist/chunk-693f3zn8.js.map +15 -0
  83. package/dist/{chunk-7zgecwy1.js → chunk-6x0pqh32.js} +12 -1
  84. package/dist/{chunk-7zgecwy1.js.map → chunk-6x0pqh32.js.map} +3 -3
  85. package/dist/{chunk-c5rkjrgp.js → chunk-7ytf06d3.js} +1 -1
  86. package/dist/{chunk-a0e6x5hd.js → chunk-898y24dd.js} +165 -90
  87. package/dist/chunk-898y24dd.js.map +15 -0
  88. package/dist/{chunk-mrp7k0pw.js → chunk-91kcnbf0.js} +9 -14
  89. package/dist/chunk-91kcnbf0.js.map +10 -0
  90. package/dist/{chunk-z0s4axeh.js → chunk-91wthfwe.js} +97 -21
  91. package/dist/{chunk-z0s4axeh.js.map → chunk-91wthfwe.js.map} +8 -7
  92. package/dist/{chunk-yv79ncbv.js → chunk-96yw3pwd.js} +3 -3
  93. package/dist/chunk-96yw3pwd.js.map +10 -0
  94. package/dist/chunk-98cw09sw.js.map +2 -2
  95. package/dist/{chunk-g00bfdq6.js → chunk-9pfw47qx.js} +318 -257
  96. package/dist/chunk-9pfw47qx.js.map +44 -0
  97. package/dist/{chunk-5hz0fnca.js → chunk-a0073121.js} +64 -60
  98. package/dist/chunk-a0073121.js.map +12 -0
  99. package/dist/{chunk-cfvakeax.js → chunk-a69fkrtr.js} +5 -5
  100. package/dist/{chunk-72w2pxk7.js → chunk-bdhfn0ww.js} +11 -3
  101. package/dist/{chunk-72w2pxk7.js.map → chunk-bdhfn0ww.js.map} +3 -3
  102. package/dist/chunk-bep5rrdq.js +81 -0
  103. package/dist/chunk-bep5rrdq.js.map +10 -0
  104. package/dist/chunk-bxx3ms5t.js +29 -0
  105. package/dist/chunk-bxx3ms5t.js.map +10 -0
  106. package/dist/{chunk-v2vcg0w6.js → chunk-cbn96bve.js} +2 -2
  107. package/dist/{chunk-860dwwy0.js → chunk-cd234ba4.js} +22 -12
  108. package/dist/chunk-cd234ba4.js.map +14 -0
  109. package/dist/{chunk-gq8vhakp.js → chunk-cvrbhvtr.js} +292 -104
  110. package/dist/chunk-cvrbhvtr.js.map +46 -0
  111. package/dist/{chunk-ms2tmn1k.js → chunk-d8yes9yx.js} +355 -100
  112. package/dist/chunk-d8yes9yx.js.map +20 -0
  113. package/dist/{chunk-pr2h4bv4.js → chunk-darm7eeg.js} +9 -9
  114. package/dist/{chunk-pr2h4bv4.js.map → chunk-darm7eeg.js.map} +3 -3
  115. package/dist/chunk-dmn70ztd.js.map +2 -2
  116. package/dist/chunk-drz59ve0.js +57 -0
  117. package/dist/chunk-drz59ve0.js.map +10 -0
  118. package/dist/{chunk-skz0hst3.js → chunk-dsfw1bdr.js} +6 -86
  119. package/dist/{chunk-skz0hst3.js.map → chunk-dsfw1bdr.js.map} +3 -3
  120. package/dist/{chunk-g6cke204.js → chunk-f85hpqnm.js} +1 -1
  121. package/dist/{chunk-vsj3mdfj.js → chunk-fc5zfxy1.js} +1 -1
  122. package/dist/chunk-ffwvdgk1.js +85 -0
  123. package/dist/chunk-ffwvdgk1.js.map +10 -0
  124. package/dist/chunk-gbcrz0gr.js +552 -0
  125. package/dist/chunk-gbcrz0gr.js.map +17 -0
  126. package/dist/{chunk-gqm76kse.js → chunk-gc226ten.js} +434 -177
  127. package/dist/chunk-gc226ten.js.map +62 -0
  128. package/dist/{chunk-awbhdqyc.js → chunk-gmt22nxx.js} +10 -16
  129. package/dist/chunk-gmt22nxx.js.map +10 -0
  130. package/dist/chunk-h89wz928.js +42 -0
  131. package/dist/chunk-h89wz928.js.map +10 -0
  132. package/dist/{chunk-aa6z4a19.js → chunk-hgqpcmyr.js} +2 -1
  133. package/dist/chunk-hgqpcmyr.js.map +12 -0
  134. package/dist/{chunk-gqh45d2n.js → chunk-ht4a7mjg.js} +76 -6
  135. package/dist/chunk-ht4a7mjg.js.map +15 -0
  136. package/dist/{chunk-x9m9x2eq.js → chunk-jhyc777j.js} +3 -3
  137. package/dist/{chunk-fh8kgex1.js → chunk-jmwy25mf.js} +76 -58
  138. package/dist/{chunk-fh8kgex1.js.map → chunk-jmwy25mf.js.map} +3 -3
  139. package/dist/{chunk-rb1xx120.js → chunk-k4kkp58d.js} +25 -8
  140. package/dist/chunk-k4kkp58d.js.map +11 -0
  141. package/dist/{chunk-jsy70480.js → chunk-ky7zpbtt.js} +366 -98
  142. package/dist/chunk-ky7zpbtt.js.map +19 -0
  143. package/dist/chunk-m4ehq95f.js +9 -0
  144. package/dist/chunk-m4ehq95f.js.map +10 -0
  145. package/dist/{chunk-17kfctj6.js → chunk-m8zkvep1.js} +2 -2
  146. package/dist/{chunk-z0271qkp.js → chunk-mdnw7nj8.js} +8 -6
  147. package/dist/chunk-mdnw7nj8.js.map +15 -0
  148. package/dist/{chunk-4zhmdsx6.js → chunk-mf6hwpzh.js} +121 -28
  149. package/dist/{chunk-4zhmdsx6.js.map → chunk-mf6hwpzh.js.map} +6 -6
  150. package/dist/{chunk-z30bv4ga.js → chunk-mr60an99.js} +5 -3
  151. package/dist/{chunk-z30bv4ga.js.map → chunk-mr60an99.js.map} +3 -3
  152. package/dist/chunk-n33e8dz8.js +191 -0
  153. package/dist/chunk-n33e8dz8.js.map +11 -0
  154. package/dist/chunk-p1683c0v.js +104 -0
  155. package/dist/chunk-p1683c0v.js.map +11 -0
  156. package/dist/{chunk-9qsh3p5y.js → chunk-rb143ggb.js} +1 -1
  157. package/dist/{chunk-653vwrzr.js → chunk-rdghfsss.js} +1 -1
  158. package/dist/chunk-rdghfsss.js.map +10 -0
  159. package/dist/{chunk-ftv470j8.js → chunk-rqtdtm43.js} +365 -67
  160. package/dist/chunk-rqtdtm43.js.map +50 -0
  161. package/dist/{chunk-dz5h08xv.js → chunk-rzcjp5m2.js} +28 -9
  162. package/dist/chunk-rzcjp5m2.js.map +25 -0
  163. package/dist/{chunk-f4w3yp4f.js → chunk-rzkr70gr.js} +108 -21
  164. package/dist/chunk-rzkr70gr.js.map +13 -0
  165. package/dist/{chunk-3ckk0xfj.js → chunk-s24qbp32.js} +18 -13
  166. package/dist/{chunk-3ckk0xfj.js.map → chunk-s24qbp32.js.map} +3 -3
  167. package/dist/{chunk-f0rwz2vh.js → chunk-t6f3tdnr.js} +2 -54
  168. package/dist/chunk-t6f3tdnr.js.map +10 -0
  169. package/dist/{chunk-93csa55g.js → chunk-tw03bsmb.js} +11 -5
  170. package/dist/chunk-tw03bsmb.js.map +11 -0
  171. package/dist/chunk-vef6qa14.js +363 -0
  172. package/dist/chunk-vef6qa14.js.map +14 -0
  173. package/dist/{chunk-92vk7gta.js → chunk-vn3yh259.js} +1 -1
  174. package/dist/{chunk-g91qxjj0.js → chunk-w9bp61e7.js} +5 -5
  175. package/dist/{chunk-b19g04jk.js → chunk-xgptywp0.js} +4 -3
  176. package/dist/chunk-xgptywp0.js.map +11 -0
  177. package/dist/{chunk-g53f0e4j.js → chunk-xnx96gfy.js} +45 -17
  178. package/dist/{chunk-g53f0e4j.js.map → chunk-xnx96gfy.js.map} +3 -3
  179. package/dist/{chunk-1824gssz.js → chunk-y487ywrv.js} +4 -4
  180. package/dist/{chunk-7apz6hg4.js → chunk-y6vnvayj.js} +8 -4
  181. package/dist/chunk-y6vnvayj.js.map +10 -0
  182. package/dist/{chunk-wf88w4kp.js → chunk-ypj2wqtj.js} +3 -6
  183. package/dist/{chunk-wf88w4kp.js.map → chunk-ypj2wqtj.js.map} +4 -4
  184. package/dist/chunk-z3y5kg1x.js +14 -0
  185. package/dist/chunk-z3y5kg1x.js.map +10 -0
  186. package/dist/{chunk-38zv5rkr.js → chunk-z9h698s8.js} +1 -1
  187. package/dist/{chunk-38zv5rkr.js.map → chunk-z9h698s8.js.map} +2 -2
  188. package/dist/{chunk-8vj0rjgs.js → chunk-zdkcdshk.js} +3 -36
  189. package/dist/{chunk-8vj0rjgs.js.map → chunk-zdkcdshk.js.map} +3 -4
  190. package/dist/{chunk-358caqf5.js → chunk-znw0zvy4.js} +2 -2
  191. package/dist/datasets/validation.d.ts +4 -0
  192. package/dist/datasets/validation.d.ts.map +1 -1
  193. package/dist/datasets/write.d.ts.map +1 -1
  194. package/dist/datasets/write.js +5 -4
  195. package/dist/datasets/write.js.map +1 -1
  196. package/dist/edits/types.d.ts +19 -19
  197. package/dist/edits/types.d.ts.map +1 -1
  198. package/dist/error-reporting/capability.d.ts +3 -2
  199. package/dist/error-reporting/capability.d.ts.map +1 -1
  200. package/dist/error-reporting/internal.js +5 -4
  201. package/dist/error-reporting/internal.js.map +1 -1
  202. package/dist/error-reporting/reports.d.ts +10 -0
  203. package/dist/error-reporting/reports.d.ts.map +1 -1
  204. package/dist/error-reporting/types.d.ts +10 -2
  205. package/dist/error-reporting/types.d.ts.map +1 -1
  206. package/dist/errors/catalog.d.ts +16 -0
  207. package/dist/errors/catalog.d.ts.map +1 -1
  208. package/dist/errors/failure-message.d.ts +8 -0
  209. package/dist/errors/failure-message.d.ts.map +1 -0
  210. package/dist/errors/internal.d.ts.map +1 -1
  211. package/dist/errors/internal.js +3 -2
  212. package/dist/errors/internal.js.map +1 -1
  213. package/dist/events/envelope.d.ts +0 -12
  214. package/dist/events/envelope.d.ts.map +1 -1
  215. package/dist/events/index.d.ts +1 -1
  216. package/dist/events/index.d.ts.map +1 -1
  217. package/dist/events/index.js +5 -4
  218. package/dist/events/index.js.map +1 -1
  219. package/dist/events/service.d.ts +1 -2
  220. package/dist/events/service.d.ts.map +1 -1
  221. package/dist/events/toStoredEvent.d.ts +1 -2
  222. package/dist/events/toStoredEvent.d.ts.map +1 -1
  223. package/dist/events/types/index.d.ts +2 -1
  224. package/dist/events/types/index.d.ts.map +1 -1
  225. package/dist/execution/agent.d.ts +1 -2
  226. package/dist/execution/agent.d.ts.map +1 -1
  227. package/dist/execution/agent.js +48 -43
  228. package/dist/execution/agent.js.map +1 -1
  229. package/dist/execution/authorization.d.ts.map +1 -1
  230. package/dist/execution/authorized-object-reader.d.ts +3 -0
  231. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  232. package/dist/execution/kernel-operation.d.ts +4 -0
  233. package/dist/execution/kernel-operation.d.ts.map +1 -0
  234. package/dist/execution/primitive.d.ts +1 -2
  235. package/dist/execution/primitive.d.ts.map +1 -1
  236. package/dist/execution/primitive.js +47 -42
  237. package/dist/execution/primitive.js.map +3 -3
  238. package/dist/execution/request.d.ts +1 -2
  239. package/dist/execution/request.d.ts.map +1 -1
  240. package/dist/execution/request.js +48 -43
  241. package/dist/execution/request.js.map +3 -3
  242. package/dist/execution/types.d.ts +6 -0
  243. package/dist/execution/types.d.ts.map +1 -1
  244. package/dist/index.d.ts +20 -10
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +77 -62
  247. package/dist/index.js.map +1 -1
  248. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  249. package/dist/lake-storage/index.js +5 -4
  250. package/dist/lake-storage/index.js.map +1 -1
  251. package/dist/maintenance/ontology-maintenance.d.ts +11 -1
  252. package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
  253. package/dist/materialization/errors.d.ts +4 -2
  254. package/dist/materialization/errors.d.ts.map +1 -1
  255. package/dist/materialization/events.d.ts +27 -2
  256. package/dist/materialization/events.d.ts.map +1 -1
  257. package/dist/materialization/index.d.ts +1 -0
  258. package/dist/materialization/index.d.ts.map +1 -1
  259. package/dist/materialization/index.js +3 -3
  260. package/dist/materialization/model.d.ts +2 -0
  261. package/dist/materialization/model.d.ts.map +1 -1
  262. package/dist/materialization/vectors.d.ts +19 -0
  263. package/dist/materialization/vectors.d.ts.map +1 -0
  264. package/dist/materializer/context.d.ts.map +1 -1
  265. package/dist/materializer/edits/commit.d.ts.map +1 -1
  266. package/dist/materializer/edits/operations.d.ts +2 -1
  267. package/dist/materializer/edits/operations.d.ts.map +1 -1
  268. package/dist/materializer/edits/plan.d.ts +2 -2
  269. package/dist/materializer/edits/plan.d.ts.map +1 -1
  270. package/dist/materializer/edits/user-refs.d.ts +30 -0
  271. package/dist/materializer/edits/user-refs.d.ts.map +1 -0
  272. package/dist/materializer/edits/vector-authority.d.ts +6 -0
  273. package/dist/materializer/edits/vector-authority.d.ts.map +1 -0
  274. package/dist/materializer/edits/vectors.d.ts +6 -0
  275. package/dist/materializer/edits/vectors.d.ts.map +1 -0
  276. package/dist/materializer/effective/build-events.d.ts +2 -2
  277. package/dist/materializer/effective/build-events.d.ts.map +1 -1
  278. package/dist/materializer/effective/validate.d.ts.map +1 -1
  279. package/dist/materializer/effective/vector-indexing.d.ts +7 -0
  280. package/dist/materializer/effective/vector-indexing.d.ts.map +1 -0
  281. package/dist/materializer/effective/vectors.d.ts +6 -0
  282. package/dist/materializer/effective/vectors.d.ts.map +1 -0
  283. package/dist/materializer/execution/scope.d.ts +11 -3
  284. package/dist/materializer/execution/scope.d.ts.map +1 -1
  285. package/dist/materializer/execution/work-executor.d.ts +2 -1
  286. package/dist/materializer/execution/work-executor.d.ts.map +1 -1
  287. package/dist/materializer/index.js +30 -27
  288. package/dist/materializer/index.js.map +1 -1
  289. package/dist/materializer/projections/replacement-plan.d.ts +2 -0
  290. package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
  291. package/dist/materializer/shared/normalize.d.ts.map +1 -1
  292. package/dist/materializer/telemetry/plan.d.ts +2 -2
  293. package/dist/materializer/telemetry/plan.d.ts.map +1 -1
  294. package/dist/models/catalog-index.d.ts +15 -0
  295. package/dist/models/catalog-index.d.ts.map +1 -0
  296. package/dist/models/catalog.d.ts +27 -6
  297. package/dist/models/catalog.d.ts.map +1 -1
  298. package/dist/models/decision/catalog.d.ts +12 -0
  299. package/dist/models/decision/catalog.d.ts.map +1 -0
  300. package/dist/models/decision/errors.d.ts +7 -0
  301. package/dist/models/decision/errors.d.ts.map +1 -0
  302. package/dist/models/decision/output.d.ts +50 -0
  303. package/dist/models/decision/output.d.ts.map +1 -0
  304. package/dist/models/decision/questions.d.ts +14 -0
  305. package/dist/models/decision/questions.d.ts.map +1 -0
  306. package/dist/models/decision/runtime.d.ts +7 -0
  307. package/dist/models/decision/runtime.d.ts.map +1 -0
  308. package/dist/models/decision/types.d.ts +92 -0
  309. package/dist/models/decision/types.d.ts.map +1 -0
  310. package/dist/models/decision/validation.d.ts +7 -0
  311. package/dist/models/decision/validation.d.ts.map +1 -0
  312. package/dist/models/definitions.d.ts +1 -1
  313. package/dist/models/definitions.d.ts.map +1 -1
  314. package/dist/models/embedding-model.d.ts +60 -0
  315. package/dist/models/embedding-model.d.ts.map +1 -0
  316. package/dist/models/execution/binding.d.ts +2 -0
  317. package/dist/models/execution/binding.d.ts.map +1 -1
  318. package/dist/models/execution/embedding.d.ts +5 -0
  319. package/dist/models/execution/embedding.d.ts.map +1 -0
  320. package/dist/models/execution/index.js +32 -27
  321. package/dist/models/execution/index.js.map +1 -1
  322. package/dist/models/execution/model-call-recorder.d.ts +5 -1
  323. package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
  324. package/dist/models/execution/session.d.ts +21 -0
  325. package/dist/models/execution/session.d.ts.map +1 -0
  326. package/dist/models/execution.d.ts.map +1 -1
  327. package/dist/models/generation-types.d.ts +2 -0
  328. package/dist/models/generation-types.d.ts.map +1 -1
  329. package/dist/models/index.d.ts +9 -1
  330. package/dist/models/index.d.ts.map +1 -1
  331. package/dist/models/index.js +17 -7
  332. package/dist/models/index.js.map +1 -1
  333. package/dist/models/pricing.d.ts +3 -2
  334. package/dist/models/pricing.d.ts.map +1 -1
  335. package/dist/objects/authorized-ontology-view.d.ts.map +1 -1
  336. package/dist/objects/execution.d.ts +21 -26
  337. package/dist/objects/execution.d.ts.map +1 -1
  338. package/dist/objects/index.js +33 -30
  339. package/dist/objects/index.js.map +1 -1
  340. package/dist/objects/query/executor.d.ts +3 -0
  341. package/dist/objects/query/executor.d.ts.map +1 -1
  342. package/dist/objects/query/index.d.ts +2 -0
  343. package/dist/objects/query/index.d.ts.map +1 -1
  344. package/dist/objects/query/index.js +42 -30
  345. package/dist/objects/query/index.js.map +1 -1
  346. package/dist/objects/query/ir.d.ts +14 -3
  347. package/dist/objects/query/ir.d.ts.map +1 -1
  348. package/dist/objects/query/normalize.d.ts.map +1 -1
  349. package/dist/objects/query/scalar-values.d.ts.map +1 -1
  350. package/dist/objects/query/validate.d.ts.map +1 -1
  351. package/dist/objects/sdk/object-handle.d.ts +6 -2
  352. package/dist/objects/sdk/object-handle.d.ts.map +1 -1
  353. package/dist/objects/sdk/object-set.d.ts +2 -3
  354. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  355. package/dist/objects/sdk/query-builder.d.ts +8 -10
  356. package/dist/objects/sdk/query-builder.d.ts.map +1 -1
  357. package/dist/objects/sdk/query-executor.d.ts +2 -0
  358. package/dist/objects/sdk/query-executor.d.ts.map +1 -1
  359. package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
  360. package/dist/objects/sdk/telemetry-channel.d.ts +1 -2
  361. package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
  362. package/dist/objects/sdk/where.d.ts +2 -3
  363. package/dist/objects/sdk/where.d.ts.map +1 -1
  364. package/dist/objects/vectors/handle.d.ts +4 -0
  365. package/dist/objects/vectors/handle.d.ts.map +1 -0
  366. package/dist/objects/vectors/indexing-batch.d.ts +6 -0
  367. package/dist/objects/vectors/indexing-batch.d.ts.map +1 -0
  368. package/dist/objects/vectors/indexing-generate.d.ts +11 -0
  369. package/dist/objects/vectors/indexing-generate.d.ts.map +1 -0
  370. package/dist/objects/vectors/indexing-runtime.d.ts +7 -0
  371. package/dist/objects/vectors/indexing-runtime.d.ts.map +1 -0
  372. package/dist/objects/vectors/indexing-shared.d.ts +17 -0
  373. package/dist/objects/vectors/indexing-shared.d.ts.map +1 -0
  374. package/dist/objects/vectors/indexing-single.d.ts +4 -0
  375. package/dist/objects/vectors/indexing-single.d.ts.map +1 -0
  376. package/dist/objects/vectors/indexing-store-batch.d.ts +6 -0
  377. package/dist/objects/vectors/indexing-store-batch.d.ts.map +1 -0
  378. package/dist/objects/vectors/indexing.d.ts +7 -0
  379. package/dist/objects/vectors/indexing.d.ts.map +1 -0
  380. package/dist/objects/vectors/profile.d.ts +13 -0
  381. package/dist/objects/vectors/profile.d.ts.map +1 -0
  382. package/dist/objects/vectors/query.d.ts +5 -0
  383. package/dist/objects/vectors/query.d.ts.map +1 -0
  384. package/dist/objects/vectors/resolve-query.d.ts +6 -0
  385. package/dist/objects/vectors/resolve-query.d.ts.map +1 -0
  386. package/dist/objects/vectors/types.d.ts +11 -0
  387. package/dist/objects/vectors/types.d.ts.map +1 -0
  388. package/dist/ontology/builders.d.ts +11 -10
  389. package/dist/ontology/builders.d.ts.map +1 -1
  390. package/dist/ontology/index.d.ts +5 -2
  391. package/dist/ontology/index.d.ts.map +1 -1
  392. package/dist/ontology/index.js +7 -5
  393. package/dist/ontology/index.js.map +1 -1
  394. package/dist/ontology/inference/index.d.ts +34 -22
  395. package/dist/ontology/inference/index.d.ts.map +1 -1
  396. package/dist/ontology/internal.d.ts +1 -0
  397. package/dist/ontology/internal.d.ts.map +1 -1
  398. package/dist/ontology/internal.js +10 -7
  399. package/dist/ontology/internal.js.map +1 -1
  400. package/dist/ontology/primitives.d.ts +38 -0
  401. package/dist/ontology/primitives.d.ts.map +1 -0
  402. package/dist/ontology/query-capabilities.d.ts +38 -0
  403. package/dist/ontology/query-capabilities.d.ts.map +1 -0
  404. package/dist/ontology/refs.d.ts +23 -2
  405. package/dist/ontology/refs.d.ts.map +1 -1
  406. package/dist/ontology/registered.d.ts +16 -0
  407. package/dist/ontology/registered.d.ts.map +1 -0
  408. package/dist/ontology/registry.d.ts.map +1 -1
  409. package/dist/ontology/tokens.d.ts +35 -1
  410. package/dist/ontology/tokens.d.ts.map +1 -1
  411. package/dist/ontology/types.d.ts +26 -13
  412. package/dist/ontology/types.d.ts.map +1 -1
  413. package/dist/ontology/user-ref.d.ts +35 -0
  414. package/dist/ontology/user-ref.d.ts.map +1 -0
  415. package/dist/ontology/validation/definition.d.ts +3 -0
  416. package/dist/ontology/validation/definition.d.ts.map +1 -0
  417. package/dist/ontology/validation/index.d.ts +1 -1
  418. package/dist/ontology/validation/index.d.ts.map +1 -1
  419. package/dist/ontology/validation/normalize.d.ts.map +1 -1
  420. package/dist/ontology/validation/properties.d.ts +6 -1
  421. package/dist/ontology/validation/properties.d.ts.map +1 -1
  422. package/dist/ontology/validation/query.d.ts.map +1 -1
  423. package/dist/ontology/validation/schema.d.ts +1 -1
  424. package/dist/ontology/validation/schema.d.ts.map +1 -1
  425. package/dist/ontology/vector-profiles.d.ts +4 -0
  426. package/dist/ontology/vector-profiles.d.ts.map +1 -0
  427. package/dist/pipelines/index.js +32 -29
  428. package/dist/pipelines/index.js.map +1 -1
  429. package/dist/predicates/types.d.ts +53 -3
  430. package/dist/predicates/types.d.ts.map +1 -1
  431. package/dist/projections/builders.d.ts +19 -1
  432. package/dist/projections/builders.d.ts.map +1 -1
  433. package/dist/projections/internal.js +28 -25
  434. package/dist/projections/internal.js.map +1 -1
  435. package/dist/projections/validation.d.ts.map +1 -1
  436. package/dist/query.js +2 -2
  437. package/dist/queues/in-memory.d.ts +3 -2
  438. package/dist/queues/in-memory.d.ts.map +1 -1
  439. package/dist/queues/index.d.ts +1 -1
  440. package/dist/queues/index.d.ts.map +1 -1
  441. package/dist/queues/index.js +1 -1
  442. package/dist/queues/types.d.ts +5 -0
  443. package/dist/queues/types.d.ts.map +1 -1
  444. package/dist/runtime/create.d.ts +4 -3
  445. package/dist/runtime/create.d.ts.map +1 -1
  446. package/dist/runtime/host.d.ts +10 -7
  447. package/dist/runtime/host.d.ts.map +1 -1
  448. package/dist/runtime/index.d.ts +1 -1
  449. package/dist/runtime/index.d.ts.map +1 -1
  450. package/dist/runtime/internal.d.ts +3 -0
  451. package/dist/runtime/internal.d.ts.map +1 -1
  452. package/dist/runtime/internal.js +49 -1
  453. package/dist/runtime/internal.js.map +1 -1
  454. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  455. package/dist/runtime/sixb.d.ts +11 -6
  456. package/dist/runtime/sixb.d.ts.map +1 -1
  457. package/dist/runtime/types.d.ts +182 -187
  458. package/dist/runtime/types.d.ts.map +1 -1
  459. package/dist/sandboxes/auth.d.ts +16 -0
  460. package/dist/sandboxes/auth.d.ts.map +1 -0
  461. package/dist/sandboxes/config.d.ts +5 -0
  462. package/dist/sandboxes/config.d.ts.map +1 -0
  463. package/dist/sandboxes/configuration.d.ts +41 -0
  464. package/dist/sandboxes/configuration.d.ts.map +1 -0
  465. package/dist/sandboxes/environment.d.ts +13 -0
  466. package/dist/sandboxes/environment.d.ts.map +1 -0
  467. package/dist/sandboxes/errors.d.ts +1 -1
  468. package/dist/sandboxes/errors.d.ts.map +1 -1
  469. package/dist/sandboxes/index.d.ts +6 -1
  470. package/dist/sandboxes/index.d.ts.map +1 -1
  471. package/dist/sandboxes/index.js +16 -3
  472. package/dist/sandboxes/index.js.map +1 -1
  473. package/dist/sandboxes/sandbox.d.ts +39 -4
  474. package/dist/sandboxes/sandbox.d.ts.map +1 -1
  475. package/dist/shared/params/builders.d.ts +25 -0
  476. package/dist/shared/params/builders.d.ts.map +1 -0
  477. package/dist/shared/params/types.d.ts +48 -0
  478. package/dist/shared/params/types.d.ts.map +1 -0
  479. package/dist/shared/params/user-refs.d.ts +19 -0
  480. package/dist/shared/params/user-refs.d.ts.map +1 -0
  481. package/dist/shared/params/validation.d.ts +15 -0
  482. package/dist/shared/params/validation.d.ts.map +1 -0
  483. package/dist/shares/compiler.d.ts.map +1 -1
  484. package/dist/shares/internal.js +29 -26
  485. package/dist/shares/internal.js.map +2 -2
  486. package/dist/storage/action-runs/failure.js +4 -3
  487. package/dist/storage/action-runs/failure.js.map +1 -1
  488. package/dist/storage/action-runs/provider.js +1 -1
  489. package/dist/storage/action-runs/types.d.ts +1 -1
  490. package/dist/storage/action-runs/types.d.ts.map +1 -1
  491. package/dist/storage/agents/in-memory.d.ts +2 -1
  492. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  493. package/dist/storage/agents/index.d.ts +1 -1
  494. package/dist/storage/agents/index.d.ts.map +1 -1
  495. package/dist/storage/agents/provider.d.ts +5 -1
  496. package/dist/storage/agents/provider.d.ts.map +1 -1
  497. package/dist/storage/agents/provider.js +8 -4
  498. package/dist/storage/agents/provider.js.map +1 -1
  499. package/dist/storage/agents/types.d.ts +49 -0
  500. package/dist/storage/agents/types.d.ts.map +1 -1
  501. package/dist/storage/ai-cost/analytics.d.ts +1 -0
  502. package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
  503. package/dist/storage/ai-cost/index.d.ts +1 -1
  504. package/dist/storage/ai-cost/index.d.ts.map +1 -1
  505. package/dist/storage/ai-cost/provider.js +2 -2
  506. package/dist/storage/ai-cost/types.d.ts +14 -2
  507. package/dist/storage/ai-cost/types.d.ts.map +1 -1
  508. package/dist/storage/ai-limits/enforcement.js +4 -3
  509. package/dist/storage/ai-limits/enforcement.js.map +1 -1
  510. package/dist/storage/auth/in-memory/access-tokens.d.ts.map +1 -1
  511. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  512. package/dist/storage/auth/in-memory/device-authorizations.d.ts.map +1 -1
  513. package/dist/storage/auth/in-memory/sessions.d.ts +8 -1
  514. package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
  515. package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
  516. package/dist/storage/auth/index.d.ts +1 -1
  517. package/dist/storage/auth/index.d.ts.map +1 -1
  518. package/dist/storage/auth/types.d.ts +62 -13
  519. package/dist/storage/auth/types.d.ts.map +1 -1
  520. package/dist/storage/connector-connections/provider.js +3 -2
  521. package/dist/storage/connector-connections/provider.js.map +2 -2
  522. package/dist/storage/executions/provider.d.ts +3 -3
  523. package/dist/storage/executions/provider.d.ts.map +1 -1
  524. package/dist/storage/executions/provider.js +13 -11
  525. package/dist/storage/executions/provider.js.map +3 -3
  526. package/dist/storage/executions/types.d.ts +3 -0
  527. package/dist/storage/executions/types.d.ts.map +1 -1
  528. package/dist/storage/executions/validation.d.ts.map +1 -1
  529. package/dist/storage/file-upload-sessions/in-memory.d.ts +9 -18
  530. package/dist/storage/file-upload-sessions/in-memory.d.ts.map +1 -1
  531. package/dist/storage/file-upload-sessions/index.d.ts +1 -1
  532. package/dist/storage/file-upload-sessions/index.d.ts.map +1 -1
  533. package/dist/storage/file-upload-sessions/provider.d.ts +52 -0
  534. package/dist/storage/file-upload-sessions/provider.d.ts.map +1 -0
  535. package/dist/storage/file-upload-sessions/provider.js +24 -0
  536. package/dist/storage/file-upload-sessions/provider.js.map +9 -0
  537. package/dist/storage/file-upload-sessions/types.d.ts +19 -1
  538. package/dist/storage/file-upload-sessions/types.d.ts.map +1 -1
  539. package/dist/storage/file-upload-sessions/utils.d.ts +8 -2
  540. package/dist/storage/file-upload-sessions/utils.d.ts.map +1 -1
  541. package/dist/storage/index.d.ts +8 -6
  542. package/dist/storage/index.d.ts.map +1 -1
  543. package/dist/storage/index.js +37 -30
  544. package/dist/storage/index.js.map +1 -1
  545. package/dist/storage/internal.js +11 -9
  546. package/dist/storage/internal.js.map +1 -1
  547. package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
  548. package/dist/storage/objects/in-memory/read-source.d.ts +5 -0
  549. package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -1
  550. package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -1
  551. package/dist/storage/objects/in-memory/storage.d.ts +7 -0
  552. package/dist/storage/objects/in-memory/storage.d.ts.map +1 -1
  553. package/dist/storage/objects/types.d.ts +2 -0
  554. package/dist/storage/objects/types.d.ts.map +1 -1
  555. package/dist/storage/ontology/commits.d.ts +7 -2
  556. package/dist/storage/ontology/commits.d.ts.map +1 -1
  557. package/dist/storage/ontology/in-memory/index.d.ts +4 -0
  558. package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
  559. package/dist/storage/ontology/in-memory/materializations.d.ts +2 -0
  560. package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
  561. package/dist/storage/ontology/in-memory/shared-state.d.ts +7 -0
  562. package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
  563. package/dist/storage/ontology/in-memory/vector-indexing.d.ts +44 -0
  564. package/dist/storage/ontology/in-memory/vector-indexing.d.ts.map +1 -0
  565. package/dist/storage/ontology/in-memory/vectors.d.ts +31 -0
  566. package/dist/storage/ontology/in-memory/vectors.d.ts.map +1 -0
  567. package/dist/storage/ontology/index.d.ts +6 -0
  568. package/dist/storage/ontology/index.d.ts.map +1 -1
  569. package/dist/storage/ontology/provider-work.d.ts.map +1 -1
  570. package/dist/storage/ontology/provider.d.ts +14 -1
  571. package/dist/storage/ontology/provider.d.ts.map +1 -1
  572. package/dist/storage/ontology/provider.js +9 -3
  573. package/dist/storage/ontology/provider.js.map +1 -1
  574. package/dist/storage/ontology/vector-indexing.d.ts +94 -0
  575. package/dist/storage/ontology/vector-indexing.d.ts.map +1 -0
  576. package/dist/storage/ontology/vectors.d.ts +56 -0
  577. package/dist/storage/ontology/vectors.d.ts.map +1 -0
  578. package/dist/storage/operation-scope.d.ts.map +1 -1
  579. package/dist/storage/operation-scope.js +1 -1
  580. package/dist/storage/projection-runs/provider.js +4 -3
  581. package/dist/storage/projection-runs/provider.js.map +1 -1
  582. package/dist/storage/types.d.ts +2 -2
  583. package/dist/storage/types.d.ts.map +1 -1
  584. package/dist/storage/workflow-interventions/index.d.ts +1 -1
  585. package/dist/storage/workflow-interventions/index.d.ts.map +1 -1
  586. package/dist/storage/workflow-interventions/types.d.ts +5 -8
  587. package/dist/storage/workflow-interventions/types.d.ts.map +1 -1
  588. package/dist/storage/workflow-runs/provider.js +10 -8
  589. package/dist/storage/workflow-runs/provider.js.map +1 -1
  590. package/dist/syncs/index.js +33 -30
  591. package/dist/syncs/index.js.map +1 -1
  592. package/dist/testing/action-execution.d.ts +4 -0
  593. package/dist/testing/action-execution.d.ts.map +1 -1
  594. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  595. package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
  596. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  597. package/dist/testing/execution.d.ts +1 -2
  598. package/dist/testing/execution.d.ts.map +1 -1
  599. package/dist/testing/file-upload-session-storage-contract.d.ts +12 -0
  600. package/dist/testing/file-upload-session-storage-contract.d.ts.map +1 -0
  601. package/dist/testing/index.d.ts +2 -0
  602. package/dist/testing/index.d.ts.map +1 -1
  603. package/dist/testing/index.js +2351 -1263
  604. package/dist/testing/index.js.map +19 -17
  605. package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
  606. package/dist/testing/object-query-contract.d.ts.map +1 -1
  607. package/dist/testing/object-read-scope-contract.d.ts.map +1 -1
  608. package/dist/testing/ontology-contract-fixture.d.ts +8 -0
  609. package/dist/testing/ontology-contract-fixture.d.ts.map +1 -1
  610. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  611. package/dist/testing/queues-contract.d.ts.map +1 -1
  612. package/dist/testing/sandboxes-contract.d.ts.map +1 -1
  613. package/dist/testing/workflow-intervention-storage-contract.d.ts +8 -0
  614. package/dist/testing/workflow-intervention-storage-contract.d.ts.map +1 -0
  615. package/dist/webhooks/internal.js +29 -26
  616. package/dist/webhooks/internal.js.map +2 -2
  617. package/dist/webhooks/types.d.ts +2 -2
  618. package/dist/webhooks/types.d.ts.map +1 -1
  619. package/dist/workers/index.js +3 -2
  620. package/dist/workers/index.js.map +2 -2
  621. package/dist/workflows/failure.d.ts.map +1 -1
  622. package/dist/workflows/index.js +51 -45
  623. package/dist/workflows/index.js.map +1 -1
  624. package/dist/workflows/run-dispatch.d.ts.map +1 -1
  625. package/dist/workflows/types.d.ts +2 -2
  626. package/dist/workflows/types.d.ts.map +1 -1
  627. package/package.json +7 -1
  628. package/src/actions/builders/params.ts +1 -48
  629. package/src/actions/index.ts +0 -3
  630. package/src/actions/read-facade.ts +102 -62
  631. package/src/actions/request.ts +13 -0
  632. package/src/actions/run-dispatch.ts +3 -0
  633. package/src/actions/types/context.ts +17 -65
  634. package/src/actions/types/params.ts +16 -75
  635. package/src/actions/validation.ts +7 -84
  636. package/src/agents/authority.ts +1 -1
  637. package/src/agents/errors.ts +3 -0
  638. package/src/agents/execution.ts +67 -15
  639. package/src/agents/ids.ts +8 -0
  640. package/src/agents/index.ts +1 -0
  641. package/src/agents/request.ts +11 -0
  642. package/src/agents/sandbox.ts +44 -0
  643. package/src/agents/validation.ts +2 -108
  644. package/src/assert-never.ts +7 -0
  645. package/src/auth/client-address.ts +12 -0
  646. package/src/auth/csrf.ts +14 -5
  647. package/src/auth/index.ts +3 -2
  648. package/src/auth/runtime.ts +299 -277
  649. package/src/auth/session-cache.ts +18 -6
  650. package/src/auth/sessions.ts +30 -0
  651. package/src/auth/types.ts +7 -17
  652. package/src/bootstrap/index.ts +1 -0
  653. package/src/bootstrap/ontology-type-manifest.ts +112 -60
  654. package/src/datasets/validation.ts +40 -11
  655. package/src/datasets/write.ts +8 -11
  656. package/src/edits/types.ts +47 -63
  657. package/src/error-reporting/capability.ts +11 -0
  658. package/src/error-reporting/reports.ts +23 -0
  659. package/src/error-reporting/types.ts +12 -1
  660. package/src/errors/catalog.ts +16 -0
  661. package/src/errors/failure-message.ts +15 -0
  662. package/src/errors/internal.ts +57 -25
  663. package/src/events/envelope.ts +0 -13
  664. package/src/events/index.ts +1 -1
  665. package/src/events/service.ts +1 -11
  666. package/src/events/toStoredEvent.ts +1 -3
  667. package/src/events/types/index.ts +1 -1
  668. package/src/execution/agent.ts +1 -2
  669. package/src/execution/authorization.ts +12 -5
  670. package/src/execution/authorized-object-reader.ts +42 -9
  671. package/src/execution/kernel-operation.ts +27 -0
  672. package/src/execution/primitive.ts +1 -2
  673. package/src/execution/request.ts +1 -2
  674. package/src/execution/scopes.ts +2 -0
  675. package/src/execution/types.ts +4 -4
  676. package/src/index.ts +68 -8
  677. package/src/lake-storage/in-memory.ts +5 -3
  678. package/src/maintenance/ontology-maintenance.ts +77 -1
  679. package/src/materialization/errors.ts +4 -2
  680. package/src/materialization/events.ts +27 -2
  681. package/src/materialization/index.ts +1 -0
  682. package/src/materialization/model.ts +2 -0
  683. package/src/materialization/vectors.ts +18 -0
  684. package/src/materializer/README.md +16 -0
  685. package/src/materializer/context.ts +10 -0
  686. package/src/materializer/edits/commit.ts +29 -13
  687. package/src/materializer/edits/operations.ts +32 -4
  688. package/src/materializer/edits/plan.ts +4 -5
  689. package/src/materializer/edits/user-refs.ts +115 -0
  690. package/src/materializer/edits/vector-authority.ts +108 -0
  691. package/src/materializer/edits/vectors.ts +100 -0
  692. package/src/materializer/effective/build-events.ts +4 -5
  693. package/src/materializer/effective/validate.ts +10 -3
  694. package/src/materializer/effective/vector-indexing.ts +84 -0
  695. package/src/materializer/effective/vectors.ts +47 -0
  696. package/src/materializer/execution/scope.ts +40 -7
  697. package/src/materializer/execution/work-executor.ts +11 -3
  698. package/src/materializer/projections/replace.ts +3 -1
  699. package/src/materializer/projections/replacement-plan.ts +4 -0
  700. package/src/materializer/shared/normalize.ts +11 -0
  701. package/src/materializer/telemetry/append.ts +5 -13
  702. package/src/materializer/telemetry/plan.ts +4 -5
  703. package/src/models/catalog-index.ts +38 -0
  704. package/src/models/catalog.ts +66 -38
  705. package/src/models/decision/catalog.ts +32 -0
  706. package/src/models/decision/errors.ts +18 -0
  707. package/src/models/decision/output.ts +101 -0
  708. package/src/models/decision/questions.ts +29 -0
  709. package/src/models/decision/runtime.ts +188 -0
  710. package/src/models/decision/types.ts +109 -0
  711. package/src/models/decision/validation.ts +335 -0
  712. package/src/models/definitions.ts +1 -1
  713. package/src/models/embedding-model.ts +129 -0
  714. package/src/models/execution/README.md +63 -0
  715. package/src/models/execution/binding.ts +2 -0
  716. package/src/models/execution/embedding.ts +133 -0
  717. package/src/models/execution/model-call-recorder.ts +42 -30
  718. package/src/models/execution/session.ts +81 -0
  719. package/src/models/execution.ts +10 -52
  720. package/src/models/generation-types.ts +2 -0
  721. package/src/models/index.ts +37 -0
  722. package/src/models/pricing.ts +1 -2
  723. package/src/objects/authorized-ontology-view.ts +12 -8
  724. package/src/objects/execution.ts +34 -61
  725. package/src/objects/query/executor.ts +25 -7
  726. package/src/objects/query/explain.ts +7 -2
  727. package/src/objects/query/index.ts +2 -0
  728. package/src/objects/query/ir.ts +13 -2
  729. package/src/objects/query/normalize.ts +5 -1
  730. package/src/objects/query/planner.ts +1 -0
  731. package/src/objects/query/scalar-values.ts +19 -0
  732. package/src/objects/query/validate.ts +129 -117
  733. package/src/objects/sdk/object-handle.ts +11 -8
  734. package/src/objects/sdk/object-set.ts +9 -15
  735. package/src/objects/sdk/query-builder.ts +66 -72
  736. package/src/objects/sdk/query-executor.ts +2 -1
  737. package/src/objects/sdk/runtime-query-executor.ts +6 -2
  738. package/src/objects/sdk/telemetry-channel.ts +6 -7
  739. package/src/objects/sdk/where.ts +6 -13
  740. package/src/objects/vectors/README.md +59 -0
  741. package/src/objects/vectors/handle.ts +91 -0
  742. package/src/objects/vectors/indexing-batch.ts +163 -0
  743. package/src/objects/vectors/indexing-generate.ts +184 -0
  744. package/src/objects/vectors/indexing-runtime.ts +17 -0
  745. package/src/objects/vectors/indexing-shared.ts +188 -0
  746. package/src/objects/vectors/indexing-single.ts +51 -0
  747. package/src/objects/vectors/indexing-store-batch.ts +62 -0
  748. package/src/objects/vectors/indexing.ts +23 -0
  749. package/src/objects/vectors/profile.ts +64 -0
  750. package/src/objects/vectors/query.ts +16 -0
  751. package/src/objects/vectors/resolve-query.ts +89 -0
  752. package/src/objects/vectors/types.ts +10 -0
  753. package/src/ontology/builders.ts +15 -11
  754. package/src/ontology/index.ts +6 -0
  755. package/src/ontology/inference/index.ts +56 -36
  756. package/src/ontology/internal.ts +1 -0
  757. package/src/ontology/json-schema.ts +12 -0
  758. package/src/ontology/primitives.ts +91 -0
  759. package/src/ontology/query-capabilities.ts +136 -0
  760. package/src/ontology/refs.ts +33 -6
  761. package/src/ontology/registered.ts +22 -0
  762. package/src/ontology/registry.ts +14 -3
  763. package/src/ontology/tokens.ts +41 -2
  764. package/src/ontology/types.ts +28 -12
  765. package/src/ontology/user-ref.ts +120 -0
  766. package/src/ontology/validation/definition.ts +93 -0
  767. package/src/ontology/validation/index.ts +1 -0
  768. package/src/ontology/validation/normalize.ts +39 -3
  769. package/src/ontology/validation/properties.ts +109 -23
  770. package/src/ontology/validation/query.ts +44 -92
  771. package/src/ontology/validation/schema.ts +101 -23
  772. package/src/ontology/vector-profiles.ts +35 -0
  773. package/src/predicates/types.ts +43 -33
  774. package/src/projections/builders.ts +24 -3
  775. package/src/projections/validation.ts +15 -1
  776. package/src/queues/in-memory.ts +5 -0
  777. package/src/queues/index.ts +1 -0
  778. package/src/queues/types.ts +10 -0
  779. package/src/runtime/create.ts +7 -6
  780. package/src/runtime/host.ts +44 -10
  781. package/src/runtime/index.ts +3 -2
  782. package/src/runtime/internal.ts +3 -0
  783. package/src/runtime/resolve-definitions.ts +19 -1
  784. package/src/runtime/sixb.ts +25 -17
  785. package/src/runtime/types.ts +288 -478
  786. package/src/sandboxes/README.md +41 -0
  787. package/src/sandboxes/auth.ts +17 -0
  788. package/src/sandboxes/config.ts +37 -0
  789. package/src/sandboxes/configuration.ts +268 -0
  790. package/src/sandboxes/environment.ts +107 -0
  791. package/src/sandboxes/errors.ts +1 -1
  792. package/src/sandboxes/index.ts +15 -0
  793. package/src/sandboxes/sandbox.ts +42 -4
  794. package/src/shared/params/builders.ts +50 -0
  795. package/src/shared/params/types.ts +85 -0
  796. package/src/shared/params/user-refs.ts +48 -0
  797. package/src/shared/params/validation.ts +114 -0
  798. package/src/shares/compiler.ts +6 -16
  799. package/src/storage/action-runs/types.ts +1 -0
  800. package/src/storage/agents/in-memory.ts +25 -1
  801. package/src/storage/agents/index.ts +3 -0
  802. package/src/storage/agents/provider.ts +105 -0
  803. package/src/storage/agents/types.ts +54 -0
  804. package/src/storage/ai-cost/analytics.ts +59 -21
  805. package/src/storage/ai-cost/index.ts +1 -0
  806. package/src/storage/ai-cost/types.ts +19 -2
  807. package/src/storage/auth/in-memory/access-tokens.ts +5 -2
  808. package/src/storage/auth/in-memory/auth-storage.ts +5 -8
  809. package/src/storage/auth/in-memory/device-authorizations.ts +0 -2
  810. package/src/storage/auth/in-memory/sessions.ts +69 -1
  811. package/src/storage/auth/in-memory/shared.ts +13 -7
  812. package/src/storage/auth/index.ts +2 -1
  813. package/src/storage/auth/types.ts +57 -13
  814. package/src/storage/executions/provider.ts +24 -12
  815. package/src/storage/executions/types.ts +1 -0
  816. package/src/storage/executions/validation.ts +8 -4
  817. package/src/storage/file-upload-sessions/in-memory.ts +64 -113
  818. package/src/storage/file-upload-sessions/index.ts +1 -0
  819. package/src/storage/file-upload-sessions/provider.ts +258 -0
  820. package/src/storage/file-upload-sessions/types.ts +20 -1
  821. package/src/storage/file-upload-sessions/utils.ts +25 -9
  822. package/src/storage/index.ts +18 -3
  823. package/src/storage/objects/in-memory/query.ts +38 -14
  824. package/src/storage/objects/in-memory/read-scope.ts +9 -2
  825. package/src/storage/objects/in-memory/read-source.ts +5 -0
  826. package/src/storage/objects/in-memory/selected-reader.ts +5 -1
  827. package/src/storage/objects/in-memory/storage.ts +19 -1
  828. package/src/storage/objects/types.ts +2 -0
  829. package/src/storage/ontology/commits.ts +7 -2
  830. package/src/storage/ontology/in-memory/index.ts +20 -0
  831. package/src/storage/ontology/in-memory/materializations.ts +19 -34
  832. package/src/storage/ontology/in-memory/shared-state.ts +9 -0
  833. package/src/storage/ontology/in-memory/vector-indexing.ts +179 -0
  834. package/src/storage/ontology/in-memory/vectors.ts +73 -0
  835. package/src/storage/ontology/index.ts +14 -0
  836. package/src/storage/ontology/provider-header-validation.ts +57 -0
  837. package/src/storage/ontology/provider-work.ts +15 -3
  838. package/src/storage/ontology/provider.ts +59 -1
  839. package/src/storage/ontology/vector-indexing.ts +98 -0
  840. package/src/storage/ontology/vectors.ts +48 -0
  841. package/src/storage/operation-scope.ts +2 -0
  842. package/src/storage/types.ts +3 -1
  843. package/src/storage/workflow-interventions/index.ts +0 -1
  844. package/src/storage/workflow-interventions/types.ts +5 -9
  845. package/src/testing/action-execution.ts +13 -3
  846. package/src/testing/agent-storage-contract.ts +246 -0
  847. package/src/testing/ai-cost-storage-contract.ts +134 -0
  848. package/src/testing/auth-storage-contract.ts +149 -62
  849. package/src/testing/execution-storage-contract.ts +1 -2
  850. package/src/testing/execution.ts +4 -7
  851. package/src/testing/file-upload-session-storage-contract.ts +335 -0
  852. package/src/testing/index.ts +8 -0
  853. package/src/testing/materializer-storage-contract.ts +86 -4
  854. package/src/testing/object-query-contract.ts +162 -27
  855. package/src/testing/object-read-scope-contract.ts +1 -5
  856. package/src/testing/ontology-contract-fixture.ts +23 -3
  857. package/src/testing/ontology-storage-contract.ts +58 -0
  858. package/src/testing/queues-contract.ts +31 -0
  859. package/src/testing/sandboxes-contract.ts +27 -0
  860. package/src/testing/workflow-intervention-storage-contract.ts +203 -0
  861. package/src/webhooks/types.ts +2 -2
  862. package/src/workflows/failure.ts +10 -4
  863. package/src/workflows/run-dispatch.ts +12 -1
  864. package/src/workflows/snapshot.ts +16 -7
  865. package/src/workflows/types.ts +2 -2
  866. package/src/workflows/validation.ts +2 -2
  867. package/dist/chunk-01kj2pbh.js.map +0 -19
  868. package/dist/chunk-5hz0fnca.js.map +0 -12
  869. package/dist/chunk-653vwrzr.js.map +0 -10
  870. package/dist/chunk-7apz6hg4.js.map +0 -10
  871. package/dist/chunk-7bs40fe1.js.map +0 -12
  872. package/dist/chunk-860dwwy0.js.map +0 -14
  873. package/dist/chunk-93csa55g.js.map +0 -11
  874. package/dist/chunk-a0e6x5hd.js.map +0 -14
  875. package/dist/chunk-aa6z4a19.js.map +0 -12
  876. package/dist/chunk-ap0g1g74.js.map +0 -11
  877. package/dist/chunk-awbhdqyc.js.map +0 -10
  878. package/dist/chunk-b19g04jk.js.map +0 -11
  879. package/dist/chunk-dz5h08xv.js.map +0 -25
  880. package/dist/chunk-f0rwz2vh.js.map +0 -11
  881. package/dist/chunk-f4w3yp4f.js.map +0 -12
  882. package/dist/chunk-ftv470j8.js.map +0 -45
  883. package/dist/chunk-g00bfdq6.js.map +0 -43
  884. package/dist/chunk-gq8vhakp.js.map +0 -44
  885. package/dist/chunk-gqh45d2n.js.map +0 -15
  886. package/dist/chunk-gqm76kse.js.map +0 -58
  887. package/dist/chunk-jsy70480.js.map +0 -15
  888. package/dist/chunk-mrp7k0pw.js.map +0 -10
  889. package/dist/chunk-ms2tmn1k.js.map +0 -17
  890. package/dist/chunk-rb1xx120.js.map +0 -11
  891. package/dist/chunk-sepyxgpc.js.map +0 -15
  892. package/dist/chunk-yv79ncbv.js.map +0 -10
  893. package/dist/chunk-z0271qkp.js.map +0 -15
  894. package/dist/chunk-z3y411fq.js +0 -99
  895. package/dist/chunk-z3y411fq.js.map +0 -11
  896. /package/dist/{chunk-1yefycb1.js.map → chunk-2hbhn1ff.js.map} +0 -0
  897. /package/dist/{chunk-wjasrj67.js.map → chunk-3qpcrcj8.js.map} +0 -0
  898. /package/dist/{chunk-0y39rgsb.js.map → chunk-4tnrzqqh.js.map} +0 -0
  899. /package/dist/{chunk-c5rkjrgp.js.map → chunk-7ytf06d3.js.map} +0 -0
  900. /package/dist/{chunk-cfvakeax.js.map → chunk-a69fkrtr.js.map} +0 -0
  901. /package/dist/{chunk-v2vcg0w6.js.map → chunk-cbn96bve.js.map} +0 -0
  902. /package/dist/{chunk-g6cke204.js.map → chunk-f85hpqnm.js.map} +0 -0
  903. /package/dist/{chunk-vsj3mdfj.js.map → chunk-fc5zfxy1.js.map} +0 -0
  904. /package/dist/{chunk-x9m9x2eq.js.map → chunk-jhyc777j.js.map} +0 -0
  905. /package/dist/{chunk-17kfctj6.js.map → chunk-m8zkvep1.js.map} +0 -0
  906. /package/dist/{chunk-9qsh3p5y.js.map → chunk-rb143ggb.js.map} +0 -0
  907. /package/dist/{chunk-92vk7gta.js.map → chunk-vn3yh259.js.map} +0 -0
  908. /package/dist/{chunk-g91qxjj0.js.map → chunk-w9bp61e7.js.map} +0 -0
  909. /package/dist/{chunk-1824gssz.js.map → chunk-y487ywrv.js.map} +0 -0
  910. /package/dist/{chunk-358caqf5.js.map → chunk-znw0zvy4.js.map} +0 -0
@@ -18,6 +18,7 @@ import {
18
18
  type AccessTokenRecord,
19
19
  type AuthStorage,
20
20
  AuthStorageError,
21
+ type CompleteDeviceAuthorizationInput,
21
22
  type InvitationRecord,
22
23
  type ServiceAccountGroupMembershipRecord,
23
24
  type ServiceAccountRecord,
@@ -31,7 +32,8 @@ import {
31
32
  hashAccessTokenSecret,
32
33
  parseAccessTokenValue,
33
34
  } from "./access-tokens"
34
- import type { AuthSessionAudience } from "./audience"
35
+ import { type AuthSessionAudience, DEFAULT_AUTH_SESSION_AUDIENCE } from "./audience"
36
+ import { getRequestClientAddress } from "./client-address"
35
37
  import {
36
38
  getCookie,
37
39
  type ResolvedAuthCookieOptions,
@@ -39,7 +41,15 @@ import {
39
41
  } from "./cookies"
40
42
  import { AuthRuntimeError } from "./errors"
41
43
  import { SessionCache } from "./session-cache"
42
- import { hashSessionSecret, parseSessionCookieValue } from "./sessions"
44
+ import {
45
+ type BearerSessionTokens,
46
+ createBearerSessionTokens,
47
+ hashSessionSecret,
48
+ parseBearerSessionToken,
49
+ parseSessionCookieValue,
50
+ SESSION_ACCESS_TOKEN_PREFIX,
51
+ SESSION_REFRESH_TOKEN_PREFIX,
52
+ } from "./sessions"
43
53
  import type {
44
54
  AuthenticatedAuthSession,
45
55
  AuthenticatedRequestAuthSession,
@@ -59,12 +69,12 @@ import type {
59
69
  GetInvitationOptionsResult,
60
70
  GetMembershipOptionsResult,
61
71
  InvitationDeliveryAuthStrategy,
72
+ InvitationDestination,
62
73
  InvitationGroupOption,
63
74
  InvitationRecipientStatus,
64
75
  InviteDeliveryResult,
65
76
  InviteDeliveryStatus,
66
77
  InviteUserInput,
67
- InviteUserOptions,
68
78
  InviteUserResult,
69
79
  ListInvitationsInput,
70
80
  ListInvitationsResult,
@@ -76,7 +86,6 @@ import type {
76
86
  ListServiceAccountsResult,
77
87
  MemberSummary,
78
88
  MembershipCapabilities,
79
- Principal,
80
89
  ReactivateMemberInput,
81
90
  ReactivateMemberResult,
82
91
  ResolvedAuthConfig,
@@ -86,10 +95,10 @@ import type {
86
95
  RevokePersonalAccessTokenInput,
87
96
  RevokeServiceAccountAccessTokenInput,
88
97
  RevokeServiceAccountAccessTokenResult,
89
- SecurityContext,
90
98
  SixbAuthConfig,
91
99
  SuspendMemberInput,
92
100
  SuspendMemberResult,
101
+ UnauthenticatedAuthSession,
93
102
  UpdateMemberGroupsInput,
94
103
  UpdateMemberGroupsResult,
95
104
  } from "./types"
@@ -100,7 +109,6 @@ import {
100
109
  resolveAuthConfig,
101
110
  resolveAuthSessionAudience,
102
111
  resolveInvitationExpiresAt,
103
- sanitizeReturnTo,
104
112
  } from "./validation"
105
113
 
106
114
  export {
@@ -117,6 +125,12 @@ export {
117
125
  const SESSION_TOUCH_INTERVAL_MS = 60_000
118
126
  const ACCESS_TOKEN_TOUCH_INTERVAL_MS = 60_000
119
127
 
128
+ // A native client's access token is sent on every request, so a leaked one must stop working soon.
129
+ const BEARER_ACCESS_TOKEN_TTL_MS = 15 * 60_000
130
+ // A replaced refresh token still rotates this long after its replacement, so a client whose refresh
131
+ // response was lost can retry. Later, it means a copy is in use and the session is revoked.
132
+ const REFRESH_REUSE_GRACE_MS = 60_000
133
+
120
134
  export interface AuthRuntimeOptions {
121
135
  readonly projectId: string
122
136
  readonly storage: Storage
@@ -211,7 +225,7 @@ export class AuthRuntime {
211
225
  ): Promise<AuthSessionResult>
212
226
  async getSession(
213
227
  request: Request,
214
- options: AuthSessionResolutionOptions & { readonly credentialSource: "accessToken" | "any" }
228
+ options: AuthSessionResolutionOptions & { readonly credentialSource: "any" }
215
229
  ): Promise<AuthRequestResult>
216
230
  async getSession(
217
231
  request: Request,
@@ -226,22 +240,20 @@ export class AuthRuntime {
226
240
  }
227
241
 
228
242
  const audience = resolveAuthSessionAudience(options.audience)
229
- const credentialSource = options.credentialSource ?? "session"
230
243
 
231
- if (credentialSource !== "session") {
232
- const authorizationHeader = request.headers.get("authorization")
244
+ if (options.credentialSource === "any") {
233
245
  const tokenValue = getBearerAccessTokenValue(request)
246
+ if (tokenValue?.startsWith(SESSION_ACCESS_TOKEN_PREFIX)) {
247
+ return this.resolveBearerSession(tokenValue)
248
+ }
234
249
  if (tokenValue) {
235
250
  return this.resolveAccessTokenSession(request, tokenValue)
236
251
  }
237
252
 
238
- if (authorizationHeader) {
253
+ // An Authorization header that is not a usable token never falls back to the cookie.
254
+ if (request.headers.get("authorization")) {
239
255
  return { authenticated: false, reason: "invalid_access_token" }
240
256
  }
241
-
242
- if (credentialSource === "accessToken") {
243
- return { authenticated: false, reason: "missing_access_token" }
244
- }
245
257
  }
246
258
 
247
259
  return this.resolveCookieSession(request, audience, options.sessionActivity)
@@ -269,6 +281,7 @@ export class AuthRuntime {
269
281
  const cached = this.sessionCache?.get({
270
282
  sessionId: parts.sessionId,
271
283
  tokenHash,
284
+ transport: "cookie",
272
285
  audience,
273
286
  nowMs,
274
287
  })
@@ -311,48 +324,142 @@ export class AuthRuntime {
311
324
  sessionRenewed = true
312
325
  }
313
326
 
314
- const user = await storage.users.getById({
315
- projectId: this.projectId,
316
- id: session.userId,
317
- })
327
+ if (!sessionRenewed) {
328
+ await this.touchSessionLastSeen(storage, session, now)
329
+ }
330
+ const result = await this.authenticateSession(storage, session, tokenHash, now)
331
+ return result.authenticated && sessionRenewed ? { ...result, sessionRenewed: true } : result
332
+ }
318
333
 
319
- if (!user) {
320
- return { authenticated: false, reason: "missing_user" }
334
+ private async resolveBearerSession(tokenValue: string): Promise<AuthSessionResult> {
335
+ const parts = parseBearerSessionToken(SESSION_ACCESS_TOKEN_PREFIX, tokenValue)
336
+ if (!parts) {
337
+ return { authenticated: false, reason: "invalid_access_token" }
321
338
  }
322
339
 
323
- if (user.status === "suspended") {
324
- return { authenticated: false, reason: "suspended_user" }
340
+ const tokenHash = hashSessionSecret(parts.sessionSecret)
341
+ const now = new Date()
342
+ const cached = this.sessionCache?.get({
343
+ sessionId: parts.sessionId,
344
+ tokenHash,
345
+ transport: "bearer",
346
+ nowMs: now.getTime(),
347
+ })
348
+ if (cached) {
349
+ return cached
325
350
  }
326
351
 
327
- const memberships = await storage.groupMemberships.listForUser({
352
+ const storage = this.requireAuthStorage()
353
+ const session = await storage.sessions.findValidByAccessTokenHash({
328
354
  projectId: this.projectId,
329
- userId: user.id,
355
+ id: parts.sessionId,
356
+ tokenHash,
357
+ now,
330
358
  })
359
+ if (!session) {
360
+ return { authenticated: false, reason: "invalid_access_token" }
361
+ }
331
362
 
332
- if (!sessionRenewed) {
333
- await this.touchSessionLastSeen(storage, session, now)
363
+ await this.touchSessionLastSeen(storage, session, now)
364
+ return this.authenticateSession(storage, session, tokenHash, now)
365
+ }
366
+
367
+ /** Resolve a live session's user and groups, the same way for cookies and bearer tokens. */
368
+ private async authenticateSession(
369
+ storage: AuthStorage,
370
+ session: SessionRecord,
371
+ tokenHash: string,
372
+ now: Date
373
+ ): Promise<AuthSessionResult> {
374
+ const member = await this.loadActiveUser(storage, session.userId)
375
+ if (!member.authenticated) {
376
+ return member
334
377
  }
335
378
 
336
379
  const result: AuthenticatedAuthSession = {
337
380
  authenticated: true,
338
381
  credentialSource: "session",
339
- principal: { type: "user", id: user.id },
340
- user,
382
+ principal: { type: "user", id: member.user.id },
383
+ user: member.user,
341
384
  session,
342
- groupIds: memberships.map((membership) => membership.groupId),
385
+ groupIds: member.groupIds,
343
386
  }
344
-
345
387
  this.sessionCache?.set({
346
- sessionId: parts.sessionId,
388
+ sessionId: session.id,
347
389
  tokenHash,
348
- audience,
390
+ audience: session.audience,
349
391
  session: result,
350
- nowMs,
392
+ nowMs: now.getTime(),
351
393
  sessionExpiresAtMs: session.expiresAt.getTime(),
352
394
  sessionAbsoluteExpiresAtMs: session.absoluteExpiresAt?.getTime(),
353
395
  })
396
+ return result
397
+ }
354
398
 
355
- return sessionRenewed ? { ...result, sessionRenewed: true } : result
399
+ /**
400
+ * The session a native client starts when the user approves it, and its first tokens. The caller
401
+ * stores the session in the same transaction that consumes the approval.
402
+ */
403
+ prepareBearerSession(input: {
404
+ readonly userId: string
405
+ readonly clientName: string
406
+ readonly now: Date
407
+ }): {
408
+ readonly session: CompleteDeviceAuthorizationInput["session"]
409
+ readonly tokens: BearerSessionTokens
410
+ } {
411
+ const sessionId = `ses_${randomUUID()}`
412
+ const tokens = createBearerSessionTokens(sessionId)
413
+ return {
414
+ tokens,
415
+ session: {
416
+ id: sessionId,
417
+ projectId: this.projectId,
418
+ userId: input.userId,
419
+ strategyId: "device",
420
+ // A native session belongs to no web app. The column needs a value; nothing reads it.
421
+ audience: DEFAULT_AUTH_SESSION_AUDIENCE,
422
+ tokenHash: tokens.tokenHash,
423
+ createdAt: input.now,
424
+ ...this.createSessionDeadlines(input.now),
425
+ bearer: {
426
+ clientName: input.clientName,
427
+ accessExpiresAt: new Date(input.now.getTime() + BEARER_ACCESS_TOKEN_TTL_MS),
428
+ refreshTokenHash: tokens.refreshTokenHash,
429
+ },
430
+ },
431
+ }
432
+ }
433
+
434
+ /**
435
+ * Trade a native client's refresh token for new tokens. Returns null when the token is not
436
+ * accepted; a replaced token presented after the grace window also revokes its session.
437
+ */
438
+ async refreshSession(
439
+ refreshToken: string
440
+ ): Promise<{ readonly tokens: BearerSessionTokens; readonly session: SessionRecord } | null> {
441
+ const parts = parseBearerSessionToken(SESSION_REFRESH_TOKEN_PREFIX, refreshToken)
442
+ if (!parts || !this.isEnabled()) {
443
+ return null
444
+ }
445
+
446
+ const now = new Date()
447
+ const tokens = createBearerSessionTokens(parts.sessionId)
448
+ const result = await this.requireAuthStorage().sessions.rotateRefreshToken({
449
+ projectId: this.projectId,
450
+ id: parts.sessionId,
451
+ refreshTokenHash: hashSessionSecret(parts.sessionSecret),
452
+ now,
453
+ reuseGraceMs: REFRESH_REUSE_GRACE_MS,
454
+ next: {
455
+ tokenHash: tokens.tokenHash,
456
+ accessExpiresAt: new Date(now.getTime() + BEARER_ACCESS_TOKEN_TTL_MS),
457
+ refreshTokenHash: tokens.refreshTokenHash,
458
+ expiresAt: new Date(now.getTime() + this.config.session.idleTimeoutMs),
459
+ },
460
+ })
461
+ this.sessionCache?.invalidate(parts.sessionId)
462
+ return result.status === "rotated" ? { tokens, session: result.session } : null
356
463
  }
357
464
 
358
465
  private canRenewSession(session: SessionRecord, nowMs: number): boolean {
@@ -397,41 +504,25 @@ export class AuthRuntime {
397
504
 
398
505
  await this.touchAccessTokenLastUsed(storage, accessToken, request, now)
399
506
 
400
- if (accessToken.subjectType === "user") {
401
- const user = await storage.users.getById({
402
- projectId: this.projectId,
403
- id: accessToken.subjectId,
404
- })
405
-
406
- if (!user) {
407
- return { authenticated: false, reason: "missing_user" }
408
- }
409
-
410
- if (user.status === "suspended") {
411
- return { authenticated: false, reason: "suspended_user" }
507
+ if (accessToken.subject.type === "user") {
508
+ const member = await this.loadActiveUser(storage, accessToken.subject.id)
509
+ if (!member.authenticated) {
510
+ return member
412
511
  }
413
512
 
414
- const memberships = await storage.groupMemberships.listForUser({
415
- projectId: this.projectId,
416
- userId: user.id,
417
- })
418
-
419
513
  return {
420
514
  authenticated: true,
421
515
  credentialSource: "accessToken",
422
- principal: { type: "user", id: user.id },
423
- user,
516
+ principal: { type: "user", id: member.user.id },
517
+ user: member.user,
424
518
  accessToken,
425
- groupIds: constrainTokenGroupIds(
426
- memberships.map((membership) => membership.groupId),
427
- accessToken
428
- ),
519
+ groupIds: constrainTokenGroupIds(member.groupIds, accessToken),
429
520
  }
430
521
  }
431
522
 
432
523
  const serviceAccount = await storage.serviceAccounts.getById({
433
524
  projectId: this.projectId,
434
- id: accessToken.subjectId,
525
+ id: accessToken.subject.id,
435
526
  })
436
527
 
437
528
  if (!serviceAccount) {
@@ -460,12 +551,32 @@ export class AuthRuntime {
460
551
  }
461
552
  }
462
553
 
463
- /**
464
- * Evict a session from the in-process cache. Call this when a session is revoked
465
- * (e.g. sign-out) so the cached result is dropped before its TTL would expire.
466
- */
467
- invalidateSession(sessionId: string): void {
468
- this.sessionCache?.invalidate(sessionId)
554
+ /** Resolve a user and their current groups the same way for every credential. */
555
+ private async loadActiveUser(
556
+ storage: AuthStorage,
557
+ userId: string
558
+ ): Promise<
559
+ | UnauthenticatedAuthSession
560
+ | { readonly authenticated: true; readonly user: UserRecord; readonly groupIds: string[] }
561
+ > {
562
+ const user = await storage.users.getById({ projectId: this.projectId, id: userId })
563
+ if (!user) {
564
+ return { authenticated: false, reason: "missing_user" }
565
+ }
566
+
567
+ if (user.status === "suspended") {
568
+ return { authenticated: false, reason: "suspended_user" }
569
+ }
570
+
571
+ const memberships = await storage.groupMemberships.listForUser({
572
+ projectId: this.projectId,
573
+ userId,
574
+ })
575
+ return {
576
+ authenticated: true,
577
+ user,
578
+ groupIds: memberships.map((membership) => membership.groupId),
579
+ }
469
580
  }
470
581
 
471
582
  // Best-effort refresh of `lastSeenAt` for the active-sessions view. Throttled,
@@ -503,109 +614,34 @@ export class AuthRuntime {
503
614
  id: accessToken.id,
504
615
  lastUsedAt: now,
505
616
  userAgent: request.headers.get("user-agent")?.trim() || undefined,
506
- ipAddress: resolveRequestIpAddress(request),
617
+ ipAddress: getRequestClientAddress(request),
507
618
  })
508
619
  } catch {
509
620
  // Touch is non-critical; ignore failures so auth still succeeds.
510
621
  }
511
622
  }
512
623
 
513
- async requirePrincipal(
514
- request: Request,
515
- options: AuthSessionResolutionOptions = {}
516
- ): Promise<Principal> {
517
- const session = await this.getSession(request, options)
518
- if (!session.authenticated) {
519
- throw new AuthRuntimeError("authentication_required", "[Sixb] Authentication is required.")
520
- }
521
-
522
- return session.principal
523
- }
524
-
525
- async requireUser(
526
- request: Request,
527
- options: AuthSessionResolutionOptions = {}
528
- ): Promise<AuthenticatedAuthSession> {
529
- const session = await this.getSession(request, { ...options, credentialSource: "session" })
530
- if (!session.authenticated) {
531
- throw new AuthRuntimeError("authentication_required", "[Sixb] Authentication is required.")
532
- }
533
-
534
- return session
535
- }
536
-
537
- async requireUserRequest(
538
- request: Request,
539
- options: AuthSessionResolutionOptions = {}
540
- ): Promise<AuthenticatedUserRequestSession> {
541
- const session = await this.getSession(request, { ...options, credentialSource: "any" })
542
- if (!session.authenticated) {
543
- throw new AuthRuntimeError("authentication_required", "[Sixb] Authentication is required.")
544
- }
545
-
546
- if (!isAuthenticatedUserRequestSession(session)) {
547
- throw new AuthRuntimeError("authorization_denied", "[Sixb] User authentication is required.")
548
- }
549
-
550
- return session
551
- }
552
-
553
- async createSecurityContext(
554
- request: Request,
555
- options: AuthSessionResolutionOptions = {}
556
- ): Promise<SecurityContext> {
557
- const session = await this.requireUser(request, options)
558
- return {
559
- principal: session.principal,
560
- sessionId: session.session.id,
561
- projectId: this.projectId,
562
- correlationId: resolveCorrelationId(request),
563
- }
564
- }
565
-
566
624
  /**
567
- * Resolve the authenticated principal's authorization context for a request.
568
- *
569
- * Grants resolve eagerly (`groups -> roles -> grants`, subtype-expanded), so the returned
570
- * context supports synchronous checks when Core binds a request execution SDK.
571
- */
572
- async createAuthorizationContext(
573
- request: Request,
574
- options: AuthSessionResolutionOptions = {}
575
- ): Promise<AuthorizationContext> {
576
- const session = await this.getSession(request, options)
577
- if (!session.authenticated) {
578
- throw new AuthRuntimeError("authentication_required", "[Sixb] Authentication is required.")
579
- }
580
-
581
- return this.contextFromSession(session)
582
- }
583
-
584
- /**
585
- * Build an authorization context from an already-resolved session, so callers
586
- * that resolve the session themselves (e.g. the server auth guard) don't read
587
- * the request twice.
625
+ * Resolve a caller's authorization context. Grants resolve eagerly
626
+ * (`groups -> roles -> grants`, subtype-expanded), so checks against it are synchronous.
588
627
  */
589
628
  contextFromSession(session: AuthenticatedRequestAuthSession): AuthorizationContext {
590
629
  return resolveAuthorizationContext({
591
630
  principal: session.principal,
592
- sessionId: session.credentialSource === "session" ? session.session.id : undefined,
631
+ sessionId: callerSessionId(session),
593
632
  groupIds: session.groupIds,
594
633
  roles: this.security.listResolvedRoles(),
595
634
  })
596
635
  }
597
636
 
598
637
  async listPersonalAccessTokens(
599
- request: Request,
600
- options: AuthSessionResolutionOptions = {}
638
+ caller: AuthenticatedUserRequestSession
601
639
  ): Promise<ListPersonalAccessTokensResult> {
602
- const session = await this.requireUserRequest(request, options)
603
640
  const storage = this.requireAuthStorage()
604
641
  const result = await storage.accessTokens.list({
605
642
  projectId: this.projectId,
606
643
  kind: "personal",
607
- subjectType: "user",
608
- subjectId: session.user.id,
644
+ subject: { type: "user", id: caller.user.id },
609
645
  includeRevoked: true,
610
646
  order: "desc",
611
647
  limit: 100,
@@ -615,14 +651,12 @@ export class AuthRuntime {
615
651
  }
616
652
 
617
653
  async createPersonalAccessToken(
618
- request: Request,
619
- input: CreatePersonalAccessTokenInput,
620
- options: AuthSessionResolutionOptions = {}
654
+ caller: AuthenticatedUserRequestSession,
655
+ input: CreatePersonalAccessTokenInput
621
656
  ): Promise<CreateAccessTokenResult> {
622
- const session = await this.requireUserRequest(request, options)
623
657
  const storage = this.requireAuthStorage()
624
658
  // A personal token can only carry groups the caller currently belongs to.
625
- const groupIds = constrainRequestedGroupIds(input.groupIds, session.groupIds, {
659
+ const groupIds = constrainRequestedGroupIds(input.groupIds, caller.groupIds, {
626
660
  subject: "personal access token",
627
661
  })
628
662
  const credential = createAccessTokenCredential("personal")
@@ -631,12 +665,11 @@ export class AuthRuntime {
631
665
  projectId: this.projectId,
632
666
  name: input.name,
633
667
  kind: "personal",
634
- subjectType: "user",
635
- subjectId: session.user.id,
668
+ subject: { type: "user", id: caller.user.id },
636
669
  tokenHash: credential.tokenHash,
637
670
  groupIds,
638
- createdByPrincipal: session.principal,
639
- createdBySessionId: session.credentialSource === "session" ? session.session.id : undefined,
671
+ createdByPrincipal: caller.principal,
672
+ createdBySessionId: callerSessionId(caller),
640
673
  createdAt: new Date(),
641
674
  expiresAt: input.expiresAt,
642
675
  })
@@ -645,11 +678,9 @@ export class AuthRuntime {
645
678
  }
646
679
 
647
680
  async revokePersonalAccessToken(
648
- request: Request,
649
- input: RevokePersonalAccessTokenInput,
650
- options: AuthSessionResolutionOptions = {}
681
+ caller: AuthenticatedUserRequestSession,
682
+ input: RevokePersonalAccessTokenInput
651
683
  ): Promise<RevokeAccessTokenResult> {
652
- const session = await this.requireUserRequest(request, options)
653
684
  const storage = this.requireAuthStorage()
654
685
  const token = await storage.accessTokens.getById({
655
686
  projectId: this.projectId,
@@ -660,8 +691,8 @@ export class AuthRuntime {
660
691
  if (
661
692
  !token ||
662
693
  token.kind !== "personal" ||
663
- token.subjectType !== "user" ||
664
- token.subjectId !== session.user.id
694
+ token.subject.type !== "user" ||
695
+ token.subject.id !== caller.user.id
665
696
  ) {
666
697
  throw missingAccessTokenError(input.tokenId, this.projectId)
667
698
  }
@@ -676,10 +707,8 @@ export class AuthRuntime {
676
707
  }
677
708
 
678
709
  async listServiceAccounts(
679
- request: Request,
680
- options: AuthSessionResolutionOptions = {}
710
+ caller: AuthenticatedUserRequestSession
681
711
  ): Promise<ListServiceAccountsResult> {
682
- const session = await this.requireUserRequest(request, options)
683
712
  const storage = this.requireAuthStorage()
684
713
  const result = await storage.serviceAccounts.list({
685
714
  projectId: this.projectId,
@@ -697,21 +726,19 @@ export class AuthRuntime {
697
726
  // listing never leaks the groups of more-privileged accounts.
698
727
  return {
699
728
  serviceAccounts: withGroups.filter(({ groupIds }) =>
700
- callerCanManageServiceAccount(session.groupIds, groupIds)
729
+ callerCanManageServiceAccount(caller.groupIds, groupIds)
701
730
  ),
702
731
  }
703
732
  }
704
733
 
705
734
  async createServiceAccount(
706
- request: Request,
707
- input: CreateServiceAccountInput,
708
- options: AuthSessionResolutionOptions = {}
735
+ caller: AuthenticatedUserRequestSession,
736
+ input: CreateServiceAccountInput
709
737
  ): Promise<CreateServiceAccountResult> {
710
- const session = await this.requireUserRequest(request, options)
711
738
  const storage = this.requireAuthStorage()
712
739
  // A caller can only place a service account in groups it itself belongs to.
713
740
  const groupIds =
714
- constrainRequestedGroupIds(input.groupIds, session.groupIds, {
741
+ constrainRequestedGroupIds(input.groupIds, caller.groupIds, {
715
742
  subject: "service account",
716
743
  }) ?? []
717
744
  const now = new Date()
@@ -720,8 +747,8 @@ export class AuthRuntime {
720
747
  projectId: this.projectId,
721
748
  name: input.name,
722
749
  description: input.description,
723
- createdByPrincipal: session.principal,
724
- createdBySessionId: session.credentialSource === "session" ? session.session.id : undefined,
750
+ createdByPrincipal: caller.principal,
751
+ createdBySessionId: callerSessionId(caller),
725
752
  createdAt: now,
726
753
  updatedAt: now,
727
754
  })
@@ -742,15 +769,13 @@ export class AuthRuntime {
742
769
  }
743
770
 
744
771
  async disableServiceAccount(
745
- request: Request,
746
- input: DisableServiceAccountInput,
747
- options: AuthSessionResolutionOptions = {}
772
+ caller: AuthenticatedUserRequestSession,
773
+ input: DisableServiceAccountInput
748
774
  ): Promise<DisableServiceAccountResult> {
749
- const session = await this.requireUserRequest(request, options)
750
775
  const storage = this.requireAuthStorage()
751
776
  const { serviceAccount, groupIds } = await this.requireManageableServiceAccount(
752
777
  storage,
753
- session.groupIds,
778
+ caller.groupIds,
754
779
  input.serviceAccountId
755
780
  )
756
781
  const updated = await storage.serviceAccounts.update({
@@ -764,22 +789,19 @@ export class AuthRuntime {
764
789
  }
765
790
 
766
791
  async listServiceAccountAccessTokens(
767
- request: Request,
768
- input: ListServiceAccountAccessTokensInput,
769
- options: AuthSessionResolutionOptions = {}
792
+ caller: AuthenticatedUserRequestSession,
793
+ input: ListServiceAccountAccessTokensInput
770
794
  ): Promise<ListServiceAccountAccessTokensResult> {
771
- const session = await this.requireUserRequest(request, options)
772
795
  const storage = this.requireAuthStorage()
773
796
  const { serviceAccount } = await this.requireManageableServiceAccount(
774
797
  storage,
775
- session.groupIds,
798
+ caller.groupIds,
776
799
  input.serviceAccountId
777
800
  )
778
801
  const result = await storage.accessTokens.list({
779
802
  projectId: this.projectId,
780
803
  kind: "serviceAccount",
781
- subjectType: "serviceAccount",
782
- subjectId: serviceAccount.id,
804
+ subject: { type: "serviceAccount", id: serviceAccount.id },
783
805
  includeRevoked: true,
784
806
  order: "desc",
785
807
  limit: 100,
@@ -789,14 +811,12 @@ export class AuthRuntime {
789
811
  }
790
812
 
791
813
  async createServiceAccountAccessToken(
792
- request: Request,
793
- input: CreateServiceAccountAccessTokenInput,
794
- options: AuthSessionResolutionOptions = {}
814
+ caller: AuthenticatedUserRequestSession,
815
+ input: CreateServiceAccountAccessTokenInput
795
816
  ): Promise<CreateServiceAccountAccessTokenResult> {
796
- const session = await this.requireUserRequest(request, options)
797
817
  const storage = this.requireAuthStorage()
798
818
  const { serviceAccount, groupIds: serviceAccountGroupIds } =
799
- await this.requireManageableServiceAccount(storage, session.groupIds, input.serviceAccountId)
819
+ await this.requireManageableServiceAccount(storage, caller.groupIds, input.serviceAccountId)
800
820
 
801
821
  if (serviceAccount.status === "suspended") {
802
822
  throw new AuthStorageError(
@@ -817,12 +837,11 @@ export class AuthRuntime {
817
837
  projectId: this.projectId,
818
838
  name: input.name,
819
839
  kind: "serviceAccount",
820
- subjectType: "serviceAccount",
821
- subjectId: serviceAccount.id,
840
+ subject: { type: "serviceAccount", id: serviceAccount.id },
822
841
  tokenHash: credential.tokenHash,
823
842
  groupIds,
824
- createdByPrincipal: session.principal,
825
- createdBySessionId: session.credentialSource === "session" ? session.session.id : undefined,
843
+ createdByPrincipal: caller.principal,
844
+ createdBySessionId: callerSessionId(caller),
826
845
  createdAt: new Date(),
827
846
  expiresAt: input.expiresAt,
828
847
  })
@@ -831,15 +850,13 @@ export class AuthRuntime {
831
850
  }
832
851
 
833
852
  async revokeServiceAccountAccessToken(
834
- request: Request,
835
- input: RevokeServiceAccountAccessTokenInput,
836
- options: AuthSessionResolutionOptions = {}
853
+ caller: AuthenticatedUserRequestSession,
854
+ input: RevokeServiceAccountAccessTokenInput
837
855
  ): Promise<RevokeServiceAccountAccessTokenResult> {
838
- const session = await this.requireUserRequest(request, options)
839
856
  const storage = this.requireAuthStorage()
840
857
  const { serviceAccount } = await this.requireManageableServiceAccount(
841
858
  storage,
842
- session.groupIds,
859
+ caller.groupIds,
843
860
  input.serviceAccountId
844
861
  )
845
862
  const token = await storage.accessTokens.getById({
@@ -850,8 +867,8 @@ export class AuthRuntime {
850
867
  if (
851
868
  !token ||
852
869
  token.kind !== "serviceAccount" ||
853
- token.subjectType !== "serviceAccount" ||
854
- token.subjectId !== serviceAccount.id
870
+ token.subject.type !== "serviceAccount" ||
871
+ token.subject.id !== serviceAccount.id
855
872
  ) {
856
873
  throw missingAccessTokenError(input.tokenId, this.projectId)
857
874
  }
@@ -913,11 +930,9 @@ export class AuthRuntime {
913
930
  }
914
931
 
915
932
  async getInvitationOptions(
916
- request: Request,
917
- options: AuthSessionResolutionOptions = {}
933
+ caller: AuthenticatedUserRequestSession
918
934
  ): Promise<GetInvitationOptionsResult> {
919
- const session = await this.requireUser(request, options)
920
- const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
935
+ const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
921
936
  const inviteScope = scope.operations.invite
922
937
  const groups = this.scopedGroupOptions(inviteScope.groupIds)
923
938
  const hasInviteMembershipPolicy = inviteScope.policyIds.length > 0
@@ -950,11 +965,9 @@ export class AuthRuntime {
950
965
  }
951
966
 
952
967
  async getMembershipOptions(
953
- request: Request,
954
- options: AuthSessionResolutionOptions = {}
968
+ caller: AuthenticatedUserRequestSession
955
969
  ): Promise<GetMembershipOptionsResult> {
956
- const session = await this.requireUser(request, options)
957
- const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
970
+ const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
958
971
 
959
972
  return {
960
973
  // The member-admin edit-groups dialog assigns from the `assignGroups` scope.
@@ -964,13 +977,11 @@ export class AuthRuntime {
964
977
  }
965
978
 
966
979
  async listMembers(
967
- request: Request,
968
- input: ListMembersInput = {},
969
- options: AuthSessionResolutionOptions = {}
980
+ caller: AuthenticatedUserRequestSession,
981
+ input: ListMembersInput = {}
970
982
  ): Promise<ListMembersResult> {
971
- const session = await this.requireUser(request, options)
972
983
  const storage = this.requireAuthStorage()
973
- const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
984
+ const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
974
985
  const { limit, offset } = normalizePagination(input)
975
986
 
976
987
  // First slice loads all users, attaches groups, then filters and paginates in
@@ -993,7 +1004,7 @@ export class AuthRuntime {
993
1004
  continue
994
1005
  }
995
1006
 
996
- const isSelf = user.id === session.user.id
1007
+ const isSelf = user.id === caller.user.id
997
1008
  members.push({
998
1009
  user,
999
1010
  groupIds,
@@ -1012,13 +1023,11 @@ export class AuthRuntime {
1012
1023
  }
1013
1024
 
1014
1025
  async updateMemberGroups(
1015
- request: Request,
1016
- input: UpdateMemberGroupsInput,
1017
- options: AuthSessionResolutionOptions = {}
1026
+ caller: AuthenticatedUserRequestSession,
1027
+ input: UpdateMemberGroupsInput
1018
1028
  ): Promise<UpdateMemberGroupsResult> {
1019
- const session = await this.requireUser(request, options)
1020
1029
  const storage = this.requireAuthStorage()
1021
- const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
1030
+ const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
1022
1031
  const userId = assertNonEmpty(input.userId, "User id")
1023
1032
 
1024
1033
  // The target must exist and every group it currently holds must be assignable
@@ -1048,7 +1057,7 @@ export class AuthRuntime {
1048
1057
 
1049
1058
  // Self-protection: a caller may add in-scope groups to themselves but may not
1050
1059
  // remove any of their own current groups, so they cannot lock themselves out.
1051
- if (user.id === session.user.id && removals.length > 0) {
1060
+ if (user.id === caller.user.id && removals.length > 0) {
1052
1061
  throw new AuthRuntimeError(
1053
1062
  "authorization_denied",
1054
1063
  "[Sixb] The current user cannot remove their own groups."
@@ -1075,7 +1084,7 @@ export class AuthRuntime {
1075
1084
 
1076
1085
  // The user's cached session carries its old groups; drop it so the next
1077
1086
  // request resolves the updated membership.
1078
- this.invalidateUserSessions(user.id)
1087
+ this.sessionCache?.invalidateUser(user.id)
1079
1088
 
1080
1089
  const groupIds = (
1081
1090
  await storage.groupMemberships.listForUser({ projectId: this.projectId, userId: user.id })
@@ -1085,17 +1094,15 @@ export class AuthRuntime {
1085
1094
  }
1086
1095
 
1087
1096
  async suspendMember(
1088
- request: Request,
1089
- input: SuspendMemberInput,
1090
- options: AuthSessionResolutionOptions = {}
1097
+ caller: AuthenticatedUserRequestSession,
1098
+ input: SuspendMemberInput
1091
1099
  ): Promise<SuspendMemberResult> {
1092
- const session = await this.requireUser(request, options)
1093
1100
  const storage = this.requireAuthStorage()
1094
- const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
1101
+ const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
1095
1102
  const userId = assertNonEmpty(input.userId, "User id")
1096
1103
  const { user, groupIds } = await this.requireManageableMember(storage, scope, "suspend", userId)
1097
1104
 
1098
- if (user.id === session.user.id) {
1105
+ if (user.id === caller.user.id) {
1099
1106
  throw new AuthRuntimeError(
1100
1107
  "authorization_denied",
1101
1108
  "[Sixb] The current user cannot suspend themselves."
@@ -1109,19 +1116,17 @@ export class AuthRuntime {
1109
1116
  })
1110
1117
  // Storage revoked the user's sessions; drop cached copies so the suspended
1111
1118
  // user stops authenticating immediately.
1112
- this.invalidateUserSessions(user.id)
1119
+ this.sessionCache?.invalidateUser(user.id)
1113
1120
 
1114
1121
  return { user: suspended, groupIds }
1115
1122
  }
1116
1123
 
1117
1124
  async reactivateMember(
1118
- request: Request,
1119
- input: ReactivateMemberInput,
1120
- options: AuthSessionResolutionOptions = {}
1125
+ caller: AuthenticatedUserRequestSession,
1126
+ input: ReactivateMemberInput
1121
1127
  ): Promise<ReactivateMemberResult> {
1122
- const session = await this.requireUser(request, options)
1123
1128
  const storage = this.requireAuthStorage()
1124
- const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
1129
+ const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
1125
1130
  const userId = assertNonEmpty(input.userId, "User id")
1126
1131
  const { user, groupIds } = await this.requireManageableMember(storage, scope, "suspend", userId)
1127
1132
 
@@ -1136,9 +1141,49 @@ export class AuthRuntime {
1136
1141
  return { user: reactivated, groupIds }
1137
1142
  }
1138
1143
 
1139
- /** Drop cached sessions for a user after a membership or status change. */
1140
- invalidateUserSessions(userId: string): void {
1141
- this.sessionCache?.invalidateUser(userId)
1144
+ /** The caller's active sessions across every audience, most recently active first. */
1145
+ async listSessions(caller: AuthenticatedUserRequestSession): Promise<readonly SessionRecord[]> {
1146
+ return this.requireAuthStorage().sessions.listActiveByUserId({
1147
+ projectId: this.projectId,
1148
+ userId: caller.user.id,
1149
+ now: new Date(),
1150
+ })
1151
+ }
1152
+
1153
+ /**
1154
+ * End one of the caller's own sessions. Returns false for a missing session or one that belongs
1155
+ * to another user, so a caller cannot probe other accounts.
1156
+ */
1157
+ async revokeSession(
1158
+ caller: AuthenticatedUserRequestSession,
1159
+ sessionId: string
1160
+ ): Promise<boolean> {
1161
+ const storage = this.requireAuthStorage()
1162
+ const session = await storage.sessions.getById({ projectId: this.projectId, id: sessionId })
1163
+ if (!session || session.userId !== caller.user.id) {
1164
+ return false
1165
+ }
1166
+
1167
+ await storage.sessions.revoke({
1168
+ projectId: this.projectId,
1169
+ id: sessionId,
1170
+ revokedAt: new Date(),
1171
+ })
1172
+ this.sessionCache?.invalidate(sessionId)
1173
+ return true
1174
+ }
1175
+
1176
+ /** End every active session of the caller, across audiences. Returns how many ended. */
1177
+ async revokeAllSessions(caller: AuthenticatedUserRequestSession): Promise<number> {
1178
+ const revoked = await this.requireAuthStorage().sessions.revokeActiveForUser({
1179
+ projectId: this.projectId,
1180
+ userId: caller.user.id,
1181
+ revokedAt: new Date(),
1182
+ })
1183
+ for (const session of revoked) {
1184
+ this.sessionCache?.invalidate(session.id)
1185
+ }
1186
+ return revoked.length
1142
1187
  }
1143
1188
 
1144
1189
  private scopedGroupOptions(groupIds: ReadonlySet<string>): InvitationGroupOption[] {
@@ -1197,15 +1242,14 @@ export class AuthRuntime {
1197
1242
  }
1198
1243
 
1199
1244
  async invite(
1200
- request: Request,
1245
+ caller: AuthenticatedUserRequestSession,
1201
1246
  input: InviteUserInput,
1202
- options: InviteUserOptions = {}
1247
+ destination: InvitationDestination
1203
1248
  ): Promise<InviteUserResult> {
1204
- const session = await this.requireUser(request, options)
1205
1249
  const authStorage = this.requireAuthStorage()
1206
1250
  const now = new Date()
1207
1251
  const groupIds = this.resolveInviteGroupIds(input)
1208
- this.assertCanManageInvitationGroups(session.groupIds, groupIds)
1252
+ this.assertCanManageInvitationGroups(caller.groupIds, groupIds)
1209
1253
 
1210
1254
  const strategy = this.getStrategy()
1211
1255
  if (!isInvitationDeliveryAuthStrategy(strategy)) {
@@ -1216,18 +1260,15 @@ export class AuthRuntime {
1216
1260
  }
1217
1261
 
1218
1262
  await this.assertCanInviteRecipient(strategy, authStorage, input.email, now)
1219
- const deliveryAudience = resolveAuthSessionAudience(
1220
- options.delivery?.audience ?? options.audience
1221
- )
1222
- this.assertInvitationApplicationAccess(groupIds, deliveryAudience)
1263
+ this.assertInvitationApplicationAccess(groupIds, destination.audience)
1223
1264
 
1224
1265
  const invitation = await authStorage.invitations.createOrUpdateActive({
1225
1266
  id: `inv_${randomUUID()}`,
1226
1267
  projectId: this.projectId,
1227
1268
  email: input.email,
1228
1269
  groupIds,
1229
- createdByPrincipal: session.principal,
1230
- createdBySessionId: session.session.id,
1270
+ createdByPrincipal: caller.principal,
1271
+ createdBySessionId: callerSessionId(caller),
1231
1272
  createdAt: now,
1232
1273
  updatedAt: now,
1233
1274
  expiresAt: resolveInvitationExpiresAt(input.expiresAt, now),
@@ -1239,9 +1280,9 @@ export class AuthRuntime {
1239
1280
  projectId: this.projectId,
1240
1281
  authStorage,
1241
1282
  invitation,
1242
- audience: deliveryAudience,
1243
- returnTo: options.delivery?.returnTo ?? sanitizeReturnTo(input.returnTo),
1244
- requestOrigin: options.delivery?.requestOrigin ?? new URL(request.url).origin,
1283
+ audience: destination.audience,
1284
+ returnTo: destination.returnTo,
1285
+ requestOrigin: destination.requestOrigin,
1245
1286
  revealLink: input.revealLink,
1246
1287
  now,
1247
1288
  })
@@ -1270,11 +1311,9 @@ export class AuthRuntime {
1270
1311
  }
1271
1312
 
1272
1313
  async listInvitations(
1273
- request: Request,
1274
- input: ListInvitationsInput = {},
1275
- options: AuthSessionResolutionOptions = {}
1314
+ caller: AuthenticatedUserRequestSession,
1315
+ input: ListInvitationsInput = {}
1276
1316
  ): Promise<ListInvitationsResult> {
1277
- const session = await this.requireUser(request, options)
1278
1317
  const authStorage = this.requireAuthStorage()
1279
1318
  const { limit, offset } = normalizePagination(input)
1280
1319
  const result = await authStorage.invitations.list({
@@ -1283,7 +1322,7 @@ export class AuthRuntime {
1283
1322
  statuses: input.statuses,
1284
1323
  order: input.order,
1285
1324
  })
1286
- const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
1325
+ const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
1287
1326
  const manageable = result.invitations.filter((invitation) =>
1288
1327
  canPerformMembershipOperation(scope, "invite", invitation.groupIds)
1289
1328
  )
@@ -1297,11 +1336,9 @@ export class AuthRuntime {
1297
1336
  }
1298
1337
 
1299
1338
  async revokeInvitation(
1300
- request: Request,
1301
- input: RevokeInvitationInput,
1302
- options: AuthSessionResolutionOptions = {}
1339
+ caller: AuthenticatedUserRequestSession,
1340
+ input: RevokeInvitationInput
1303
1341
  ): Promise<RevokeInvitationResult> {
1304
- const session = await this.requireUser(request, options)
1305
1342
  const authStorage = this.requireAuthStorage()
1306
1343
  const invitationId = assertNonEmpty(input.invitationId, "Invitation id")
1307
1344
  const invitation = await authStorage.invitations.getById({
@@ -1316,7 +1353,7 @@ export class AuthRuntime {
1316
1353
  )
1317
1354
  }
1318
1355
 
1319
- this.assertCanManageInvitationGroups(session.groupIds, invitation.groupIds)
1356
+ this.assertCanManageInvitationGroups(caller.groupIds, invitation.groupIds)
1320
1357
 
1321
1358
  if (invitation.status !== "pending") {
1322
1359
  throw new AuthRuntimeError(
@@ -1488,24 +1525,9 @@ export class AuthRuntime {
1488
1525
  }
1489
1526
  }
1490
1527
 
1491
- function resolveCorrelationId(request: Request): string {
1492
- return (
1493
- request.headers.get("x-correlation-id") ?? request.headers.get("x-request-id") ?? randomUUID()
1494
- )
1495
- }
1496
-
1497
- function isAuthenticatedUserRequestSession(
1498
- session: AuthenticatedRequestAuthSession
1499
- ): session is AuthenticatedUserRequestSession {
1500
- return session.principal.type === "user"
1501
- }
1502
-
1503
- function resolveRequestIpAddress(request: Request): string | undefined {
1504
- return (
1505
- request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ||
1506
- request.headers.get("x-real-ip")?.trim() ||
1507
- undefined
1508
- )
1528
+ /** The interactive session a caller authenticated with, when it used one. */
1529
+ function callerSessionId(caller: AuthenticatedRequestAuthSession): string | undefined {
1530
+ return caller.credentialSource === "session" ? caller.session.id : undefined
1509
1531
  }
1510
1532
 
1511
1533
  function constrainTokenGroupIds(