@sixb/core 0.1.19 → 0.1.21

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 (765) hide show
  1. package/dist/actions/execution.d.ts.map +1 -1
  2. package/dist/actions/index.js +54 -47
  3. package/dist/actions/index.js.map +1 -1
  4. package/dist/actions/request.d.ts.map +1 -1
  5. package/dist/actions/run-authorization.d.ts +9 -0
  6. package/dist/actions/run-authorization.d.ts.map +1 -1
  7. package/dist/activity/connection.d.ts +62 -0
  8. package/dist/activity/connection.d.ts.map +1 -0
  9. package/dist/activity/device.d.ts +8 -0
  10. package/dist/activity/device.d.ts.map +1 -0
  11. package/dist/activity/execution.d.ts +48 -0
  12. package/dist/activity/execution.d.ts.map +1 -0
  13. package/dist/activity/service.d.ts +79 -0
  14. package/dist/activity/service.d.ts.map +1 -0
  15. package/dist/activity/shares.d.ts +24 -0
  16. package/dist/activity/shares.d.ts.map +1 -0
  17. package/dist/activity/timeline.d.ts +96 -0
  18. package/dist/activity/timeline.d.ts.map +1 -0
  19. package/dist/agents/index.d.ts +2 -1
  20. package/dist/agents/index.d.ts.map +1 -1
  21. package/dist/agents/index.js +63 -50
  22. package/dist/agents/index.js.map +1 -1
  23. package/dist/agents/request.d.ts.map +1 -1
  24. package/dist/agents/skills.d.ts.map +1 -1
  25. package/dist/agents/streams/index.js +3 -3
  26. package/dist/agents/streams/internal.js +3 -3
  27. package/dist/agents/types.d.ts +8 -8
  28. package/dist/agents/types.d.ts.map +1 -1
  29. package/dist/agents/validation.d.ts +1 -1
  30. package/dist/agents/validation.d.ts.map +1 -1
  31. package/dist/artifacts/address.d.ts +48 -0
  32. package/dist/artifacts/address.d.ts.map +1 -0
  33. package/dist/artifacts/csv.d.ts +22 -0
  34. package/dist/artifacts/csv.d.ts.map +1 -0
  35. package/dist/artifacts/errors.d.ts +11 -0
  36. package/dist/artifacts/errors.d.ts.map +1 -0
  37. package/dist/artifacts/execution.d.ts +43 -0
  38. package/dist/artifacts/execution.d.ts.map +1 -0
  39. package/dist/artifacts/frames/assets.d.ts +28 -0
  40. package/dist/artifacts/frames/assets.d.ts.map +1 -0
  41. package/dist/artifacts/frames/grants.d.ts +37 -0
  42. package/dist/artifacts/frames/grants.d.ts.map +1 -0
  43. package/dist/artifacts/frames/index.d.ts +10 -0
  44. package/dist/artifacts/frames/index.d.ts.map +1 -0
  45. package/dist/artifacts/frames/index.js +892 -0
  46. package/dist/artifacts/frames/index.js.map +14 -0
  47. package/dist/artifacts/frames/kit.d.ts +66 -0
  48. package/dist/artifacts/frames/kit.d.ts.map +1 -0
  49. package/dist/artifacts/frames/probe.d.ts +41 -0
  50. package/dist/artifacts/frames/probe.d.ts.map +1 -0
  51. package/dist/artifacts/frames/protocol.d.ts +98 -0
  52. package/dist/artifacts/frames/protocol.d.ts.map +1 -0
  53. package/dist/artifacts/frames/runtime.d.ts +13 -0
  54. package/dist/artifacts/frames/runtime.d.ts.map +1 -0
  55. package/dist/artifacts/html.d.ts +6 -0
  56. package/dist/artifacts/html.d.ts.map +1 -0
  57. package/dist/artifacts/ids.d.ts +5 -0
  58. package/dist/artifacts/ids.d.ts.map +1 -0
  59. package/dist/artifacts/index.d.ts +16 -0
  60. package/dist/artifacts/index.d.ts.map +1 -0
  61. package/dist/artifacts/index.js +125 -0
  62. package/dist/artifacts/index.js.map +10 -0
  63. package/dist/artifacts/kinds.d.ts +5 -0
  64. package/dist/artifacts/kinds.d.ts.map +1 -0
  65. package/dist/artifacts/limits.d.ts +28 -0
  66. package/dist/artifacts/limits.d.ts.map +1 -0
  67. package/dist/artifacts/outline.d.ts +44 -0
  68. package/dist/artifacts/outline.d.ts.map +1 -0
  69. package/dist/artifacts/publish/files.d.ts +15 -0
  70. package/dist/artifacts/publish/files.d.ts.map +1 -0
  71. package/dist/artifacts/publish/index.d.ts +5 -0
  72. package/dist/artifacts/publish/index.d.ts.map +1 -0
  73. package/dist/artifacts/publish/index.js +36 -0
  74. package/dist/artifacts/publish/index.js.map +9 -0
  75. package/dist/artifacts/publish/publish.d.ts +52 -0
  76. package/dist/artifacts/publish/publish.d.ts.map +1 -0
  77. package/dist/artifacts/publish/references.d.ts +27 -0
  78. package/dist/artifacts/publish/references.d.ts.map +1 -0
  79. package/dist/artifacts/publish/validate/document.d.ts +17 -0
  80. package/dist/artifacts/publish/validate/document.d.ts.map +1 -0
  81. package/dist/artifacts/publish/validate/file.d.ts +8 -0
  82. package/dist/artifacts/publish/validate/file.d.ts.map +1 -0
  83. package/dist/artifacts/publish/validate/sheet.d.ts +15 -0
  84. package/dist/artifacts/publish/validate/sheet.d.ts.map +1 -0
  85. package/dist/artifacts/publish/validate/slides.d.ts +21 -0
  86. package/dist/artifacts/publish/validate/slides.d.ts.map +1 -0
  87. package/dist/artifacts/references.d.ts +12 -0
  88. package/dist/artifacts/references.d.ts.map +1 -0
  89. package/dist/artifacts/resolve.d.ts +41 -0
  90. package/dist/artifacts/resolve.d.ts.map +1 -0
  91. package/dist/artifacts/theme.d.ts +19 -0
  92. package/dist/artifacts/theme.d.ts.map +1 -0
  93. package/dist/artifacts/warnings.d.ts +11 -0
  94. package/dist/artifacts/warnings.d.ts.map +1 -0
  95. package/dist/artifacts/workbook.d.ts +64 -0
  96. package/dist/artifacts/workbook.d.ts.map +1 -0
  97. package/dist/auth/cookies.d.ts +2 -4
  98. package/dist/auth/cookies.d.ts.map +1 -1
  99. package/dist/auth/index.d.ts +0 -2
  100. package/dist/auth/index.d.ts.map +1 -1
  101. package/dist/auth/index.js +14 -20
  102. package/dist/auth/index.js.map +1 -1
  103. package/dist/auth/runtime.d.ts +8 -10
  104. package/dist/auth/runtime.d.ts.map +1 -1
  105. package/dist/auth/session-cache.d.ts +1 -5
  106. package/dist/auth/session-cache.d.ts.map +1 -1
  107. package/dist/auth/strategy.js +1 -1
  108. package/dist/auth/types.d.ts +4 -8
  109. package/dist/auth/types.d.ts.map +1 -1
  110. package/dist/auth/validation.d.ts +0 -1
  111. package/dist/auth/validation.d.ts.map +1 -1
  112. package/dist/authorization/decision.d.ts +2 -4
  113. package/dist/authorization/decision.d.ts.map +1 -1
  114. package/dist/authorization/grant-kinds.d.ts +6 -8
  115. package/dist/authorization/grant-kinds.d.ts.map +1 -1
  116. package/dist/authorization/index.d.ts +0 -1
  117. package/dist/authorization/index.d.ts.map +1 -1
  118. package/dist/authorization/index.js +7 -11
  119. package/dist/authorization/index.js.map +1 -1
  120. package/dist/authorization/resolve.d.ts +1 -1
  121. package/dist/authorization/resolve.d.ts.map +1 -1
  122. package/dist/blob-storage/browser.js +1 -1
  123. package/dist/blob-storage/index.js +2 -2
  124. package/dist/blob-storage/internal.d.ts +1 -1
  125. package/dist/blob-storage/internal.d.ts.map +1 -1
  126. package/dist/blob-storage/internal.js +11 -5
  127. package/dist/blob-storage/internal.js.map +1 -1
  128. package/dist/blob-storage/media-type.d.ts +12 -0
  129. package/dist/blob-storage/media-type.d.ts.map +1 -1
  130. package/dist/bootstrap/index.js +54 -48
  131. package/dist/bootstrap/index.js.map +2 -2
  132. package/dist/{chunk-t6vq7bff.js → chunk-0bphap9y.js} +5 -5
  133. package/dist/{chunk-7mbzgd9m.js → chunk-1cc1xaf3.js} +3 -3
  134. package/dist/chunk-3jms7je7.js +14 -0
  135. package/dist/chunk-3jms7je7.js.map +10 -0
  136. package/dist/{chunk-s54c868q.js → chunk-3qct2mdc.js} +3 -13
  137. package/dist/chunk-3qct2mdc.js.map +12 -0
  138. package/dist/{chunk-6gmfggss.js → chunk-431pyp2c.js} +3 -3
  139. package/dist/{chunk-c85m1hyj.js → chunk-447a5c0p.js} +2 -2
  140. package/dist/chunk-48qjhh6v.js +185 -0
  141. package/dist/chunk-48qjhh6v.js.map +13 -0
  142. package/dist/{chunk-80mc0971.js → chunk-561r0yc9.js} +8 -8
  143. package/dist/{chunk-5e43w60z.js → chunk-5948n82c.js} +2 -2
  144. package/dist/{chunk-yzwja0mj.js → chunk-5hx48dnn.js} +2 -2
  145. package/dist/{chunk-tjb1mk5t.js → chunk-5vems3nx.js} +5 -6
  146. package/dist/{chunk-tjb1mk5t.js.map → chunk-5vems3nx.js.map} +3 -3
  147. package/dist/{chunk-aff7cyea.js → chunk-61y5xs4p.js} +563 -167
  148. package/dist/{chunk-aff7cyea.js.map → chunk-61y5xs4p.js.map} +12 -9
  149. package/dist/chunk-65abf64x.js +13 -0
  150. package/dist/chunk-65abf64x.js.map +10 -0
  151. package/dist/{chunk-z3y5kg1x.js → chunk-6eqsgvxk.js} +3 -3
  152. package/dist/{chunk-z3y5kg1x.js.map → chunk-6eqsgvxk.js.map} +2 -2
  153. package/dist/chunk-6rqgmkde.js +2028 -0
  154. package/dist/chunk-6rqgmkde.js.map +29 -0
  155. package/dist/{chunk-y7rqfrgg.js → chunk-6vb4st8k.js} +29 -38
  156. package/dist/chunk-6vb4st8k.js.map +23 -0
  157. package/dist/chunk-7q8t23v4.js +467 -0
  158. package/dist/chunk-7q8t23v4.js.map +14 -0
  159. package/dist/{chunk-kyzq4wy9.js → chunk-858emn8m.js} +17 -17
  160. package/dist/chunk-858emn8m.js.map +18 -0
  161. package/dist/{chunk-hvsb78a1.js → chunk-8frc8a4j.js} +26 -26
  162. package/dist/{chunk-hvsb78a1.js.map → chunk-8frc8a4j.js.map} +2 -2
  163. package/dist/{chunk-3zxk45er.js → chunk-8ncg20rd.js} +3 -68
  164. package/dist/{chunk-3zxk45er.js.map → chunk-8ncg20rd.js.map} +4 -5
  165. package/dist/{chunk-j2bp5ryw.js → chunk-918wwnaa.js} +495 -28
  166. package/dist/{chunk-j2bp5ryw.js.map → chunk-918wwnaa.js.map} +14 -12
  167. package/dist/{chunk-1f7wpmyp.js → chunk-9j4jw7as.js} +103 -110
  168. package/dist/chunk-9j4jw7as.js.map +14 -0
  169. package/dist/chunk-9kgkfg6v.js +502 -0
  170. package/dist/chunk-9kgkfg6v.js.map +14 -0
  171. package/dist/chunk-a3faa34j.js +74 -0
  172. package/dist/chunk-a3faa34j.js.map +10 -0
  173. package/dist/{chunk-ey3pyej1.js → chunk-akzryx9h.js} +347 -1174
  174. package/dist/{chunk-ey3pyej1.js.map → chunk-akzryx9h.js.map} +19 -25
  175. package/dist/chunk-arns890k.js +10 -0
  176. package/dist/chunk-arns890k.js.map +10 -0
  177. package/dist/{chunk-zrmy8zvw.js → chunk-bk9svbcq.js} +11 -11
  178. package/dist/{chunk-zrmy8zvw.js.map → chunk-bk9svbcq.js.map} +2 -2
  179. package/dist/{chunk-hkc3jct7.js → chunk-c06hmxyy.js} +2 -10
  180. package/dist/chunk-c06hmxyy.js.map +10 -0
  181. package/dist/{chunk-q1vkr2ys.js → chunk-c1rxbz5y.js} +3 -3
  182. package/dist/chunk-cfj9dfbb.js +288 -0
  183. package/dist/chunk-cfj9dfbb.js.map +12 -0
  184. package/dist/{chunk-4tcx876c.js → chunk-cn0fwwhy.js} +19 -19
  185. package/dist/{chunk-4tcx876c.js.map → chunk-cn0fwwhy.js.map} +1 -1
  186. package/dist/{chunk-gc4ntf7d.js → chunk-cwdzcv37.js} +1 -1
  187. package/dist/{chunk-fa02jy15.js → chunk-cy4mbddw.js} +1 -1
  188. package/dist/{chunk-7kg3k1m9.js → chunk-d09e3rax.js} +1 -1
  189. package/dist/chunk-d5rjr8c0.js +176 -0
  190. package/dist/chunk-d5rjr8c0.js.map +12 -0
  191. package/dist/{chunk-rhg02hxq.js → chunk-d7dnxdep.js} +3 -3
  192. package/dist/{chunk-b38szspf.js → chunk-dhcv7yxc.js} +1 -1
  193. package/dist/{chunk-b38szspf.js.map → chunk-dhcv7yxc.js.map} +1 -1
  194. package/dist/{chunk-enpsx8k5.js → chunk-dhdha526.js} +23 -21
  195. package/dist/chunk-dhdha526.js.map +10 -0
  196. package/dist/{chunk-8mx7qw3y.js → chunk-dvd2fp9q.js} +2 -2
  197. package/dist/{chunk-8mx7qw3y.js.map → chunk-dvd2fp9q.js.map} +3 -3
  198. package/dist/{chunk-bwjcehza.js → chunk-e17zdm62.js} +6 -12
  199. package/dist/{chunk-bwjcehza.js.map → chunk-e17zdm62.js.map} +3 -4
  200. package/dist/{chunk-tpn40322.js → chunk-e6k4thh5.js} +11 -10
  201. package/dist/{chunk-tpn40322.js.map → chunk-e6k4thh5.js.map} +3 -3
  202. package/dist/{chunk-tw03bsmb.js → chunk-eptrvnby.js} +224 -3
  203. package/dist/chunk-eptrvnby.js.map +12 -0
  204. package/dist/{chunk-xt1zt7gv.js → chunk-f4pamkt9.js} +30 -23
  205. package/dist/chunk-f4pamkt9.js.map +12 -0
  206. package/dist/chunk-ff5xkv0p.js +211 -0
  207. package/dist/chunk-ff5xkv0p.js.map +10 -0
  208. package/dist/{chunk-bpgy64fw.js → chunk-g257jwnc.js} +10 -4
  209. package/dist/{chunk-bpgy64fw.js.map → chunk-g257jwnc.js.map} +3 -3
  210. package/dist/chunk-g5bvzyyr.js +32 -0
  211. package/dist/chunk-g5bvzyyr.js.map +10 -0
  212. package/dist/{chunk-2jntasmh.js → chunk-hcbyfxbe.js} +25 -49
  213. package/dist/chunk-hcbyfxbe.js.map +12 -0
  214. package/dist/chunk-hke9aeen.js +9 -0
  215. package/dist/chunk-hke9aeen.js.map +10 -0
  216. package/dist/{chunk-1sr8ryzk.js → chunk-hwksyjks.js} +122 -1
  217. package/dist/{chunk-1sr8ryzk.js.map → chunk-hwksyjks.js.map} +3 -3
  218. package/dist/chunk-jcfw4h7m.js +9 -0
  219. package/dist/chunk-jcfw4h7m.js.map +10 -0
  220. package/dist/{chunk-85yvv5n0.js → chunk-k43ct2ke.js} +20 -11
  221. package/dist/chunk-k43ct2ke.js.map +12 -0
  222. package/dist/{chunk-dnmadg9k.js → chunk-kge7k6ey.js} +40 -8
  223. package/dist/chunk-kge7k6ey.js.map +15 -0
  224. package/dist/{chunk-wz0xs816.js → chunk-ky3j490c.js} +2 -2
  225. package/dist/chunk-mjddfa7k.js +129 -0
  226. package/dist/chunk-mjddfa7k.js.map +12 -0
  227. package/dist/{chunk-3gnrh4ve.js → chunk-nn5xnx3s.js} +86 -111
  228. package/dist/chunk-nn5xnx3s.js.map +40 -0
  229. package/dist/{chunk-rz53yb4v.js → chunk-q5e5tv4b.js} +35 -7
  230. package/dist/{chunk-rz53yb4v.js.map → chunk-q5e5tv4b.js.map} +3 -3
  231. package/dist/{chunk-vyf9kfqf.js → chunk-q7gn29y3.js} +1 -1
  232. package/dist/{chunk-d2ync1v3.js → chunk-rmakanzx.js} +10 -12
  233. package/dist/{chunk-d2ync1v3.js.map → chunk-rmakanzx.js.map} +3 -4
  234. package/dist/{chunk-v9xd5wzd.js → chunk-s7jg7pmn.js} +1 -1
  235. package/dist/chunk-tbc1ngpd.js +642 -0
  236. package/dist/chunk-tbc1ngpd.js.map +18 -0
  237. package/dist/chunk-twe4dx8p.js +676 -0
  238. package/dist/chunk-twe4dx8p.js.map +15 -0
  239. package/dist/{chunk-nre82s12.js → chunk-vf57cr4t.js} +2 -2
  240. package/dist/{chunk-9ybhtmg4.js → chunk-vvxtn22d.js} +1 -1
  241. package/dist/{chunk-jhm3zsa7.js → chunk-wkv3h3q7.js} +64 -2
  242. package/dist/{chunk-jhm3zsa7.js.map → chunk-wkv3h3q7.js.map} +3 -3
  243. package/dist/chunk-x0v3jd47.js +124 -0
  244. package/dist/chunk-x0v3jd47.js.map +10 -0
  245. package/dist/{chunk-7t429e3f.js → chunk-xvsc5m8n.js} +1 -1
  246. package/dist/{chunk-kg5j6fct.js → chunk-y5tah2kf.js} +1 -1
  247. package/dist/{chunk-52bk93x8.js → chunk-z58tm0hm.js} +2 -2
  248. package/dist/datasets/builders.d.ts +15 -2
  249. package/dist/datasets/builders.d.ts.map +1 -1
  250. package/dist/datasets/column-index.d.ts +7 -0
  251. package/dist/datasets/column-index.d.ts.map +1 -0
  252. package/dist/datasets/execution.d.ts +3 -2
  253. package/dist/datasets/execution.d.ts.map +1 -1
  254. package/dist/datasets/write.js +8 -8
  255. package/dist/deploy/internal.js +4 -3
  256. package/dist/deploy/internal.js.map +4 -4
  257. package/dist/deploy/services.d.ts.map +1 -1
  258. package/dist/deploy/types.d.ts +1 -2
  259. package/dist/deploy/types.d.ts.map +1 -1
  260. package/dist/error-reporting/internal.js +4 -4
  261. package/dist/errors/internal.d.ts +1 -0
  262. package/dist/errors/internal.d.ts.map +1 -1
  263. package/dist/errors/internal.js +7 -4
  264. package/dist/errors/internal.js.map +1 -1
  265. package/dist/events/execution.d.ts +12 -2
  266. package/dist/events/execution.d.ts.map +1 -1
  267. package/dist/events/index.js +4 -4
  268. package/dist/execution/agent.js +56 -49
  269. package/dist/execution/agent.js.map +1 -1
  270. package/dist/execution/authorization.d.ts.map +1 -1
  271. package/dist/execution/authorized-object-reader.d.ts +52 -11
  272. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  273. package/dist/execution/object-reader-clearance.d.ts +41 -0
  274. package/dist/execution/object-reader-clearance.d.ts.map +1 -0
  275. package/dist/execution/object-reader-ontology.d.ts +12 -0
  276. package/dist/execution/object-reader-ontology.d.ts.map +1 -0
  277. package/dist/execution/object-reader-security.d.ts +45 -0
  278. package/dist/execution/object-reader-security.d.ts.map +1 -0
  279. package/dist/execution/primitive.js +54 -47
  280. package/dist/execution/primitive.js.map +1 -1
  281. package/dist/execution/request.js +49 -42
  282. package/dist/execution/request.js.map +2 -2
  283. package/dist/http/api-routes.d.ts.map +1 -1
  284. package/dist/http/index.js +1 -1
  285. package/dist/index.d.ts +23 -7
  286. package/dist/index.d.ts.map +1 -1
  287. package/dist/index.js +111 -109
  288. package/dist/index.js.map +1 -1
  289. package/dist/lake-storage/in-memory.d.ts +1 -0
  290. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  291. package/dist/lake-storage/index.d.ts +6 -3
  292. package/dist/lake-storage/index.d.ts.map +1 -1
  293. package/dist/lake-storage/index.js +21 -13
  294. package/dist/lake-storage/index.js.map +1 -1
  295. package/dist/lake-storage/lineage.d.ts +94 -0
  296. package/dist/lake-storage/lineage.d.ts.map +1 -0
  297. package/dist/lake-storage/sql-transforms.d.ts +45 -0
  298. package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
  299. package/dist/lake-storage/types.d.ts +55 -1
  300. package/dist/lake-storage/types.d.ts.map +1 -1
  301. package/dist/lake-storage/version-inputs.d.ts +14 -3
  302. package/dist/lake-storage/version-inputs.d.ts.map +1 -1
  303. package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
  304. package/dist/materializer/index.js +31 -30
  305. package/dist/materializer/index.js.map +1 -1
  306. package/dist/models/execution/index.js +26 -25
  307. package/dist/models/execution/index.js.map +1 -1
  308. package/dist/objects/clearance-redaction.d.ts +27 -0
  309. package/dist/objects/clearance-redaction.d.ts.map +1 -0
  310. package/dist/objects/index.js +54 -47
  311. package/dist/objects/index.js.map +1 -1
  312. package/dist/objects/link/authorization.d.ts +8 -5
  313. package/dist/objects/link/authorization.d.ts.map +1 -1
  314. package/dist/objects/link/upsert-batch.d.ts.map +1 -1
  315. package/dist/objects/object/delete.d.ts.map +1 -1
  316. package/dist/objects/object/upsert-batch.d.ts.map +1 -1
  317. package/dist/objects/object/upsert.d.ts.map +1 -1
  318. package/dist/objects/property-clearance.d.ts +47 -24
  319. package/dist/objects/property-clearance.d.ts.map +1 -1
  320. package/dist/objects/query/clearance-admission.d.ts +10 -0
  321. package/dist/objects/query/clearance-admission.d.ts.map +1 -0
  322. package/dist/objects/query/index.js +29 -28
  323. package/dist/objects/query/index.js.map +1 -1
  324. package/dist/objects/query/link-query-clearance.d.ts +21 -0
  325. package/dist/objects/query/link-query-clearance.d.ts.map +1 -0
  326. package/dist/objects/vectors/handle.d.ts.map +1 -1
  327. package/dist/objects/vectors/profile.d.ts +5 -0
  328. package/dist/objects/vectors/profile.d.ts.map +1 -1
  329. package/dist/ontology/builders.d.ts.map +1 -1
  330. package/dist/ontology/docs-markdown.d.ts +1 -1
  331. package/dist/ontology/docs-markdown.d.ts.map +1 -1
  332. package/dist/ontology/index.js +7 -7
  333. package/dist/ontology/internal.js +4 -4
  334. package/dist/ontology/internal.js.map +1 -1
  335. package/dist/pipelines/index.d.ts +2 -0
  336. package/dist/pipelines/index.d.ts.map +1 -1
  337. package/dist/pipelines/index.js +47 -35
  338. package/dist/pipelines/index.js.map +1 -1
  339. package/dist/pipelines/lineage.d.ts +17 -0
  340. package/dist/pipelines/lineage.d.ts.map +1 -0
  341. package/dist/projections/internal.d.ts +2 -2
  342. package/dist/projections/internal.js +30 -29
  343. package/dist/projections/internal.js.map +1 -1
  344. package/dist/runtime/create.d.ts +3 -0
  345. package/dist/runtime/create.d.ts.map +1 -1
  346. package/dist/runtime/host.d.ts +6 -0
  347. package/dist/runtime/host.d.ts.map +1 -1
  348. package/dist/runtime/internal.d.ts +2 -0
  349. package/dist/runtime/internal.d.ts.map +1 -1
  350. package/dist/runtime/internal.js +46 -42
  351. package/dist/runtime/internal.js.map +1 -1
  352. package/dist/runtime/ontology-mutations.d.ts +2 -0
  353. package/dist/runtime/ontology-mutations.d.ts.map +1 -1
  354. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  355. package/dist/runtime/sixb.d.ts +8 -0
  356. package/dist/runtime/sixb.d.ts.map +1 -1
  357. package/dist/sandboxes/auth.d.ts +16 -0
  358. package/dist/sandboxes/auth.d.ts.map +1 -1
  359. package/dist/sandboxes/config.d.ts.map +1 -1
  360. package/dist/sandboxes/configuration.d.ts +26 -0
  361. package/dist/sandboxes/configuration.d.ts.map +1 -1
  362. package/dist/sandboxes/index.d.ts +1 -1
  363. package/dist/sandboxes/index.d.ts.map +1 -1
  364. package/dist/sandboxes/index.js +14 -13
  365. package/dist/sandboxes/index.js.map +1 -1
  366. package/dist/sandboxes/sandbox.d.ts +28 -5
  367. package/dist/sandboxes/sandbox.d.ts.map +1 -1
  368. package/dist/security/applied-markings-contribution.d.ts +58 -0
  369. package/dist/security/applied-markings-contribution.d.ts.map +1 -0
  370. package/dist/security/applied-markings-host.d.ts +10 -0
  371. package/dist/security/applied-markings-host.d.ts.map +1 -0
  372. package/dist/security/applied-markings-snapshot.d.ts +67 -0
  373. package/dist/security/applied-markings-snapshot.d.ts.map +1 -0
  374. package/dist/security/applied-markings.d.ts +73 -0
  375. package/dist/security/applied-markings.d.ts.map +1 -0
  376. package/dist/security/builders.d.ts.map +1 -1
  377. package/dist/security/dataset-version-markings.d.ts +47 -0
  378. package/dist/security/dataset-version-markings.d.ts.map +1 -0
  379. package/dist/security/every.d.ts +1 -4
  380. package/dist/security/every.d.ts.map +1 -1
  381. package/dist/security/grants.d.ts +4 -5
  382. package/dist/security/grants.d.ts.map +1 -1
  383. package/dist/security/index.d.ts +2 -2
  384. package/dist/security/index.d.ts.map +1 -1
  385. package/dist/security/internal.d.ts +15 -0
  386. package/dist/security/internal.d.ts.map +1 -0
  387. package/dist/security/internal.js +135 -0
  388. package/dist/security/internal.js.map +10 -0
  389. package/dist/security/marking-propagation.d.ts +62 -0
  390. package/dist/security/marking-propagation.d.ts.map +1 -0
  391. package/dist/security/marking-sets.d.ts +14 -0
  392. package/dist/security/marking-sets.d.ts.map +1 -0
  393. package/dist/security/markings.d.ts +6 -3
  394. package/dist/security/markings.d.ts.map +1 -1
  395. package/dist/security/membership-policies.d.ts.map +1 -1
  396. package/dist/security/pipeline-markings.d.ts +20 -0
  397. package/dist/security/pipeline-markings.d.ts.map +1 -0
  398. package/dist/security/project.d.ts +4 -0
  399. package/dist/security/project.d.ts.map +1 -0
  400. package/dist/security/projection-markings.d.ts +71 -0
  401. package/dist/security/projection-markings.d.ts.map +1 -0
  402. package/dist/security/public.d.ts +10 -0
  403. package/dist/security/public.d.ts.map +1 -0
  404. package/dist/security/public.js +10 -0
  405. package/dist/security/public.js.map +9 -0
  406. package/dist/security/redactions.d.ts +4 -1
  407. package/dist/security/redactions.d.ts.map +1 -1
  408. package/dist/security/registry.d.ts +0 -1
  409. package/dist/security/registry.d.ts.map +1 -1
  410. package/dist/security/types.d.ts +34 -19
  411. package/dist/security/types.d.ts.map +1 -1
  412. package/dist/security/validation.d.ts +0 -6
  413. package/dist/security/validation.d.ts.map +1 -1
  414. package/dist/shares/internal.js +25 -24
  415. package/dist/shares/internal.js.map +2 -2
  416. package/dist/storage/action-runs/failure.js +3 -3
  417. package/dist/storage/action-runs/in-memory.d.ts +4 -0
  418. package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
  419. package/dist/storage/action-runs/types.d.ts +8 -0
  420. package/dist/storage/action-runs/types.d.ts.map +1 -1
  421. package/dist/storage/activity/in-memory.d.ts +55 -0
  422. package/dist/storage/activity/in-memory.d.ts.map +1 -0
  423. package/dist/storage/activity/index.d.ts +3 -0
  424. package/dist/storage/activity/index.d.ts.map +1 -0
  425. package/dist/storage/activity/policy.d.ts +96 -0
  426. package/dist/storage/activity/policy.d.ts.map +1 -0
  427. package/dist/storage/activity/types.d.ts +191 -0
  428. package/dist/storage/activity/types.d.ts.map +1 -0
  429. package/dist/storage/agents/in-memory.d.ts +4 -0
  430. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  431. package/dist/storage/agents/provider.d.ts.map +1 -1
  432. package/dist/storage/agents/provider.js +2 -5
  433. package/dist/storage/agents/provider.js.map +1 -1
  434. package/dist/storage/agents/types.d.ts +10 -9
  435. package/dist/storage/agents/types.d.ts.map +1 -1
  436. package/dist/storage/ai-limits/enforcement.js +3 -3
  437. package/dist/storage/artifacts/errors.d.ts +8 -0
  438. package/dist/storage/artifacts/errors.d.ts.map +1 -0
  439. package/dist/storage/artifacts/in-memory.d.ts +34 -0
  440. package/dist/storage/artifacts/in-memory.d.ts.map +1 -0
  441. package/dist/storage/artifacts/index.d.ts +5 -0
  442. package/dist/storage/artifacts/index.d.ts.map +1 -0
  443. package/dist/storage/artifacts/record.d.ts +17 -0
  444. package/dist/storage/artifacts/record.d.ts.map +1 -0
  445. package/dist/storage/artifacts/types.d.ts +184 -0
  446. package/dist/storage/artifacts/types.d.ts.map +1 -0
  447. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  448. package/dist/storage/auth/in-memory/magic-links.d.ts.map +1 -1
  449. package/dist/storage/auth/in-memory/oidc-attempts.d.ts.map +1 -1
  450. package/dist/storage/auth/in-memory/sessions.d.ts +2 -11
  451. package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
  452. package/dist/storage/auth/in-memory/shared.d.ts +1 -2
  453. package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
  454. package/dist/storage/auth/index.d.ts +1 -1
  455. package/dist/storage/auth/index.d.ts.map +1 -1
  456. package/dist/storage/auth/types.d.ts +20 -17
  457. package/dist/storage/auth/types.d.ts.map +1 -1
  458. package/dist/storage/connector-connections/provider.js +2 -2
  459. package/dist/storage/executions/in-memory.d.ts +2 -1
  460. package/dist/storage/executions/in-memory.d.ts.map +1 -1
  461. package/dist/storage/executions/index.d.ts +1 -1
  462. package/dist/storage/executions/index.d.ts.map +1 -1
  463. package/dist/storage/executions/provider.d.ts +2 -0
  464. package/dist/storage/executions/provider.d.ts.map +1 -1
  465. package/dist/storage/executions/provider.js +9 -223
  466. package/dist/storage/executions/provider.js.map +3 -4
  467. package/dist/storage/executions/types.d.ts +31 -0
  468. package/dist/storage/executions/types.d.ts.map +1 -1
  469. package/dist/storage/file-upload-sessions/provider.js +12 -12
  470. package/dist/storage/in-memory/index.d.ts +8 -0
  471. package/dist/storage/in-memory/index.d.ts.map +1 -1
  472. package/dist/storage/index.d.ts +6 -4
  473. package/dist/storage/index.d.ts.map +1 -1
  474. package/dist/storage/index.js +47 -46
  475. package/dist/storage/index.js.map +1 -1
  476. package/dist/storage/internal.d.ts +3 -0
  477. package/dist/storage/internal.d.ts.map +1 -1
  478. package/dist/storage/internal.js +66 -16
  479. package/dist/storage/internal.js.map +1 -1
  480. package/dist/storage/ontology/in-memory/sources.d.ts +2 -1
  481. package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
  482. package/dist/storage/ontology/index.d.ts +1 -1
  483. package/dist/storage/ontology/index.d.ts.map +1 -1
  484. package/dist/storage/ontology/sources.d.ts +15 -0
  485. package/dist/storage/ontology/sources.d.ts.map +1 -1
  486. package/dist/storage/projection-runs/provider.js +3 -3
  487. package/dist/storage/share-grants/in-memory.d.ts +2 -1
  488. package/dist/storage/share-grants/in-memory.d.ts.map +1 -1
  489. package/dist/storage/share-grants/index.d.ts +1 -1
  490. package/dist/storage/share-grants/index.d.ts.map +1 -1
  491. package/dist/storage/share-grants/types.d.ts +6 -0
  492. package/dist/storage/share-grants/types.d.ts.map +1 -1
  493. package/dist/storage/types.d.ts +4 -0
  494. package/dist/storage/types.d.ts.map +1 -1
  495. package/dist/storage/workflow-runs/in-memory.d.ts +4 -0
  496. package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
  497. package/dist/storage/workflow-runs/provider.js +14 -13
  498. package/dist/storage/workflow-runs/provider.js.map +1 -1
  499. package/dist/storage/workflow-runs/types.d.ts +5 -0
  500. package/dist/storage/workflow-runs/types.d.ts.map +1 -1
  501. package/dist/syncs/index.js +35 -34
  502. package/dist/syncs/index.js.map +1 -1
  503. package/dist/testing/action-run-storage-contract.d.ts.map +1 -1
  504. package/dist/testing/activity-storage-contract.d.ts +14 -0
  505. package/dist/testing/activity-storage-contract.d.ts.map +1 -0
  506. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  507. package/dist/testing/artifact-storage-contract.d.ts +13 -0
  508. package/dist/testing/artifact-storage-contract.d.ts.map +1 -0
  509. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  510. package/dist/testing/execution-storage-contract.d.ts.map +1 -1
  511. package/dist/testing/index.d.ts +2 -0
  512. package/dist/testing/index.d.ts.map +1 -1
  513. package/dist/testing/index.js +4493 -3225
  514. package/dist/testing/index.js.map +14 -12
  515. package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
  516. package/dist/testing/lake-storage-contract.d.ts +2 -0
  517. package/dist/testing/lake-storage-contract.d.ts.map +1 -1
  518. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  519. package/dist/testing/share-grant-storage-contract.d.ts.map +1 -1
  520. package/dist/webhooks/internal.js +28 -27
  521. package/dist/webhooks/internal.js.map +2 -2
  522. package/dist/workers/index.js +2 -2
  523. package/dist/workflows/builders.d.ts.map +1 -1
  524. package/dist/workflows/index.js +57 -51
  525. package/dist/workflows/index.js.map +1 -1
  526. package/dist/workflows/types.d.ts +9 -0
  527. package/dist/workflows/types.d.ts.map +1 -1
  528. package/dist/workflows/validation.d.ts +7 -0
  529. package/dist/workflows/validation.d.ts.map +1 -1
  530. package/package.json +32 -2
  531. package/src/actions/execution.ts +18 -13
  532. package/src/actions/request.ts +18 -3
  533. package/src/actions/run-authorization.ts +23 -0
  534. package/src/activity/README.md +155 -0
  535. package/src/activity/connection.ts +217 -0
  536. package/src/activity/device.ts +41 -0
  537. package/src/activity/execution.ts +210 -0
  538. package/src/activity/service.ts +274 -0
  539. package/src/activity/shares.ts +62 -0
  540. package/src/activity/timeline.ts +424 -0
  541. package/src/agents/index.ts +8 -3
  542. package/src/agents/request.ts +5 -0
  543. package/src/agents/skills.ts +6 -0
  544. package/src/agents/types.ts +8 -8
  545. package/src/agents/validation.ts +2 -0
  546. package/src/artifacts/address.ts +132 -0
  547. package/src/artifacts/csv.ts +108 -0
  548. package/src/artifacts/errors.ts +21 -0
  549. package/src/artifacts/execution.ts +153 -0
  550. package/src/artifacts/frames/assets.ts +88 -0
  551. package/src/artifacts/frames/grants.ts +124 -0
  552. package/src/artifacts/frames/index.ts +15 -0
  553. package/src/artifacts/frames/kit.ts +392 -0
  554. package/src/artifacts/frames/probe.ts +309 -0
  555. package/src/artifacts/frames/protocol.ts +174 -0
  556. package/src/artifacts/frames/runtime.ts +213 -0
  557. package/src/artifacts/html.ts +25 -0
  558. package/src/artifacts/ids.ts +18 -0
  559. package/src/artifacts/index.ts +61 -0
  560. package/src/artifacts/kinds.ts +8 -0
  561. package/src/artifacts/limits.ts +27 -0
  562. package/src/artifacts/outline.ts +62 -0
  563. package/src/artifacts/publish/files.ts +87 -0
  564. package/src/artifacts/publish/index.ts +12 -0
  565. package/src/artifacts/publish/publish.ts +250 -0
  566. package/src/artifacts/publish/references.ts +130 -0
  567. package/src/artifacts/publish/validate/document.ts +114 -0
  568. package/src/artifacts/publish/validate/file.ts +19 -0
  569. package/src/artifacts/publish/validate/sheet.ts +251 -0
  570. package/src/artifacts/publish/validate/slides.ts +134 -0
  571. package/src/artifacts/references.ts +11 -0
  572. package/src/artifacts/resolve.ts +97 -0
  573. package/src/artifacts/theme.ts +116 -0
  574. package/src/artifacts/warnings.ts +10 -0
  575. package/src/artifacts/workbook.ts +315 -0
  576. package/src/auth/cookies.ts +3 -20
  577. package/src/auth/index.ts +0 -6
  578. package/src/auth/runtime.ts +59 -76
  579. package/src/auth/session-cache.ts +2 -9
  580. package/src/auth/types.ts +4 -8
  581. package/src/auth/validation.ts +0 -2
  582. package/src/authorization/decision.ts +13 -23
  583. package/src/authorization/grant-kinds.ts +33 -28
  584. package/src/authorization/index.ts +0 -1
  585. package/src/authorization/resolve.ts +10 -6
  586. package/src/blob-storage/internal.ts +1 -1
  587. package/src/blob-storage/media-type.ts +69 -0
  588. package/src/datasets/builders.ts +66 -2
  589. package/src/datasets/column-index.ts +19 -0
  590. package/src/datasets/execution.ts +23 -9
  591. package/src/deploy/services.ts +0 -1
  592. package/src/deploy/types.ts +1 -2
  593. package/src/deploy/validation.ts +3 -1
  594. package/src/errors/internal.ts +1 -0
  595. package/src/events/execution.ts +134 -21
  596. package/src/execution/authorization.ts +11 -5
  597. package/src/execution/authorized-object-reader.ts +270 -256
  598. package/src/execution/object-reader-clearance.ts +91 -0
  599. package/src/execution/object-reader-ontology.ts +63 -0
  600. package/src/execution/object-reader-security.ts +146 -0
  601. package/src/http/api-routes.ts +125 -0
  602. package/src/index.ts +72 -17
  603. package/src/lake-storage/in-memory.ts +26 -3
  604. package/src/lake-storage/index.ts +13 -1
  605. package/src/lake-storage/lineage.ts +385 -0
  606. package/src/lake-storage/sql-transforms.ts +45 -0
  607. package/src/lake-storage/types.ts +59 -1
  608. package/src/lake-storage/version-inputs.ts +35 -6
  609. package/src/maintenance/ontology-maintenance.ts +15 -0
  610. package/src/models/execution/embedding.ts +6 -6
  611. package/src/objects/clearance-redaction.ts +138 -0
  612. package/src/objects/link/authorization.ts +27 -7
  613. package/src/objects/link/remove.ts +2 -2
  614. package/src/objects/link/upsert-batch.ts +7 -5
  615. package/src/objects/link/upsert.ts +2 -2
  616. package/src/objects/object/delete.ts +2 -0
  617. package/src/objects/object/upsert-batch.ts +2 -4
  618. package/src/objects/object/upsert.ts +2 -3
  619. package/src/objects/property-clearance.ts +171 -152
  620. package/src/objects/query/clearance-admission.ts +112 -0
  621. package/src/objects/query/link-query-clearance.ts +73 -0
  622. package/src/objects/vectors/README.md +4 -0
  623. package/src/objects/vectors/handle.ts +11 -2
  624. package/src/objects/vectors/indexing-generate.ts +2 -2
  625. package/src/objects/vectors/profile.ts +5 -0
  626. package/src/ontology/builders.ts +12 -1
  627. package/src/ontology/docs-markdown.ts +1 -1
  628. package/src/pipelines/index.ts +2 -0
  629. package/src/pipelines/lineage.ts +45 -0
  630. package/src/projections/internal.ts +2 -2
  631. package/src/runtime/create.ts +4 -0
  632. package/src/runtime/host.ts +55 -0
  633. package/src/runtime/internal.ts +2 -0
  634. package/src/runtime/ontology-mutations.ts +19 -4
  635. package/src/runtime/resolve-definitions.ts +66 -3
  636. package/src/runtime/sixb.ts +18 -1
  637. package/src/sandboxes/README.md +29 -7
  638. package/src/sandboxes/auth.ts +16 -0
  639. package/src/sandboxes/config.ts +2 -7
  640. package/src/sandboxes/configuration.ts +61 -7
  641. package/src/sandboxes/index.ts +1 -0
  642. package/src/sandboxes/sandbox.ts +27 -5
  643. package/src/security/applied-markings-contribution.ts +277 -0
  644. package/src/security/applied-markings-host.ts +41 -0
  645. package/src/security/applied-markings-snapshot.ts +235 -0
  646. package/src/security/applied-markings.ts +405 -0
  647. package/src/security/builders.ts +7 -2
  648. package/src/security/dataset-version-markings.ts +163 -0
  649. package/src/security/every.ts +0 -4
  650. package/src/security/grants.ts +42 -27
  651. package/src/security/index.ts +3 -3
  652. package/src/security/internal.ts +18 -0
  653. package/src/security/marking-propagation.ts +255 -0
  654. package/src/security/marking-sets.ts +42 -0
  655. package/src/security/markings.ts +29 -178
  656. package/src/security/membership-policies.ts +3 -1
  657. package/src/security/pipeline-markings.ts +175 -0
  658. package/src/security/project.ts +8 -0
  659. package/src/security/projection-markings.ts +421 -0
  660. package/src/security/public.ts +10 -0
  661. package/src/security/redactions.ts +7 -2
  662. package/src/security/registry.ts +0 -8
  663. package/src/security/types.ts +38 -26
  664. package/src/security/validation.ts +28 -19
  665. package/src/storage/action-runs/in-memory.ts +18 -0
  666. package/src/storage/action-runs/types.ts +8 -0
  667. package/src/storage/activity/in-memory.ts +374 -0
  668. package/src/storage/activity/index.ts +27 -0
  669. package/src/storage/activity/policy.ts +430 -0
  670. package/src/storage/activity/types.ts +211 -0
  671. package/src/storage/agents/in-memory.ts +10 -0
  672. package/src/storage/agents/provider.ts +2 -13
  673. package/src/storage/agents/types.ts +10 -17
  674. package/src/storage/artifacts/errors.ts +16 -0
  675. package/src/storage/artifacts/in-memory.ts +240 -0
  676. package/src/storage/artifacts/index.ts +30 -0
  677. package/src/storage/artifacts/record.ts +200 -0
  678. package/src/storage/artifacts/types.ts +209 -0
  679. package/src/storage/auth/in-memory/auth-storage.ts +0 -18
  680. package/src/storage/auth/in-memory/magic-links.ts +0 -3
  681. package/src/storage/auth/in-memory/oidc-attempts.ts +0 -3
  682. package/src/storage/auth/in-memory/sessions.ts +22 -25
  683. package/src/storage/auth/in-memory/shared.ts +1 -10
  684. package/src/storage/auth/index.ts +2 -0
  685. package/src/storage/auth/types.ts +20 -18
  686. package/src/storage/executions/in-memory.ts +61 -1
  687. package/src/storage/executions/index.ts +3 -0
  688. package/src/storage/executions/provider.ts +12 -0
  689. package/src/storage/executions/types.ts +30 -0
  690. package/src/storage/in-memory/index.ts +16 -0
  691. package/src/storage/index.ts +63 -0
  692. package/src/storage/internal.ts +30 -0
  693. package/src/storage/ontology/in-memory/sources.ts +23 -0
  694. package/src/storage/ontology/index.ts +2 -0
  695. package/src/storage/ontology/sources.ts +17 -0
  696. package/src/storage/share-grants/in-memory.ts +8 -0
  697. package/src/storage/share-grants/index.ts +1 -0
  698. package/src/storage/share-grants/types.ts +8 -0
  699. package/src/storage/types.ts +4 -0
  700. package/src/storage/workflow-runs/in-memory.ts +16 -0
  701. package/src/storage/workflow-runs/types.ts +5 -0
  702. package/src/testing/action-run-storage-contract.ts +25 -0
  703. package/src/testing/activity-storage-contract.ts +840 -0
  704. package/src/testing/agent-storage-contract.ts +22 -21
  705. package/src/testing/artifact-storage-contract.ts +517 -0
  706. package/src/testing/auth-storage-contract.ts +61 -107
  707. package/src/testing/execution-storage-contract.ts +147 -3
  708. package/src/testing/index.ts +9 -0
  709. package/src/testing/lake-merge-storage-contract.ts +38 -0
  710. package/src/testing/lake-storage-contract.ts +247 -2
  711. package/src/testing/materializer-storage-contract.ts +1 -0
  712. package/src/testing/ontology-storage-contract.ts +57 -2
  713. package/src/testing/share-grant-storage-contract.ts +15 -0
  714. package/src/workflows/builders.ts +14 -0
  715. package/src/workflows/types.ts +9 -0
  716. package/src/workflows/validation.ts +72 -0
  717. package/dist/auth/audience.d.ts +0 -8
  718. package/dist/auth/audience.d.ts.map +0 -1
  719. package/dist/authorization/application-access.d.ts +0 -18
  720. package/dist/authorization/application-access.d.ts.map +0 -1
  721. package/dist/chunk-1f7wpmyp.js.map +0 -14
  722. package/dist/chunk-1k89ecfr.js +0 -85
  723. package/dist/chunk-1k89ecfr.js.map +0 -10
  724. package/dist/chunk-2jntasmh.js.map +0 -13
  725. package/dist/chunk-3gnrh4ve.js.map +0 -40
  726. package/dist/chunk-85yvv5n0.js.map +0 -12
  727. package/dist/chunk-9gyp8hg1.js +0 -363
  728. package/dist/chunk-9gyp8hg1.js.map +0 -14
  729. package/dist/chunk-dnmadg9k.js.map +0 -15
  730. package/dist/chunk-enpsx8k5.js.map +0 -10
  731. package/dist/chunk-hkc3jct7.js.map +0 -10
  732. package/dist/chunk-kyzq4wy9.js.map +0 -18
  733. package/dist/chunk-s16apyk9.js +0 -256
  734. package/dist/chunk-s16apyk9.js.map +0 -16
  735. package/dist/chunk-s54c868q.js.map +0 -12
  736. package/dist/chunk-tw03bsmb.js.map +0 -11
  737. package/dist/chunk-wwdfe68s.js +0 -128
  738. package/dist/chunk-wwdfe68s.js.map +0 -11
  739. package/dist/chunk-xt1zt7gv.js.map +0 -13
  740. package/dist/chunk-y7rqfrgg.js.map +0 -24
  741. package/dist/security/applications.d.ts +0 -15
  742. package/dist/security/applications.d.ts.map +0 -1
  743. package/src/auth/audience.ts +0 -28
  744. package/src/authorization/application-access.ts +0 -34
  745. package/src/security/applications.ts +0 -11
  746. /package/dist/{chunk-t6vq7bff.js.map → chunk-0bphap9y.js.map} +0 -0
  747. /package/dist/{chunk-7mbzgd9m.js.map → chunk-1cc1xaf3.js.map} +0 -0
  748. /package/dist/{chunk-6gmfggss.js.map → chunk-431pyp2c.js.map} +0 -0
  749. /package/dist/{chunk-c85m1hyj.js.map → chunk-447a5c0p.js.map} +0 -0
  750. /package/dist/{chunk-80mc0971.js.map → chunk-561r0yc9.js.map} +0 -0
  751. /package/dist/{chunk-5e43w60z.js.map → chunk-5948n82c.js.map} +0 -0
  752. /package/dist/{chunk-yzwja0mj.js.map → chunk-5hx48dnn.js.map} +0 -0
  753. /package/dist/{chunk-q1vkr2ys.js.map → chunk-c1rxbz5y.js.map} +0 -0
  754. /package/dist/{chunk-gc4ntf7d.js.map → chunk-cwdzcv37.js.map} +0 -0
  755. /package/dist/{chunk-fa02jy15.js.map → chunk-cy4mbddw.js.map} +0 -0
  756. /package/dist/{chunk-7kg3k1m9.js.map → chunk-d09e3rax.js.map} +0 -0
  757. /package/dist/{chunk-rhg02hxq.js.map → chunk-d7dnxdep.js.map} +0 -0
  758. /package/dist/{chunk-wz0xs816.js.map → chunk-ky3j490c.js.map} +0 -0
  759. /package/dist/{chunk-vyf9kfqf.js.map → chunk-q7gn29y3.js.map} +0 -0
  760. /package/dist/{chunk-v9xd5wzd.js.map → chunk-s7jg7pmn.js.map} +0 -0
  761. /package/dist/{chunk-nre82s12.js.map → chunk-vf57cr4t.js.map} +0 -0
  762. /package/dist/{chunk-9ybhtmg4.js.map → chunk-vvxtn22d.js.map} +0 -0
  763. /package/dist/{chunk-7t429e3f.js.map → chunk-xvsc5m8n.js.map} +0 -0
  764. /package/dist/{chunk-kg5j6fct.js.map → chunk-y5tah2kf.js.map} +0 -0
  765. /package/dist/{chunk-52bk93x8.js.map → chunk-z58tm0hm.js.map} +0 -0
