@sixb/core 0.1.12 → 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 (527) hide show
  1. package/dist/actions/index.d.ts +2 -2
  2. package/dist/actions/index.d.ts.map +1 -1
  3. package/dist/actions/index.js +28 -26
  4. package/dist/actions/index.js.map +1 -1
  5. package/dist/actions/read-facade.d.ts +14 -16
  6. package/dist/actions/read-facade.d.ts.map +1 -1
  7. package/dist/actions/request.d.ts.map +1 -1
  8. package/dist/actions/run-dispatch.d.ts +2 -0
  9. package/dist/actions/run-dispatch.d.ts.map +1 -1
  10. package/dist/actions/types/context.d.ts +18 -31
  11. package/dist/actions/types/context.d.ts.map +1 -1
  12. package/dist/actions/types/params.d.ts +2 -1
  13. package/dist/actions/types/params.d.ts.map +1 -1
  14. package/dist/actions/worker.js +1 -1
  15. package/dist/agents/index.js +41 -39
  16. package/dist/agents/index.js.map +1 -1
  17. package/dist/agents/streams/index.js +2 -2
  18. package/dist/agents/streams/internal.js +2 -2
  19. package/dist/assert-never.d.ts +6 -0
  20. package/dist/assert-never.d.ts.map +1 -0
  21. package/dist/auth/client-address.d.ts +3 -0
  22. package/dist/auth/client-address.d.ts.map +1 -0
  23. package/dist/auth/csrf.d.ts +5 -1
  24. package/dist/auth/csrf.d.ts.map +1 -1
  25. package/dist/auth/index.d.ts +3 -2
  26. package/dist/auth/index.d.ts.map +1 -1
  27. package/dist/auth/index.js +14 -8
  28. package/dist/auth/index.js.map +1 -1
  29. package/dist/auth/runtime.d.ts +58 -41
  30. package/dist/auth/runtime.d.ts.map +1 -1
  31. package/dist/auth/session-cache.d.ts +10 -3
  32. package/dist/auth/session-cache.d.ts.map +1 -1
  33. package/dist/auth/sessions.d.ts +12 -0
  34. package/dist/auth/sessions.d.ts.map +1 -1
  35. package/dist/auth/strategy.js +1 -1
  36. package/dist/auth/types.d.ts +8 -15
  37. package/dist/auth/types.d.ts.map +1 -1
  38. package/dist/authorization/index.js +3 -3
  39. package/dist/bootstrap/index.d.ts +1 -1
  40. package/dist/bootstrap/index.d.ts.map +1 -1
  41. package/dist/bootstrap/index.js +45 -43
  42. package/dist/bootstrap/index.js.map +1 -1
  43. package/dist/bootstrap/ontology-type-manifest.d.ts +8 -0
  44. package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
  45. package/dist/{chunk-q5gz3g2j.js → chunk-0321g649.js} +2 -16
  46. package/dist/{chunk-q5gz3g2j.js.map → chunk-0321g649.js.map} +2 -2
  47. package/dist/{chunk-e1f1sqba.js → chunk-04h4t2b5.js} +3 -3
  48. package/dist/{chunk-y3ev53cq.js → chunk-2fv8sajb.js} +2 -2
  49. package/dist/{chunk-3bnt2wna.js → chunk-2hbhn1ff.js} +1 -1
  50. package/dist/{chunk-eyjzgav0.js → chunk-3nx8vj5a.js} +6 -4
  51. package/dist/chunk-3nx8vj5a.js.map +12 -0
  52. package/dist/{chunk-5tetw4hn.js → chunk-4tnrzqqh.js} +1 -1
  53. package/dist/{chunk-g50nxqs5.js → chunk-63fp9x3q.js} +63 -20
  54. package/dist/chunk-63fp9x3q.js.map +20 -0
  55. package/dist/{chunk-qm535afa.js → chunk-693f3zn8.js} +66 -24
  56. package/dist/chunk-693f3zn8.js.map +15 -0
  57. package/dist/{chunk-7zgecwy1.js → chunk-6x0pqh32.js} +12 -1
  58. package/dist/{chunk-7zgecwy1.js.map → chunk-6x0pqh32.js.map} +3 -3
  59. package/dist/{chunk-6ma8dvzc.js → chunk-898y24dd.js} +49 -42
  60. package/dist/chunk-898y24dd.js.map +15 -0
  61. package/dist/{chunk-7qnvhtcd.js → chunk-91wthfwe.js} +17 -17
  62. package/dist/{chunk-7qnvhtcd.js.map → chunk-91wthfwe.js.map} +5 -5
  63. package/dist/chunk-96yw3pwd.js.map +2 -2
  64. package/dist/{chunk-2cxv584m.js → chunk-9pfw47qx.js} +309 -204
  65. package/dist/chunk-9pfw47qx.js.map +44 -0
  66. package/dist/{chunk-4k53sm9e.js → chunk-a0073121.js} +59 -59
  67. package/dist/{chunk-4k53sm9e.js.map → chunk-a0073121.js.map} +5 -5
  68. package/dist/{chunk-jjwhy3rs.js → chunk-a69fkrtr.js} +5 -5
  69. package/dist/{chunk-y1ahv8b7.js → chunk-bdhfn0ww.js} +1 -1
  70. package/dist/{chunk-4ph94nhd.js → chunk-bep5rrdq.js} +2 -2
  71. package/dist/{chunk-kept9cdd.js → chunk-bxx3ms5t.js} +1 -1
  72. package/dist/{chunk-xtfryrfb.js → chunk-cbn96bve.js} +2 -2
  73. package/dist/{chunk-nzsy3xrp.js → chunk-cvrbhvtr.js} +69 -44
  74. package/dist/{chunk-nzsy3xrp.js.map → chunk-cvrbhvtr.js.map} +7 -7
  75. package/dist/{chunk-vsg0g7h9.js → chunk-d8yes9yx.js} +304 -45
  76. package/dist/chunk-d8yes9yx.js.map +20 -0
  77. package/dist/{chunk-tg4g4zh0.js → chunk-darm7eeg.js} +9 -9
  78. package/dist/{chunk-tg4g4zh0.js.map → chunk-darm7eeg.js.map} +3 -3
  79. package/dist/{chunk-vpxss818.js → chunk-drz59ve0.js} +9 -8
  80. package/dist/chunk-drz59ve0.js.map +10 -0
  81. package/dist/{chunk-7c2g3sz9.js → chunk-dsfw1bdr.js} +5 -5
  82. package/dist/{chunk-7c2g3sz9.js.map → chunk-dsfw1bdr.js.map} +1 -1
  83. package/dist/{chunk-p6r1ex7t.js → chunk-ffwvdgk1.js} +5 -13
  84. package/dist/chunk-ffwvdgk1.js.map +10 -0
  85. package/dist/{chunk-r5zythxp.js → chunk-gbcrz0gr.js} +7 -7
  86. package/dist/{chunk-ybhz3j9g.js → chunk-gc226ten.js} +104 -148
  87. package/dist/{chunk-ybhz3j9g.js.map → chunk-gc226ten.js.map} +7 -8
  88. package/dist/{chunk-3ghw2t5q.js → chunk-gmt22nxx.js} +10 -16
  89. package/dist/chunk-gmt22nxx.js.map +10 -0
  90. package/dist/chunk-h89wz928.js +42 -0
  91. package/dist/chunk-h89wz928.js.map +10 -0
  92. package/dist/{chunk-hkw8rykk.js → chunk-ht4a7mjg.js} +74 -4
  93. package/dist/chunk-ht4a7mjg.js.map +15 -0
  94. package/dist/{chunk-t7dzd1tm.js → chunk-jhyc777j.js} +2 -2
  95. package/dist/{chunk-xn686q2e.js → chunk-jmwy25mf.js} +75 -57
  96. package/dist/{chunk-xn686q2e.js.map → chunk-jmwy25mf.js.map} +3 -3
  97. package/dist/{chunk-f06sf7rr.js → chunk-k4kkp58d.js} +18 -5
  98. package/dist/chunk-k4kkp58d.js.map +11 -0
  99. package/dist/{chunk-2h63nrde.js → chunk-ky7zpbtt.js} +5 -7
  100. package/dist/{chunk-2h63nrde.js.map → chunk-ky7zpbtt.js.map} +3 -4
  101. package/dist/chunk-m4ehq95f.js +9 -0
  102. package/dist/chunk-m4ehq95f.js.map +10 -0
  103. package/dist/{chunk-0mza4xb2.js → chunk-m8zkvep1.js} +2 -2
  104. package/dist/{chunk-b768c93y.js → chunk-mf6hwpzh.js} +83 -28
  105. package/dist/{chunk-b768c93y.js.map → chunk-mf6hwpzh.js.map} +5 -5
  106. package/dist/{chunk-yxb4c62x.js → chunk-mr60an99.js} +3 -2
  107. package/dist/{chunk-yxb4c62x.js.map → chunk-mr60an99.js.map} +3 -3
  108. package/dist/chunk-n33e8dz8.js +191 -0
  109. package/dist/chunk-n33e8dz8.js.map +11 -0
  110. package/dist/chunk-rdghfsss.js.map +2 -2
  111. package/dist/{chunk-m7cx05vp.js → chunk-rqtdtm43.js} +126 -59
  112. package/dist/{chunk-m7cx05vp.js.map → chunk-rqtdtm43.js.map} +13 -12
  113. package/dist/{chunk-bbaa1fet.js → chunk-rzcjp5m2.js} +7 -3
  114. package/dist/chunk-rzcjp5m2.js.map +25 -0
  115. package/dist/{chunk-hzw7yv5g.js → chunk-rzkr70gr.js} +5 -1
  116. package/dist/{chunk-hzw7yv5g.js.map → chunk-rzkr70gr.js.map} +3 -3
  117. package/dist/{chunk-sfypc7mk.js → chunk-s24qbp32.js} +4 -4
  118. package/dist/{chunk-axndsymr.js → chunk-tw03bsmb.js} +2 -2
  119. package/dist/{chunk-axndsymr.js.map → chunk-tw03bsmb.js.map} +3 -3
  120. package/dist/{chunk-y0v18c2j.js → chunk-vef6qa14.js} +2 -2
  121. package/dist/{chunk-gzt6v1ja.js → chunk-vn3yh259.js} +1 -1
  122. package/dist/{chunk-bg2bs62d.js → chunk-w9bp61e7.js} +5 -5
  123. package/dist/{chunk-3h7ctayx.js → chunk-xgptywp0.js} +4 -3
  124. package/dist/chunk-xgptywp0.js.map +11 -0
  125. package/dist/{chunk-gswwr35f.js → chunk-y487ywrv.js} +4 -4
  126. package/dist/{chunk-bet1rb9h.js → chunk-y6vnvayj.js} +1 -1
  127. package/dist/{chunk-x9tmx3fc.js → chunk-ypj2wqtj.js} +3 -6
  128. package/dist/{chunk-x9tmx3fc.js.map → chunk-ypj2wqtj.js.map} +4 -4
  129. package/dist/{chunk-g2gezsg5.js → chunk-z9h698s8.js} +1 -1
  130. package/dist/{chunk-wjffn5m4.js → chunk-zdkcdshk.js} +3 -36
  131. package/dist/{chunk-wjffn5m4.js.map → chunk-zdkcdshk.js.map} +3 -4
  132. package/dist/{chunk-bfjv1adk.js → chunk-znw0zvy4.js} +1 -1
  133. package/dist/edits/types.d.ts +19 -19
  134. package/dist/edits/types.d.ts.map +1 -1
  135. package/dist/error-reporting/internal.js +3 -3
  136. package/dist/errors/catalog.d.ts +4 -0
  137. package/dist/errors/catalog.d.ts.map +1 -1
  138. package/dist/errors/internal.js +1 -1
  139. package/dist/events/envelope.d.ts +0 -12
  140. package/dist/events/envelope.d.ts.map +1 -1
  141. package/dist/events/index.d.ts +1 -1
  142. package/dist/events/index.d.ts.map +1 -1
  143. package/dist/events/index.js +3 -3
  144. package/dist/events/service.d.ts +1 -2
  145. package/dist/events/service.d.ts.map +1 -1
  146. package/dist/events/toStoredEvent.d.ts +1 -2
  147. package/dist/events/toStoredEvent.d.ts.map +1 -1
  148. package/dist/events/types/index.d.ts +2 -1
  149. package/dist/events/types/index.d.ts.map +1 -1
  150. package/dist/execution/agent.d.ts +1 -2
  151. package/dist/execution/agent.d.ts.map +1 -1
  152. package/dist/execution/agent.js +39 -37
  153. package/dist/execution/agent.js.map +1 -1
  154. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  155. package/dist/execution/primitive.d.ts +1 -2
  156. package/dist/execution/primitive.d.ts.map +1 -1
  157. package/dist/execution/primitive.js +38 -36
  158. package/dist/execution/primitive.js.map +3 -3
  159. package/dist/execution/request.d.ts +1 -2
  160. package/dist/execution/request.d.ts.map +1 -1
  161. package/dist/execution/request.js +39 -37
  162. package/dist/execution/request.js.map +3 -3
  163. package/dist/index.d.ts +6 -6
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +56 -50
  166. package/dist/index.js.map +1 -1
  167. package/dist/maintenance/ontology-maintenance.d.ts +11 -1
  168. package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
  169. package/dist/materialization/errors.d.ts +3 -1
  170. package/dist/materialization/errors.d.ts.map +1 -1
  171. package/dist/materialization/events.d.ts +27 -2
  172. package/dist/materialization/events.d.ts.map +1 -1
  173. package/dist/materializer/edits/commit.d.ts.map +1 -1
  174. package/dist/materializer/edits/operations.d.ts +2 -1
  175. package/dist/materializer/edits/operations.d.ts.map +1 -1
  176. package/dist/materializer/edits/plan.d.ts +2 -2
  177. package/dist/materializer/edits/plan.d.ts.map +1 -1
  178. package/dist/materializer/edits/user-refs.d.ts +30 -0
  179. package/dist/materializer/edits/user-refs.d.ts.map +1 -0
  180. package/dist/materializer/effective/build-events.d.ts +2 -2
  181. package/dist/materializer/effective/build-events.d.ts.map +1 -1
  182. package/dist/materializer/execution/scope.d.ts +11 -3
  183. package/dist/materializer/execution/scope.d.ts.map +1 -1
  184. package/dist/materializer/index.js +23 -21
  185. package/dist/materializer/index.js.map +1 -1
  186. package/dist/materializer/projections/replacement-plan.d.ts +2 -0
  187. package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
  188. package/dist/materializer/telemetry/plan.d.ts +2 -2
  189. package/dist/materializer/telemetry/plan.d.ts.map +1 -1
  190. package/dist/models/execution/index.js +23 -21
  191. package/dist/models/execution/index.js.map +1 -1
  192. package/dist/models/index.js +1 -1
  193. package/dist/objects/execution.d.ts +21 -27
  194. package/dist/objects/execution.d.ts.map +1 -1
  195. package/dist/objects/index.js +28 -26
  196. package/dist/objects/index.js.map +1 -1
  197. package/dist/objects/query/executor.d.ts.map +1 -1
  198. package/dist/objects/query/index.js +27 -25
  199. package/dist/objects/query/index.js.map +1 -1
  200. package/dist/objects/query/ir.d.ts +8 -1
  201. package/dist/objects/query/ir.d.ts.map +1 -1
  202. package/dist/objects/query/scalar-values.d.ts.map +1 -1
  203. package/dist/objects/query/validate.d.ts.map +1 -1
  204. package/dist/objects/sdk/object-handle.d.ts +1 -2
  205. package/dist/objects/sdk/object-handle.d.ts.map +1 -1
  206. package/dist/objects/sdk/object-set.d.ts +2 -3
  207. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  208. package/dist/objects/sdk/query-builder.d.ts +8 -10
  209. package/dist/objects/sdk/query-builder.d.ts.map +1 -1
  210. package/dist/objects/sdk/telemetry-channel.d.ts +1 -2
  211. package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
  212. package/dist/objects/sdk/where.d.ts +2 -3
  213. package/dist/objects/sdk/where.d.ts.map +1 -1
  214. package/dist/ontology/builders.d.ts +11 -10
  215. package/dist/ontology/builders.d.ts.map +1 -1
  216. package/dist/ontology/index.d.ts +4 -2
  217. package/dist/ontology/index.d.ts.map +1 -1
  218. package/dist/ontology/index.js +6 -4
  219. package/dist/ontology/index.js.map +1 -1
  220. package/dist/ontology/inference/index.d.ts +34 -22
  221. package/dist/ontology/inference/index.d.ts.map +1 -1
  222. package/dist/ontology/internal.d.ts +1 -0
  223. package/dist/ontology/internal.d.ts.map +1 -1
  224. package/dist/ontology/internal.js +9 -7
  225. package/dist/ontology/internal.js.map +1 -1
  226. package/dist/ontology/primitives.d.ts +38 -0
  227. package/dist/ontology/primitives.d.ts.map +1 -0
  228. package/dist/ontology/query-capabilities.d.ts +38 -0
  229. package/dist/ontology/query-capabilities.d.ts.map +1 -0
  230. package/dist/ontology/refs.d.ts +23 -2
  231. package/dist/ontology/refs.d.ts.map +1 -1
  232. package/dist/ontology/registered.d.ts +16 -0
  233. package/dist/ontology/registered.d.ts.map +1 -0
  234. package/dist/ontology/registry.d.ts.map +1 -1
  235. package/dist/ontology/tokens.d.ts +35 -1
  236. package/dist/ontology/tokens.d.ts.map +1 -1
  237. package/dist/ontology/types.d.ts +18 -4
  238. package/dist/ontology/types.d.ts.map +1 -1
  239. package/dist/ontology/user-ref.d.ts +35 -0
  240. package/dist/ontology/user-ref.d.ts.map +1 -0
  241. package/dist/ontology/validation/definition.d.ts.map +1 -1
  242. package/dist/ontology/validation/index.d.ts +1 -1
  243. package/dist/ontology/validation/index.d.ts.map +1 -1
  244. package/dist/ontology/validation/normalize.d.ts.map +1 -1
  245. package/dist/ontology/validation/properties.d.ts +6 -1
  246. package/dist/ontology/validation/properties.d.ts.map +1 -1
  247. package/dist/ontology/validation/query.d.ts.map +1 -1
  248. package/dist/ontology/validation/schema.d.ts.map +1 -1
  249. package/dist/pipelines/index.js +26 -24
  250. package/dist/pipelines/index.js.map +1 -1
  251. package/dist/predicates/types.d.ts +53 -3
  252. package/dist/predicates/types.d.ts.map +1 -1
  253. package/dist/projections/builders.d.ts +19 -1
  254. package/dist/projections/builders.d.ts.map +1 -1
  255. package/dist/projections/internal.js +23 -21
  256. package/dist/projections/internal.js.map +1 -1
  257. package/dist/projections/validation.d.ts.map +1 -1
  258. package/dist/query.js +2 -2
  259. package/dist/queues/in-memory.d.ts +1 -1
  260. package/dist/queues/in-memory.d.ts.map +1 -1
  261. package/dist/runtime/create.d.ts +1 -1
  262. package/dist/runtime/create.d.ts.map +1 -1
  263. package/dist/runtime/host.d.ts +5 -5
  264. package/dist/runtime/host.d.ts.map +1 -1
  265. package/dist/runtime/index.d.ts +1 -1
  266. package/dist/runtime/index.d.ts.map +1 -1
  267. package/dist/runtime/internal.js +27 -25
  268. package/dist/runtime/internal.js.map +1 -1
  269. package/dist/runtime/sixb.d.ts +5 -5
  270. package/dist/runtime/sixb.d.ts.map +1 -1
  271. package/dist/runtime/types.d.ts +171 -188
  272. package/dist/runtime/types.d.ts.map +1 -1
  273. package/dist/sandboxes/index.js +5 -5
  274. package/dist/sandboxes/sandbox.d.ts +4 -1
  275. package/dist/sandboxes/sandbox.d.ts.map +1 -1
  276. package/dist/shared/params/types.d.ts +4 -3
  277. package/dist/shared/params/types.d.ts.map +1 -1
  278. package/dist/shared/params/user-refs.d.ts +19 -0
  279. package/dist/shared/params/user-refs.d.ts.map +1 -0
  280. package/dist/shares/compiler.d.ts.map +1 -1
  281. package/dist/shares/internal.js +24 -22
  282. package/dist/shares/internal.js.map +2 -2
  283. package/dist/storage/action-runs/failure.js +2 -2
  284. package/dist/storage/action-runs/types.d.ts +1 -1
  285. package/dist/storage/action-runs/types.d.ts.map +1 -1
  286. package/dist/storage/agents/provider.js +1 -1
  287. package/dist/storage/ai-limits/enforcement.js +2 -2
  288. package/dist/storage/auth/in-memory/access-tokens.d.ts.map +1 -1
  289. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  290. package/dist/storage/auth/in-memory/device-authorizations.d.ts.map +1 -1
  291. package/dist/storage/auth/in-memory/sessions.d.ts +8 -1
  292. package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
  293. package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
  294. package/dist/storage/auth/index.d.ts +1 -1
  295. package/dist/storage/auth/index.d.ts.map +1 -1
  296. package/dist/storage/auth/types.d.ts +62 -13
  297. package/dist/storage/auth/types.d.ts.map +1 -1
  298. package/dist/storage/connector-connections/provider.js +1 -1
  299. package/dist/storage/executions/provider.js +1 -1
  300. package/dist/storage/file-upload-sessions/in-memory.d.ts +9 -18
  301. package/dist/storage/file-upload-sessions/in-memory.d.ts.map +1 -1
  302. package/dist/storage/file-upload-sessions/index.d.ts +1 -1
  303. package/dist/storage/file-upload-sessions/index.d.ts.map +1 -1
  304. package/dist/storage/file-upload-sessions/provider.d.ts +52 -0
  305. package/dist/storage/file-upload-sessions/provider.d.ts.map +1 -0
  306. package/dist/storage/file-upload-sessions/provider.js +24 -0
  307. package/dist/storage/file-upload-sessions/provider.js.map +9 -0
  308. package/dist/storage/file-upload-sessions/types.d.ts +19 -1
  309. package/dist/storage/file-upload-sessions/types.d.ts.map +1 -1
  310. package/dist/storage/file-upload-sessions/utils.d.ts +8 -2
  311. package/dist/storage/file-upload-sessions/utils.d.ts.map +1 -1
  312. package/dist/storage/index.d.ts +3 -3
  313. package/dist/storage/index.d.ts.map +1 -1
  314. package/dist/storage/index.js +29 -25
  315. package/dist/storage/index.js.map +1 -1
  316. package/dist/storage/internal.js +11 -9
  317. package/dist/storage/internal.js.map +1 -1
  318. package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
  319. package/dist/storage/ontology/commits.d.ts +6 -2
  320. package/dist/storage/ontology/commits.d.ts.map +1 -1
  321. package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
  322. package/dist/storage/ontology/provider-work.d.ts.map +1 -1
  323. package/dist/storage/ontology/provider.d.ts +14 -1
  324. package/dist/storage/ontology/provider.d.ts.map +1 -1
  325. package/dist/storage/ontology/provider.js +8 -2
  326. package/dist/storage/ontology/provider.js.map +1 -1
  327. package/dist/storage/operation-scope.d.ts.map +1 -1
  328. package/dist/storage/operation-scope.js +1 -1
  329. package/dist/storage/projection-runs/provider.js +2 -2
  330. package/dist/storage/types.d.ts +1 -1
  331. package/dist/storage/types.d.ts.map +1 -1
  332. package/dist/storage/workflow-interventions/index.d.ts +1 -1
  333. package/dist/storage/workflow-interventions/index.d.ts.map +1 -1
  334. package/dist/storage/workflow-interventions/types.d.ts +5 -8
  335. package/dist/storage/workflow-interventions/types.d.ts.map +1 -1
  336. package/dist/storage/workflow-runs/provider.js +8 -8
  337. package/dist/syncs/index.js +27 -25
  338. package/dist/syncs/index.js.map +1 -1
  339. package/dist/testing/action-execution.d.ts +4 -0
  340. package/dist/testing/action-execution.d.ts.map +1 -1
  341. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  342. package/dist/testing/execution.d.ts +1 -2
  343. package/dist/testing/execution.d.ts.map +1 -1
  344. package/dist/testing/file-upload-session-storage-contract.d.ts +12 -0
  345. package/dist/testing/file-upload-session-storage-contract.d.ts.map +1 -0
  346. package/dist/testing/index.d.ts +2 -0
  347. package/dist/testing/index.d.ts.map +1 -1
  348. package/dist/testing/index.js +1951 -1242
  349. package/dist/testing/index.js.map +15 -13
  350. package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
  351. package/dist/testing/object-query-contract.d.ts.map +1 -1
  352. package/dist/testing/ontology-contract-fixture.d.ts +8 -0
  353. package/dist/testing/ontology-contract-fixture.d.ts.map +1 -1
  354. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  355. package/dist/testing/sandboxes-contract.d.ts.map +1 -1
  356. package/dist/testing/workflow-intervention-storage-contract.d.ts +8 -0
  357. package/dist/testing/workflow-intervention-storage-contract.d.ts.map +1 -0
  358. package/dist/webhooks/internal.js +24 -22
  359. package/dist/webhooks/internal.js.map +2 -2
  360. package/dist/webhooks/types.d.ts +2 -2
  361. package/dist/webhooks/types.d.ts.map +1 -1
  362. package/dist/workers/index.js +1 -1
  363. package/dist/workflows/index.js +42 -40
  364. package/dist/workflows/index.js.map +1 -1
  365. package/dist/workflows/run-dispatch.d.ts.map +1 -1
  366. package/dist/workflows/types.d.ts +2 -2
  367. package/dist/workflows/types.d.ts.map +1 -1
  368. package/package.json +7 -1
  369. package/src/actions/index.ts +0 -3
  370. package/src/actions/read-facade.ts +102 -62
  371. package/src/actions/request.ts +13 -0
  372. package/src/actions/run-dispatch.ts +3 -0
  373. package/src/actions/types/context.ts +17 -65
  374. package/src/actions/types/params.ts +2 -1
  375. package/src/agents/authority.ts +1 -1
  376. package/src/assert-never.ts +7 -0
  377. package/src/auth/client-address.ts +12 -0
  378. package/src/auth/csrf.ts +14 -5
  379. package/src/auth/index.ts +3 -2
  380. package/src/auth/runtime.ts +299 -277
  381. package/src/auth/session-cache.ts +18 -6
  382. package/src/auth/sessions.ts +30 -0
  383. package/src/auth/types.ts +7 -17
  384. package/src/bootstrap/index.ts +1 -0
  385. package/src/bootstrap/ontology-type-manifest.ts +112 -60
  386. package/src/edits/types.ts +47 -63
  387. package/src/errors/catalog.ts +4 -0
  388. package/src/events/envelope.ts +0 -13
  389. package/src/events/index.ts +1 -1
  390. package/src/events/service.ts +1 -11
  391. package/src/events/toStoredEvent.ts +1 -3
  392. package/src/events/types/index.ts +1 -1
  393. package/src/execution/agent.ts +1 -2
  394. package/src/execution/authorized-object-reader.ts +5 -7
  395. package/src/execution/primitive.ts +1 -2
  396. package/src/execution/request.ts +1 -2
  397. package/src/index.ts +8 -7
  398. package/src/maintenance/ontology-maintenance.ts +77 -1
  399. package/src/materialization/errors.ts +2 -0
  400. package/src/materialization/events.ts +27 -2
  401. package/src/materializer/README.md +2 -0
  402. package/src/materializer/edits/commit.ts +21 -12
  403. package/src/materializer/edits/operations.ts +32 -4
  404. package/src/materializer/edits/plan.ts +4 -5
  405. package/src/materializer/edits/user-refs.ts +115 -0
  406. package/src/materializer/effective/build-events.ts +4 -5
  407. package/src/materializer/execution/scope.ts +40 -7
  408. package/src/materializer/projections/replace.ts +2 -0
  409. package/src/materializer/projections/replacement-plan.ts +4 -0
  410. package/src/materializer/telemetry/append.ts +4 -12
  411. package/src/materializer/telemetry/plan.ts +4 -5
  412. package/src/objects/execution.ts +33 -62
  413. package/src/objects/query/executor.ts +12 -3
  414. package/src/objects/query/ir.ts +7 -0
  415. package/src/objects/query/planner.ts +1 -0
  416. package/src/objects/query/scalar-values.ts +19 -0
  417. package/src/objects/query/validate.ts +55 -44
  418. package/src/objects/sdk/object-handle.ts +8 -8
  419. package/src/objects/sdk/object-set.ts +8 -15
  420. package/src/objects/sdk/query-builder.ts +59 -71
  421. package/src/objects/sdk/telemetry-channel.ts +6 -7
  422. package/src/objects/sdk/where.ts +6 -13
  423. package/src/ontology/builders.ts +15 -11
  424. package/src/ontology/index.ts +4 -0
  425. package/src/ontology/inference/index.ts +56 -36
  426. package/src/ontology/internal.ts +1 -0
  427. package/src/ontology/json-schema.ts +12 -0
  428. package/src/ontology/primitives.ts +91 -0
  429. package/src/ontology/query-capabilities.ts +136 -0
  430. package/src/ontology/refs.ts +33 -6
  431. package/src/ontology/registered.ts +22 -0
  432. package/src/ontology/registry.ts +6 -3
  433. package/src/ontology/tokens.ts +41 -2
  434. package/src/ontology/types.ts +19 -3
  435. package/src/ontology/user-ref.ts +120 -0
  436. package/src/ontology/validation/definition.ts +2 -13
  437. package/src/ontology/validation/index.ts +1 -0
  438. package/src/ontology/validation/normalize.ts +39 -3
  439. package/src/ontology/validation/properties.ts +95 -19
  440. package/src/ontology/validation/query.ts +11 -42
  441. package/src/ontology/validation/schema.ts +16 -0
  442. package/src/predicates/types.ts +43 -33
  443. package/src/projections/builders.ts +24 -3
  444. package/src/projections/validation.ts +15 -1
  445. package/src/runtime/create.ts +2 -2
  446. package/src/runtime/host.ts +10 -12
  447. package/src/runtime/index.ts +3 -2
  448. package/src/runtime/sixb.ts +13 -23
  449. package/src/runtime/types.ts +277 -479
  450. package/src/sandboxes/sandbox.ts +4 -1
  451. package/src/shared/params/types.ts +4 -3
  452. package/src/shared/params/user-refs.ts +48 -0
  453. package/src/shares/compiler.ts +6 -16
  454. package/src/storage/action-runs/types.ts +1 -0
  455. package/src/storage/auth/in-memory/access-tokens.ts +5 -2
  456. package/src/storage/auth/in-memory/auth-storage.ts +5 -8
  457. package/src/storage/auth/in-memory/device-authorizations.ts +0 -2
  458. package/src/storage/auth/in-memory/sessions.ts +69 -1
  459. package/src/storage/auth/in-memory/shared.ts +13 -7
  460. package/src/storage/auth/index.ts +2 -1
  461. package/src/storage/auth/types.ts +57 -13
  462. package/src/storage/executions/validation.ts +1 -1
  463. package/src/storage/file-upload-sessions/in-memory.ts +64 -113
  464. package/src/storage/file-upload-sessions/index.ts +1 -0
  465. package/src/storage/file-upload-sessions/provider.ts +258 -0
  466. package/src/storage/file-upload-sessions/types.ts +20 -1
  467. package/src/storage/file-upload-sessions/utils.ts +25 -9
  468. package/src/storage/index.ts +3 -2
  469. package/src/storage/objects/in-memory/query.ts +13 -3
  470. package/src/storage/ontology/commits.ts +6 -2
  471. package/src/storage/ontology/in-memory/materializations.ts +6 -34
  472. package/src/storage/ontology/provider-header-validation.ts +57 -0
  473. package/src/storage/ontology/provider-work.ts +15 -3
  474. package/src/storage/ontology/provider.ts +59 -1
  475. package/src/storage/operation-scope.ts +1 -0
  476. package/src/storage/types.ts +0 -1
  477. package/src/storage/workflow-interventions/index.ts +0 -1
  478. package/src/storage/workflow-interventions/types.ts +5 -9
  479. package/src/testing/action-execution.ts +13 -3
  480. package/src/testing/auth-storage-contract.ts +149 -62
  481. package/src/testing/execution-storage-contract.ts +1 -2
  482. package/src/testing/execution.ts +4 -7
  483. package/src/testing/file-upload-session-storage-contract.ts +335 -0
  484. package/src/testing/index.ts +8 -0
  485. package/src/testing/materializer-storage-contract.ts +86 -4
  486. package/src/testing/object-query-contract.ts +121 -2
  487. package/src/testing/ontology-contract-fixture.ts +23 -3
  488. package/src/testing/ontology-storage-contract.ts +58 -0
  489. package/src/testing/sandboxes-contract.ts +27 -0
  490. package/src/testing/workflow-intervention-storage-contract.ts +203 -0
  491. package/src/webhooks/types.ts +2 -2
  492. package/src/workflows/run-dispatch.ts +12 -1
  493. package/src/workflows/snapshot.ts +16 -7
  494. package/src/workflows/types.ts +2 -2
  495. package/dist/chunk-2cxv584m.js.map +0 -43
  496. package/dist/chunk-3ghw2t5q.js.map +0 -10
  497. package/dist/chunk-3h7ctayx.js.map +0 -11
  498. package/dist/chunk-6ma8dvzc.js.map +0 -15
  499. package/dist/chunk-bbaa1fet.js.map +0 -25
  500. package/dist/chunk-eyjzgav0.js.map +0 -12
  501. package/dist/chunk-f06sf7rr.js.map +0 -11
  502. package/dist/chunk-g50nxqs5.js.map +0 -18
  503. package/dist/chunk-hkw8rykk.js.map +0 -15
  504. package/dist/chunk-p6r1ex7t.js.map +0 -10
  505. package/dist/chunk-qm535afa.js.map +0 -15
  506. package/dist/chunk-vpxss818.js.map +0 -10
  507. package/dist/chunk-vsg0g7h9.js.map +0 -17
  508. /package/dist/{chunk-e1f1sqba.js.map → chunk-04h4t2b5.js.map} +0 -0
  509. /package/dist/{chunk-y3ev53cq.js.map → chunk-2fv8sajb.js.map} +0 -0
  510. /package/dist/{chunk-3bnt2wna.js.map → chunk-2hbhn1ff.js.map} +0 -0
  511. /package/dist/{chunk-5tetw4hn.js.map → chunk-4tnrzqqh.js.map} +0 -0
  512. /package/dist/{chunk-jjwhy3rs.js.map → chunk-a69fkrtr.js.map} +0 -0
  513. /package/dist/{chunk-y1ahv8b7.js.map → chunk-bdhfn0ww.js.map} +0 -0
  514. /package/dist/{chunk-4ph94nhd.js.map → chunk-bep5rrdq.js.map} +0 -0
  515. /package/dist/{chunk-kept9cdd.js.map → chunk-bxx3ms5t.js.map} +0 -0
  516. /package/dist/{chunk-xtfryrfb.js.map → chunk-cbn96bve.js.map} +0 -0
  517. /package/dist/{chunk-r5zythxp.js.map → chunk-gbcrz0gr.js.map} +0 -0
  518. /package/dist/{chunk-t7dzd1tm.js.map → chunk-jhyc777j.js.map} +0 -0
  519. /package/dist/{chunk-0mza4xb2.js.map → chunk-m8zkvep1.js.map} +0 -0
  520. /package/dist/{chunk-sfypc7mk.js.map → chunk-s24qbp32.js.map} +0 -0
  521. /package/dist/{chunk-y0v18c2j.js.map → chunk-vef6qa14.js.map} +0 -0
  522. /package/dist/{chunk-gzt6v1ja.js.map → chunk-vn3yh259.js.map} +0 -0
  523. /package/dist/{chunk-bg2bs62d.js.map → chunk-w9bp61e7.js.map} +0 -0
  524. /package/dist/{chunk-gswwr35f.js.map → chunk-y487ywrv.js.map} +0 -0
  525. /package/dist/{chunk-bet1rb9h.js.map → chunk-y6vnvayj.js.map} +0 -0
  526. /package/dist/{chunk-g2gezsg5.js.map → chunk-z9h698s8.js.map} +0 -0
  527. /package/dist/{chunk-bfjv1adk.js.map → chunk-znw0zvy4.js.map} +0 -0