@@ -0,0 +1,840 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type {
3
+ ActivityEventInput,
4
+ ActivityStorage,
5
+ AppendActivityInput,
6
+ } from "../storage/activity/types"
7
+ import type { Storage } from "../storage/types"
8
+
9
+ export interface ActivityStorageContractSuiteOptions<TStorage extends Storage = Storage> {
10
+ /** A whole storage, so the suite can also check transaction rollback. */
11
+ readonly createStorage: () => TStorage | Promise<TStorage>
12
+ readonly cleanup?: (storage: TStorage) => void | Promise<void>
13
+ /** Deletes one visit with its page views, as removing a user's history will. */
14
+ readonly deleteVisit: (
15
+ storage: TStorage,
16
+ visit: { readonly projectId: string; readonly id: string }
17
+ ) => Promise<void>
18
+ }
19
+
20
+ const projectId = "activity-contract"
21
+ const at = new Date("2026-10-01T23:59:00.000Z")
22
+ const midnight = new Date("2026-10-02T00:00:00.000Z")
23
+ const minute = 60_000
24
+ const period = {
25
+ projectId,
26
+ from: new Date(at.getTime() - 1_000),
27
+ to: new Date(at.getTime() + 24 * 60 * minute),
28
+ }
29
+
30
+ /** Provider-neutral visit assignment, retry, quota, counting and isolation contract. */
31
+ export function runActivityStorageContractSuite<TStorage extends Storage>(
32
+ label: string,
33
+ options: ActivityStorageContractSuiteOptions<TStorage>
34
+ ): void {
35
+ const withActivity = async (
36
+ run: (activity: ActivityStorage, storage: TStorage) => Promise<void>
37
+ ): Promise<void> => {
38
+ const storage = await options.createStorage()
39
+ try {
40
+ if (!storage.activity) {
41
+ throw new Error("[Sixb] The storage under test has no activity slot.")
42
+ }
43
+ await run(storage.activity, storage)
44
+ } finally {
45
+ await options.cleanup?.(storage)
46
+ }
47
+ }
48
+
49
+ describe(label, () => {
50
+ // Guard proof: store each batch's attribution on the visit; the original source is replaced.
51
+ test("arrival attribution is fixed by the first event and retry-safe", async () => {
52
+ await withActivity(async (activity) => {
53
+ const attribution = { source: "newsletter", medium: "email", campaign: "launch" }
54
+ const first = batch("arrival", {
55
+ events: [{ id: "arrival", type: "page.view", route: "/", attribution }],
56
+ })
57
+ await activity.append(first)
58
+
59
+ const reordered = { campaign: "launch", source: "newsletter", medium: "email" }
60
+ await expect(
61
+ activity.append({
62
+ ...first,
63
+ events: [{ ...pageView("arrival", "/"), attribution: reordered }],
64
+ })
65
+ ).resolves.toEqual({ status: "accepted", accepted: 0 })
66
+ await expect(
67
+ activity.append({ ...first, events: [{ ...pageView("arrival", "/"), attribution: {} }] })
68
+ ).rejects.toThrow("different content")
69
+
70
+ attribution.source = "mutated-after-append"
71
+ await activity.append(
72
+ batch("other-tab", {
73
+ now: later(2),
74
+ events: [{ ...pageView("other-tab", "/next"), attribution: { source: "another" } }],
75
+ })
76
+ )
77
+
78
+ // The other tab continued the visit past midnight; the next day lists its first arrival.
79
+ const nextDay = await activity.list({ ...period, from: midnight, limit: 10 })
80
+ expect(nextDay.visits.map((visit) => visit.attribution)).toEqual([
81
+ { source: "newsletter", medium: "email", campaign: "launch" },
82
+ ])
83
+
84
+ // Activity after inactivity starts a direct visit, on its page; an event without any
85
+ // attribution is not collected.
86
+ await activity.append(
87
+ batch("resumed", {
88
+ now: later(40),
89
+ events: [{ id: "resumed", type: "visit.activity", route: "/next", attribution: {} }],
90
+ })
91
+ )
92
+ await activity.append(batch("legacy", { sessionId: "old-client" }))
93
+ await expect(read(activity, "visit-resumed")).resolves.toMatchObject({
94
+ visit: { attribution: {}, pageViews: 1 },
95
+ pageViews: [{ id: "resumed", sequence: 1, route: "/next" }],
96
+ })
97
+ await expect(read(activity, "visit-legacy")).resolves.toMatchObject({
98
+ visit: { attribution: null },
99
+ })
100
+ })
101
+ })
102
+
103
+ test("invalid attribution cannot partially mutate storage", async () => {
104
+ await withActivity(async (activity) => {
105
+ for (const attribution of [
106
+ { source: "x".repeat(101) },
107
+ { medium: "bad\nlabel" },
108
+ { referrer: "https://example.com/private?token=secret" },
109
+ { referrer: "UPPER.example" },
110
+ ]) {
111
+ await expect(
112
+ activity.append(batch("bad", { events: [{ ...pageView("bad"), attribution }] }))
113
+ ).rejects.toThrow("[Sixb]")
114
+ }
115
+ expect((await activity.summarize(period)).visits).toBe(0)
116
+
117
+ await activity.append(
118
+ batch("shared-referral", {
119
+ sessionId: "shared-session",
120
+ actor: { type: "share", grantId: "grant" },
121
+ events: [
122
+ { ...pageView("shared-referral"), attribution: { referrer: "partner.example" } },
123
+ ],
124
+ })
125
+ )
126
+ const visits = await activity.list({ ...period, limit: 1 })
127
+ expect(visits.visits[0]?.attribution).toEqual({ referrer: "partner.example" })
128
+ })
129
+ })
130
+
131
+ // Guard proof: make planActivityAppend's inactivity comparison always continue the visit.
132
+ test("retried page views neither repeat nor prolong a visit; inactivity starts another", async () => {
133
+ await withActivity(async (activity) => {
134
+ await activity.append(batch("first"))
135
+ await expect(activity.append(batch("first", { now: later(29) }))).resolves.toEqual({
136
+ status: "accepted",
137
+ accepted: 0,
138
+ })
139
+ await activity.append(batch("second", { now: later(30) }))
140
+
141
+ const page = await activity.list({ ...period, limit: 10 })
142
+ expect(page.visits.map((visit) => [visit.id, visit.pageViews])).toEqual([
143
+ ["visit-second", 1],
144
+ ["visit-first", 1],
145
+ ])
146
+ expect(page.visits[1]?.lastSeenAt).toEqual(at)
147
+ })
148
+ })
149
+
150
+ // Guard proof: insert visit.activity events as page views; the timeline and counts grow.
151
+ test("activity keeps a visit alive without adding a page view", async () => {
152
+ await withActivity(async (activity) => {
153
+ await activity.append(batch("view"))
154
+ await expect(activity.append(heartbeat("pulse-1", later(20)))).resolves.toEqual({
155
+ status: "accepted",
156
+ accepted: 1,
157
+ })
158
+ await activity.append(heartbeat("pulse-2", later(45)))
159
+ await activity.append(batch("still-same-visit", { now: later(70) }))
160
+
161
+ const visits = await activity.list({ ...period, limit: 10 })
162
+ expect(visits.visits).toHaveLength(1)
163
+ expect(visits.visits[0]).toMatchObject({
164
+ id: "visit-view",
165
+ startedAt: at,
166
+ lastSeenAt: later(70),
167
+ pageViews: 2,
168
+ })
169
+
170
+ const timeline = await read(activity, "visit-view")
171
+ expect(timeline?.pageViews.map((view) => [view.id, view.sequence])).toEqual([
172
+ ["view", 1],
173
+ ["still-same-visit", 2],
174
+ ])
175
+ expect(await activity.summarize(period)).toMatchObject({ visits: 1, pageViews: 2 })
176
+
177
+ // Activity is not stored, so its id is free and a retry of it counts again.
178
+ await expect(activity.append(heartbeat("pulse-1", later(71)))).resolves.toEqual({
179
+ status: "accepted",
180
+ accepted: 1,
181
+ })
182
+ await expect(activity.append(heartbeat("view", later(72), "/other"))).rejects.toThrow(
183
+ "different content"
184
+ )
185
+ })
186
+ })
187
+
188
+ // Guard proof: filter planActivityAppend's page views on `page.view` alone; the visit opened
189
+ // by activity has no page, and its retry adds one.
190
+ test("activity that opens a visit records its page once, and its retry is recognized", async () => {
191
+ await withActivity(async (activity) => {
192
+ await activity.append(batch("first"))
193
+ const returning = heartbeat("back", later(45), "/reports")
194
+
195
+ await expect(activity.append(returning)).resolves.toEqual({
196
+ status: "accepted",
197
+ accepted: 1,
198
+ })
199
+ await expect(
200
+ activity.append({ ...returning, now: later(46), newVisitId: "visit-retry" })
201
+ ).resolves.toEqual({ status: "accepted", accepted: 0 })
202
+
203
+ const visit = await read(activity, "visit-back")
204
+ expect(visit?.visit).toMatchObject({ startedAt: later(45), pageViews: 1 })
205
+ expect(visit?.pageViews.map((view) => [view.id, view.sequence, view.route])).toEqual([
206
+ ["back", 1, "/reports"],
207
+ ])
208
+ await expect(read(activity, "visit-retry")).resolves.toBeNull()
209
+ })
210
+ })
211
+
212
+ // Guard proof: drop the age check from continuesVisit; the second day joins the first visit.
213
+ test("a visit ends at its next event once a day old", async () => {
214
+ await withActivity(async (activity) => {
215
+ const allDay = { idleTimeoutMs: 24 * 60 * minute }
216
+ await activity.append(batch("morning", allDay))
217
+ await activity.append(batch("evening", { ...allDay, now: later(23 * 60) }))
218
+ await activity.append(batch("next-day", { ...allDay, now: later(24 * 60 + 1) }))
219
+
220
+ const lateOnFirstDay = { ...period, from: later(22 * 60), to: later(23 * 60 + 1) }
221
+ const visits = await activity.list({ ...lateOnFirstDay, limit: 10 })
222
+ expect(visits.visits.map((visit) => [visit.id, visit.pageViews])).toEqual([
223
+ ["visit-morning", 2],
224
+ ])
225
+
226
+ const nextDay = await activity.list({
227
+ ...period,
228
+ from: later(24 * 60),
229
+ to: later(25 * 60),
230
+ limit: 10,
231
+ })
232
+ expect(nextDay.visits.map((visit) => visit.id)).toEqual(["visit-next-day"])
233
+ })
234
+ })
235
+
236
+ // Guard proof: drop the Math.max in planActivityAppend; the visit and its page move back.
237
+ test("a server clock stepping back never moves a visit back", async () => {
238
+ await withActivity(async (activity) => {
239
+ await activity.append(batch("first", { now: later(10) }))
240
+ await activity.append(batch("earlier", { now: later(5) }))
241
+
242
+ const timeline = await read(activity, "visit-first")
243
+ expect(timeline?.visit.lastSeenAt).toEqual(later(10))
244
+ expect(timeline?.pageViews.map((view) => [view.id, view.receivedAt])).toEqual([
245
+ ["first", later(10)],
246
+ ["earlier", later(10)],
247
+ ])
248
+ })
249
+ })
250
+
251
+ // Guard proof: have the provider report a deleted visit's start as its source's last activity;
252
+ // the next batch then adds to the missing visit and fails.
253
+ test("a session whose visit was deleted starts another", async () => {
254
+ await withActivity(async (activity, storage) => {
255
+ await activity.append(batch("first"))
256
+ await options.deleteVisit(storage, { projectId, id: "visit-first" })
257
+
258
+ await activity.append(batch("second", { now: later(1) }))
259
+
260
+ await expect(read(activity, "visit-first")).resolves.toBeNull()
261
+ const visit = await read(activity, "visit-second")
262
+ expect(visit?.visit).toMatchObject({ startedAt: later(1), pageViews: 1 })
263
+ expect(visit?.pageViews.map((view) => [view.id, view.sequence])).toEqual([["second", 1]])
264
+ })
265
+ })
266
+
267
+ test("concurrent tabs of one session share a visit and its sequence", async () => {
268
+ await withActivity(async (activity) => {
269
+ await Promise.all(
270
+ Array.from({ length: 10 }, (_, index) => activity.append(batch(`tab-${index}`)))
271
+ )
272
+
273
+ const visits = await activity.list({ ...period, limit: 10 })
274
+ expect(visits.visits).toHaveLength(1)
275
+ expect(visits.visits[0]?.pageViews).toBe(10)
276
+
277
+ const timeline = await read(activity, visits.visits[0]?.id ?? "", 100)
278
+ expect(timeline?.pageViews.map((view) => view.sequence)).toEqual([
279
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
280
+ ])
281
+ })
282
+ })
283
+
284
+ test("each session has its own visit; an account counts once and shares apart", async () => {
285
+ await withActivity(async (activity) => {
286
+ await activity.append(batch("a"))
287
+ await activity.append(batch("b", { sessionId: "session-b" }))
288
+ await activity.append(
289
+ batch("c", { sessionId: "share-session", actor: { type: "share", grantId: "grant" } })
290
+ )
291
+ // The same id in another kind of session is another source.
292
+ await activity.append(
293
+ batch("d", { sessionId: "session-a", actor: { type: "share", grantId: "grant" } })
294
+ )
295
+
296
+ expect(await activity.summarize(period)).toEqual({
297
+ users: 1,
298
+ visits: 4,
299
+ sharedVisits: 2,
300
+ pageViews: 4,
301
+ })
302
+ expect((await activity.list({ ...period, projectId: "other", limit: 10 })).visits).toEqual(
303
+ []
304
+ )
305
+ await expect(read(activity, "visit-a", 10, "other")).resolves.toBeNull()
306
+
307
+ // Core joins a visit with its session's executions and device through this id.
308
+ expect((await read(activity, "visit-a"))?.sessionId).toBe("session-a")
309
+ expect((await read(activity, "visit-d"))?.sessionId).toBe("session-a")
310
+ })
311
+ })
312
+
313
+ test("a session's visits count whole, the latest first, for one account only", async () => {
314
+ await withActivity(async (activity) => {
315
+ await activity.append(batch("first"))
316
+ await activity.append(batch("second", { now: later(31) }))
317
+ await activity.append(batch("third", { now: later(62) }))
318
+ await activity.append(batch("other-session", { sessionId: "session-b" }))
319
+ await activity.append(
320
+ batch("share", { sessionId: "session-c", actor: { type: "share", grantId: "grant" } })
321
+ )
322
+ await activity.append(
323
+ batch("other-user", { sessionId: "session-d", actor: { type: "user", userId: "user-b" } })
324
+ )
325
+
326
+ const sessions = await activity.sessionVisits({
327
+ projectId,
328
+ userId: "user-a",
329
+ sessionIds: ["session-a", "session-b", "session-c", "session-d", "missing"],
330
+ limit: 2,
331
+ })
332
+
333
+ expect(
334
+ [...sessions]
335
+ .sort((left, right) => left.sessionId.localeCompare(right.sessionId))
336
+ .map((session) => ({
337
+ sessionId: session.sessionId,
338
+ visits: session.visits,
339
+ latest: session.latest.map((visit) => visit.id),
340
+ }))
341
+ ).toEqual([
342
+ { sessionId: "session-a", visits: 3, latest: ["visit-third", "visit-second"] },
343
+ { sessionId: "session-b", visits: 1, latest: ["visit-other-session"] },
344
+ ])
345
+ await expect(
346
+ activity.sessionVisits({
347
+ projectId: "other",
348
+ userId: "user-a",
349
+ sessionIds: ["session-a"],
350
+ limit: 2,
351
+ })
352
+ ).resolves.toEqual([])
353
+ })
354
+ })
355
+
356
+ // Guard proof: drop the provider's userId predicate; the share and the other account leak in.
357
+ test("user filters apply before pagination and summary, never to shares", async () => {
358
+ await withActivity(async (activity) => {
359
+ await activity.append(batch("a"))
360
+ await activity.append(batch("b", { sessionId: "second-session" }))
361
+ await activity.append(
362
+ batch("c", { sessionId: "another-user", actor: { type: "user", userId: "user-b" } })
363
+ )
364
+ await activity.append(
365
+ batch("d", { sessionId: "share-session", actor: { type: "share", grantId: "user-a" } })
366
+ )
367
+ await activity.append(batch("e", { projectId: "other" }))
368
+
369
+ const filtered = { ...period, userId: "user-a" }
370
+ expect(await activity.summarize(filtered)).toEqual({
371
+ users: 1,
372
+ visits: 2,
373
+ sharedVisits: 0,
374
+ pageViews: 2,
375
+ })
376
+
377
+ const first = await activity.list({ ...filtered, limit: 1 })
378
+ expect(first.hasMore).toBe(true)
379
+ expect(first.visits[0]?.actor).toEqual({ type: "user", userId: "user-a" })
380
+
381
+ const last = first.visits[0]
382
+ if (!last) throw new Error("Expected a first visit.")
383
+ const second = await activity.list({
384
+ ...filtered,
385
+ limit: 1,
386
+ before: { at: last.lastSeenAt, id: last.id },
387
+ })
388
+ expect(second.hasMore).toBe(false)
389
+ expect(new Set([...first.visits, ...second.visits].map((visit) => visit.id))).toEqual(
390
+ new Set(["visit-a", "visit-b"])
391
+ )
392
+
393
+ expect(await activity.summarize({ ...period, userId: "unknown" })).toEqual({
394
+ users: 0,
395
+ visits: 0,
396
+ sharedVisits: 0,
397
+ pageViews: 0,
398
+ })
399
+ })
400
+ })
401
+
402
+ test("users count their sessions once and page through equal timestamps without shares", async () => {
403
+ await withActivity(async (activity) => {
404
+ await activity.append(batch("a"))
405
+ await activity.append(batch("b", { sessionId: "second-session" }))
406
+ await activity.append(
407
+ batch("c", { sessionId: "user-b", actor: { type: "user", userId: "user-b" } })
408
+ )
409
+ await activity.append(
410
+ batch("d", { sessionId: "share-session", actor: { type: "share", grantId: "user-b" } })
411
+ )
412
+ await activity.append(batch("e", { projectId: "other" }))
413
+
414
+ const first = await activity.users({ ...period, limit: 1 })
415
+ expect(first).toEqual({
416
+ users: [{ userId: "user-b", lastSeenAt: at, visits: 1, pageViews: 1 }],
417
+ hasMore: true,
418
+ })
419
+
420
+ const second = await activity.users({ ...period, limit: 1, before: { id: "user-b", at } })
421
+ expect(second).toEqual({
422
+ users: [{ userId: "user-a", lastSeenAt: at, visits: 2, pageViews: 2 }],
423
+ hasMore: false,
424
+ })
425
+
426
+ expect((await activity.users({ ...period, projectId: "empty", limit: 10 })).users).toEqual(
427
+ []
428
+ )
429
+ expect((await activity.users({ ...period, userId: "user-a", limit: 10 })).users).toEqual(
430
+ second.users
431
+ )
432
+ })
433
+ })
434
+
435
+ // Guard proof: select visits by page views in the period instead of by overlap; the visit
436
+ // active after midnight disappears from the second day.
437
+ test("a visit counts in every period it overlaps, page views only where received", async () => {
438
+ await withActivity(async (activity) => {
439
+ await activity.append(batch("a"))
440
+ await activity.append(heartbeat("pulse", midnight))
441
+
442
+ const afterMidnight = { ...period, from: midnight }
443
+ expect(await activity.summarize(afterMidnight)).toEqual({
444
+ users: 1,
445
+ visits: 1,
446
+ sharedVisits: 0,
447
+ pageViews: 0,
448
+ })
449
+ expect(await activity.users({ ...afterMidnight, limit: 10 })).toEqual({
450
+ users: [{ userId: "user-a", lastSeenAt: midnight, visits: 1, pageViews: 0 }],
451
+ hasMore: false,
452
+ })
453
+
454
+ const visits = await activity.list({ ...afterMidnight, limit: 10 })
455
+ expect(visits.visits[0]).toMatchObject({
456
+ startedAt: at,
457
+ lastSeenAt: midnight,
458
+ pageViews: 1,
459
+ })
460
+
461
+ const beforeVisit = { ...period, from: new Date(at.getTime() - minute), to: at }
462
+ expect((await activity.summarize(beforeVisit)).visits).toBe(0)
463
+ })
464
+ })
465
+
466
+ test("visit cursors do not lose equal-timestamp records", async () => {
467
+ await withActivity(async (activity) => {
468
+ for (const id of ["a", "b", "c"]) {
469
+ await activity.append(batch(id, { sessionId: id }))
470
+ }
471
+
472
+ const first = await activity.list({ ...period, limit: 2 })
473
+ expect(first.hasMore).toBe(true)
474
+
475
+ const last = first.visits.at(-1)
476
+ if (!last) throw new Error("Expected a last visit.")
477
+ const next = await activity.list({
478
+ ...period,
479
+ limit: 2,
480
+ before: { at: last.lastSeenAt, id: last.id },
481
+ })
482
+ expect(new Set([...first.visits, ...next.visits].map((visit) => visit.id)).size).toBe(3)
483
+ expect(next.hasMore).toBe(false)
484
+ })
485
+ })
486
+
487
+ test("a visit reads its first page views by sequence", async () => {
488
+ await withActivity(async (activity) => {
489
+ for (const id of ["one", "two", "three"]) {
490
+ await activity.append(batch(id, { newVisitId: "visit-timeline" }))
491
+ }
492
+
493
+ const first = await read(activity, "visit-timeline", 2)
494
+ expect(first?.pageViews.map((view) => view.route)).toEqual([
495
+ "/invoices/:id",
496
+ "/invoices/:id",
497
+ ])
498
+ expect(first?.hasMore).toBe(true)
499
+
500
+ const all = await read(activity, "visit-timeline", 3)
501
+ expect(all?.pageViews.map((view) => [view.id, view.sequence])).toEqual([
502
+ ["one", 1],
503
+ ["two", 2],
504
+ ["three", 3],
505
+ ])
506
+ expect(all?.hasMore).toBe(false)
507
+ })
508
+ })
509
+
510
+ test("the quota is atomic, counts activity, and ignores retried page views", async () => {
511
+ await withActivity(async (activity) => {
512
+ for (let round = 0; round < 5; round++) {
513
+ await activity.append(
514
+ batch(`q${round}`, {
515
+ events: Array.from({ length: 20 }, (_, index) => pageView(`q${round}-${index}`)),
516
+ })
517
+ )
518
+ }
519
+ await activity.append(
520
+ batch("pulses", {
521
+ events: Array.from({ length: 20 }, (_, index) => ({
522
+ id: `pulse-${index}`,
523
+ type: "visit.activity" as const,
524
+ route: "/",
525
+ })),
526
+ })
527
+ )
528
+
529
+ await expect(activity.append(batch("q0-0"))).resolves.toEqual({
530
+ status: "accepted",
531
+ accepted: 0,
532
+ })
533
+ await expect(activity.append(batch("over"))).resolves.toEqual({
534
+ status: "throttled",
535
+ accepted: 0,
536
+ })
537
+ await expect(activity.append(batch("after", { now: later(1) }))).resolves.toEqual({
538
+ status: "accepted",
539
+ accepted: 1,
540
+ })
541
+ })
542
+ })
543
+
544
+ test("invalid and conflicting batches cannot partially mutate activity", async () => {
545
+ await withActivity(async (activity) => {
546
+ await activity.append(batch("a"))
547
+
548
+ await expect(
549
+ activity.append(batch("a", { events: [pageView("a", "/other")] }))
550
+ ).rejects.toThrow("different content")
551
+ await expect(
552
+ activity.append(batch("b", { events: [pageView("b", "/secret?token=value")] }))
553
+ ).rejects.toThrow("[Sixb]")
554
+ await expect(
555
+ activity.append(batch("c", { events: [pageView("c"), pageView("a", "/other")] }))
556
+ ).rejects.toThrow("different content")
557
+
558
+ expect(await activity.summarize(period)).toMatchObject({ visits: 1, pageViews: 1 })
559
+ })
560
+ })
561
+
562
+ // Guard proof: number planActivityAppend's interactions apart from its page views; they then
563
+ // repeat page view sequences.
564
+ test("interactions share the visit's sequence with page views and keep it alive", async () => {
565
+ await withActivity(async (activity) => {
566
+ await activity.append(
567
+ batch("view", {
568
+ events: [pageView("view"), interaction("export"), pageView("next", "/reports")],
569
+ })
570
+ )
571
+ await expect(
572
+ activity.append(batch("filter", { now: later(20), events: [interaction("filter")] }))
573
+ ).resolves.toEqual({ status: "accepted", accepted: 1 })
574
+ await activity.append(batch("last", { now: later(45) }))
575
+
576
+ const visits = await activity.list({ ...period, limit: 10 })
577
+ expect(
578
+ visits.visits.map((visit) => [
579
+ visit.id,
580
+ visit.lastSeenAt,
581
+ visit.pageViews,
582
+ visit.interactions,
583
+ ])
584
+ ).toEqual([["visit-view", later(45), 3, 2]])
585
+ expect(await activity.summarize(period)).toMatchObject({ visits: 1, pageViews: 3 })
586
+
587
+ const visit = await read(activity, "visit-view")
588
+ expect(visit?.pageViews.map((view) => [view.id, view.sequence, view.route])).toEqual([
589
+ ["view", 1, "/invoices/:id"],
590
+ ["next", 3, "/reports"],
591
+ ["last", 5, "/invoices/:id"],
592
+ ])
593
+ expect(
594
+ visit?.interactions.map((event) => [event.id, event.sequence, event.name, event.route])
595
+ ).toEqual([
596
+ ["export", 2, "invoices.export", "/invoices/:id"],
597
+ ["filter", 4, "invoices.export", "/invoices/:id"],
598
+ ])
599
+ expect(visit?.interactions[1]?.receivedAt).toEqual(later(20))
600
+
601
+ // One bound covers both, in sequence.
602
+ const first = await read(activity, "visit-view", 4)
603
+ expect(first?.pageViews.map((view) => view.id)).toEqual(["view", "next"])
604
+ expect(first?.interactions.map((event) => event.id)).toEqual(["export", "filter"])
605
+ expect(first?.hasMore).toBe(true)
606
+ })
607
+ })
608
+
609
+ // Guard proof: leave interactions out of the provider's stored-event read; the retry is
610
+ // stored twice.
611
+ test("a retried interaction is recognized, and its id cannot say anything else", async () => {
612
+ await withActivity(async (activity) => {
613
+ await activity.append(batch("view", { events: [pageView("view"), interaction("export")] }))
614
+
615
+ await expect(
616
+ activity.append(batch("retry", { now: later(1), events: [interaction("export")] }))
617
+ ).resolves.toEqual({ status: "accepted", accepted: 0 })
618
+
619
+ for (const events of [
620
+ [interaction("export", "invoices.print")],
621
+ [interaction("export", "invoices.export", "/reports")],
622
+ [pageView("export")],
623
+ [{ id: "export", type: "visit.activity" as const, route: "/invoices/:id" }],
624
+ [interaction("view")],
625
+ ]) {
626
+ await expect(
627
+ activity.append(batch("conflict", { now: later(2), events }))
628
+ ).rejects.toThrow("different content")
629
+ }
630
+
631
+ const visit = await read(activity, "visit-view")
632
+ expect(visit?.visit).toMatchObject({ lastSeenAt: at, pageViews: 1, interactions: 1 })
633
+ expect(visit?.interactions.map((event) => [event.id, event.sequence])).toEqual([
634
+ ["export", 2],
635
+ ])
636
+ })
637
+ })
638
+
639
+ test("interactions count toward the quota", async () => {
640
+ await withActivity(async (activity) => {
641
+ for (let round = 0; round < 6; round++) {
642
+ await activity.append(
643
+ batch(`round-${round}`, {
644
+ events: Array.from({ length: 20 }, (_, index) => interaction(`i${round}-${index}`)),
645
+ })
646
+ )
647
+ }
648
+
649
+ await expect(activity.append(batch("over"))).resolves.toEqual({
650
+ status: "throttled",
651
+ accepted: 0,
652
+ })
653
+ await expect(
654
+ activity.append(batch("retry", { events: [interaction("i0-0")] }))
655
+ ).resolves.toEqual({ status: "accepted", accepted: 0 })
656
+ })
657
+ })
658
+
659
+ // Guard proof: drop the page view planActivityAppend adds for an interaction that opens a
660
+ // visit; the visit then starts on no page and claims no arrival.
661
+ test("an interaction that opens a visit starts it on its page, retry-safe", async () => {
662
+ await withActivity(async (activity, storage) => {
663
+ await activity.append(batch("view", { events: [pageView("view"), interaction("export")] }))
664
+ const back = batch("back", {
665
+ now: later(45),
666
+ events: [interaction("back", "invoices.filter.applied", "/reports"), pageView("then")],
667
+ })
668
+ await activity.append(back)
669
+ await expect(
670
+ activity.append({ ...back, now: later(46), newVisitId: "visit-retry" })
671
+ ).resolves.toEqual({ status: "accepted", accepted: 0 })
672
+
673
+ const visits = await activity.list({ ...period, limit: 10 })
674
+ expect(
675
+ visits.visits.map((visit) => [visit.id, visit.pageViews, visit.interactions])
676
+ ).toEqual([
677
+ ["visit-back", 2, 1],
678
+ ["visit-view", 1, 1],
679
+ ])
680
+
681
+ // The entry page view's id is derived outside the event-id alphabet.
682
+ const opened = await read(activity, "visit-back")
683
+ expect(opened?.visit).toMatchObject({ startedAt: later(45), attribution: {} })
684
+ expect(opened?.pageViews.map((view) => [view.id, view.sequence, view.route])).toEqual([
685
+ ["back.page", 1, "/reports"],
686
+ ["then", 3, "/invoices/:id"],
687
+ ])
688
+ expect(opened?.interactions.map((event) => [event.id, event.sequence])).toEqual([
689
+ ["back", 2],
690
+ ])
691
+ await expect(read(activity, "visit-retry")).resolves.toBeNull()
692
+
693
+ // A deleted visit takes its interactions with it.
694
+ await options.deleteVisit(storage, { projectId, id: "visit-view" })
695
+ await activity.append(batch("again", { now: later(47), events: [interaction("export")] }))
696
+ expect((await read(activity, "visit-back"))?.interactions.map((event) => event.id)).toEqual(
697
+ ["back", "export"]
698
+ )
699
+ })
700
+ })
701
+
702
+ test("invalid interactions cannot partially mutate activity", async () => {
703
+ await withActivity(async (activity) => {
704
+ for (const name of [
705
+ "",
706
+ "Invoices.export",
707
+ "invoices.123",
708
+ "invoices..export",
709
+ ".invoices",
710
+ "invoices export",
711
+ "invoices/export",
712
+ "invoices.row1234",
713
+ `invoices.${"a".repeat(41)}`,
714
+ `a${"b".repeat(100)}`,
715
+ ]) {
716
+ await expect(
717
+ activity.append(batch("bad", { events: [pageView("view"), interaction("i", name)] }))
718
+ ).rejects.toThrow("[Sixb]")
719
+ }
720
+
721
+ await expect(
722
+ activity.append(
723
+ batch("bad", {
724
+ events: [
725
+ pageView("view"),
726
+ { ...interaction("i"), attribution: {} } as unknown as ActivityEventInput,
727
+ ],
728
+ })
729
+ )
730
+ ).rejects.toThrow("no attribution")
731
+ await expect(
732
+ activity.append(
733
+ batch("bad", { events: [interaction("i", "invoices.export", "/invoices?id=1")] })
734
+ )
735
+ ).rejects.toThrow("[Sixb]")
736
+
737
+ expect((await activity.summarize(period)).visits).toBe(0)
738
+
739
+ const valid = ["v2.export", "invoices.page-123", `invoices.${"a".repeat(40)}`]
740
+ await expect(
741
+ activity.append(
742
+ batch("good", {
743
+ events: valid.map((name, index) => interaction(`ok-${index}`, name)),
744
+ })
745
+ )
746
+ ).resolves.toEqual({ status: "accepted", accepted: 3 })
747
+ })
748
+ })
749
+
750
+ test("activity follows the storage transaction rollback contract", async () => {
751
+ await withActivity(async (activity, storage) => {
752
+ await expect(
753
+ storage.transaction(async (tx) => {
754
+ await tx.activity?.append(batch("a"))
755
+ throw new Error("rollback")
756
+ })
757
+ ).rejects.toThrow("rollback")
758
+ expect((await activity.summarize(period)).visits).toBe(0)
759
+
760
+ await activity.append(batch("b"))
761
+ expect((await activity.list({ ...period, limit: 10 })).visits[0]?.id).toBe("visit-b")
762
+ })
763
+ })
764
+
765
+ test("UTC days count a visit on both sides of midnight and its page views once", async () => {
766
+ await withActivity(async (activity) => {
767
+ await activity.append(batch("a"))
768
+ await activity.append(heartbeat("pulse", midnight))
769
+ await activity.append(batch("b", { now: midnight, sessionId: "second-session" }))
770
+ await activity.append(
771
+ batch("c", {
772
+ now: midnight,
773
+ sessionId: "other-user",
774
+ actor: { type: "user", userId: "user-b" },
775
+ })
776
+ )
777
+ await activity.append(
778
+ batch("d", {
779
+ now: midnight,
780
+ sessionId: "share",
781
+ actor: { type: "share", grantId: "user-a" },
782
+ })
783
+ )
784
+ await activity.append(batch("e", { now: midnight, projectId: "other" }))
785
+ // A retry adds neither a day nor a page view.
786
+ await activity.append(
787
+ batch("b", { now: new Date(midnight.getTime() + 1), sessionId: "second-session" })
788
+ )
789
+
790
+ const year = {
791
+ projectId,
792
+ userId: "user-a",
793
+ from: new Date("2026-01-01T00:00:00.000Z"),
794
+ to: new Date("2027-01-01T00:00:00.000Z"),
795
+ }
796
+ expect(await activity.calendar(year)).toEqual([
797
+ { day: "2026-10-01", visits: 1, pageViews: 1 },
798
+ { day: "2026-10-02", visits: 2, pageViews: 1 },
799
+ ])
800
+ expect(await activity.calendar({ ...year, to: midnight })).toEqual([
801
+ { day: "2026-10-01", visits: 1, pageViews: 1 },
802
+ ])
803
+ expect(await activity.calendar({ ...year, userId: "unknown" })).toEqual([])
804
+ })
805
+ })
806
+ })
807
+ }
808
+
809
+ function batch(event: string, overrides: Partial<AppendActivityInput> = {}): AppendActivityInput {
810
+ return {
811
+ projectId,
812
+ actor: { type: "user", userId: "user-a" },
813
+ sessionId: "session-a",
814
+ events: [pageView(event)],
815
+ now: at,
816
+ idleTimeoutMs: 30 * minute,
817
+ newVisitId: `visit-${event}`,
818
+ ...overrides,
819
+ }
820
+ }
821
+
822
+ function pageView(id: string, route = "/invoices/:id") {
823
+ return { id, type: "page.view" as const, route }
824
+ }
825
+
826
+ function interaction(id: string, name = "invoices.export", route = "/invoices/:id") {
827
+ return { id, type: "ui.interaction" as const, name, route }
828
+ }
829
+
830
+ function heartbeat(id: string, now: Date, route = "/invoices/:id"): AppendActivityInput {
831
+ return batch(id, { now, events: [{ id, type: "visit.activity", route }] })
832
+ }
833
+
834
+ function later(minutes: number): Date {
835
+ return new Date(at.getTime() + minutes * minute)
836
+ }
837
+
838
+ function read(activity: ActivityStorage, id: string, limit = 10, project = projectId) {
839
+ return activity.read({ projectId: project, id, limit })
840
+ }