@@ -16,7 +16,10 @@ export type SandboxStatus = "running" | "stopped" | "failed"
16
16
  * default set at factory.create(...).
17
17
  */
18
18
  export interface RunCommandOptions {
19
- /** Overrides the sandbox-level workingDirectory for this call. */
19
+ /**
20
+ * Working directory for this call. Defaults to the sandbox's workingDirectory;
21
+ * relative paths resolve against it, while absolute paths override it.
22
+ */
20
23
  readonly cwd?: string
21
24
  /** Merged on top of sandbox-level env. Per-call wins on collision. */
22
25
  readonly env?: Readonly<Record<string, string>>
@@ -6,6 +6,7 @@ import type {
6
6
  SchemaOrRef,
7
7
  ValueType,
8
8
  } from "../../ontology"
9
+ import type { RegisteredValueTypes } from "../../ontology/registered"
9
10
  import type { QuantitativeTypeId } from "../../ontology/units"
10
11
 
11
12
  type Simplify<T> = { [K in keyof T]: T[K] } & {}
@@ -57,14 +58,14 @@ type InferStructuredParamValue<
57
58
 
58
59
  type InferParamSchemaValue<
59
60
  TSchema extends SchemaOrRef,
60
- TValueTypes extends readonly ValueType[] = [],
61
+ TValueTypes extends readonly ValueType[] = RegisteredValueTypes,
61
62
  > = TSchema extends keyof ParamPrimitiveSchemaValues
62
63
  ? ParamPrimitiveSchemaValues[TSchema]
63
64
  : InferStructuredParamValue<TSchema, TValueTypes>
64
65
 
65
66
  type InferParamValue<
66
67
  TParam extends ParamConfig,
67
- TValueTypes extends readonly ValueType[] = [],
68
+ TValueTypes extends readonly ValueType[] = RegisteredValueTypes,
68
69
  > = TParam["nullable"] extends true
69
70
  ? InferParamSchemaValue<TParam["schema"], TValueTypes> | null
70
71
  : InferParamSchemaValue<TParam["schema"], TValueTypes>
@@ -72,7 +73,7 @@ type InferParamValue<
72
73
  /** Infer the validated runtime input represented by a parameter config. */
73
74
  export type InferParams<
74
75
  TParams extends ParamsConfig,
75
- TValueTypes extends readonly ValueType[] = [],
76
+ TValueTypes extends readonly ValueType[] = RegisteredValueTypes,
76
77
  > = string extends keyof TParams
77
78
  ? Record<string, unknown>
78
79
  : Simplify<
@@ -0,0 +1,48 @@
1
+ import type { SchemaOrRef, ValueType } from "../../ontology"
2
+ import { isObjectRefSchema } from "../../ontology/refs"
3
+ import { collectUserRefIds, userReferenceProblem } from "../../ontology/user-ref"
4
+ import type { AuthStorage } from "../../storage/auth/types"
5
+
6
+ /**
7
+ * Reject params that reference a user who does not exist or is not active.
8
+ *
9
+ * Callers run it only when a new run is created: replaying an existing run keeps the params it was
10
+ * accepted with, even if a referenced user was suspended since.
11
+ */
12
+ export async function assertParamUsersActive(input: {
13
+ readonly auth: AuthStorage | undefined
14
+ readonly projectId: string
15
+ readonly schemas: Readonly<Record<string, SchemaOrRef>>
16
+ readonly values: Readonly<Record<string, unknown>>
17
+ readonly valueTypesById: ReadonlyMap<string, ValueType>
18
+ /** Names one param in error messages, for example `Action param 'task.assign.assignee'`. */
19
+ readonly describe: (paramId: string) => string
20
+ readonly invalid: (message: string) => Error
21
+ }): Promise<void> {
22
+ const references: { readonly paramId: string; readonly id: string }[] = []
23
+ for (const [paramId, schema] of Object.entries(input.schemas)) {
24
+ if (isObjectRefSchema(schema)) continue
25
+ const ids = collectUserRefIds(schema, input.values[paramId], input.valueTypesById, new Set())
26
+ for (const id of ids) references.push({ paramId, id })
27
+ }
28
+ if (references.length === 0) return
29
+
30
+ const users = input.auth?.users
31
+ const statuses = new Map(
32
+ await Promise.all(
33
+ [...new Set(references.map((reference) => reference.id))].map(
34
+ async (id) =>
35
+ [
36
+ id,
37
+ users
38
+ ? ((await users.getById({ projectId: input.projectId, id }))?.status ?? null)
39
+ : "unverifiable",
40
+ ] as const
41
+ )
42
+ )
43
+ )
44
+ for (const { paramId, id } of references) {
45
+ const problem = userReferenceProblem(input.describe(paramId), id, statuses.get(id) ?? null)
46
+ if (problem) throw input.invalid(problem)
47
+ }
48
+ }
@@ -1,7 +1,8 @@
1
1
  import type { ActionDefinitionCatalog } from "../actions"
2
2
  import type { LinkPathSelection, LinkPathSelectionMode, ObjectRef } from "../ontology"
3
+ import { isPrimitiveSchema, primitiveTraits } from "../ontology/primitives"
3
4
  import type { OntologyDefinitionCatalog } from "../ontology/registry"
4
- import type { ObjectLink, ObjectType } from "../ontology/types"
5
+ import type { ObjectLink, ObjectType, PrimitiveSchema } from "../ontology/types"
5
6
  import type {
6
7
  ObjectReadLinkDefinitionSelection,
7
8
  ObjectReadLinkSelection,
@@ -88,17 +89,6 @@ export function compileShareAccessPlan(input: CompileShareAccessPlanInput): Shar
88
89
  return snapshotShareAccessPlan({ grants })
89
90
  }
90
91
 
91
- const SHAREABLE_PRIMITIVE_SCHEMAS = new Set([
92
- "string",
93
- "integer",
94
- "double",
95
- "decimal",
96
- "boolean",
97
- "date",
98
- "timestamp",
99
- "uuid",
100
- ])
101
-
102
92
  /**
103
93
  * V1 deliberately excludes references from shared Action params. A delegated caller cannot yet be
104
94
  * authorized to resolve arbitrary object or blob references supplied at invocation time.
@@ -112,9 +102,9 @@ function assertShareableActionParams(input: {
112
102
  const seenSchemas = new WeakSet<object>()
113
103
  const resolvingValueTypes = new Set<string>()
114
104
 
115
- const reject = (path: string, kind: "objectRef" | "fileRef"): never => {
105
+ const reject = (path: string, kind: "objectRef" | PrimitiveSchema): never => {
116
106
  throw invalid(
117
- `Share '${input.shareId}' Action '${input.actionId}' parameter '${path}' uses ${kind}. Shared Action parameters cannot contain objectRef or fileRef in V1.`
107
+ `Share '${input.shareId}' Action '${input.actionId}' parameter '${path}' uses ${kind}. Shared Action parameters cannot contain objectRef, fileRef, or userRef in V1.`
118
108
  )
119
109
  }
120
110
 
@@ -126,8 +116,8 @@ function assertShareableActionParams(input: {
126
116
 
127
117
  const walk = (schema: unknown, path: string): void => {
128
118
  if (typeof schema === "string") {
129
- if (schema === "fileRef") reject(path, "fileRef")
130
- if (!SHAREABLE_PRIMITIVE_SCHEMAS.has(schema)) malformed(path)
119
+ if (!isPrimitiveSchema(schema)) malformed(path)
120
+ else if (primitiveTraits(schema)?.shareableParam !== true) reject(path, schema)
131
121
  return
132
122
  }
133
123
  if (!isRecord(schema)) throw malformed(path)
@@ -27,6 +27,7 @@ export const ACTION_RUN_FAILURE_CODES = [
27
27
  "runtime.cancelled",
28
28
  "queue.enqueue_failed",
29
29
  "action.phase_failed",
30
+ "action.read_conflict",
30
31
  ] as const satisfies readonly [SixbErrorCode, ...SixbErrorCode[]]
31
32
 
32
33
  export type ActionRunFailureCode = (typeof ACTION_RUN_FAILURE_CODES)[number]
@@ -38,8 +38,11 @@ export class InMemoryAuthAccessTokenStore implements AuthAccessTokenStore {
38
38
  const rows = [...this.state.accessTokens.values()]
39
39
  .filter((token) => token.projectId === input.projectId)
40
40
  .filter((token) => input.kind === undefined || token.kind === input.kind)
41
- .filter((token) => input.subjectType === undefined || token.subjectType === input.subjectType)
42
- .filter((token) => input.subjectId === undefined || token.subjectId === input.subjectId)
41
+ .filter(
42
+ (token) =>
43
+ input.subject === undefined ||
44
+ (token.subject.type === input.subject.type && token.subject.id === input.subject.id)
45
+ )
43
46
  .filter((token) => input.includeRevoked || !token.revokedAt)
44
47
  .sort((a, b) => compareByCreatedAt(a, b, order))
45
48
  const page = rows.slice(offset, input.limit === undefined ? undefined : offset + input.limit)
@@ -30,7 +30,6 @@ import {
30
30
  cloneRecord,
31
31
  consumeMagicLinkRecord,
32
32
  consumeOidcAttemptRecord,
33
- createAccessTokenRecord,
34
33
  createAuthStorageState,
35
34
  createSessionRecord,
36
35
  deviceAuthorizationKey,
@@ -138,24 +137,22 @@ export class InMemoryAuthStorage implements AuthStorage {
138
137
  )
139
138
  }
140
139
  if (
141
- input.accessToken.projectId !== input.projectId ||
142
- input.accessToken.subjectType !== "user" ||
143
- input.accessToken.subjectId !== authorization.approvedUserId ||
144
- input.accessToken.createdBySessionId !== authorization.approvedSessionId
140
+ input.session.projectId !== input.projectId ||
141
+ input.session.userId !== authorization.approvedUserId
145
142
  ) {
146
143
  throw new AuthStorageError(
147
144
  "invalid_device_authorization",
148
- "[Sixb] Device access token is invalid."
145
+ "[Sixb] Device session is invalid."
149
146
  )
150
147
  }
151
- const accessToken = createAccessTokenRecord(this.state, input.accessToken)
148
+ const session = createSessionRecord(this.state, input.session)
152
149
  const consumed = {
153
150
  ...authorization,
154
151
  status: "consumed" as const,
155
152
  consumedAt: new Date(input.completedAt),
156
153
  }
157
154
  this.state.deviceAuthorizations.set(key, cloneRecord(consumed))
158
- return { authorization: cloneRecord(consumed), accessToken: cloneRecord(accessToken) }
155
+ return { authorization: cloneRecord(consumed), session: cloneRecord(session) }
159
156
  }
160
157
 
161
158
  async completeMagicLinkSignIn(
@@ -45,8 +45,6 @@ export class InMemoryAuthDeviceAuthorizationStore implements AuthDeviceAuthoriza
45
45
  deviceCodeHash: assertNonEmpty(input.deviceCodeHash, "Device code hash"),
46
46
  userCode: assertNonEmpty(input.userCode, "User code"),
47
47
  clientName: assertNonEmpty(input.clientName, "Client name"),
48
- tokenName: assertNonEmpty(input.tokenName, "Token name"),
49
- tokenExpiresAt: new Date(input.tokenExpiresAt),
50
48
  status: "pending",
51
49
  createdAt: new Date(input.createdAt),
52
50
  expiresAt: new Date(input.expiresAt),
@@ -1,6 +1,11 @@
1
1
  import type { AuthSessionAudience } from "../../../auth/audience"
2
2
  import { AuthStorageError } from "../errors"
3
- import type { AuthSessionStore, CreateAuthSessionInput, SessionRecord } from "../types"
3
+ import type {
4
+ AuthSessionStore,
5
+ CreateAuthSessionInput,
6
+ RotateSessionRefreshTokenResult,
7
+ SessionRecord,
8
+ } from "../types"
4
9
  import type { AuthStorageState } from "./shared"
5
10
  import {
6
11
  cloneDate,
@@ -73,6 +78,7 @@ export class InMemoryAuthSessionStore implements AuthSessionStore {
73
78
  const session = this.state.sessions.get(sessionKey(params.projectId, params.id))
74
79
  if (
75
80
  !session ||
81
+ session.bearer ||
76
82
  session.audience !== params.audience ||
77
83
  session.tokenHash !== params.tokenHash ||
78
84
  !isActiveSession(session, params.now)
@@ -83,6 +89,67 @@ export class InMemoryAuthSessionStore implements AuthSessionStore {
83
89
  return cloneRecord(session)
84
90
  }
85
91
 
92
+ async findValidByAccessTokenHash(params: {
93
+ readonly projectId: string
94
+ readonly id: string
95
+ readonly tokenHash: string
96
+ readonly now: Date
97
+ }): Promise<SessionRecord | null> {
98
+ const session = this.state.sessions.get(sessionKey(params.projectId, params.id))
99
+ if (
100
+ !session?.bearer ||
101
+ session.tokenHash !== params.tokenHash ||
102
+ session.bearer.accessExpiresAt <= params.now ||
103
+ !isActiveSession(session, params.now)
104
+ ) {
105
+ return null
106
+ }
107
+
108
+ return cloneRecord(session)
109
+ }
110
+
111
+ async rotateRefreshToken(
112
+ params: Parameters<AuthSessionStore["rotateRefreshToken"]>[0]
113
+ ): Promise<RotateSessionRefreshTokenResult> {
114
+ const key = sessionKey(params.projectId, params.id)
115
+ const session = this.state.sessions.get(key)
116
+ if (!session?.bearer || !isActiveSession(session, params.now)) {
117
+ return { status: "invalid" }
118
+ }
119
+
120
+ const { bearer } = session
121
+ const replacedRecently =
122
+ bearer.previousRefreshTokenHash === params.refreshTokenHash &&
123
+ bearer.refreshedAt !== undefined &&
124
+ params.now.getTime() - bearer.refreshedAt.getTime() <= params.reuseGraceMs
125
+ if (bearer.refreshTokenHash !== params.refreshTokenHash && !replacedRecently) {
126
+ if (bearer.previousRefreshTokenHash !== params.refreshTokenHash) {
127
+ return { status: "invalid" }
128
+ }
129
+ this.state.sessions.set(key, cloneRecord({ ...session, revokedAt: cloneDate(params.now) }))
130
+ return { status: "reused" }
131
+ }
132
+
133
+ const requestedExpiresAt = session.absoluteExpiresAt
134
+ ? new Date(Math.min(params.next.expiresAt.getTime(), session.absoluteExpiresAt.getTime()))
135
+ : params.next.expiresAt
136
+ const next: SessionRecord = {
137
+ ...session,
138
+ tokenHash: params.next.tokenHash,
139
+ expiresAt: new Date(Math.max(session.expiresAt.getTime(), requestedExpiresAt.getTime())),
140
+ lastSeenAt: cloneDate(params.now),
141
+ bearer: {
142
+ clientName: bearer.clientName,
143
+ accessExpiresAt: cloneDate(params.next.accessExpiresAt),
144
+ refreshTokenHash: params.next.refreshTokenHash,
145
+ previousRefreshTokenHash: bearer.refreshTokenHash,
146
+ refreshedAt: cloneDate(params.now),
147
+ },
148
+ }
149
+ this.state.sessions.set(key, cloneRecord(next))
150
+ return { status: "rotated", session: cloneRecord(next) }
151
+ }
152
+
86
153
  async renewIfValid(params: {
87
154
  readonly projectId: string
88
155
  readonly id: string
@@ -95,6 +162,7 @@ export class InMemoryAuthSessionStore implements AuthSessionStore {
95
162
  const session = this.state.sessions.get(key)
96
163
  if (
97
164
  !session ||
165
+ session.bearer ||
98
166
  session.audience !== params.audience ||
99
167
  session.tokenHash !== params.tokenHash ||
100
168
  !isActiveSession(session, params.now)
@@ -320,6 +320,13 @@ export function createSessionRecord(
320
320
  absoluteExpiresAt: input.absoluteExpiresAt ? cloneDate(input.absoluteExpiresAt) : undefined,
321
321
  userAgent: input.userAgent,
322
322
  ipAddress: input.ipAddress,
323
+ bearer: input.bearer
324
+ ? {
325
+ clientName: assertNonEmpty(input.bearer.clientName, "Session client name"),
326
+ accessExpiresAt: cloneDate(input.bearer.accessExpiresAt),
327
+ refreshTokenHash: assertNonEmpty(input.bearer.refreshTokenHash, "Refresh token hash"),
328
+ }
329
+ : undefined,
323
330
  }
324
331
 
325
332
  state.sessions.set(sessionKey(projectId, id), cloneRecord(session))
@@ -398,11 +405,11 @@ export function createAccessTokenRecord(
398
405
  const id = assertNonEmpty(input.id, "Access token id")
399
406
  const projectId = assertNonEmpty(input.projectId, "Project id")
400
407
  const name = assertNonEmpty(input.name, "Access token name")
401
- const subjectId = assertNonEmpty(input.subjectId, "Access token subject id")
408
+ const subjectId = assertNonEmpty(input.subject.id, "Access token subject id")
402
409
  const tokenHash = assertNonEmpty(input.tokenHash, "Access token hash")
403
410
 
404
- assertAccessTokenSubject(input.kind, input.subjectType)
405
- assertAccessTokenSubjectExists(state, projectId, input.subjectType, subjectId)
411
+ assertAccessTokenSubject(input.kind, input.subject.type)
412
+ assertAccessTokenSubjectExists(state, projectId, input.subject.type, subjectId)
406
413
 
407
414
  const key = accessTokenKey(projectId, id)
408
415
  if (state.accessTokens.has(key)) {
@@ -417,8 +424,7 @@ export function createAccessTokenRecord(
417
424
  projectId,
418
425
  name,
419
426
  kind: input.kind,
420
- subjectType: input.subjectType,
421
- subjectId,
427
+ subject: { type: input.subject.type, id: subjectId },
422
428
  tokenHash,
423
429
  groupIds: normalizeOptionalGroupIds(input.groupIds),
424
430
  createdByPrincipal: input.createdByPrincipal,
@@ -484,7 +490,7 @@ export function removeGroupMembershipRecord(
484
490
 
485
491
  function assertAccessTokenSubject(
486
492
  kind: CreateAuthAccessTokenInput["kind"],
487
- subjectType: CreateAuthAccessTokenInput["subjectType"]
493
+ subjectType: CreateAuthAccessTokenInput["subject"]["type"]
488
494
  ): void {
489
495
  if (
490
496
  (kind === "personal" && subjectType === "user") ||
@@ -502,7 +508,7 @@ function assertAccessTokenSubject(
502
508
  function assertAccessTokenSubjectExists(
503
509
  state: AuthStorageState,
504
510
  projectId: string,
505
- subjectType: CreateAuthAccessTokenInput["subjectType"],
511
+ subjectType: CreateAuthAccessTokenInput["subject"]["type"],
506
512
  subjectId: string
507
513
  ): void {
508
514
  if (subjectType === "user") {
@@ -3,7 +3,6 @@ export { AuthStorageError } from "./errors"
3
3
  export { InMemoryAuthStorage } from "./in-memory"
4
4
  export type {
5
5
  AccessTokenRecord,
6
- AccessTokenSubjectType,
7
6
  AuthAccessTokenStore,
8
7
  AuthDeviceAuthorizationStore,
9
8
  AuthGroupMembershipStore,
@@ -16,6 +15,7 @@ export type {
16
15
  AuthStorage,
17
16
  AuthUserIdentityStore,
18
17
  AuthUserStore,
18
+ BearerSessionState,
19
19
  CompleteAuthSessionInput,
20
20
  CompleteDeviceAuthorizationInput,
21
21
  CompleteDeviceAuthorizationResult,
@@ -47,6 +47,7 @@ export type {
47
47
  MagicLinkRecord,
48
48
  OidcAuthorizationAttemptRecord,
49
49
  ReconcileAuthServiceAccountGroupMembershipsInput,
50
+ RotateSessionRefreshTokenResult,
50
51
  ServiceAccountGroupMembershipRecord,
51
52
  ServiceAccountRecord,
52
53
  ServiceAccountStatus,
@@ -1,10 +1,10 @@
1
1
  import type { AccessTokenKind, AuthSessionAudience, Principal } from "../../auth"
2
+ import type { AuthorizablePrincipal } from "../../execution/types"
2
3
 
3
4
  export type UserStatus = "active" | "suspended"
4
5
  export type ServiceAccountStatus = "active" | "suspended"
5
6
  export type InvitationStatus = "pending" | "accepted" | "revoked"
6
7
  export type GroupMembershipSource = "invitation" | "manual" | "agent"
7
- export type AccessTokenSubjectType = "user" | "serviceAccount"
8
8
  export type DeviceAuthorizationStatus = "pending" | "approved" | "denied" | "consumed"
9
9
  export const MAX_PENDING_DEVICE_AUTHORIZATIONS = 100
10
10
 
@@ -54,6 +54,7 @@ export interface SessionRecord {
54
54
  readonly projectId: string
55
55
  readonly userId: string
56
56
  readonly strategyId: string
57
+ /** The web app a browser session belongs to. A bearer session belongs to none and ignores it. */
57
58
  readonly audience: AuthSessionAudience
58
59
  readonly tokenHash: string
59
60
  readonly createdAt: Date
@@ -65,15 +66,36 @@ export interface SessionRecord {
65
66
  // view. Display only — never used for authorization.
66
67
  readonly userAgent?: string
67
68
  readonly ipAddress?: string
69
+ /** Present when a native client holds the session as bearer tokens instead of a cookie. */
70
+ readonly bearer?: BearerSessionState
68
71
  }
69
72
 
73
+ /**
74
+ * A native client's credentials for its session. `tokenHash` on the session is the current access
75
+ * token's hash; the refresh token rotates on every refresh.
76
+ */
77
+ export interface BearerSessionState {
78
+ /** Self-reported client label, such as "sixb CLI on alex-mbp". Display only. */
79
+ readonly clientName: string
80
+ readonly accessExpiresAt: Date
81
+ readonly refreshTokenHash: string
82
+ /** The refresh token the last rotation replaced, accepted briefly in case its response was lost. */
83
+ readonly previousRefreshTokenHash?: string
84
+ readonly refreshedAt?: Date
85
+ }
86
+
87
+ export type RotateSessionRefreshTokenResult =
88
+ | { readonly status: "rotated"; readonly session: SessionRecord }
89
+ /** A replaced refresh token came back after the grace window; the session is now revoked. */
90
+ | { readonly status: "reused" }
91
+ | { readonly status: "invalid" }
92
+
70
93
  export interface AccessTokenRecord {
71
94
  readonly id: string
72
95
  readonly projectId: string
73
96
  readonly name: string
74
97
  readonly kind: AccessTokenKind
75
- readonly subjectType: AccessTokenSubjectType
76
- readonly subjectId: string
98
+ readonly subject: AuthorizablePrincipal
77
99
  readonly tokenHash: string
78
100
  /**
79
101
  * Optional group constraint. Undefined means "inherit every current group";
@@ -148,8 +170,6 @@ export interface DeviceAuthorizationRecord {
148
170
  readonly deviceCodeHash: string
149
171
  readonly userCode: string
150
172
  readonly clientName: string
151
- readonly tokenName: string
152
- readonly tokenExpiresAt: Date
153
173
  readonly status: DeviceAuthorizationStatus
154
174
  readonly approvedUserId?: string
155
175
  readonly approvedSessionId?: string
@@ -273,6 +293,7 @@ export interface CreateAuthSessionInput {
273
293
  readonly absoluteExpiresAt?: Date
274
294
  readonly userAgent?: string
275
295
  readonly ipAddress?: string
296
+ readonly bearer?: Pick<BearerSessionState, "clientName" | "accessExpiresAt" | "refreshTokenHash">
276
297
  }
277
298
 
278
299
  export interface CreateAuthAccessTokenInput {
@@ -280,8 +301,7 @@ export interface CreateAuthAccessTokenInput {
280
301
  readonly projectId: string
281
302
  readonly name: string
282
303
  readonly kind: AccessTokenKind
283
- readonly subjectType: AccessTokenSubjectType
284
- readonly subjectId: string
304
+ readonly subject: AuthorizablePrincipal
285
305
  readonly tokenHash: string
286
306
  readonly groupIds?: readonly string[]
287
307
  readonly createdByPrincipal?: Principal
@@ -293,8 +313,7 @@ export interface CreateAuthAccessTokenInput {
293
313
  export interface ListAuthAccessTokensInput {
294
314
  readonly projectId: string
295
315
  readonly kind?: AccessTokenKind
296
- readonly subjectType?: AccessTokenSubjectType
297
- readonly subjectId?: string
316
+ readonly subject?: AuthorizablePrincipal
298
317
  readonly includeRevoked?: boolean
299
318
  readonly limit?: number
300
319
  readonly offset?: number
@@ -385,8 +404,6 @@ export interface CreateDeviceAuthorizationInput {
385
404
  readonly deviceCodeHash: string
386
405
  readonly userCode: string
387
406
  readonly clientName: string
388
- readonly tokenName: string
389
- readonly tokenExpiresAt: Date
390
407
  readonly createdAt: Date
391
408
  readonly expiresAt: Date
392
409
  }
@@ -395,13 +412,14 @@ export interface CompleteDeviceAuthorizationInput {
395
412
  readonly projectId: string
396
413
  readonly id: string
397
414
  readonly deviceCodeHash: string
398
- readonly accessToken: CreateAuthAccessTokenInput
415
+ /** The bearer session to start for the approving user. */
416
+ readonly session: CreateAuthSessionInput & { readonly bearer: BearerSessionState }
399
417
  readonly completedAt: Date
400
418
  }
401
419
 
402
420
  export interface CompleteDeviceAuthorizationResult {
403
421
  readonly authorization: DeviceAuthorizationRecord
404
- readonly accessToken: AccessTokenRecord
422
+ readonly session: SessionRecord
405
423
  }
406
424
 
407
425
  export interface CompleteMagicLinkSignInInput {
@@ -523,6 +541,7 @@ export interface AuthSessionStore {
523
541
  readonly userId: string
524
542
  readonly now: Date
525
543
  }): Promise<readonly SessionRecord[]>
544
+ /** A live browser (cookie) session whose secret hashes to `tokenHash`. */
526
545
  findValidByTokenHash(params: {
527
546
  readonly projectId: string
528
547
  readonly id: string
@@ -530,6 +549,31 @@ export interface AuthSessionStore {
530
549
  readonly tokenHash: string
531
550
  readonly now: Date
532
551
  }): Promise<SessionRecord | null>
552
+ /** A live bearer session whose current, unexpired access token hashes to `tokenHash`. */
553
+ findValidByAccessTokenHash(params: {
554
+ readonly projectId: string
555
+ readonly id: string
556
+ readonly tokenHash: string
557
+ readonly now: Date
558
+ }): Promise<SessionRecord | null>
559
+ /**
560
+ * Atomically replace a live bearer session's tokens. The current refresh token rotates; the one
561
+ * it replaced also rotates within `reuseGraceMs` of that replacement. Presenting it later revokes
562
+ * the session. `next.expiresAt` extends the idle deadline, never past the absolute one.
563
+ */
564
+ rotateRefreshToken(params: {
565
+ readonly projectId: string
566
+ readonly id: string
567
+ readonly refreshTokenHash: string
568
+ readonly now: Date
569
+ readonly reuseGraceMs: number
570
+ readonly next: {
571
+ readonly tokenHash: string
572
+ readonly accessExpiresAt: Date
573
+ readonly refreshTokenHash: string
574
+ readonly expiresAt: Date
575
+ }
576
+ }): Promise<RotateSessionRefreshTokenResult>
533
577
  renewIfValid(params: {
534
578
  readonly projectId: string
535
579
  readonly id: string
@@ -340,7 +340,7 @@ async function validateCredential(
340
340
  `[Sixb] Authority access token '${credential.id}' does not exist in project '${record.projectId}'.`
341
341
  )
342
342
  }
343
- if (token.subjectType !== principal.type || token.subjectId !== principal.id) {
343
+ if (!principalsEqual(token.subject, principal)) {
344
344
  throw new ExecutionStorageError(
345
345
  "invalid_credential",
346
346
  `[Sixb] Authority access token '${credential.id}' does not belong to principal '${principal.id}'.`