@indigoai-us/hq-cloud 6.18.44-alpha.8 → 6.18.44

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 (1068) hide show
  1. package/dist/bin/sync-runner-planning.d.ts +12 -0
  2. package/dist/bin/sync-runner-planning.d.ts.map +1 -1
  3. package/dist/bin/sync-runner-planning.js +18 -0
  4. package/dist/bin/sync-runner-planning.js.map +1 -1
  5. package/dist/bin/sync-runner-watch-loop.d.ts +18 -0
  6. package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
  7. package/dist/bin/sync-runner-watch-loop.js +75 -6
  8. package/dist/bin/sync-runner-watch-loop.js.map +1 -1
  9. package/dist/bin/sync-runner.d.ts +22 -1
  10. package/dist/bin/sync-runner.d.ts.map +1 -1
  11. package/dist/bin/sync-runner.js +33 -4
  12. package/dist/bin/sync-runner.js.map +1 -1
  13. package/dist/cli/conflict.d.ts.map +1 -1
  14. package/dist/cli/conflict.js +2 -1
  15. package/dist/cli/conflict.js.map +1 -1
  16. package/dist/cli/rescue-core.d.ts +6 -0
  17. package/dist/cli/rescue-core.d.ts.map +1 -1
  18. package/dist/cli/rescue-core.js +10 -1
  19. package/dist/cli/rescue-core.js.map +1 -1
  20. package/dist/cli/rescue-windows-test-harness.d.ts +19 -0
  21. package/dist/cli/rescue-windows-test-harness.d.ts.map +1 -0
  22. package/dist/cli/rescue-windows-test-harness.js +443 -0
  23. package/dist/cli/rescue-windows-test-harness.js.map +1 -0
  24. package/dist/company-resolver.d.ts +22 -0
  25. package/dist/company-resolver.d.ts.map +1 -1
  26. package/dist/company-resolver.js +1 -1
  27. package/dist/company-resolver.js.map +1 -1
  28. package/dist/ignore.d.ts +4 -1
  29. package/dist/ignore.d.ts.map +1 -1
  30. package/dist/ignore.js +10 -12
  31. package/dist/ignore.js.map +1 -1
  32. package/dist/journal-snapshot-decoder.js +15 -2
  33. package/dist/journal-snapshot-decoder.js.map +1 -1
  34. package/dist/sync/durable-apply.d.ts +2 -0
  35. package/dist/sync/durable-apply.d.ts.map +1 -1
  36. package/dist/sync/durable-apply.js +9 -12
  37. package/dist/sync/durable-apply.js.map +1 -1
  38. package/dist/sync/fsync-compat.d.ts +13 -0
  39. package/dist/sync/fsync-compat.d.ts.map +1 -0
  40. package/dist/sync/fsync-compat.js +33 -0
  41. package/dist/sync/fsync-compat.js.map +1 -0
  42. package/dist/sync/multipart-uploader.d.ts.map +1 -1
  43. package/dist/sync/multipart-uploader.js +2 -1
  44. package/dist/sync/multipart-uploader.js.map +1 -1
  45. package/dist/sync/scope-inventory-client.d.ts.map +1 -1
  46. package/dist/sync/scope-inventory-client.js +7 -2
  47. package/dist/sync/scope-inventory-client.js.map +1 -1
  48. package/dist/telemetry.d.ts +31 -0
  49. package/dist/telemetry.d.ts.map +1 -1
  50. package/dist/telemetry.js +177 -17
  51. package/dist/telemetry.js.map +1 -1
  52. package/dist/usage-company-fallback.d.ts +104 -0
  53. package/dist/usage-company-fallback.d.ts.map +1 -0
  54. package/dist/usage-company-fallback.js +599 -0
  55. package/dist/usage-company-fallback.js.map +1 -0
  56. package/dist/watch-owner-lease.d.ts +3 -0
  57. package/dist/watch-owner-lease.d.ts.map +1 -1
  58. package/dist/watch-owner-lease.js +14 -3
  59. package/dist/watch-owner-lease.js.map +1 -1
  60. package/package.json +2 -2
  61. package/dist/active-company.test.d.ts +0 -2
  62. package/dist/active-company.test.d.ts.map +0 -1
  63. package/dist/active-company.test.js +0 -149
  64. package/dist/active-company.test.js.map +0 -1
  65. package/dist/agent-codex-instructions.test.d.ts +0 -2
  66. package/dist/agent-codex-instructions.test.d.ts.map +0 -1
  67. package/dist/agent-codex-instructions.test.js +0 -271
  68. package/dist/agent-codex-instructions.test.js.map +0 -1
  69. package/dist/backup-prune.test.d.ts +0 -2
  70. package/dist/backup-prune.test.d.ts.map +0 -1
  71. package/dist/backup-prune.test.js +0 -154
  72. package/dist/backup-prune.test.js.map +0 -1
  73. package/dist/bandwidth.test.d.ts +0 -2
  74. package/dist/bandwidth.test.d.ts.map +0 -1
  75. package/dist/bandwidth.test.js +0 -342
  76. package/dist/bandwidth.test.js.map +0 -1
  77. package/dist/best-effort-error.test.d.ts +0 -2
  78. package/dist/best-effort-error.test.d.ts.map +0 -1
  79. package/dist/best-effort-error.test.js +0 -54
  80. package/dist/best-effort-error.test.js.map +0 -1
  81. package/dist/bin/area-ledger-migration.test.d.ts +0 -2
  82. package/dist/bin/area-ledger-migration.test.d.ts.map +0 -1
  83. package/dist/bin/area-ledger-migration.test.js +0 -410
  84. package/dist/bin/area-ledger-migration.test.js.map +0 -1
  85. package/dist/bin/backup-prune-runner.test.d.ts +0 -2
  86. package/dist/bin/backup-prune-runner.test.d.ts.map +0 -1
  87. package/dist/bin/backup-prune-runner.test.js +0 -22
  88. package/dist/bin/backup-prune-runner.test.js.map +0 -1
  89. package/dist/bin/journal-repair.test.d.ts +0 -2
  90. package/dist/bin/journal-repair.test.d.ts.map +0 -1
  91. package/dist/bin/journal-repair.test.js +0 -53
  92. package/dist/bin/journal-repair.test.js.map +0 -1
  93. package/dist/bin/layout-compatibility.test.d.ts +0 -2
  94. package/dist/bin/layout-compatibility.test.d.ts.map +0 -1
  95. package/dist/bin/layout-compatibility.test.js +0 -87
  96. package/dist/bin/layout-compatibility.test.js.map +0 -1
  97. package/dist/bin/outpost-heartbeat.test.d.ts +0 -7
  98. package/dist/bin/outpost-heartbeat.test.d.ts.map +0 -1
  99. package/dist/bin/outpost-heartbeat.test.js +0 -84
  100. package/dist/bin/outpost-heartbeat.test.js.map +0 -1
  101. package/dist/bin/outpost-session-host.test.d.ts +0 -7
  102. package/dist/bin/outpost-session-host.test.d.ts.map +0 -1
  103. package/dist/bin/outpost-session-host.test.js +0 -52
  104. package/dist/bin/outpost-session-host.test.js.map +0 -1
  105. package/dist/bin/sync-mutation.test.d.ts +0 -2
  106. package/dist/bin/sync-mutation.test.d.ts.map +0 -1
  107. package/dist/bin/sync-mutation.test.js +0 -64
  108. package/dist/bin/sync-mutation.test.js.map +0 -1
  109. package/dist/bin/sync-runner-args.test.d.ts +0 -2
  110. package/dist/bin/sync-runner-args.test.d.ts.map +0 -1
  111. package/dist/bin/sync-runner-args.test.js +0 -82
  112. package/dist/bin/sync-runner-args.test.js.map +0 -1
  113. package/dist/bin/sync-runner-auth-wait.test.d.ts +0 -2
  114. package/dist/bin/sync-runner-auth-wait.test.d.ts.map +0 -1
  115. package/dist/bin/sync-runner-auth-wait.test.js +0 -406
  116. package/dist/bin/sync-runner-auth-wait.test.js.map +0 -1
  117. package/dist/bin/sync-runner-backoff.regression.test.d.ts +0 -29
  118. package/dist/bin/sync-runner-backoff.regression.test.d.ts.map +0 -1
  119. package/dist/bin/sync-runner-backoff.regression.test.js +0 -224
  120. package/dist/bin/sync-runner-backoff.regression.test.js.map +0 -1
  121. package/dist/bin/sync-runner-company.test.d.ts +0 -2
  122. package/dist/bin/sync-runner-company.test.d.ts.map +0 -1
  123. package/dist/bin/sync-runner-company.test.js +0 -2439
  124. package/dist/bin/sync-runner-company.test.js.map +0 -1
  125. package/dist/bin/sync-runner-delete-snapshot-mixed.bench.test.d.ts +0 -2
  126. package/dist/bin/sync-runner-delete-snapshot-mixed.bench.test.d.ts.map +0 -1
  127. package/dist/bin/sync-runner-delete-snapshot-mixed.bench.test.js +0 -648
  128. package/dist/bin/sync-runner-delete-snapshot-mixed.bench.test.js.map +0 -1
  129. package/dist/bin/sync-runner-delete-snapshot.bench.test.d.ts +0 -2
  130. package/dist/bin/sync-runner-delete-snapshot.bench.test.d.ts.map +0 -1
  131. package/dist/bin/sync-runner-delete-snapshot.bench.test.js +0 -329
  132. package/dist/bin/sync-runner-delete-snapshot.bench.test.js.map +0 -1
  133. package/dist/bin/sync-runner-events.test.d.ts +0 -2
  134. package/dist/bin/sync-runner-events.test.d.ts.map +0 -1
  135. package/dist/bin/sync-runner-events.test.js +0 -364
  136. package/dist/bin/sync-runner-events.test.js.map +0 -1
  137. package/dist/bin/sync-runner-heap-telemetry.test.d.ts +0 -2
  138. package/dist/bin/sync-runner-heap-telemetry.test.d.ts.map +0 -1
  139. package/dist/bin/sync-runner-heap-telemetry.test.js +0 -1966
  140. package/dist/bin/sync-runner-heap-telemetry.test.js.map +0 -1
  141. package/dist/bin/sync-runner-manifest.test.d.ts +0 -12
  142. package/dist/bin/sync-runner-manifest.test.d.ts.map +0 -1
  143. package/dist/bin/sync-runner-manifest.test.js +0 -921
  144. package/dist/bin/sync-runner-manifest.test.js.map +0 -1
  145. package/dist/bin/sync-runner-planning.test.d.ts +0 -2
  146. package/dist/bin/sync-runner-planning.test.d.ts.map +0 -1
  147. package/dist/bin/sync-runner-planning.test.js +0 -448
  148. package/dist/bin/sync-runner-planning.test.js.map +0 -1
  149. package/dist/bin/sync-runner-post-sync-flags.test.d.ts +0 -2
  150. package/dist/bin/sync-runner-post-sync-flags.test.d.ts.map +0 -1
  151. package/dist/bin/sync-runner-post-sync-flags.test.js +0 -64
  152. package/dist/bin/sync-runner-post-sync-flags.test.js.map +0 -1
  153. package/dist/bin/sync-runner-publish-expansion.test.d.ts +0 -2
  154. package/dist/bin/sync-runner-publish-expansion.test.d.ts.map +0 -1
  155. package/dist/bin/sync-runner-publish-expansion.test.js +0 -54
  156. package/dist/bin/sync-runner-publish-expansion.test.js.map +0 -1
  157. package/dist/bin/sync-runner-receiver-unresolved-company.test.d.ts +0 -2
  158. package/dist/bin/sync-runner-receiver-unresolved-company.test.d.ts.map +0 -1
  159. package/dist/bin/sync-runner-receiver-unresolved-company.test.js +0 -379
  160. package/dist/bin/sync-runner-receiver-unresolved-company.test.js.map +0 -1
  161. package/dist/bin/sync-runner-rollup.test.d.ts +0 -2
  162. package/dist/bin/sync-runner-rollup.test.d.ts.map +0 -1
  163. package/dist/bin/sync-runner-rollup.test.js +0 -24
  164. package/dist/bin/sync-runner-rollup.test.js.map +0 -1
  165. package/dist/bin/sync-runner-watch-loop.test.d.ts +0 -2
  166. package/dist/bin/sync-runner-watch-loop.test.d.ts.map +0 -1
  167. package/dist/bin/sync-runner-watch-loop.test.js +0 -734
  168. package/dist/bin/sync-runner-watch-loop.test.js.map +0 -1
  169. package/dist/bin/sync-runner-watch-routes.test.d.ts +0 -2
  170. package/dist/bin/sync-runner-watch-routes.test.d.ts.map +0 -1
  171. package/dist/bin/sync-runner-watch-routes.test.js +0 -181
  172. package/dist/bin/sync-runner-watch-routes.test.js.map +0 -1
  173. package/dist/bin/sync-runner.test.d.ts +0 -10
  174. package/dist/bin/sync-runner.test.d.ts.map +0 -1
  175. package/dist/bin/sync-runner.test.js +0 -18984
  176. package/dist/bin/sync-runner.test.js.map +0 -1
  177. package/dist/cli/case-alias.test.d.ts +0 -2
  178. package/dist/cli/case-alias.test.d.ts.map +0 -1
  179. package/dist/cli/case-alias.test.js +0 -96
  180. package/dist/cli/case-alias.test.js.map +0 -1
  181. package/dist/cli/conflict-recovery.test.d.ts +0 -2
  182. package/dist/cli/conflict-recovery.test.d.ts.map +0 -1
  183. package/dist/cli/conflict-recovery.test.js +0 -201
  184. package/dist/cli/conflict-recovery.test.js.map +0 -1
  185. package/dist/cli/conflict-winner.test.d.ts +0 -7
  186. package/dist/cli/conflict-winner.test.d.ts.map +0 -1
  187. package/dist/cli/conflict-winner.test.js +0 -98
  188. package/dist/cli/conflict-winner.test.js.map +0 -1
  189. package/dist/cli/doctor.test.d.ts +0 -13
  190. package/dist/cli/doctor.test.d.ts.map +0 -1
  191. package/dist/cli/doctor.test.js +0 -607
  192. package/dist/cli/doctor.test.js.map +0 -1
  193. package/dist/cli/invite.test.d.ts +0 -5
  194. package/dist/cli/invite.test.d.ts.map +0 -1
  195. package/dist/cli/invite.test.js +0 -178
  196. package/dist/cli/invite.test.js.map +0 -1
  197. package/dist/cli/onepass-pull-planner-regressions.test.d.ts +0 -2
  198. package/dist/cli/onepass-pull-planner-regressions.test.d.ts.map +0 -1
  199. package/dist/cli/onepass-pull-planner-regressions.test.js +0 -300
  200. package/dist/cli/onepass-pull-planner-regressions.test.js.map +0 -1
  201. package/dist/cli/onepass-pull-planner.test.d.ts +0 -2
  202. package/dist/cli/onepass-pull-planner.test.d.ts.map +0 -1
  203. package/dist/cli/onepass-pull-planner.test.js +0 -266
  204. package/dist/cli/onepass-pull-planner.test.js.map +0 -1
  205. package/dist/cli/push-scan-exclusions.test.d.ts +0 -2
  206. package/dist/cli/push-scan-exclusions.test.d.ts.map +0 -1
  207. package/dist/cli/push-scan-exclusions.test.js +0 -99
  208. package/dist/cli/push-scan-exclusions.test.js.map +0 -1
  209. package/dist/cli/reindex-knowledge.test.d.ts +0 -12
  210. package/dist/cli/reindex-knowledge.test.d.ts.map +0 -1
  211. package/dist/cli/reindex-knowledge.test.js +0 -260
  212. package/dist/cli/reindex-knowledge.test.js.map +0 -1
  213. package/dist/cli/reindex.test.d.ts +0 -11
  214. package/dist/cli/reindex.test.d.ts.map +0 -1
  215. package/dist/cli/reindex.test.js +0 -811
  216. package/dist/cli/reindex.test.js.map +0 -1
  217. package/dist/cli/rescue-breaker.test.d.ts +0 -2
  218. package/dist/cli/rescue-breaker.test.d.ts.map +0 -1
  219. package/dist/cli/rescue-breaker.test.js +0 -812
  220. package/dist/cli/rescue-breaker.test.js.map +0 -1
  221. package/dist/cli/rescue-classify-ordering.test.d.ts +0 -2
  222. package/dist/cli/rescue-classify-ordering.test.d.ts.map +0 -1
  223. package/dist/cli/rescue-classify-ordering.test.js +0 -500
  224. package/dist/cli/rescue-classify-ordering.test.js.map +0 -1
  225. package/dist/cli/rescue-clone-diagnostics.test.d.ts +0 -2
  226. package/dist/cli/rescue-clone-diagnostics.test.d.ts.map +0 -1
  227. package/dist/cli/rescue-clone-diagnostics.test.js +0 -101
  228. package/dist/cli/rescue-clone-diagnostics.test.js.map +0 -1
  229. package/dist/cli/rescue-clone-network-retry.test.d.ts +0 -2
  230. package/dist/cli/rescue-clone-network-retry.test.d.ts.map +0 -1
  231. package/dist/cli/rescue-clone-network-retry.test.js +0 -415
  232. package/dist/cli/rescue-clone-network-retry.test.js.map +0 -1
  233. package/dist/cli/rescue-core-stamp.test.d.ts +0 -2
  234. package/dist/cli/rescue-core-stamp.test.d.ts.map +0 -1
  235. package/dist/cli/rescue-core-stamp.test.js +0 -364
  236. package/dist/cli/rescue-core-stamp.test.js.map +0 -1
  237. package/dist/cli/rescue-drift-reconcile.test.d.ts +0 -2
  238. package/dist/cli/rescue-drift-reconcile.test.d.ts.map +0 -1
  239. package/dist/cli/rescue-drift-reconcile.test.js +0 -162
  240. package/dist/cli/rescue-drift-reconcile.test.js.map +0 -1
  241. package/dist/cli/rescue-drop-dir-symlink.test.d.ts +0 -2
  242. package/dist/cli/rescue-drop-dir-symlink.test.d.ts.map +0 -1
  243. package/dist/cli/rescue-drop-dir-symlink.test.js +0 -255
  244. package/dist/cli/rescue-drop-dir-symlink.test.js.map +0 -1
  245. package/dist/cli/rescue-exec-bit-preserve.test.d.ts +0 -2
  246. package/dist/cli/rescue-exec-bit-preserve.test.d.ts.map +0 -1
  247. package/dist/cli/rescue-exec-bit-preserve.test.js +0 -177
  248. package/dist/cli/rescue-exec-bit-preserve.test.js.map +0 -1
  249. package/dist/cli/rescue-hq-root-guard.test.d.ts +0 -2
  250. package/dist/cli/rescue-hq-root-guard.test.d.ts.map +0 -1
  251. package/dist/cli/rescue-hq-root-guard.test.js +0 -210
  252. package/dist/cli/rescue-hq-root-guard.test.js.map +0 -1
  253. package/dist/cli/rescue-journal-reconcile.test.d.ts +0 -2
  254. package/dist/cli/rescue-journal-reconcile.test.d.ts.map +0 -1
  255. package/dist/cli/rescue-journal-reconcile.test.js +0 -186
  256. package/dist/cli/rescue-journal-reconcile.test.js.map +0 -1
  257. package/dist/cli/rescue-keep-local-ignore.test.d.ts +0 -2
  258. package/dist/cli/rescue-keep-local-ignore.test.d.ts.map +0 -1
  259. package/dist/cli/rescue-keep-local-ignore.test.js +0 -315
  260. package/dist/cli/rescue-keep-local-ignore.test.js.map +0 -1
  261. package/dist/cli/rescue-move.test.d.ts +0 -2
  262. package/dist/cli/rescue-move.test.d.ts.map +0 -1
  263. package/dist/cli/rescue-move.test.js +0 -166
  264. package/dist/cli/rescue-move.test.js.map +0 -1
  265. package/dist/cli/rescue-mtime-preserve.test.d.ts +0 -2
  266. package/dist/cli/rescue-mtime-preserve.test.d.ts.map +0 -1
  267. package/dist/cli/rescue-mtime-preserve.test.js +0 -186
  268. package/dist/cli/rescue-mtime-preserve.test.js.map +0 -1
  269. package/dist/cli/rescue-preserve-copy-symlink.test.d.ts +0 -2
  270. package/dist/cli/rescue-preserve-copy-symlink.test.d.ts.map +0 -1
  271. package/dist/cli/rescue-preserve-copy-symlink.test.js +0 -483
  272. package/dist/cli/rescue-preserve-copy-symlink.test.js.map +0 -1
  273. package/dist/cli/rescue-realpath.test.d.ts +0 -2
  274. package/dist/cli/rescue-realpath.test.d.ts.map +0 -1
  275. package/dist/cli/rescue-realpath.test.js +0 -109
  276. package/dist/cli/rescue-realpath.test.js.map +0 -1
  277. package/dist/cli/rescue-restore-flag.test.d.ts +0 -2
  278. package/dist/cli/rescue-restore-flag.test.d.ts.map +0 -1
  279. package/dist/cli/rescue-restore-flag.test.js +0 -82
  280. package/dist/cli/rescue-restore-flag.test.js.map +0 -1
  281. package/dist/cli/rescue-rsync-preflight.test.d.ts +0 -2
  282. package/dist/cli/rescue-rsync-preflight.test.d.ts.map +0 -1
  283. package/dist/cli/rescue-rsync-preflight.test.js +0 -579
  284. package/dist/cli/rescue-rsync-preflight.test.js.map +0 -1
  285. package/dist/cli/rescue-rsync-status.test.d.ts +0 -2
  286. package/dist/cli/rescue-rsync-status.test.d.ts.map +0 -1
  287. package/dist/cli/rescue-rsync-status.test.js +0 -406
  288. package/dist/cli/rescue-rsync-status.test.js.map +0 -1
  289. package/dist/cli/rescue-settings-reconcile.test.d.ts +0 -2
  290. package/dist/cli/rescue-settings-reconcile.test.d.ts.map +0 -1
  291. package/dist/cli/rescue-settings-reconcile.test.js +0 -610
  292. package/dist/cli/rescue-settings-reconcile.test.js.map +0 -1
  293. package/dist/cli/rescue-snapshot-copy.test.d.ts +0 -2
  294. package/dist/cli/rescue-snapshot-copy.test.d.ts.map +0 -1
  295. package/dist/cli/rescue-snapshot-copy.test.js +0 -790
  296. package/dist/cli/rescue-snapshot-copy.test.js.map +0 -1
  297. package/dist/cli/rescue-snapshot-recovery.test.d.ts +0 -2
  298. package/dist/cli/rescue-snapshot-recovery.test.d.ts.map +0 -1
  299. package/dist/cli/rescue-snapshot-recovery.test.js +0 -265
  300. package/dist/cli/rescue-snapshot-recovery.test.js.map +0 -1
  301. package/dist/cli/rescue-snapshot.test.d.ts +0 -2
  302. package/dist/cli/rescue-snapshot.test.d.ts.map +0 -1
  303. package/dist/cli/rescue-snapshot.test.js +0 -46
  304. package/dist/cli/rescue-snapshot.test.js.map +0 -1
  305. package/dist/cli/rescue-source-switch-floor.test.d.ts +0 -2
  306. package/dist/cli/rescue-source-switch-floor.test.d.ts.map +0 -1
  307. package/dist/cli/rescue-source-switch-floor.test.js +0 -247
  308. package/dist/cli/rescue-source-switch-floor.test.js.map +0 -1
  309. package/dist/cli/rescue-unchanged-delete.test.d.ts +0 -2
  310. package/dist/cli/rescue-unchanged-delete.test.d.ts.map +0 -1
  311. package/dist/cli/rescue-unchanged-delete.test.js +0 -305
  312. package/dist/cli/rescue-unchanged-delete.test.js.map +0 -1
  313. package/dist/cli/rescue.reindex.test.d.ts +0 -2
  314. package/dist/cli/rescue.reindex.test.d.ts.map +0 -1
  315. package/dist/cli/rescue.reindex.test.js +0 -72
  316. package/dist/cli/rescue.reindex.test.js.map +0 -1
  317. package/dist/cli/rescue.test.d.ts +0 -2
  318. package/dist/cli/rescue.test.d.ts.map +0 -1
  319. package/dist/cli/rescue.test.js +0 -127
  320. package/dist/cli/rescue.test.js.map +0 -1
  321. package/dist/cli/share-plan-limit-presign.test.d.ts +0 -2
  322. package/dist/cli/share-plan-limit-presign.test.d.ts.map +0 -1
  323. package/dist/cli/share-plan-limit-presign.test.js +0 -271
  324. package/dist/cli/share-plan-limit-presign.test.js.map +0 -1
  325. package/dist/cli/share-presign-transport.test.d.ts +0 -22
  326. package/dist/cli/share-presign-transport.test.d.ts.map +0 -1
  327. package/dist/cli/share-presign-transport.test.js +0 -388
  328. package/dist/cli/share-presign-transport.test.js.map +0 -1
  329. package/dist/cli/share.test.d.ts +0 -5
  330. package/dist/cli/share.test.d.ts.map +0 -1
  331. package/dist/cli/share.test.js +0 -12335
  332. package/dist/cli/share.test.js.map +0 -1
  333. package/dist/cli/streaming-pull-planner.bench.test.d.ts +0 -15
  334. package/dist/cli/streaming-pull-planner.bench.test.d.ts.map +0 -1
  335. package/dist/cli/streaming-pull-planner.bench.test.js +0 -273
  336. package/dist/cli/streaming-pull-planner.bench.test.js.map +0 -1
  337. package/dist/cli/sync-scope.test.d.ts +0 -22
  338. package/dist/cli/sync-scope.test.d.ts.map +0 -1
  339. package/dist/cli/sync-scope.test.js +0 -903
  340. package/dist/cli/sync-scope.test.js.map +0 -1
  341. package/dist/cli/sync.test.d.ts +0 -5
  342. package/dist/cli/sync.test.d.ts.map +0 -1
  343. package/dist/cli/sync.test.js +0 -9028
  344. package/dist/cli/sync.test.js.map +0 -1
  345. package/dist/cli/tombstones.test.d.ts +0 -2
  346. package/dist/cli/tombstones.test.d.ts.map +0 -1
  347. package/dist/cli/tombstones.test.js +0 -120
  348. package/dist/cli/tombstones.test.js.map +0 -1
  349. package/dist/cli/watch-event-push-conflict.test.d.ts +0 -25
  350. package/dist/cli/watch-event-push-conflict.test.d.ts.map +0 -1
  351. package/dist/cli/watch-event-push-conflict.test.js +0 -230
  352. package/dist/cli/watch-event-push-conflict.test.js.map +0 -1
  353. package/dist/client-info.test.d.ts +0 -11
  354. package/dist/client-info.test.d.ts.map +0 -1
  355. package/dist/client-info.test.js +0 -168
  356. package/dist/client-info.test.js.map +0 -1
  357. package/dist/cognito-auth-lock-no-hard-links.test.d.ts +0 -11
  358. package/dist/cognito-auth-lock-no-hard-links.test.d.ts.map +0 -1
  359. package/dist/cognito-auth-lock-no-hard-links.test.js +0 -76
  360. package/dist/cognito-auth-lock-no-hard-links.test.js.map +0 -1
  361. package/dist/cognito-auth.test.d.ts +0 -9
  362. package/dist/cognito-auth.test.d.ts.map +0 -1
  363. package/dist/cognito-auth.test.js +0 -745
  364. package/dist/cognito-auth.test.js.map +0 -1
  365. package/dist/company-resolver.test.d.ts +0 -7
  366. package/dist/company-resolver.test.d.ts.map +0 -1
  367. package/dist/company-resolver.test.js +0 -533
  368. package/dist/company-resolver.test.js.map +0 -1
  369. package/dist/company-slug.test.d.ts +0 -7
  370. package/dist/company-slug.test.d.ts.map +0 -1
  371. package/dist/company-slug.test.js +0 -43
  372. package/dist/company-slug.test.js.map +0 -1
  373. package/dist/company-vault-transport.test.d.ts +0 -12
  374. package/dist/company-vault-transport.test.d.ts.map +0 -1
  375. package/dist/company-vault-transport.test.js +0 -97
  376. package/dist/company-vault-transport.test.js.map +0 -1
  377. package/dist/context.test.d.ts +0 -7
  378. package/dist/context.test.d.ts.map +0 -1
  379. package/dist/context.test.js +0 -646
  380. package/dist/context.test.js.map +0 -1
  381. package/dist/entity-resolver.test.d.ts +0 -10
  382. package/dist/entity-resolver.test.d.ts.map +0 -1
  383. package/dist/entity-resolver.test.js +0 -244
  384. package/dist/entity-resolver.test.js.map +0 -1
  385. package/dist/getindigo-dead-refs-contract.test.d.ts +0 -2
  386. package/dist/getindigo-dead-refs-contract.test.d.ts.map +0 -1
  387. package/dist/getindigo-dead-refs-contract.test.js +0 -58
  388. package/dist/getindigo-dead-refs-contract.test.js.map +0 -1
  389. package/dist/hermetic-test-env.test.d.ts +0 -2
  390. package/dist/hermetic-test-env.test.d.ts.map +0 -1
  391. package/dist/hermetic-test-env.test.js +0 -61
  392. package/dist/hermetic-test-env.test.js.map +0 -1
  393. package/dist/hq-root-recovery.test.d.ts +0 -2
  394. package/dist/hq-root-recovery.test.d.ts.map +0 -1
  395. package/dist/hq-root-recovery.test.js +0 -65
  396. package/dist/hq-root-recovery.test.js.map +0 -1
  397. package/dist/ignore.test.d.ts +0 -10
  398. package/dist/ignore.test.d.ts.map +0 -1
  399. package/dist/ignore.test.js +0 -926
  400. package/dist/ignore.test.js.map +0 -1
  401. package/dist/index.test.d.ts +0 -2
  402. package/dist/index.test.d.ts.map +0 -1
  403. package/dist/index.test.js +0 -26
  404. package/dist/index.test.js.map +0 -1
  405. package/dist/journal-area-ledger-read-boundary.test.d.ts +0 -2
  406. package/dist/journal-area-ledger-read-boundary.test.d.ts.map +0 -1
  407. package/dist/journal-area-ledger-read-boundary.test.js +0 -420
  408. package/dist/journal-area-ledger-read-boundary.test.js.map +0 -1
  409. package/dist/journal-baseline.test.d.ts +0 -2
  410. package/dist/journal-baseline.test.d.ts.map +0 -1
  411. package/dist/journal-baseline.test.js +0 -218
  412. package/dist/journal-baseline.test.js.map +0 -1
  413. package/dist/journal-decode-window.test.d.ts +0 -2
  414. package/dist/journal-decode-window.test.d.ts.map +0 -1
  415. package/dist/journal-decode-window.test.js +0 -99
  416. package/dist/journal-decode-window.test.js.map +0 -1
  417. package/dist/journal-delta-writes.test.d.ts +0 -2
  418. package/dist/journal-delta-writes.test.d.ts.map +0 -1
  419. package/dist/journal-delta-writes.test.js +0 -159
  420. package/dist/journal-delta-writes.test.js.map +0 -1
  421. package/dist/journal-ledger-index.test.d.ts +0 -15
  422. package/dist/journal-ledger-index.test.d.ts.map +0 -1
  423. package/dist/journal-ledger-index.test.js +0 -269
  424. package/dist/journal-ledger-index.test.js.map +0 -1
  425. package/dist/journal-public-boundary.test.d.ts +0 -2
  426. package/dist/journal-public-boundary.test.d.ts.map +0 -1
  427. package/dist/journal-public-boundary.test.js +0 -216
  428. package/dist/journal-public-boundary.test.js.map +0 -1
  429. package/dist/journal-row-store.test.d.ts +0 -2
  430. package/dist/journal-row-store.test.d.ts.map +0 -1
  431. package/dist/journal-row-store.test.js +0 -729
  432. package/dist/journal-row-store.test.js.map +0 -1
  433. package/dist/journal-snapshot-memory-helpers.d.ts +0 -33
  434. package/dist/journal-snapshot-memory-helpers.d.ts.map +0 -1
  435. package/dist/journal-snapshot-memory-helpers.js +0 -212
  436. package/dist/journal-snapshot-memory-helpers.js.map +0 -1
  437. package/dist/journal-snapshot-memory.test.d.ts +0 -2
  438. package/dist/journal-snapshot-memory.test.d.ts.map +0 -1
  439. package/dist/journal-snapshot-memory.test.js +0 -47
  440. package/dist/journal-snapshot-memory.test.js.map +0 -1
  441. package/dist/journal-snapshot-v4-memory.test.d.ts +0 -2
  442. package/dist/journal-snapshot-v4-memory.test.d.ts.map +0 -1
  443. package/dist/journal-snapshot-v4-memory.test.js +0 -24
  444. package/dist/journal-snapshot-v4-memory.test.js.map +0 -1
  445. package/dist/journal-snapshot-v4-writer-memory.test.d.ts +0 -2
  446. package/dist/journal-snapshot-v4-writer-memory.test.d.ts.map +0 -1
  447. package/dist/journal-snapshot-v4-writer-memory.test.js +0 -76
  448. package/dist/journal-snapshot-v4-writer-memory.test.js.map +0 -1
  449. package/dist/journal-snapshot-v4-writer.test.d.ts +0 -2
  450. package/dist/journal-snapshot-v4-writer.test.d.ts.map +0 -1
  451. package/dist/journal-snapshot-v4-writer.test.js +0 -282
  452. package/dist/journal-snapshot-v4-writer.test.js.map +0 -1
  453. package/dist/journal-snapshot-v4.test.d.ts +0 -2
  454. package/dist/journal-snapshot-v4.test.d.ts.map +0 -1
  455. package/dist/journal-snapshot-v4.test.js +0 -281
  456. package/dist/journal-snapshot-v4.test.js.map +0 -1
  457. package/dist/journal-store.test.d.ts +0 -2
  458. package/dist/journal-store.test.d.ts.map +0 -1
  459. package/dist/journal-store.test.js +0 -1227
  460. package/dist/journal-store.test.js.map +0 -1
  461. package/dist/journal-streaming.heap.test.d.ts +0 -2
  462. package/dist/journal-streaming.heap.test.d.ts.map +0 -1
  463. package/dist/journal-streaming.heap.test.js +0 -190
  464. package/dist/journal-streaming.heap.test.js.map +0 -1
  465. package/dist/journal.test.d.ts +0 -9
  466. package/dist/journal.test.d.ts.map +0 -1
  467. package/dist/journal.test.js +0 -1074
  468. package/dist/journal.test.js.map +0 -1
  469. package/dist/kms10-etag-safe-pull.test.d.ts +0 -2
  470. package/dist/kms10-etag-safe-pull.test.d.ts.map +0 -1
  471. package/dist/kms10-etag-safe-pull.test.js +0 -53
  472. package/dist/kms10-etag-safe-pull.test.js.map +0 -1
  473. package/dist/lib/cloud-authoritative.test.d.ts +0 -2
  474. package/dist/lib/cloud-authoritative.test.d.ts.map +0 -1
  475. package/dist/lib/cloud-authoritative.test.js +0 -42
  476. package/dist/lib/cloud-authoritative.test.js.map +0 -1
  477. package/dist/lib/conflict-reconcile.test.d.ts +0 -7
  478. package/dist/lib/conflict-reconcile.test.d.ts.map +0 -1
  479. package/dist/lib/conflict-reconcile.test.js +0 -246
  480. package/dist/lib/conflict-reconcile.test.js.map +0 -1
  481. package/dist/lib/conflict.test.d.ts +0 -9
  482. package/dist/lib/conflict.test.d.ts.map +0 -1
  483. package/dist/lib/conflict.test.js +0 -340
  484. package/dist/lib/conflict.test.js.map +0 -1
  485. package/dist/lib/describe-error.test.d.ts +0 -2
  486. package/dist/lib/describe-error.test.d.ts.map +0 -1
  487. package/dist/lib/describe-error.test.js +0 -148
  488. package/dist/lib/describe-error.test.js.map +0 -1
  489. package/dist/lib/machine-id.test.d.ts +0 -8
  490. package/dist/lib/machine-id.test.d.ts.map +0 -1
  491. package/dist/lib/machine-id.test.js +0 -228
  492. package/dist/lib/machine-id.test.js.map +0 -1
  493. package/dist/lib/net-errors.test.d.ts +0 -2
  494. package/dist/lib/net-errors.test.d.ts.map +0 -1
  495. package/dist/lib/net-errors.test.js +0 -111
  496. package/dist/lib/net-errors.test.js.map +0 -1
  497. package/dist/lib/ontology-entity-meta.test.d.ts +0 -2
  498. package/dist/lib/ontology-entity-meta.test.d.ts.map +0 -1
  499. package/dist/lib/ontology-entity-meta.test.js +0 -79
  500. package/dist/lib/ontology-entity-meta.test.js.map +0 -1
  501. package/dist/lib/ontology-entity-push.test.d.ts +0 -2
  502. package/dist/lib/ontology-entity-push.test.d.ts.map +0 -1
  503. package/dist/lib/ontology-entity-push.test.js +0 -156
  504. package/dist/lib/ontology-entity-push.test.js.map +0 -1
  505. package/dist/lib/personal-connector-settings-sync.test.d.ts +0 -2
  506. package/dist/lib/personal-connector-settings-sync.test.d.ts.map +0 -1
  507. package/dist/lib/personal-connector-settings-sync.test.js +0 -34
  508. package/dist/lib/personal-connector-settings-sync.test.js.map +0 -1
  509. package/dist/lib/readlink-safe.test.d.ts +0 -2
  510. package/dist/lib/readlink-safe.test.d.ts.map +0 -1
  511. package/dist/lib/readlink-safe.test.js +0 -34
  512. package/dist/lib/readlink-safe.test.js.map +0 -1
  513. package/dist/lib/s3-content-checksum.test.d.ts +0 -2
  514. package/dist/lib/s3-content-checksum.test.d.ts.map +0 -1
  515. package/dist/lib/s3-content-checksum.test.js +0 -26
  516. package/dist/lib/s3-content-checksum.test.js.map +0 -1
  517. package/dist/lib/skill-register-landed-bytes.test.d.ts +0 -2
  518. package/dist/lib/skill-register-landed-bytes.test.d.ts.map +0 -1
  519. package/dist/lib/skill-register-landed-bytes.test.js +0 -83
  520. package/dist/lib/skill-register-landed-bytes.test.js.map +0 -1
  521. package/dist/local-path-codec.test.d.ts +0 -14
  522. package/dist/local-path-codec.test.d.ts.map +0 -1
  523. package/dist/local-path-codec.test.js +0 -122
  524. package/dist/local-path-codec.test.js.map +0 -1
  525. package/dist/machine-auth.test.d.ts +0 -14
  526. package/dist/machine-auth.test.d.ts.map +0 -1
  527. package/dist/machine-auth.test.js +0 -1482
  528. package/dist/machine-auth.test.js.map +0 -1
  529. package/dist/machine-token-cache-isolation.test.d.ts +0 -24
  530. package/dist/machine-token-cache-isolation.test.d.ts.map +0 -1
  531. package/dist/machine-token-cache-isolation.test.js +0 -284
  532. package/dist/machine-token-cache-isolation.test.js.map +0 -1
  533. package/dist/manifest/US-002.acceptance.test.d.ts +0 -11
  534. package/dist/manifest/US-002.acceptance.test.d.ts.map +0 -1
  535. package/dist/manifest/US-002.acceptance.test.js +0 -160
  536. package/dist/manifest/US-002.acceptance.test.js.map +0 -1
  537. package/dist/manifest/US-004.acceptance.test.d.ts +0 -12
  538. package/dist/manifest/US-004.acceptance.test.d.ts.map +0 -1
  539. package/dist/manifest/US-004.acceptance.test.js +0 -173
  540. package/dist/manifest/US-004.acceptance.test.js.map +0 -1
  541. package/dist/manifest/build-manifest-resident-parity.test.d.ts +0 -2
  542. package/dist/manifest/build-manifest-resident-parity.test.d.ts.map +0 -1
  543. package/dist/manifest/build-manifest-resident-parity.test.js +0 -69
  544. package/dist/manifest/build-manifest-resident-parity.test.js.map +0 -1
  545. package/dist/manifest/build-manifest.bench.test.d.ts +0 -22
  546. package/dist/manifest/build-manifest.bench.test.d.ts.map +0 -1
  547. package/dist/manifest/build-manifest.bench.test.js +0 -930
  548. package/dist/manifest/build-manifest.bench.test.js.map +0 -1
  549. package/dist/manifest/build-manifest.test.d.ts +0 -10
  550. package/dist/manifest/build-manifest.test.d.ts.map +0 -1
  551. package/dist/manifest/build-manifest.test.js +0 -1217
  552. package/dist/manifest/build-manifest.test.js.map +0 -1
  553. package/dist/manifest/contract.test.d.ts +0 -17
  554. package/dist/manifest/contract.test.d.ts.map +0 -1
  555. package/dist/manifest/contract.test.js +0 -346
  556. package/dist/manifest/contract.test.js.map +0 -1
  557. package/dist/manifest/import-graph.test.d.ts +0 -25
  558. package/dist/manifest/import-graph.test.d.ts.map +0 -1
  559. package/dist/manifest/import-graph.test.js +0 -120
  560. package/dist/manifest/import-graph.test.js.map +0 -1
  561. package/dist/manifest/ledger-shard-isolation.test.d.ts +0 -18
  562. package/dist/manifest/ledger-shard-isolation.test.d.ts.map +0 -1
  563. package/dist/manifest/ledger-shard-isolation.test.js +0 -153
  564. package/dist/manifest/ledger-shard-isolation.test.js.map +0 -1
  565. package/dist/manifest/snapshot-store.test.d.ts +0 -11
  566. package/dist/manifest/snapshot-store.test.d.ts.map +0 -1
  567. package/dist/manifest/snapshot-store.test.js +0 -206
  568. package/dist/manifest/snapshot-store.test.js.map +0 -1
  569. package/dist/manifest/upload-manifest.test.d.ts +0 -10
  570. package/dist/manifest/upload-manifest.test.d.ts.map +0 -1
  571. package/dist/manifest/upload-manifest.test.js +0 -1335
  572. package/dist/manifest/upload-manifest.test.js.map +0 -1
  573. package/dist/manifest-reconcile.test.d.ts +0 -2
  574. package/dist/manifest-reconcile.test.d.ts.map +0 -1
  575. package/dist/manifest-reconcile.test.js +0 -1029
  576. package/dist/manifest-reconcile.test.js.map +0 -1
  577. package/dist/object-io.test.d.ts +0 -11
  578. package/dist/object-io.test.d.ts.map +0 -1
  579. package/dist/object-io.test.js +0 -2376
  580. package/dist/object-io.test.js.map +0 -1
  581. package/dist/operation-lock.test.d.ts +0 -5
  582. package/dist/operation-lock.test.d.ts.map +0 -1
  583. package/dist/operation-lock.test.js +0 -796
  584. package/dist/operation-lock.test.js.map +0 -1
  585. package/dist/outcome-telemetry.test.d.ts +0 -9
  586. package/dist/outcome-telemetry.test.d.ts.map +0 -1
  587. package/dist/outcome-telemetry.test.js +0 -663
  588. package/dist/outcome-telemetry.test.js.map +0 -1
  589. package/dist/outposts/client.test.d.ts +0 -9
  590. package/dist/outposts/client.test.d.ts.map +0 -1
  591. package/dist/outposts/client.test.js +0 -415
  592. package/dist/outposts/client.test.js.map +0 -1
  593. package/dist/outposts/command.test.d.ts +0 -18
  594. package/dist/outposts/command.test.d.ts.map +0 -1
  595. package/dist/outposts/command.test.js +0 -1230
  596. package/dist/outposts/command.test.js.map +0 -1
  597. package/dist/outposts/replica-sync.test.d.ts +0 -2
  598. package/dist/outposts/replica-sync.test.d.ts.map +0 -1
  599. package/dist/outposts/replica-sync.test.js +0 -224
  600. package/dist/outposts/replica-sync.test.js.map +0 -1
  601. package/dist/outposts/self-deploy.test.d.ts +0 -2
  602. package/dist/outposts/self-deploy.test.d.ts.map +0 -1
  603. package/dist/outposts/self-deploy.test.js +0 -218
  604. package/dist/outposts/self-deploy.test.js.map +0 -1
  605. package/dist/outposts/session-heartbeat-bounds.test.d.ts +0 -25
  606. package/dist/outposts/session-heartbeat-bounds.test.d.ts.map +0 -1
  607. package/dist/outposts/session-heartbeat-bounds.test.js +0 -156
  608. package/dist/outposts/session-heartbeat-bounds.test.js.map +0 -1
  609. package/dist/outposts/session-heartbeat-guard.test.d.ts +0 -16
  610. package/dist/outposts/session-heartbeat-guard.test.d.ts.map +0 -1
  611. package/dist/outposts/session-heartbeat-guard.test.js +0 -88
  612. package/dist/outposts/session-heartbeat-guard.test.js.map +0 -1
  613. package/dist/outposts/session-heartbeat-publisher.test.d.ts +0 -10
  614. package/dist/outposts/session-heartbeat-publisher.test.d.ts.map +0 -1
  615. package/dist/outposts/session-heartbeat-publisher.test.js +0 -153
  616. package/dist/outposts/session-heartbeat-publisher.test.js.map +0 -1
  617. package/dist/outposts/session-heartbeat-retain-guard.test.d.ts +0 -18
  618. package/dist/outposts/session-heartbeat-retain-guard.test.d.ts.map +0 -1
  619. package/dist/outposts/session-heartbeat-retain-guard.test.js +0 -106
  620. package/dist/outposts/session-heartbeat-retain-guard.test.js.map +0 -1
  621. package/dist/outposts/session-heartbeat-scan.test.d.ts +0 -20
  622. package/dist/outposts/session-heartbeat-scan.test.d.ts.map +0 -1
  623. package/dist/outposts/session-heartbeat-scan.test.js +0 -241
  624. package/dist/outposts/session-heartbeat-scan.test.js.map +0 -1
  625. package/dist/outposts/session-heartbeat.test.d.ts +0 -11
  626. package/dist/outposts/session-heartbeat.test.d.ts.map +0 -1
  627. package/dist/outposts/session-heartbeat.test.js +0 -370
  628. package/dist/outposts/session-heartbeat.test.js.map +0 -1
  629. package/dist/outposts/session-host-auth.test.d.ts +0 -16
  630. package/dist/outposts/session-host-auth.test.d.ts.map +0 -1
  631. package/dist/outposts/session-host-auth.test.js +0 -284
  632. package/dist/outposts/session-host-auth.test.js.map +0 -1
  633. package/dist/outposts/session-host-command.test.d.ts +0 -10
  634. package/dist/outposts/session-host-command.test.d.ts.map +0 -1
  635. package/dist/outposts/session-host-command.test.js +0 -180
  636. package/dist/outposts/session-host-command.test.js.map +0 -1
  637. package/dist/outposts/session-host-connection.test.d.ts +0 -18
  638. package/dist/outposts/session-host-connection.test.d.ts.map +0 -1
  639. package/dist/outposts/session-host-connection.test.js +0 -392
  640. package/dist/outposts/session-host-connection.test.js.map +0 -1
  641. package/dist/outposts/session-host-fakes.d.ts +0 -61
  642. package/dist/outposts/session-host-fakes.d.ts.map +0 -1
  643. package/dist/outposts/session-host-fakes.js +0 -115
  644. package/dist/outposts/session-host-fakes.js.map +0 -1
  645. package/dist/outposts/session-host-ndjson.test.d.ts +0 -11
  646. package/dist/outposts/session-host-ndjson.test.d.ts.map +0 -1
  647. package/dist/outposts/session-host-ndjson.test.js +0 -73
  648. package/dist/outposts/session-host-ndjson.test.js.map +0 -1
  649. package/dist/outposts/session-host-protocol.test.d.ts +0 -15
  650. package/dist/outposts/session-host-protocol.test.d.ts.map +0 -1
  651. package/dist/outposts/session-host-protocol.test.js +0 -0
  652. package/dist/outposts/session-host-protocol.test.js.map +0 -1
  653. package/dist/outposts/session-host-server.test.d.ts +0 -10
  654. package/dist/outposts/session-host-server.test.d.ts.map +0 -1
  655. package/dist/outposts/session-host-server.test.js +0 -118
  656. package/dist/outposts/session-host-server.test.js.map +0 -1
  657. package/dist/outposts/session-host-sessions.test.d.ts +0 -18
  658. package/dist/outposts/session-host-sessions.test.d.ts.map +0 -1
  659. package/dist/outposts/session-host-sessions.test.js +0 -439
  660. package/dist/outposts/session-host-sessions.test.js.map +0 -1
  661. package/dist/outposts/terminal.test.d.ts +0 -2
  662. package/dist/outposts/terminal.test.d.ts.map +0 -1
  663. package/dist/outposts/terminal.test.js +0 -146
  664. package/dist/outposts/terminal.test.js.map +0 -1
  665. package/dist/outposts/transport.test.d.ts +0 -10
  666. package/dist/outposts/transport.test.d.ts.map +0 -1
  667. package/dist/outposts/transport.test.js +0 -205
  668. package/dist/outposts/transport.test.js.map +0 -1
  669. package/dist/packed-journal-phase2.test.d.ts +0 -2
  670. package/dist/packed-journal-phase2.test.d.ts.map +0 -1
  671. package/dist/packed-journal-phase2.test.js +0 -273
  672. package/dist/packed-journal-phase2.test.js.map +0 -1
  673. package/dist/path-ancestors.test.d.ts +0 -2
  674. package/dist/path-ancestors.test.d.ts.map +0 -1
  675. package/dist/path-ancestors.test.js +0 -21
  676. package/dist/path-ancestors.test.js.map +0 -1
  677. package/dist/personal-vault-exclusions.test.d.ts +0 -22
  678. package/dist/personal-vault-exclusions.test.d.ts.map +0 -1
  679. package/dist/personal-vault-exclusions.test.js +0 -294
  680. package/dist/personal-vault-exclusions.test.js.map +0 -1
  681. package/dist/personal-vault.test.d.ts +0 -18
  682. package/dist/personal-vault.test.d.ts.map +0 -1
  683. package/dist/personal-vault.test.js +0 -1099
  684. package/dist/personal-vault.test.js.map +0 -1
  685. package/dist/plan-limit-pause.test.d.ts +0 -2
  686. package/dist/plan-limit-pause.test.d.ts.map +0 -1
  687. package/dist/plan-limit-pause.test.js +0 -150
  688. package/dist/plan-limit-pause.test.js.map +0 -1
  689. package/dist/plan-limit.fixtures.d.ts +0 -34
  690. package/dist/plan-limit.fixtures.d.ts.map +0 -1
  691. package/dist/plan-limit.fixtures.js +0 -96
  692. package/dist/plan-limit.fixtures.js.map +0 -1
  693. package/dist/plan-limit.test.d.ts +0 -2
  694. package/dist/plan-limit.test.d.ts.map +0 -1
  695. package/dist/plan-limit.test.js +0 -132
  696. package/dist/plan-limit.test.js.map +0 -1
  697. package/dist/prefix-coalesce.test.d.ts +0 -2
  698. package/dist/prefix-coalesce.test.d.ts.map +0 -1
  699. package/dist/prefix-coalesce.test.js +0 -260
  700. package/dist/prefix-coalesce.test.js.map +0 -1
  701. package/dist/private-folder-transport.test.d.ts +0 -2
  702. package/dist/private-folder-transport.test.d.ts.map +0 -1
  703. package/dist/private-folder-transport.test.js +0 -33
  704. package/dist/private-folder-transport.test.js.map +0 -1
  705. package/dist/public-surface.test.d.ts +0 -15
  706. package/dist/public-surface.test.d.ts.map +0 -1
  707. package/dist/public-surface.test.js +0 -110
  708. package/dist/public-surface.test.js.map +0 -1
  709. package/dist/qmd-reindex.test.d.ts +0 -14
  710. package/dist/qmd-reindex.test.d.ts.map +0 -1
  711. package/dist/qmd-reindex.test.js +0 -899
  712. package/dist/qmd-reindex.test.js.map +0 -1
  713. package/dist/read-only-state-dir.test.d.ts +0 -27
  714. package/dist/read-only-state-dir.test.d.ts.map +0 -1
  715. package/dist/read-only-state-dir.test.js +0 -167
  716. package/dist/read-only-state-dir.test.js.map +0 -1
  717. package/dist/remote-pull.test.d.ts +0 -2
  718. package/dist/remote-pull.test.d.ts.map +0 -1
  719. package/dist/remote-pull.test.js +0 -1147
  720. package/dist/remote-pull.test.js.map +0 -1
  721. package/dist/s3-download-stream-hash.test.d.ts +0 -2
  722. package/dist/s3-download-stream-hash.test.d.ts.map +0 -1
  723. package/dist/s3-download-stream-hash.test.js +0 -70
  724. package/dist/s3-download-stream-hash.test.js.map +0 -1
  725. package/dist/s3.list-cost.test.d.ts +0 -2
  726. package/dist/s3.list-cost.test.d.ts.map +0 -1
  727. package/dist/s3.list-cost.test.js +0 -51
  728. package/dist/s3.list-cost.test.js.map +0 -1
  729. package/dist/s3.rename-retry.test.d.ts +0 -2
  730. package/dist/s3.rename-retry.test.d.ts.map +0 -1
  731. package/dist/s3.rename-retry.test.js +0 -217
  732. package/dist/s3.rename-retry.test.js.map +0 -1
  733. package/dist/s3.symlink-materialize.test.d.ts +0 -18
  734. package/dist/s3.symlink-materialize.test.d.ts.map +0 -1
  735. package/dist/s3.symlink-materialize.test.js +0 -579
  736. package/dist/s3.symlink-materialize.test.js.map +0 -1
  737. package/dist/s3.test.d.ts +0 -9
  738. package/dist/s3.test.d.ts.map +0 -1
  739. package/dist/s3.test.js +0 -2047
  740. package/dist/s3.test.js.map +0 -1
  741. package/dist/s3.windows-portability.test.d.ts +0 -12
  742. package/dist/s3.windows-portability.test.d.ts.map +0 -1
  743. package/dist/s3.windows-portability.test.js +0 -223
  744. package/dist/s3.windows-portability.test.js.map +0 -1
  745. package/dist/schemas/signal-types.test.d.ts +0 -2
  746. package/dist/schemas/signal-types.test.d.ts.map +0 -1
  747. package/dist/schemas/signal-types.test.js +0 -65
  748. package/dist/schemas/signal-types.test.js.map +0 -1
  749. package/dist/schemas/source-channels.test.d.ts +0 -2
  750. package/dist/schemas/source-channels.test.d.ts.map +0 -1
  751. package/dist/schemas/source-channels.test.js +0 -65
  752. package/dist/schemas/source-channels.test.js.map +0 -1
  753. package/dist/scope-shrink.test.d.ts +0 -13
  754. package/dist/scope-shrink.test.d.ts.map +0 -1
  755. package/dist/scope-shrink.test.js +0 -558
  756. package/dist/scope-shrink.test.js.map +0 -1
  757. package/dist/session-log-capture.test.d.ts +0 -2
  758. package/dist/session-log-capture.test.d.ts.map +0 -1
  759. package/dist/session-log-capture.test.js +0 -533
  760. package/dist/session-log-capture.test.js.map +0 -1
  761. package/dist/session-log-retention.test.d.ts +0 -2
  762. package/dist/session-log-retention.test.d.ts.map +0 -1
  763. package/dist/session-log-retention.test.js +0 -383
  764. package/dist/session-log-retention.test.js.map +0 -1
  765. package/dist/signals/get.test.d.ts +0 -5
  766. package/dist/signals/get.test.d.ts.map +0 -1
  767. package/dist/signals/get.test.js +0 -254
  768. package/dist/signals/get.test.js.map +0 -1
  769. package/dist/signals/list.test.d.ts +0 -9
  770. package/dist/signals/list.test.d.ts.map +0 -1
  771. package/dist/signals/list.test.js +0 -330
  772. package/dist/signals/list.test.js.map +0 -1
  773. package/dist/skill-telemetry.test.d.ts +0 -2
  774. package/dist/skill-telemetry.test.d.ts.map +0 -1
  775. package/dist/skill-telemetry.test.js +0 -1484
  776. package/dist/skill-telemetry.test.js.map +0 -1
  777. package/dist/sources/get.test.d.ts +0 -5
  778. package/dist/sources/get.test.d.ts.map +0 -1
  779. package/dist/sources/get.test.js +0 -236
  780. package/dist/sources/get.test.js.map +0 -1
  781. package/dist/sources/list.test.d.ts +0 -8
  782. package/dist/sources/list.test.d.ts.map +0 -1
  783. package/dist/sources/list.test.js +0 -318
  784. package/dist/sources/list.test.js.map +0 -1
  785. package/dist/sts-credential-refresh.test.d.ts +0 -2
  786. package/dist/sts-credential-refresh.test.d.ts.map +0 -1
  787. package/dist/sts-credential-refresh.test.js +0 -181
  788. package/dist/sts-credential-refresh.test.js.map +0 -1
  789. package/dist/swallowed-error-sites.test.d.ts +0 -2
  790. package/dist/swallowed-error-sites.test.d.ts.map +0 -1
  791. package/dist/swallowed-error-sites.test.js +0 -199
  792. package/dist/swallowed-error-sites.test.js.map +0 -1
  793. package/dist/swallowed-error-w32.test.d.ts +0 -2
  794. package/dist/swallowed-error-w32.test.d.ts.map +0 -1
  795. package/dist/swallowed-error-w32.test.js +0 -171
  796. package/dist/swallowed-error-w32.test.js.map +0 -1
  797. package/dist/swallowed-error-w33.test.d.ts +0 -2
  798. package/dist/swallowed-error-w33.test.d.ts.map +0 -1
  799. package/dist/swallowed-error-w33.test.js +0 -125
  800. package/dist/swallowed-error-w33.test.js.map +0 -1
  801. package/dist/swallowed-error-w34.test.d.ts +0 -2
  802. package/dist/swallowed-error-w34.test.d.ts.map +0 -1
  803. package/dist/swallowed-error-w34.test.js +0 -110
  804. package/dist/swallowed-error-w34.test.js.map +0 -1
  805. package/dist/swallowed-error-w35.test.d.ts +0 -2
  806. package/dist/swallowed-error-w35.test.d.ts.map +0 -1
  807. package/dist/swallowed-error-w35.test.js +0 -223
  808. package/dist/swallowed-error-w35.test.js.map +0 -1
  809. package/dist/sync/area-ledger-auto-migration.test.d.ts +0 -2
  810. package/dist/sync/area-ledger-auto-migration.test.d.ts.map +0 -1
  811. package/dist/sync/area-ledger-auto-migration.test.js +0 -291
  812. package/dist/sync/area-ledger-auto-migration.test.js.map +0 -1
  813. package/dist/sync/area-ledger-migration.test.d.ts +0 -2
  814. package/dist/sync/area-ledger-migration.test.d.ts.map +0 -1
  815. package/dist/sync/area-ledger-migration.test.js +0 -554
  816. package/dist/sync/area-ledger-migration.test.js.map +0 -1
  817. package/dist/sync/area-ledger-recovery.bench.test.d.ts +0 -2
  818. package/dist/sync/area-ledger-recovery.bench.test.d.ts.map +0 -1
  819. package/dist/sync/area-ledger-recovery.bench.test.js +0 -60
  820. package/dist/sync/area-ledger-recovery.bench.test.js.map +0 -1
  821. package/dist/sync/area-ledger-writer-lock.bench.test.d.ts +0 -2
  822. package/dist/sync/area-ledger-writer-lock.bench.test.d.ts.map +0 -1
  823. package/dist/sync/area-ledger-writer-lock.bench.test.js +0 -57
  824. package/dist/sync/area-ledger-writer-lock.bench.test.js.map +0 -1
  825. package/dist/sync/area-ledger.test.d.ts +0 -2
  826. package/dist/sync/area-ledger.test.d.ts.map +0 -1
  827. package/dist/sync/area-ledger.test.js +0 -1401
  828. package/dist/sync/area-ledger.test.js.map +0 -1
  829. package/dist/sync/area-resolver.test.d.ts +0 -2
  830. package/dist/sync/area-resolver.test.d.ts.map +0 -1
  831. package/dist/sync/area-resolver.test.js +0 -234
  832. package/dist/sync/area-resolver.test.js.map +0 -1
  833. package/dist/sync/base-version-resolver.test.d.ts +0 -2
  834. package/dist/sync/base-version-resolver.test.d.ts.map +0 -1
  835. package/dist/sync/base-version-resolver.test.js +0 -24
  836. package/dist/sync/base-version-resolver.test.js.map +0 -1
  837. package/dist/sync/candidate-uploader.test.d.ts +0 -2
  838. package/dist/sync/candidate-uploader.test.d.ts.map +0 -1
  839. package/dist/sync/candidate-uploader.test.js +0 -132
  840. package/dist/sync/candidate-uploader.test.js.map +0 -1
  841. package/dist/sync/child-process-sync-worker-env.test.d.ts +0 -2
  842. package/dist/sync/child-process-sync-worker-env.test.d.ts.map +0 -1
  843. package/dist/sync/child-process-sync-worker-env.test.js +0 -38
  844. package/dist/sync/child-process-sync-worker-env.test.js.map +0 -1
  845. package/dist/sync/child-process-sync-worker-errors.test.d.ts +0 -2
  846. package/dist/sync/child-process-sync-worker-errors.test.d.ts.map +0 -1
  847. package/dist/sync/child-process-sync-worker-errors.test.js +0 -121
  848. package/dist/sync/child-process-sync-worker-errors.test.js.map +0 -1
  849. package/dist/sync/child-process-sync-worker.test.d.ts +0 -2
  850. package/dist/sync/child-process-sync-worker.test.d.ts.map +0 -1
  851. package/dist/sync/child-process-sync-worker.test.js +0 -262
  852. package/dist/sync/child-process-sync-worker.test.js.map +0 -1
  853. package/dist/sync/content-hash.test.d.ts +0 -2
  854. package/dist/sync/content-hash.test.d.ts.map +0 -1
  855. package/dist/sync/content-hash.test.js +0 -16
  856. package/dist/sync/content-hash.test.js.map +0 -1
  857. package/dist/sync/delta-client.test.d.ts +0 -2
  858. package/dist/sync/delta-client.test.d.ts.map +0 -1
  859. package/dist/sync/delta-client.test.js +0 -97
  860. package/dist/sync/delta-client.test.js.map +0 -1
  861. package/dist/sync/durable-apply.test.d.ts +0 -2
  862. package/dist/sync/durable-apply.test.d.ts.map +0 -1
  863. package/dist/sync/durable-apply.test.js +0 -180
  864. package/dist/sync/durable-apply.test.js.map +0 -1
  865. package/dist/sync/event-sync.test.d.ts +0 -14
  866. package/dist/sync/event-sync.test.d.ts.map +0 -1
  867. package/dist/sync/event-sync.test.js +0 -1714
  868. package/dist/sync/event-sync.test.js.map +0 -1
  869. package/dist/sync/feature-flags.test.d.ts +0 -24
  870. package/dist/sync/feature-flags.test.d.ts.map +0 -1
  871. package/dist/sync/feature-flags.test.js +0 -594
  872. package/dist/sync/feature-flags.test.js.map +0 -1
  873. package/dist/sync/full-pass-cap-governor.bench.test.d.ts +0 -2
  874. package/dist/sync/full-pass-cap-governor.bench.test.d.ts.map +0 -1
  875. package/dist/sync/full-pass-cap-governor.bench.test.js +0 -179
  876. package/dist/sync/full-pass-cap-governor.bench.test.js.map +0 -1
  877. package/dist/sync/full-pass-caps.test.d.ts +0 -2
  878. package/dist/sync/full-pass-caps.test.d.ts.map +0 -1
  879. package/dist/sync/full-pass-caps.test.js +0 -550
  880. package/dist/sync/full-pass-caps.test.js.map +0 -1
  881. package/dist/sync/idle-full-reconcile.test.d.ts +0 -2
  882. package/dist/sync/idle-full-reconcile.test.d.ts.map +0 -1
  883. package/dist/sync/idle-full-reconcile.test.js +0 -62
  884. package/dist/sync/idle-full-reconcile.test.js.map +0 -1
  885. package/dist/sync/inbound-event-admission.test.d.ts +0 -2
  886. package/dist/sync/inbound-event-admission.test.d.ts.map +0 -1
  887. package/dist/sync/inbound-event-admission.test.js +0 -125
  888. package/dist/sync/inbound-event-admission.test.js.map +0 -1
  889. package/dist/sync/journal-ledger-stream.test.d.ts +0 -12
  890. package/dist/sync/journal-ledger-stream.test.d.ts.map +0 -1
  891. package/dist/sync/journal-ledger-stream.test.js +0 -134
  892. package/dist/sync/journal-ledger-stream.test.js.map +0 -1
  893. package/dist/sync/lease-client.test.d.ts +0 -2
  894. package/dist/sync/lease-client.test.d.ts.map +0 -1
  895. package/dist/sync/lease-client.test.js +0 -119
  896. package/dist/sync/lease-client.test.js.map +0 -1
  897. package/dist/sync/logger.test.d.ts +0 -19
  898. package/dist/sync/logger.test.d.ts.map +0 -1
  899. package/dist/sync/logger.test.js +0 -204
  900. package/dist/sync/logger.test.js.map +0 -1
  901. package/dist/sync/metrics.test.d.ts +0 -19
  902. package/dist/sync/metrics.test.d.ts.map +0 -1
  903. package/dist/sync/metrics.test.js +0 -357
  904. package/dist/sync/metrics.test.js.map +0 -1
  905. package/dist/sync/multipart-uploader.test.d.ts +0 -2
  906. package/dist/sync/multipart-uploader.test.d.ts.map +0 -1
  907. package/dist/sync/multipart-uploader.test.js +0 -135
  908. package/dist/sync/multipart-uploader.test.js.map +0 -1
  909. package/dist/sync/mutation-client.test.d.ts +0 -2
  910. package/dist/sync/mutation-client.test.d.ts.map +0 -1
  911. package/dist/sync/mutation-client.test.js +0 -100
  912. package/dist/sync/mutation-client.test.js.map +0 -1
  913. package/dist/sync/mutation-session.test.d.ts +0 -2
  914. package/dist/sync/mutation-session.test.d.ts.map +0 -1
  915. package/dist/sync/mutation-session.test.js +0 -190
  916. package/dist/sync/mutation-session.test.js.map +0 -1
  917. package/dist/sync/parallel-sync-coordinator.test.d.ts +0 -2
  918. package/dist/sync/parallel-sync-coordinator.test.d.ts.map +0 -1
  919. package/dist/sync/parallel-sync-coordinator.test.js +0 -564
  920. package/dist/sync/parallel-sync-coordinator.test.js.map +0 -1
  921. package/dist/sync/path-leases.test.d.ts +0 -2
  922. package/dist/sync/path-leases.test.d.ts.map +0 -1
  923. package/dist/sync/path-leases.test.js +0 -51
  924. package/dist/sync/path-leases.test.js.map +0 -1
  925. package/dist/sync/per-area-maintenance.test.d.ts +0 -2
  926. package/dist/sync/per-area-maintenance.test.d.ts.map +0 -1
  927. package/dist/sync/per-area-maintenance.test.js +0 -100
  928. package/dist/sync/per-area-maintenance.test.js.map +0 -1
  929. package/dist/sync/push-event.test.d.ts +0 -15
  930. package/dist/sync/push-event.test.d.ts.map +0 -1
  931. package/dist/sync/push-event.test.js +0 -282
  932. package/dist/sync/push-event.test.js.map +0 -1
  933. package/dist/sync/push-receiver.test.d.ts +0 -25
  934. package/dist/sync/push-receiver.test.d.ts.map +0 -1
  935. package/dist/sync/push-receiver.test.js +0 -2851
  936. package/dist/sync/push-receiver.test.js.map +0 -1
  937. package/dist/sync/push-transport.test.d.ts +0 -2
  938. package/dist/sync/push-transport.test.d.ts.map +0 -1
  939. package/dist/sync/push-transport.test.js +0 -70
  940. package/dist/sync/push-transport.test.js.map +0 -1
  941. package/dist/sync/push-walk-matchers.bench.test.d.ts +0 -2
  942. package/dist/sync/push-walk-matchers.bench.test.d.ts.map +0 -1
  943. package/dist/sync/push-walk-matchers.bench.test.js +0 -230
  944. package/dist/sync/push-walk-matchers.bench.test.js.map +0 -1
  945. package/dist/sync/realtime-network-integration.test.d.ts +0 -2
  946. package/dist/sync/realtime-network-integration.test.d.ts.map +0 -1
  947. package/dist/sync/realtime-network-integration.test.js +0 -83
  948. package/dist/sync/realtime-network-integration.test.js.map +0 -1
  949. package/dist/sync/realtime-rollout.test.d.ts +0 -2
  950. package/dist/sync/realtime-rollout.test.d.ts.map +0 -1
  951. package/dist/sync/realtime-rollout.test.js +0 -94
  952. package/dist/sync/realtime-rollout.test.js.map +0 -1
  953. package/dist/sync/realtime-telemetry.test.d.ts +0 -2
  954. package/dist/sync/realtime-telemetry.test.d.ts.map +0 -1
  955. package/dist/sync/realtime-telemetry.test.js +0 -300
  956. package/dist/sync/realtime-telemetry.test.js.map +0 -1
  957. package/dist/sync/receiver-origin-config.test.d.ts +0 -2
  958. package/dist/sync/receiver-origin-config.test.d.ts.map +0 -1
  959. package/dist/sync/receiver-origin-config.test.js +0 -39
  960. package/dist/sync/receiver-origin-config.test.js.map +0 -1
  961. package/dist/sync/reconcile-cursor.test.d.ts +0 -2
  962. package/dist/sync/reconcile-cursor.test.d.ts.map +0 -1
  963. package/dist/sync/reconcile-cursor.test.js +0 -139
  964. package/dist/sync/reconcile-cursor.test.js.map +0 -1
  965. package/dist/sync/remote-file-spool.test.d.ts +0 -2
  966. package/dist/sync/remote-file-spool.test.d.ts.map +0 -1
  967. package/dist/sync/remote-file-spool.test.js +0 -77
  968. package/dist/sync/remote-file-spool.test.js.map +0 -1
  969. package/dist/sync/scope-inventory-client.test.d.ts +0 -2
  970. package/dist/sync/scope-inventory-client.test.d.ts.map +0 -1
  971. package/dist/sync/scope-inventory-client.test.js +0 -103
  972. package/dist/sync/scope-inventory-client.test.js.map +0 -1
  973. package/dist/sync/secret-path-policy.test.d.ts +0 -2
  974. package/dist/sync/secret-path-policy.test.d.ts.map +0 -1
  975. package/dist/sync/secret-path-policy.test.js +0 -183
  976. package/dist/sync/secret-path-policy.test.js.map +0 -1
  977. package/dist/sync/snapshot-client.test.d.ts +0 -2
  978. package/dist/sync/snapshot-client.test.d.ts.map +0 -1
  979. package/dist/sync/snapshot-client.test.js +0 -169
  980. package/dist/sync/snapshot-client.test.js.map +0 -1
  981. package/dist/sync/state-store.test.d.ts +0 -2
  982. package/dist/sync/state-store.test.d.ts.map +0 -1
  983. package/dist/sync/state-store.test.js +0 -1556
  984. package/dist/sync/state-store.test.js.map +0 -1
  985. package/dist/sync/sync-contract.test.d.ts +0 -2
  986. package/dist/sync/sync-contract.test.d.ts.map +0 -1
  987. package/dist/sync/sync-contract.test.js +0 -141
  988. package/dist/sync/sync-contract.test.js.map +0 -1
  989. package/dist/sync/targeted-pull-prefixes.test.d.ts +0 -2
  990. package/dist/sync/targeted-pull-prefixes.test.d.ts.map +0 -1
  991. package/dist/sync/targeted-pull-prefixes.test.js +0 -33
  992. package/dist/sync/targeted-pull-prefixes.test.js.map +0 -1
  993. package/dist/sync/targeted-upsert-exact-list.test.d.ts +0 -2
  994. package/dist/sync/targeted-upsert-exact-list.test.d.ts.map +0 -1
  995. package/dist/sync/targeted-upsert-exact-list.test.js +0 -247
  996. package/dist/sync/targeted-upsert-exact-list.test.js.map +0 -1
  997. package/dist/sync/unchanged-push-events.test.d.ts +0 -2
  998. package/dist/sync/unchanged-push-events.test.d.ts.map +0 -1
  999. package/dist/sync/unchanged-push-events.test.js +0 -76
  1000. package/dist/sync/unchanged-push-events.test.js.map +0 -1
  1001. package/dist/sync/uploader-finalization.test.d.ts +0 -2
  1002. package/dist/sync/uploader-finalization.test.d.ts.map +0 -1
  1003. package/dist/sync/uploader-finalization.test.js +0 -107
  1004. package/dist/sync/uploader-finalization.test.js.map +0 -1
  1005. package/dist/sync-core.test.d.ts +0 -2
  1006. package/dist/sync-core.test.d.ts.map +0 -1
  1007. package/dist/sync-core.test.js +0 -189
  1008. package/dist/sync-core.test.js.map +0 -1
  1009. package/dist/sync-progress.test.d.ts +0 -2
  1010. package/dist/sync-progress.test.d.ts.map +0 -1
  1011. package/dist/sync-progress.test.js +0 -277
  1012. package/dist/sync-progress.test.js.map +0 -1
  1013. package/dist/telemetry-events.test.d.ts +0 -2
  1014. package/dist/telemetry-events.test.d.ts.map +0 -1
  1015. package/dist/telemetry-events.test.js +0 -113
  1016. package/dist/telemetry-events.test.js.map +0 -1
  1017. package/dist/telemetry.test.d.ts +0 -11
  1018. package/dist/telemetry.test.d.ts.map +0 -1
  1019. package/dist/telemetry.test.js +0 -1603
  1020. package/dist/telemetry.test.js.map +0 -1
  1021. package/dist/vault-client.test.d.ts +0 -7
  1022. package/dist/vault-client.test.d.ts.map +0 -1
  1023. package/dist/vault-client.test.js +0 -1334
  1024. package/dist/vault-client.test.js.map +0 -1
  1025. package/dist/watch-coverage.test.d.ts +0 -2
  1026. package/dist/watch-coverage.test.d.ts.map +0 -1
  1027. package/dist/watch-coverage.test.js +0 -56
  1028. package/dist/watch-coverage.test.js.map +0 -1
  1029. package/dist/watch-owner-lease.test.d.ts +0 -2
  1030. package/dist/watch-owner-lease.test.d.ts.map +0 -1
  1031. package/dist/watch-owner-lease.test.js +0 -353
  1032. package/dist/watch-owner-lease.test.js.map +0 -1
  1033. package/dist/watch-parent.test.d.ts +0 -2
  1034. package/dist/watch-parent.test.d.ts.map +0 -1
  1035. package/dist/watch-parent.test.js +0 -131
  1036. package/dist/watch-parent.test.js.map +0 -1
  1037. package/dist/watch-roots.test.d.ts +0 -18
  1038. package/dist/watch-roots.test.d.ts.map +0 -1
  1039. package/dist/watch-roots.test.js +0 -395
  1040. package/dist/watch-roots.test.js.map +0 -1
  1041. package/dist/watcher-continuity-hot-path.test.d.ts +0 -2
  1042. package/dist/watcher-continuity-hot-path.test.d.ts.map +0 -1
  1043. package/dist/watcher-continuity-hot-path.test.js +0 -40
  1044. package/dist/watcher-continuity-hot-path.test.js.map +0 -1
  1045. package/dist/watcher-event-gate.test.d.ts +0 -16
  1046. package/dist/watcher-event-gate.test.d.ts.map +0 -1
  1047. package/dist/watcher-event-gate.test.js +0 -191
  1048. package/dist/watcher-event-gate.test.js.map +0 -1
  1049. package/dist/watcher-replan-sweep.test.d.ts +0 -2
  1050. package/dist/watcher-replan-sweep.test.d.ts.map +0 -1
  1051. package/dist/watcher-replan-sweep.test.js +0 -245
  1052. package/dist/watcher-replan-sweep.test.js.map +0 -1
  1053. package/dist/watcher-stdout.test.d.ts +0 -2
  1054. package/dist/watcher-stdout.test.d.ts.map +0 -1
  1055. package/dist/watcher-stdout.test.js +0 -86
  1056. package/dist/watcher-stdout.test.js.map +0 -1
  1057. package/dist/watcher.test.d.ts +0 -2
  1058. package/dist/watcher.test.d.ts.map +0 -1
  1059. package/dist/watcher.test.js +0 -4301
  1060. package/dist/watcher.test.js.map +0 -1
  1061. package/dist/watcher.warmup-cancel.test.d.ts +0 -2
  1062. package/dist/watcher.warmup-cancel.test.d.ts.map +0 -1
  1063. package/dist/watcher.warmup-cancel.test.js +0 -59
  1064. package/dist/watcher.warmup-cancel.test.js.map +0 -1
  1065. package/dist/watcher.warmup-responsive.test.d.ts +0 -2
  1066. package/dist/watcher.warmup-responsive.test.d.ts.map +0 -1
  1067. package/dist/watcher.warmup-responsive.test.js +0 -62
  1068. package/dist/watcher.warmup-responsive.test.js.map +0 -1
@@ -1,1714 +0,0 @@
1
- /**
2
- * Phase 3 event-sync tests (US-017/US-018/US-019).
3
- *
4
- * - resolveEventSync: exact-email gate semantics + env-override precedence.
5
- * - subscribeSyncReceive: request shape, response validation, failure surface.
6
- * - sqsClientFromAwsSdk: command mapping + abort-signal forwarding.
7
- * - createRefreshingSqsClient: proactive skew refresh, reactive retry-once on
8
- * expiry-class errors, non-expiry errors propagate, concurrent refresh
9
- * collapse.
10
- * - startEventSync: happy-path handle wiring (self-echo filter, publish leg),
11
- * poll-only degradation on subscribe/tenant failure.
12
- */
13
- import { describe, expect, it, vi } from "vitest";
14
- import * as fs from "node:fs";
15
- import * as os from "node:os";
16
- import * as path from "node:path";
17
- import { resolveEventSync, subscribeSyncReceive, sqsClientFromAwsSdk, createRefreshingSqsClient, createUnifiedRealtimeScheduler, startEventSync, } from "./event-sync.js";
18
- import { RealtimeUnavailableError, SyncDeviceLimitError, } from "./push-transport.js";
19
- import { hashFile } from "../journal.js";
20
- import { FakeClock } from "../watcher.js";
21
- function subscribeResponse(overrides = {}, queueUrl = "https://sqs.us-east-1.amazonaws.com/000000000000/sync-push-prs_t-dev1") {
22
- return {
23
- queueUrl,
24
- region: "us-east-1",
25
- credentials: {
26
- accessKeyId: "AKIA-1",
27
- secretAccessKey: "sec-1",
28
- sessionToken: "tok-1",
29
- expiration: "2026-06-10T13:00:00.000Z",
30
- ...overrides,
31
- },
32
- };
33
- }
34
- // ─── resolveEventSync (US-019) ──────────────────────────────────────────────
35
- describe("resolveEventSync — local disable only", () => {
36
- it.each(["0", "false", "no", "off"])("override %j keeps the event path dormant", (override) => expect(resolveEventSync(override)).toBe(false));
37
- it.each([undefined, "", "1", "true", "yes", "on", "indigo"])("override %j cannot grant authority", (override) => expect(resolveEventSync(override)).toBe(true));
38
- });
39
- describe("createUnifiedRealtimeScheduler", () => {
40
- it("coalesces watcher, wake, reconnect, retry, and high-water through one guard", async () => {
41
- let active = 0;
42
- let maximumActive = 0;
43
- let drains = 0;
44
- const firstState = { release: null };
45
- const first = new Promise((resolve) => { firstState.release = resolve; });
46
- const scheduler = createUnifiedRealtimeScheduler({
47
- runGuarded: async (drain) => {
48
- active += 1;
49
- maximumActive = Math.max(maximumActive, active);
50
- try {
51
- await drain();
52
- }
53
- finally {
54
- active -= 1;
55
- }
56
- },
57
- drain: async () => {
58
- drains += 1;
59
- if (drains === 1)
60
- await first;
61
- },
62
- checkHighWater: async () => true,
63
- });
64
- scheduler.signal("watcher");
65
- scheduler.signal("wake");
66
- scheduler.signal("reconnect");
67
- scheduler.signal("retry");
68
- await Promise.resolve();
69
- expect(drains).toBe(1);
70
- await scheduler.checkHighWater();
71
- firstState.release?.();
72
- for (let i = 0; i < 8; i++)
73
- await Promise.resolve();
74
- expect(maximumActive).toBe(1);
75
- // The four signals and high-water collapse into one post-drain pass.
76
- expect(drains).toBe(2);
77
- await scheduler.dispose();
78
- });
79
- it("recovers all-lost wakes through high-water without a V1 callback", async () => {
80
- const drain = vi.fn().mockResolvedValue(undefined);
81
- const scheduler = createUnifiedRealtimeScheduler({
82
- runGuarded: async (work) => work(),
83
- drain,
84
- checkHighWater: async () => true,
85
- });
86
- await scheduler.checkHighWater();
87
- for (let i = 0; i < 4; i++)
88
- await Promise.resolve();
89
- expect(drain).toHaveBeenCalledOnce();
90
- await scheduler.dispose();
91
- });
92
- it("disposes the old receiver and drops its pending wakes when identity changes", async () => {
93
- const firstState = { listener: null };
94
- const secondState = { listener: null };
95
- const first = { start: (listener) => { firstState.listener = listener; }, dispose: vi.fn() };
96
- const second = { start: (listener) => { secondState.listener = listener; }, dispose: vi.fn() };
97
- const drain = vi.fn().mockResolvedValue(undefined);
98
- const scheduler = createUnifiedRealtimeScheduler({ runGuarded: async (work) => work(), drain });
99
- await scheduler.replaceIdentity("identity-a", first);
100
- // The reconnect signal may drain, isolate the old-wake assertion below.
101
- await Promise.resolve();
102
- drain.mockClear();
103
- await scheduler.replaceIdentity("identity-b", second);
104
- expect(first.dispose).toHaveBeenCalledOnce();
105
- // The new receiver's reconnect check is its own bounded drain. Isolate
106
- // delivery below so this assertion specifically proves the old listener
107
- // could not enqueue work after identity disposal.
108
- for (let i = 0; i < 4; i++)
109
- await Promise.resolve();
110
- drain.mockClear();
111
- firstState.listener?.(JSON.stringify({ contractVersion: 2, eventType: "vault.changed", scopeHandle: "scope_a", cursor: "old_cursor" }));
112
- secondState.listener?.(JSON.stringify({ contractVersion: 2, eventType: "vault.changed", scopeHandle: "scope_b", cursor: "new_cursor" }));
113
- for (let i = 0; i < 4; i++)
114
- await Promise.resolve();
115
- expect(drain).toHaveBeenCalledOnce();
116
- await scheduler.dispose();
117
- expect(second.dispose).toHaveBeenCalledOnce();
118
- });
119
- it("quiesces an in-flight old-identity drain before starting its replacement", async () => {
120
- const drainState = { release: null };
121
- const drainGate = new Promise((resolve) => { drainState.release = resolve; });
122
- const first = { start: () => undefined, dispose: vi.fn() };
123
- const second = { start: vi.fn(), dispose: vi.fn() };
124
- const scheduler = createUnifiedRealtimeScheduler({
125
- runGuarded: async (work) => work(),
126
- drain: async () => drainGate,
127
- });
128
- await scheduler.replaceIdentity("identity-a", first);
129
- const replacement = scheduler.replaceIdentity("identity-b", second);
130
- await Promise.resolve();
131
- expect(first.dispose).toHaveBeenCalledOnce();
132
- expect(second.start).not.toHaveBeenCalled();
133
- drainState.release?.();
134
- await replacement;
135
- expect(second.start).toHaveBeenCalledOnce();
136
- await scheduler.dispose();
137
- });
138
- it("retains a failed drain bit for its bounded retry", async () => {
139
- vi.useFakeTimers();
140
- try {
141
- const drain = vi
142
- .fn()
143
- .mockRejectedValueOnce(new Error("temporary"))
144
- .mockResolvedValueOnce(undefined);
145
- const scheduler = createUnifiedRealtimeScheduler({
146
- runGuarded: async (work) => work(),
147
- drain,
148
- retryDelayMs: 0,
149
- onError: () => undefined,
150
- });
151
- scheduler.signal("wake");
152
- await Promise.resolve();
153
- await vi.advanceTimersByTimeAsync(0);
154
- expect(drain).toHaveBeenCalledTimes(2);
155
- await scheduler.dispose();
156
- }
157
- finally {
158
- vi.useRealTimers();
159
- }
160
- });
161
- it("cleans up a partially started replacement receiver", async () => {
162
- const sourceState = { callback: null };
163
- const source = {
164
- start: (listener) => {
165
- sourceState.callback = listener;
166
- throw new Error("startup failed");
167
- },
168
- dispose: vi.fn(),
169
- };
170
- const drain = vi.fn().mockResolvedValue(undefined);
171
- const scheduler = createUnifiedRealtimeScheduler({ runGuarded: async (work) => work(), drain });
172
- await expect(scheduler.replaceIdentity("identity-a", source)).rejects.toThrow(/startup failed/);
173
- expect(source.dispose).toHaveBeenCalledOnce();
174
- sourceState.callback?.(JSON.stringify({ contractVersion: 2, eventType: "vault.changed", scopeHandle: "scope_a", cursor: "cursor_a" }));
175
- await Promise.resolve();
176
- expect(drain).not.toHaveBeenCalled();
177
- await scheduler.dispose();
178
- });
179
- });
180
- // ─── subscribeSyncReceive ───────────────────────────────────────────────────
181
- describe("subscribeSyncReceive", () => {
182
- it("POSTs deviceId with a Bearer token and parses the response", async () => {
183
- const calls = [];
184
- const resp = subscribeResponse();
185
- const result = await subscribeSyncReceive({
186
- apiUrl: "https://api.example.com/",
187
- authToken: async () => "jwt-123",
188
- deviceId: "dev1",
189
- fetchImpl: async (url, init) => {
190
- calls.push({ url, init: init });
191
- return { ok: true, status: 200, text: async () => JSON.stringify(resp) };
192
- },
193
- });
194
- expect(result).toEqual(resp);
195
- expect(calls).toHaveLength(1);
196
- expect(calls[0].url).toBe("https://api.example.com/v1/sync/subscribe");
197
- const init = calls[0].init;
198
- expect(init.headers.Authorization).toBe("Bearer jwt-123");
199
- expect(JSON.parse(init.body)).toEqual({ deviceId: "dev1" });
200
- });
201
- it("throws with status + body excerpt on non-2xx", async () => {
202
- await expect(subscribeSyncReceive({
203
- apiUrl: "https://api.example.com",
204
- authToken: "jwt",
205
- deviceId: "dev1",
206
- fetchImpl: async () => ({
207
- ok: false,
208
- status: 503,
209
- text: async () => "subscribe exploded",
210
- }),
211
- })).rejects.toThrow(/503.*subscribe exploded/s);
212
- });
213
- it("throws a non-retryable typed error for the coded realtime denial", async () => {
214
- const error = await subscribeSyncReceive({
215
- apiUrl: "https://api.example.com",
216
- authToken: "jwt",
217
- deviceId: "dev1",
218
- fetchImpl: async () => ({
219
- ok: false,
220
- status: 403,
221
- text: async () => JSON.stringify({
222
- error: "realtime-unavailable",
223
- code: "REALTIME_UNAVAILABLE",
224
- retryable: false,
225
- }),
226
- }),
227
- }).then(() => undefined, (reason) => reason);
228
- expect(error).toBeInstanceOf(RealtimeUnavailableError);
229
- expect(error).toMatchObject({ retryable: false, status: 403 });
230
- });
231
- it("throws a typed error for the coded sync device limit denial", async () => {
232
- const error = await subscribeSyncReceive({
233
- apiUrl: "https://api.example.com",
234
- authToken: "jwt",
235
- deviceId: "dev1",
236
- fetchImpl: async () => ({
237
- ok: false,
238
- status: 429,
239
- text: async () => JSON.stringify({
240
- error: "sync-device-limit-exceeded",
241
- code: "SYNC_DEVICE_LIMIT_EXCEEDED",
242
- }),
243
- }),
244
- }).then(() => undefined, (reason) => reason);
245
- expect(error).toBeInstanceOf(Error);
246
- expect(error).toMatchObject({
247
- code: "SYNC_DEVICE_LIMIT_EXCEEDED",
248
- retryable: false,
249
- status: 429,
250
- });
251
- expect(error.name).toBe("SyncDeviceLimitError");
252
- });
253
- it("rejects a response missing credentials (old server) loudly", async () => {
254
- await expect(subscribeSyncReceive({
255
- apiUrl: "https://api.example.com",
256
- authToken: "jwt",
257
- deviceId: "dev1",
258
- fetchImpl: async () => ({
259
- ok: true,
260
- status: 200,
261
- text: async () => JSON.stringify({ queueUrl: "https://q", region: "us-east-1" }),
262
- }),
263
- })).rejects.toThrow(/credentials\.accessKeyId/);
264
- });
265
- });
266
- // ─── sqsClientFromAwsSdk ────────────────────────────────────────────────────
267
- describe("sqsClientFromAwsSdk", () => {
268
- it("requests and parses SQS system attributes while mapping commands and forwarding abort", async () => {
269
- const sent = [];
270
- const fakeSdk = {
271
- send: async (cmd, opts) => {
272
- sent.push({ input: cmd.input, opts });
273
- if (sent.length === 4) {
274
- return {
275
- Failed: [{
276
- Id: "entry-two",
277
- Code: "ReceiptHandleIsInvalid",
278
- Message: "one receipt was rejected",
279
- SenderFault: true,
280
- }],
281
- };
282
- }
283
- return {
284
- Messages: [{
285
- Body: "b",
286
- ReceiptHandle: "rh",
287
- MessageId: "m1",
288
- Attributes: {
289
- ApproximateReceiveCount: "3",
290
- SentTimestamp: "1712345",
291
- },
292
- }],
293
- };
294
- },
295
- };
296
- const adapted = sqsClientFromAwsSdk(fakeSdk);
297
- const ac = new AbortController();
298
- const out = await adapted.receiveMessage({
299
- queueUrl: "https://q",
300
- maxMessages: 5,
301
- waitTimeSeconds: 20,
302
- visibilityTimeoutSeconds: 600,
303
- signal: ac.signal,
304
- });
305
- expect(out.messages).toEqual([
306
- {
307
- Body: "b",
308
- ReceiptHandle: "rh",
309
- MessageId: "m1",
310
- approximateReceiveCount: 3,
311
- sentTimestampMs: 1712345,
312
- },
313
- ]);
314
- expect(sent[0].input).toMatchObject({
315
- QueueUrl: "https://q",
316
- MaxNumberOfMessages: 5,
317
- WaitTimeSeconds: 20,
318
- VisibilityTimeout: 600,
319
- MessageSystemAttributeNames: ["ApproximateReceiveCount", "SentTimestamp"],
320
- });
321
- expect(sent[0].opts).toEqual({ abortSignal: ac.signal });
322
- await adapted.deleteMessage({ queueUrl: "https://q", receiptHandle: "rh" });
323
- expect(sent[1].input).toMatchObject({
324
- QueueUrl: "https://q",
325
- ReceiptHandle: "rh",
326
- });
327
- await adapted.changeMessageVisibility({
328
- queueUrl: "https://q",
329
- receiptHandle: "rh",
330
- visibilityTimeoutSeconds: 0,
331
- });
332
- expect(sent[2].input).toMatchObject({
333
- QueueUrl: "https://q",
334
- ReceiptHandle: "rh",
335
- VisibilityTimeout: 0,
336
- });
337
- const batchResult = await adapted.changeMessageVisibilityBatch({
338
- queueUrl: "https://q",
339
- entries: [
340
- { id: "entry-one", receiptHandle: "rh-one" },
341
- { id: "entry-two", receiptHandle: "rh-two" },
342
- ],
343
- visibilityTimeoutSeconds: 600,
344
- });
345
- expect(sent[3].input).toMatchObject({
346
- QueueUrl: "https://q",
347
- Entries: [
348
- { Id: "entry-one", ReceiptHandle: "rh-one", VisibilityTimeout: 600 },
349
- { Id: "entry-two", ReceiptHandle: "rh-two", VisibilityTimeout: 600 },
350
- ],
351
- });
352
- expect(batchResult).toEqual({
353
- failedEntries: [{
354
- id: "entry-two",
355
- code: "ReceiptHandleIsInvalid",
356
- message: "one receipt was rejected",
357
- senderFault: true,
358
- }],
359
- });
360
- });
361
- it("returns an empty list when the SDK omits Messages", async () => {
362
- const adapted = sqsClientFromAwsSdk({
363
- send: async () => ({}),
364
- });
365
- const out = await adapted.receiveMessage({
366
- queueUrl: "https://q",
367
- maxMessages: 1,
368
- waitTimeSeconds: 1,
369
- signal: new AbortController().signal,
370
- });
371
- expect(out.messages).toEqual([]);
372
- });
373
- });
374
- // ─── createRefreshingSqsClient ──────────────────────────────────────────────
375
- function expiringError(name) {
376
- const e = new Error(name);
377
- e.name = name;
378
- return e;
379
- }
380
- function recordingSqs() {
381
- const client = {
382
- receives: 0,
383
- async receiveMessage() {
384
- client.receives += 1;
385
- return { messages: [] };
386
- },
387
- async deleteMessage() { },
388
- async changeMessageVisibility() { },
389
- async changeMessageVisibilityBatch() { return { failedEntries: [] }; },
390
- };
391
- return client;
392
- }
393
- describe("createRefreshingSqsClient", () => {
394
- const T0 = Date.parse("2026-06-10T12:00:00.000Z");
395
- it("uses the initial client while creds are fresh (no refresh)", async () => {
396
- const subscribe = vi.fn();
397
- const built = [];
398
- const client = createRefreshingSqsClient({
399
- initial: subscribeResponse(), // expires 13:00
400
- subscribe,
401
- buildSqs: () => {
402
- const c = recordingSqs();
403
- built.push(c);
404
- return c;
405
- },
406
- now: () => T0, // 60 min before expiry — outside the 2-min skew window
407
- });
408
- await client.receiveMessage({
409
- queueUrl: "https://q",
410
- maxMessages: 1,
411
- waitTimeSeconds: 1,
412
- signal: new AbortController().signal,
413
- });
414
- expect(subscribe).not.toHaveBeenCalled();
415
- expect(built).toHaveLength(1);
416
- });
417
- it("proactively re-vends inside the expiry skew window", async () => {
418
- const subscribe = vi
419
- .fn()
420
- .mockResolvedValue(subscribeResponse({ expiration: "2026-06-10T15:00:00.000Z" }));
421
- const built = [];
422
- const client = createRefreshingSqsClient({
423
- initial: subscribeResponse(), // expires 13:00
424
- subscribe,
425
- buildSqs: () => {
426
- const c = recordingSqs();
427
- built.push(c);
428
- return c;
429
- },
430
- now: () => Date.parse("2026-06-10T12:59:30.000Z"), // inside 2-min skew
431
- });
432
- await client.receiveMessage({
433
- queueUrl: "https://q",
434
- maxMessages: 1,
435
- waitTimeSeconds: 1,
436
- signal: new AbortController().signal,
437
- });
438
- expect(subscribe).toHaveBeenCalledTimes(1);
439
- expect(built).toHaveLength(2); // initial + rebuilt
440
- });
441
- it("reactively re-vends ONCE on an expiry-class error, then retries", async () => {
442
- const subscribe = vi
443
- .fn()
444
- .mockResolvedValue(subscribeResponse({ expiration: "2026-06-10T15:00:00.000Z" }));
445
- const failing = {
446
- async receiveMessage() {
447
- throw expiringError("ExpiredTokenException");
448
- },
449
- async deleteMessage() { },
450
- async changeMessageVisibility() { },
451
- async changeMessageVisibilityBatch() { return { failedEntries: [] }; },
452
- };
453
- const fresh = recordingSqs();
454
- let builds = 0;
455
- const client = createRefreshingSqsClient({
456
- initial: subscribeResponse(),
457
- subscribe,
458
- // First build (construction) returns the always-failing client; the
459
- // refresh-triggered rebuild returns the fresh one.
460
- buildSqs: () => (builds++ === 0 ? failing : fresh),
461
- now: () => T0,
462
- });
463
- const out = await client.receiveMessage({
464
- queueUrl: "https://q",
465
- maxMessages: 1,
466
- waitTimeSeconds: 1,
467
- signal: new AbortController().signal,
468
- });
469
- expect(out.messages).toEqual([]);
470
- expect(subscribe).toHaveBeenCalledTimes(1);
471
- expect(fresh.receives).toBe(1);
472
- });
473
- it("non-expiry errors propagate untouched (receiver backoff owns them)", async () => {
474
- const subscribe = vi.fn();
475
- const client = createRefreshingSqsClient({
476
- initial: subscribeResponse(),
477
- subscribe,
478
- buildSqs: () => ({
479
- async receiveMessage() {
480
- throw expiringError("AccessDeniedException");
481
- },
482
- async deleteMessage() { },
483
- async changeMessageVisibility() { },
484
- async changeMessageVisibilityBatch() { return { failedEntries: [] }; },
485
- }),
486
- now: () => T0,
487
- });
488
- await expect(client.receiveMessage({
489
- queueUrl: "https://q",
490
- maxMessages: 1,
491
- waitTimeSeconds: 1,
492
- signal: new AbortController().signal,
493
- })).rejects.toThrow("AccessDeniedException");
494
- expect(subscribe).not.toHaveBeenCalled();
495
- });
496
- it("collapses concurrent refreshes onto one subscribe call", async () => {
497
- // Indirection object (not a nullable local) so TS doesn't narrow the
498
- // callback assignment from inside the promise executor to `never`.
499
- const sub = {};
500
- const subscribe = vi.fn(() => new Promise((res) => {
501
- sub.resolve = res;
502
- }));
503
- const client = createRefreshingSqsClient({
504
- initial: subscribeResponse(),
505
- subscribe,
506
- buildSqs: () => recordingSqs(),
507
- now: () => Date.parse("2026-06-10T13:30:00.000Z"), // past expiry
508
- });
509
- const sig = new AbortController().signal;
510
- const p1 = client.receiveMessage({
511
- queueUrl: "https://q",
512
- maxMessages: 1,
513
- waitTimeSeconds: 1,
514
- signal: sig,
515
- });
516
- const p2 = client.receiveMessage({
517
- queueUrl: "https://q",
518
- maxMessages: 1,
519
- waitTimeSeconds: 1,
520
- signal: sig,
521
- });
522
- // Let both calls hit ensureFresh before resolving the vend.
523
- await new Promise((r) => setTimeout(r, 0));
524
- sub.resolve?.(subscribeResponse({ expiration: "2026-06-10T15:00:00.000Z" }));
525
- await Promise.all([p1, p2]);
526
- expect(subscribe).toHaveBeenCalledTimes(1);
527
- });
528
- });
529
- // ─── startEventSync ─────────────────────────────────────────────────────────
530
- function pushEvent(overrides = {}) {
531
- return {
532
- relativePath: "companies/indigo/docs/a.md",
533
- kind: "upsert",
534
- contentHash: `sha256:${"a".repeat(64)}`,
535
- mtime: "2026-06-10T12:00:00.000Z",
536
- originDeviceId: "peer-device",
537
- originTenantId: "prs_tenant",
538
- sequenceNumber: 1,
539
- eventTimestamp: "2026-06-10T12:00:00.000Z",
540
- ...overrides,
541
- };
542
- }
543
- describe("startEventSync", () => {
544
- function happyOpts(syncCalls) {
545
- return {
546
- hqRoot: "/tmp/hq",
547
- apiUrl: "https://api.example.com",
548
- authToken: async () => "jwt",
549
- deviceId: "this-device",
550
- resolveTenantId: async () => "prs_tenant",
551
- syncBatchFn: async (ctx) => {
552
- syncCalls.push(...ctx.events);
553
- },
554
- subscribe: async () => subscribeResponse(),
555
- buildSqs: () => ({
556
- // Parks the receiver's poll loop, but honors the abort signal (the
557
- // SqsClientLike contract) so dispose() doesn't block on the drain
558
- // deadline.
559
- receiveMessage: ({ signal }) => new Promise((resolve) => {
560
- signal.addEventListener("abort", () => resolve({ messages: [] }), {
561
- once: true,
562
- });
563
- }),
564
- deleteMessage: async () => { },
565
- changeMessageVisibility: async () => { },
566
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
567
- }),
568
- log: () => { },
569
- };
570
- }
571
- it("logs one receiver.drain JSON line and drops receiver debug records", async () => {
572
- const syncCalls = [];
573
- const logs = [];
574
- let firstReceive = true;
575
- const queueSqs = {
576
- receiveMessage: ({ signal, waitTimeSeconds }) => {
577
- if (firstReceive && waitTimeSeconds > 1) {
578
- firstReceive = false;
579
- return Promise.resolve({
580
- messages: [{
581
- Body: JSON.stringify(pushEvent()),
582
- ReceiptHandle: "rh-drain-log",
583
- }],
584
- });
585
- }
586
- if (waitTimeSeconds <= 1)
587
- return Promise.resolve({ messages: [] });
588
- return new Promise((resolve) => {
589
- signal.addEventListener("abort", () => resolve({ messages: [] }), {
590
- once: true,
591
- });
592
- });
593
- },
594
- deleteMessage: async () => { },
595
- changeMessageVisibility: async () => { },
596
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
597
- };
598
- const handles = await startEventSync({
599
- ...happyOpts(syncCalls),
600
- buildSqs: () => queueSqs,
601
- log: (line) => logs.push(line),
602
- });
603
- try {
604
- await vi.waitFor(() => {
605
- expect(logs.some((line) => {
606
- try {
607
- return JSON.parse(line).event === "receiver.drain";
608
- }
609
- catch {
610
- return false;
611
- }
612
- })).toBe(true);
613
- });
614
- const receiverDrainLines = logs.filter((line) => {
615
- try {
616
- const record = JSON.parse(line);
617
- return record.type === "receiver" && record.event === "receiver.drain";
618
- }
619
- catch {
620
- return false;
621
- }
622
- });
623
- expect(receiverDrainLines).toHaveLength(1);
624
- expect(JSON.parse(receiverDrainLines[0])).toEqual(expect.objectContaining({
625
- type: "receiver",
626
- event: "receiver.drain",
627
- tenantId: "prs_tenant",
628
- received: 1,
629
- coalesced: 1,
630
- processed: 1,
631
- deleted: 1,
632
- released: 0,
633
- remaining: 0,
634
- msg: "push receiver drain completed",
635
- }));
636
- expect(receiverDrainLines[0]).not.toContain("\n");
637
- expect(logs.some((line) => line.includes("receiver.sync.start"))).toBe(false);
638
- }
639
- finally {
640
- await handles?.dispose();
641
- }
642
- });
643
- it("forwards receiver sync failures to the log seam as receiver JSON lines", async () => {
644
- const hqRoot = fs.mkdtempSync(path.join(os.tmpdir(), "hq-event-sync-retry-log-"));
645
- const logs = [];
646
- let delivered = false;
647
- const queueSqs = {
648
- receiveMessage: ({ signal, waitTimeSeconds }) => {
649
- if (!delivered && waitTimeSeconds > 1) {
650
- delivered = true;
651
- return Promise.resolve({
652
- messages: [{
653
- Body: JSON.stringify(pushEvent({ relativePath: "personal/policies/retry.md" })),
654
- ReceiptHandle: "rh-sync-failed",
655
- MessageId: "message-sync-failed",
656
- }],
657
- });
658
- }
659
- if (waitTimeSeconds <= 1)
660
- return Promise.resolve({ messages: [] });
661
- return new Promise((resolve) => {
662
- signal.addEventListener("abort", () => resolve({ messages: [] }), { once: true });
663
- });
664
- },
665
- deleteMessage: async () => { },
666
- changeMessageVisibility: async () => { },
667
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
668
- };
669
- const handles = await startEventSync({
670
- ...happyOpts([]),
671
- hqRoot,
672
- syncBatchFn: async () => {
673
- throw new Error("targeted pull failed");
674
- },
675
- buildSqs: () => queueSqs,
676
- log: (line) => logs.push(line),
677
- });
678
- try {
679
- await vi.waitFor(() => {
680
- const line = logs.find((value) => {
681
- try {
682
- const record = JSON.parse(value);
683
- return record.type === "receiver" && record.event === "receiver.sync.failed";
684
- }
685
- catch {
686
- return false;
687
- }
688
- });
689
- expect(line).toBeDefined();
690
- });
691
- const line = logs.find((value) => {
692
- try {
693
- const record = JSON.parse(value);
694
- return record.type === "receiver" && record.event === "receiver.sync.failed";
695
- }
696
- catch {
697
- return false;
698
- }
699
- });
700
- expect(JSON.parse(line)).toMatchObject({
701
- type: "receiver",
702
- event: "receiver.sync.failed",
703
- tenantId: "prs_tenant",
704
- pathCount: 1,
705
- err: { message: "targeted pull failed" },
706
- });
707
- }
708
- finally {
709
- await handles?.dispose();
710
- fs.rmSync(hqRoot, { recursive: true, force: true });
711
- }
712
- });
713
- async function startWithCapturedPublishTransport(overrideFactory) {
714
- const watcherModule = await import("../watcher.js");
715
- let publishTransport;
716
- class CapturingPushEventEmitter extends watcherModule.PushEventEmitter {
717
- constructor(options) {
718
- super(options);
719
- publishTransport = options.transport;
720
- }
721
- }
722
- vi.doMock("../watcher.js", () => ({
723
- ...watcherModule,
724
- PushEventEmitter: CapturingPushEventEmitter,
725
- }));
726
- vi.resetModules();
727
- try {
728
- const eventSyncModule = await import("./event-sync.js");
729
- const pushTransportModule = await import("./push-transport.js");
730
- const handles = await eventSyncModule.startEventSync({
731
- ...happyOpts([]),
732
- now: () => Date.parse("2026-06-10T12:00:00.000Z"),
733
- ...overrideFactory(pushTransportModule),
734
- });
735
- if (!publishTransport) {
736
- await handles.dispose();
737
- throw new Error("event-sync did not construct its publish transport");
738
- }
739
- return {
740
- handles,
741
- publishTransport,
742
- pushTransportModule,
743
- async cleanup() {
744
- try {
745
- await handles.dispose();
746
- }
747
- finally {
748
- vi.doUnmock("../watcher.js");
749
- vi.resetModules();
750
- }
751
- },
752
- };
753
- }
754
- catch (error) {
755
- vi.doUnmock("../watcher.js");
756
- vi.resetModules();
757
- throw error;
758
- }
759
- }
760
- const nonScopePublishErrors = [
761
- ["network error", () => new Error("push network unavailable")],
762
- ["HTTP 500", () => Object.assign(new Error("push server failed"), { status: 500 })],
763
- ["untyped 403", () => Object.assign(new Error("not a scope denial"), { status: 403 })],
764
- ];
765
- it("brings up publish + receive, self-echo-filters, and logs receiver origins", async () => {
766
- const syncCalls = [];
767
- const logs = [];
768
- const hqRoot = fs.mkdtempSync(path.join(os.tmpdir(), "hq-event-sync-origin-"));
769
- fs.mkdirSync(path.join(hqRoot, ".hq"), { recursive: true });
770
- fs.writeFileSync(path.join(hqRoot, ".hq", "config.json"), JSON.stringify({ sync: { logReceiverOrigins: true } }));
771
- const opts = {
772
- ...happyOpts(syncCalls),
773
- hqRoot,
774
- log: (message) => logs.push(message),
775
- };
776
- const receiverLogRecords = () => logs.flatMap((message) => {
777
- try {
778
- const record = JSON.parse(message);
779
- return record && typeof record === "object" && !Array.isArray(record)
780
- ? [record]
781
- : [];
782
- }
783
- catch {
784
- return [];
785
- }
786
- });
787
- // The wrapped syncFn is private to the receiver — exercise the filter
788
- // through a receiver-visible seam instead: deliver one own-device and one
789
- // peer message through the (fake) queue.
790
- const delivered = [];
791
- let deliverNext = null;
792
- const queueSqs = {
793
- receiveMessage: ({ signal, waitTimeSeconds }) => new Promise((resolve) => {
794
- if (waitTimeSeconds === 0)
795
- return resolve({ messages: [] });
796
- if (waitTimeSeconds === 1) {
797
- const t = setTimeout(() => resolve({ messages: [] }), 1);
798
- signal.addEventListener("abort", () => {
799
- clearTimeout(t);
800
- resolve({ messages: [] });
801
- }, { once: true });
802
- return;
803
- }
804
- signal.addEventListener("abort", () => resolve({ messages: [] }), {
805
- once: true,
806
- });
807
- deliverNext = (body) => {
808
- deliverNext = null; // consumed — re-armed on the next poll
809
- delivered.push(body);
810
- resolve({ messages: [{ Body: body, ReceiptHandle: "rh" }] });
811
- };
812
- }),
813
- deleteMessage: async () => { },
814
- changeMessageVisibility: async () => { },
815
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
816
- };
817
- const handles = await startEventSync({
818
- ...opts,
819
- buildSqs: () => queueSqs,
820
- });
821
- expect(handles).not.toBeNull();
822
- expect(handles.ownDeviceId).toBe("this-device");
823
- const waitForPoll = () => vi.waitFor(() => {
824
- if (!deliverNext)
825
- throw new Error("receiver not polling yet");
826
- });
827
- try {
828
- // Own-device event → filtered out (no syncFn call).
829
- await waitForPoll();
830
- deliverNext(JSON.stringify(pushEvent({ originDeviceId: "this-device" })));
831
- await vi.waitFor(() => expect(delivered).toHaveLength(1));
832
- await vi.waitFor(() => expect(receiverLogRecords()).toEqual(expect.arrayContaining([
833
- expect.objectContaining({
834
- event: "receiver.drain",
835
- origins: { "this-device": 1 },
836
- }),
837
- ])));
838
- // Peer event → bridged into syncFn.
839
- await waitForPoll();
840
- deliverNext(JSON.stringify(pushEvent({ originDeviceId: "peer-device", sequenceNumber: 2 })));
841
- await vi.waitFor(() => expect(syncCalls).toHaveLength(1));
842
- expect(syncCalls[0].originDeviceId).toBe("peer-device");
843
- await vi.waitFor(() => expect(receiverLogRecords()).toEqual(expect.arrayContaining([
844
- expect.objectContaining({
845
- event: "fanout.receive",
846
- originDeviceId: "peer-device",
847
- }),
848
- ])));
849
- // The own-device event was delivered but never bridged.
850
- expect(syncCalls.every((e) => e.originDeviceId === "peer-device")).toBe(true);
851
- // Peer delete tombstone → bridged into syncFn. The runner handles safety by
852
- // running a targeted pull; it does not unlink directly from this payload.
853
- await waitForPoll();
854
- deliverNext(JSON.stringify({
855
- relativePath: "companies/indigo/deleted.md",
856
- kind: "delete",
857
- originDeviceId: "peer-device",
858
- originTenantId: "prs_tenant",
859
- sequenceNumber: 3,
860
- eventTimestamp: "2026-06-10T12:01:00.000Z",
861
- }));
862
- await vi.waitFor(() => expect(syncCalls).toHaveLength(2));
863
- expect(syncCalls[1]).toMatchObject({
864
- kind: "delete",
865
- relativePath: "companies/indigo/deleted.md",
866
- });
867
- }
868
- finally {
869
- await handles?.dispose();
870
- fs.rmSync(hqRoot, { recursive: true, force: true });
871
- }
872
- });
873
- it("drops retired overlay events before a pull pass and emits one batch diagnostic", async () => {
874
- const hqRoot = fs.mkdtempSync(path.join(os.tmpdir(), "hq-event-sync-"));
875
- for (const relativePath of [
876
- "personal/policies/legacy-rule.md",
877
- "personal/policies/removed-rule.md",
878
- ]) {
879
- const absolutePath = path.join(hqRoot, relativePath);
880
- fs.mkdirSync(path.dirname(absolutePath), { recursive: true });
881
- fs.writeFileSync(absolutePath, "fixture\n");
882
- }
883
- const syncCalls = [];
884
- const logs = [];
885
- const messages = [
886
- { Body: JSON.stringify(pushEvent({ relativePath: "personal/policies/new-rule.md", sequenceNumber: 1 })), ReceiptHandle: "rh-valid" },
887
- { Body: JSON.stringify(pushEvent({ relativePath: "core/policies/legacy-rule.md", contentHash: `sha256:${hashFile(path.join(hqRoot, "personal/policies/legacy-rule.md"))}`, sequenceNumber: 2 })), ReceiptHandle: "rh-retired-upsert" },
888
- { Body: JSON.stringify(pushEvent({ relativePath: "core/policies/removed-rule.md", kind: "delete", sequenceNumber: 3 })), ReceiptHandle: "rh-retired-delete" },
889
- ];
890
- const deleted = [];
891
- const queueSqs = {
892
- receiveMessage: ({ signal, waitTimeSeconds }) => {
893
- if (messages.length > 0 && waitTimeSeconds > 1) {
894
- return Promise.resolve({ messages: messages.splice(0) });
895
- }
896
- if (waitTimeSeconds <= 1)
897
- return Promise.resolve({ messages: [] });
898
- return new Promise((resolve) => {
899
- signal.addEventListener("abort", () => resolve({ messages: [] }), { once: true });
900
- });
901
- },
902
- deleteMessage: async ({ receiptHandle }) => {
903
- deleted.push(receiptHandle);
904
- },
905
- changeMessageVisibility: async () => { },
906
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
907
- };
908
- const handles = await startEventSync({
909
- ...happyOpts(syncCalls),
910
- hqRoot,
911
- buildSqs: () => queueSqs,
912
- log: (message) => logs.push(message),
913
- });
914
- try {
915
- await vi.waitFor(() => expect(deleted).toHaveLength(3));
916
- expect(syncCalls.map((event) => event.relativePath)).toEqual([
917
- "personal/policies/new-rule.md",
918
- ]);
919
- expect(logs.filter((line) => line.includes("event-sync-unsyncable-events-dropped"))).toEqual([
920
- JSON.stringify({
921
- type: "event-sync-unsyncable-events-dropped",
922
- diagnostic: true,
923
- count: 2,
924
- samplePaths: ["core/policies/legacy-rule.md", "core/policies/removed-rule.md"],
925
- originDeviceId: "peer-device",
926
- originDeviceIds: ["peer-device"],
927
- }),
928
- ]);
929
- }
930
- finally {
931
- await handles.dispose();
932
- fs.rmSync(hqRoot, { recursive: true, force: true });
933
- }
934
- });
935
- it("processes release-shipped and new paths that are not retired mirrors", async () => {
936
- const hqRoot = fs.mkdtempSync(path.join(os.tmpdir(), "hq-event-sync-"));
937
- for (const relativePath of [
938
- "personal/policies/bar.md",
939
- "core/policies/bar.md",
940
- "core/policies/baz.md",
941
- ]) {
942
- const absolutePath = path.join(hqRoot, relativePath);
943
- fs.mkdirSync(path.dirname(absolutePath), { recursive: true });
944
- fs.writeFileSync(absolutePath, "fixture\n");
945
- }
946
- const syncCalls = [];
947
- const logs = [];
948
- const messages = [
949
- { Body: JSON.stringify(pushEvent({ relativePath: "core/policies/bar.md", sequenceNumber: 1 })), ReceiptHandle: "rh-collision" },
950
- { Body: JSON.stringify(pushEvent({ relativePath: "core/policies/baz.md", sequenceNumber: 2 })), ReceiptHandle: "rh-release" },
951
- { Body: JSON.stringify(pushEvent({ relativePath: "core/policies/new.md", sequenceNumber: 3 })), ReceiptHandle: "rh-new-core" },
952
- { Body: JSON.stringify(pushEvent({ relativePath: "knowledge/notes/new.md", sequenceNumber: 4 })), ReceiptHandle: "rh-new-valid-area" },
953
- ];
954
- const deleted = [];
955
- const queueSqs = {
956
- receiveMessage: ({ signal, waitTimeSeconds }) => {
957
- if (messages.length > 0 && waitTimeSeconds > 1) {
958
- return Promise.resolve({ messages: messages.splice(0) });
959
- }
960
- if (waitTimeSeconds <= 1)
961
- return Promise.resolve({ messages: [] });
962
- return new Promise((resolve) => {
963
- signal.addEventListener("abort", () => resolve({ messages: [] }), { once: true });
964
- });
965
- },
966
- deleteMessage: async ({ receiptHandle }) => {
967
- deleted.push(receiptHandle);
968
- },
969
- changeMessageVisibility: async () => { },
970
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
971
- };
972
- const handles = await startEventSync({
973
- ...happyOpts(syncCalls),
974
- hqRoot,
975
- buildSqs: () => queueSqs,
976
- log: (message) => logs.push(message),
977
- });
978
- try {
979
- await vi.waitFor(() => expect(deleted).toHaveLength(4));
980
- expect(syncCalls.map((event) => event.relativePath)).toEqual([
981
- "core/policies/bar.md",
982
- "core/policies/baz.md",
983
- "core/policies/new.md",
984
- "knowledge/notes/new.md",
985
- ]);
986
- expect(logs.filter((line) => line.includes("event-sync-unsyncable-events-dropped"))).toEqual([]);
987
- }
988
- finally {
989
- await handles.dispose();
990
- fs.rmSync(hqRoot, { recursive: true, force: true });
991
- }
992
- });
993
- it("R-F18: disables receive metrics when subscribe omits CloudWatch credentials", async () => {
994
- const oldMetricEnv = {
995
- region: process.env.HQ_SYNC_CLOUDWATCH_REGION,
996
- accessKeyId: process.env.HQ_SYNC_CLOUDWATCH_ACCESS_KEY_ID,
997
- secretAccessKey: process.env.HQ_SYNC_CLOUDWATCH_SECRET_ACCESS_KEY,
998
- sessionToken: process.env.HQ_SYNC_CLOUDWATCH_SESSION_TOKEN,
999
- };
1000
- delete process.env.HQ_SYNC_CLOUDWATCH_REGION;
1001
- delete process.env.HQ_SYNC_CLOUDWATCH_ACCESS_KEY_ID;
1002
- delete process.env.HQ_SYNC_CLOUDWATCH_SECRET_ACCESS_KEY;
1003
- delete process.env.HQ_SYNC_CLOUDWATCH_SESSION_TOKEN;
1004
- const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
1005
- const syncCalls = [];
1006
- let deliverNext = null;
1007
- const queueSqs = {
1008
- receiveMessage: ({ signal, waitTimeSeconds }) => new Promise((resolve) => {
1009
- if (waitTimeSeconds === 0)
1010
- return resolve({ messages: [] });
1011
- if (waitTimeSeconds === 1) {
1012
- const t = setTimeout(() => resolve({ messages: [] }), 1);
1013
- signal.addEventListener("abort", () => {
1014
- clearTimeout(t);
1015
- resolve({ messages: [] });
1016
- }, { once: true });
1017
- return;
1018
- }
1019
- signal.addEventListener("abort", () => resolve({ messages: [] }), {
1020
- once: true,
1021
- });
1022
- deliverNext = (body) => {
1023
- deliverNext = null;
1024
- resolve({ messages: [{ Body: body, ReceiptHandle: "rh" }] });
1025
- };
1026
- }),
1027
- deleteMessage: async () => { },
1028
- changeMessageVisibility: async () => { },
1029
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
1030
- };
1031
- let handles = null;
1032
- try {
1033
- handles = await startEventSync({
1034
- ...happyOpts(syncCalls),
1035
- buildSqs: () => queueSqs,
1036
- });
1037
- expect(handles).not.toBeNull();
1038
- await vi.waitFor(() => {
1039
- if (!deliverNext)
1040
- throw new Error("receiver not polling yet");
1041
- });
1042
- deliverNext(JSON.stringify(pushEvent({ originDeviceId: "peer-device" })));
1043
- await vi.waitFor(() => expect(syncCalls).toHaveLength(1));
1044
- await new Promise((resolve) => setTimeout(resolve, 0));
1045
- expect(consoleSpy).not.toHaveBeenCalled();
1046
- }
1047
- finally {
1048
- await handles?.dispose();
1049
- consoleSpy.mockRestore();
1050
- if (oldMetricEnv.region === undefined) {
1051
- delete process.env.HQ_SYNC_CLOUDWATCH_REGION;
1052
- }
1053
- else {
1054
- process.env.HQ_SYNC_CLOUDWATCH_REGION = oldMetricEnv.region;
1055
- }
1056
- if (oldMetricEnv.accessKeyId === undefined) {
1057
- delete process.env.HQ_SYNC_CLOUDWATCH_ACCESS_KEY_ID;
1058
- }
1059
- else {
1060
- process.env.HQ_SYNC_CLOUDWATCH_ACCESS_KEY_ID = oldMetricEnv.accessKeyId;
1061
- }
1062
- if (oldMetricEnv.secretAccessKey === undefined) {
1063
- delete process.env.HQ_SYNC_CLOUDWATCH_SECRET_ACCESS_KEY;
1064
- }
1065
- else {
1066
- process.env.HQ_SYNC_CLOUDWATCH_SECRET_ACCESS_KEY =
1067
- oldMetricEnv.secretAccessKey;
1068
- }
1069
- if (oldMetricEnv.sessionToken === undefined) {
1070
- delete process.env.HQ_SYNC_CLOUDWATCH_SESSION_TOKEN;
1071
- }
1072
- else {
1073
- process.env.HQ_SYNC_CLOUDWATCH_SESSION_TOKEN =
1074
- oldMetricEnv.sessionToken;
1075
- }
1076
- }
1077
- });
1078
- it("keeps a poll-only handle then retries startup into a live receiver", async () => {
1079
- const logged = [];
1080
- const clock = new FakeClock();
1081
- const published = [];
1082
- const receiveMessage = vi.fn(({ signal }) => new Promise((resolve) => {
1083
- signal.addEventListener("abort", () => resolve({ messages: [] }), {
1084
- once: true,
1085
- });
1086
- }));
1087
- const subscribe = vi
1088
- .fn()
1089
- .mockRejectedValueOnce(new Error("queue tags still converging"))
1090
- .mockResolvedValue(subscribeResponse());
1091
- const postTelemetryEvents = vi.fn().mockResolvedValue({ accepted: 1 });
1092
- const handles = await startEventSync({
1093
- ...happyOpts([]),
1094
- subscribe,
1095
- buildSqs: () => ({
1096
- receiveMessage,
1097
- deleteMessage: async () => { },
1098
- changeMessageVisibility: async () => { },
1099
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
1100
- }),
1101
- transport: {
1102
- connected: true,
1103
- start: async () => { },
1104
- dispose: async () => { },
1105
- publish: async (event) => {
1106
- published.push(event);
1107
- },
1108
- },
1109
- telemetryClient: { postTelemetryEvents },
1110
- clock,
1111
- now: () => Date.parse("2026-06-10T12:00:00.000Z"),
1112
- retryRandom: () => 1,
1113
- log: (m) => logged.push(m),
1114
- });
1115
- expect(handles.receiver.connected).toBe(false);
1116
- handles.publishBatch({ paths: new Map() });
1117
- expect(published).toHaveLength(0);
1118
- clock.advance(30_000);
1119
- for (let i = 0; i < 8; i++)
1120
- await Promise.resolve();
1121
- expect(subscribe).toHaveBeenCalledTimes(2);
1122
- expect(receiveMessage).toHaveBeenCalledOnce();
1123
- expect(handles.receiver.connected).toBe(true);
1124
- const abs = new URL(import.meta.url).pathname;
1125
- handles.publishBatch({ paths: new Map([[abs, "docs/retried.ts"]]) });
1126
- await vi.waitFor(() => expect(published).toHaveLength(1));
1127
- expect(logged.join("\n")).toContain("event-sync: startup failed, continuing poll-only");
1128
- expect(logged.join("\n")).toContain("next retry in 30000ms");
1129
- expect(logged.join("\n")).toContain("event-sync: live");
1130
- await vi.waitFor(() => expect(postTelemetryEvents).toHaveBeenCalledTimes(2));
1131
- expect(postTelemetryEvents.mock.calls.map(([batch]) => batch.events[0]?.properties?.startupResult)).toEqual(["poll_only", "live"]);
1132
- await handles.dispose();
1133
- });
1134
- it("stays poll-only and schedules only the long recheck after the coded subscribe denial", async () => {
1135
- const logged = [];
1136
- const clock = new FakeClock();
1137
- const subscribe = vi.fn(() => subscribeSyncReceive({
1138
- apiUrl: "https://api.example.com",
1139
- authToken: "jwt",
1140
- deviceId: "this-device",
1141
- fetchImpl: async () => ({
1142
- ok: false,
1143
- status: 403,
1144
- text: async () => JSON.stringify({
1145
- error: "realtime-unavailable",
1146
- code: "REALTIME_UNAVAILABLE",
1147
- retryable: false,
1148
- }),
1149
- }),
1150
- }));
1151
- const postTelemetryEvents = vi.fn().mockResolvedValue({ accepted: 1 });
1152
- const handles = await startEventSync({
1153
- ...happyOpts([]),
1154
- subscribe,
1155
- clock,
1156
- retryInitialMs: 30_000,
1157
- retryMaxMs: 60_000,
1158
- retryRandom: () => 1,
1159
- telemetryClient: { postTelemetryEvents },
1160
- log: (message) => logged.push(message),
1161
- });
1162
- expect(handles.receiver.connected).toBe(false);
1163
- expect(subscribe).toHaveBeenCalledTimes(1);
1164
- expect(clock.pendingTimerCount()).toBe(1);
1165
- expect(logged).toEqual([
1166
- "event-sync: realtime unavailable for this account; staying poll-only, recheck in 6h",
1167
- ]);
1168
- clock.advance(30_000);
1169
- for (let i = 0; i < 6; i++)
1170
- await Promise.resolve();
1171
- expect(subscribe).toHaveBeenCalledTimes(1);
1172
- clock.advance(6 * 60 * 60 * 1000 - 30_000);
1173
- for (let i = 0; i < 8; i++)
1174
- await Promise.resolve();
1175
- expect(subscribe).toHaveBeenCalledTimes(2);
1176
- await vi.waitFor(() => expect(clock.pendingTimerCount()).toBe(1));
1177
- expect(logged).not.toContain(expect.stringMatching(/startup retry/));
1178
- await vi.waitFor(() => expect(postTelemetryEvents).toHaveBeenCalledTimes(1));
1179
- expect(postTelemetryEvents.mock.calls[0]?.[0]).toMatchObject({
1180
- events: [{ properties: { startupResult: "realtime_unavailable" } }],
1181
- });
1182
- await handles.dispose();
1183
- });
1184
- it("quiesces a receiver when its credential refresh is denied and uses the long recheck", async () => {
1185
- const clock = new FakeClock();
1186
- const logged = [];
1187
- const subscribe = vi
1188
- .fn()
1189
- .mockResolvedValueOnce(subscribeResponse({ expiration: "2026-06-10T13:00:00.000Z" }))
1190
- .mockRejectedValueOnce(new RealtimeUnavailableError({ status: 403, operation: "refresh subscribe" }))
1191
- .mockResolvedValue(subscribeResponse({ expiration: "2026-06-10T15:00:00.000Z" }));
1192
- const postTelemetryEvents = vi.fn().mockResolvedValue({ accepted: 1 });
1193
- const handles = await startEventSync({
1194
- ...happyOpts([]),
1195
- subscribe,
1196
- buildSqs: () => ({
1197
- receiveMessage: ({ signal }) => new Promise((resolve) => {
1198
- signal.addEventListener("abort", () => resolve({ messages: [] }), {
1199
- once: true,
1200
- });
1201
- }),
1202
- deleteMessage: async () => { },
1203
- changeMessageVisibility: async () => { },
1204
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
1205
- }),
1206
- now: () => Date.parse("2026-06-10T12:59:30.000Z"),
1207
- clock,
1208
- retryRandom: () => 1,
1209
- realtimeUnavailableRecheckMs: 60_000,
1210
- telemetryClient: { postTelemetryEvents },
1211
- log: (message) => logged.push(message),
1212
- });
1213
- await vi.waitFor(() => expect(subscribe).toHaveBeenCalledTimes(2));
1214
- await vi.waitFor(() => expect(handles.receiver.connected).toBe(false));
1215
- expect(clock.pendingTimerCount()).toBe(1);
1216
- expect(logged).toContain("event-sync: realtime unavailable for this account; staying poll-only, recheck in 6h");
1217
- clock.advance(30_000);
1218
- for (let i = 0; i < 6; i++)
1219
- await Promise.resolve();
1220
- expect(subscribe).toHaveBeenCalledTimes(2);
1221
- clock.advance(30_000);
1222
- await vi.waitFor(() => expect(subscribe).toHaveBeenCalledTimes(3));
1223
- await handles.dispose();
1224
- });
1225
- it("stays poll-only after a device-cap denial and reports the transition once", async () => {
1226
- const logged = [];
1227
- const clock = new FakeClock();
1228
- const subscribe = vi.fn(() => subscribeSyncReceive({
1229
- apiUrl: "https://api.example.com",
1230
- authToken: "jwt",
1231
- deviceId: "this-device",
1232
- fetchImpl: async () => ({
1233
- ok: false,
1234
- status: 429,
1235
- text: async () => JSON.stringify({
1236
- error: "sync-device-limit-exceeded",
1237
- code: "SYNC_DEVICE_LIMIT_EXCEEDED",
1238
- }),
1239
- }),
1240
- }));
1241
- const postTelemetryEvents = vi.fn().mockResolvedValue({ accepted: 1 });
1242
- const handles = await startEventSync({
1243
- ...happyOpts([]),
1244
- subscribe,
1245
- clock,
1246
- retryInitialMs: 30_000,
1247
- retryMaxMs: 60_000,
1248
- retryRandom: () => 1,
1249
- deviceIdAgeBucket: "<1h",
1250
- deviceIdFileFreshlyCreatedThisRun: true,
1251
- telemetryClient: { postTelemetryEvents },
1252
- log: (message) => logged.push(message),
1253
- });
1254
- expect(handles.receiver.connected).toBe(false);
1255
- expect(subscribe).toHaveBeenCalledTimes(1);
1256
- expect(clock.pendingTimerCount()).toBe(1);
1257
- expect(logged).toEqual([
1258
- "event-sync: sync device limit exceeded for device this-device; staying poll-only, recheck in 6h",
1259
- ]);
1260
- await vi.waitFor(() => expect(postTelemetryEvents).toHaveBeenCalledTimes(1));
1261
- expect(postTelemetryEvents.mock.calls[0]?.[0]).toMatchObject({
1262
- events: [{
1263
- properties: {
1264
- startupResult: "sync_device_limit",
1265
- sync_device_limit: "true",
1266
- device_id_age_bucket: "lt-1h",
1267
- device_id_freshly_created: "true",
1268
- },
1269
- }],
1270
- });
1271
- clock.advance(30_000);
1272
- for (let i = 0; i < 6; i++)
1273
- await Promise.resolve();
1274
- expect(subscribe).toHaveBeenCalledTimes(1);
1275
- clock.advance(6 * 60 * 60 * 1000 - 30_000);
1276
- for (let i = 0; i < 8; i++)
1277
- await Promise.resolve();
1278
- expect(subscribe).toHaveBeenCalledTimes(2);
1279
- expect(logged).toHaveLength(1);
1280
- expect(postTelemetryEvents).toHaveBeenCalledTimes(1);
1281
- await handles.dispose();
1282
- });
1283
- it("never rechecks a device-limit denial before half the window on a zero jitter draw", async () => {
1284
- const logged = [];
1285
- const clock = new FakeClock();
1286
- const subscribe = vi.fn(() => subscribeSyncReceive({
1287
- apiUrl: "https://api.example.com",
1288
- authToken: "jwt",
1289
- deviceId: "this-device",
1290
- fetchImpl: async () => ({
1291
- ok: false,
1292
- status: 429,
1293
- text: async () => JSON.stringify({
1294
- error: "sync-device-limit-exceeded",
1295
- code: "SYNC_DEVICE_LIMIT_EXCEEDED",
1296
- }),
1297
- }),
1298
- }));
1299
- const handles = await startEventSync({
1300
- ...happyOpts([]),
1301
- subscribe,
1302
- clock,
1303
- retryRandom: () => 0,
1304
- log: (message) => logged.push(message),
1305
- });
1306
- expect(handles.receiver.connected).toBe(false);
1307
- expect(subscribe).toHaveBeenCalledTimes(1);
1308
- expect(logged).toEqual([
1309
- "event-sync: sync device limit exceeded for device this-device; staying poll-only, recheck in 6h",
1310
- ]);
1311
- expect(logged.join("\n")).not.toContain("startup retry");
1312
- clock.advance(60_000);
1313
- for (let i = 0; i < 6; i++)
1314
- await Promise.resolve();
1315
- expect(subscribe).toHaveBeenCalledTimes(1);
1316
- clock.advance(3 * 60 * 60 * 1000 - 60_001);
1317
- for (let i = 0; i < 8; i++)
1318
- await Promise.resolve();
1319
- expect(subscribe).toHaveBeenCalledTimes(1);
1320
- clock.advance(1);
1321
- for (let i = 0; i < 8; i++)
1322
- await Promise.resolve();
1323
- expect(subscribe).toHaveBeenCalledTimes(2);
1324
- expect(logged).toHaveLength(1);
1325
- await handles.dispose();
1326
- });
1327
- it("keeps an uncoded 429 on the existing short startup retry", async () => {
1328
- const logged = [];
1329
- const clock = new FakeClock();
1330
- const subscribe = vi.fn(() => subscribeSyncReceive({
1331
- apiUrl: "https://api.example.com",
1332
- authToken: "jwt",
1333
- deviceId: "this-device",
1334
- fetchImpl: async () => ({
1335
- ok: false,
1336
- status: 429,
1337
- text: async () => JSON.stringify({
1338
- error: "other-rate-limit",
1339
- code: "OTHER_429",
1340
- }),
1341
- }),
1342
- }));
1343
- const handles = await startEventSync({
1344
- ...happyOpts([]),
1345
- subscribe,
1346
- clock,
1347
- retryRandom: () => 1,
1348
- log: (message) => logged.push(message),
1349
- });
1350
- expect(handles.receiver.connected).toBe(false);
1351
- expect(clock.pendingTimerCount()).toBe(1);
1352
- expect(logged[0]).toContain("startup failed, continuing poll-only");
1353
- expect(logged[1]).toContain("next retry in 30000ms");
1354
- clock.advance(30_000);
1355
- for (let i = 0; i < 6; i++)
1356
- await Promise.resolve();
1357
- expect(subscribe).toHaveBeenCalledTimes(2);
1358
- await handles.dispose();
1359
- });
1360
- it("quiesces realtime publishing when the push endpoint returns a device-limit denial", async () => {
1361
- const clock = new FakeClock();
1362
- const logged = [];
1363
- const postTelemetryEvents = vi.fn().mockResolvedValue({ accepted: 1 });
1364
- const publish = vi.fn(async () => {
1365
- throw new SyncDeviceLimitError({ status: 429, operation: "publish" });
1366
- });
1367
- const transport = {
1368
- connected: true,
1369
- start: async () => { },
1370
- dispose: async () => { },
1371
- publish,
1372
- };
1373
- const handles = await startEventSync({
1374
- ...happyOpts([]),
1375
- clock,
1376
- transport: transport,
1377
- deviceIdAgeBucket: "<1h",
1378
- deviceIdFileFreshlyCreatedThisRun: true,
1379
- telemetryClient: { postTelemetryEvents },
1380
- log: (message) => logged.push(message),
1381
- });
1382
- expect(handles.receiver.connected).toBe(true);
1383
- const abs = new URL(import.meta.url).pathname;
1384
- handles.publishBatch({ paths: new Map([[abs, "docs/publish-denied.ts"]]) });
1385
- await vi.waitFor(() => expect(logged).toContain("event-sync: sync device limit exceeded for device this-device; staying poll-only, recheck in 6h"));
1386
- await vi.waitFor(() => expect(handles.receiver.connected).toBe(false));
1387
- expect(clock.pendingTimerCount()).toBe(1);
1388
- const deviceLimitTelemetry = () => postTelemetryEvents.mock.calls
1389
- .flatMap(([batch]) => batch.events)
1390
- .filter((event) => event.properties?.startupResult === "sync_device_limit");
1391
- await vi.waitFor(() => expect(deviceLimitTelemetry()).toHaveLength(1));
1392
- expect(deviceLimitTelemetry()[0]).toMatchObject({
1393
- properties: {
1394
- startupResult: "sync_device_limit",
1395
- sync_device_limit: "true",
1396
- device_id_age_bucket: "lt-1h",
1397
- device_id_freshly_created: "true",
1398
- },
1399
- });
1400
- handles.publishBatch({ paths: new Map([[abs, "docs/publish-denied-again.ts"]]) });
1401
- await new Promise((resolve) => setImmediate(resolve));
1402
- expect(publish).toHaveBeenCalledOnce();
1403
- await handles.dispose();
1404
- });
1405
- it("reports a retry-discovered realtime denial exactly once", async () => {
1406
- const clock = new FakeClock();
1407
- const logged = [];
1408
- const postTelemetryEvents = vi.fn().mockResolvedValue({ accepted: 1 });
1409
- const subscribe = vi
1410
- .fn()
1411
- .mockRejectedValueOnce(new Error("initial subscription failed"))
1412
- .mockRejectedValueOnce(new RealtimeUnavailableError({ status: 403, operation: "retry subscribe" }))
1413
- .mockRejectedValue(new RealtimeUnavailableError({ status: 403, operation: "recheck subscribe" }));
1414
- const handles = await startEventSync({
1415
- ...happyOpts([]),
1416
- subscribe,
1417
- clock,
1418
- retryRandom: () => 1,
1419
- realtimeUnavailableRecheckMs: 60_000,
1420
- telemetryClient: { postTelemetryEvents },
1421
- log: (message) => logged.push(message),
1422
- });
1423
- clock.advance(30_000);
1424
- await vi.waitFor(() => expect(subscribe).toHaveBeenCalledTimes(2));
1425
- await vi.waitFor(() => expect(postTelemetryEvents).toHaveBeenCalledTimes(2));
1426
- expect(logged.filter((message) => message.includes("realtime unavailable for this account")))
1427
- .toHaveLength(1);
1428
- expect(postTelemetryEvents.mock.calls.map(([batch]) => batch.events[0]?.properties?.startupResult)).toEqual(["poll_only", "realtime_unavailable"]);
1429
- expect(clock.pendingTimerCount()).toBe(1);
1430
- clock.advance(60_000);
1431
- await vi.waitFor(() => expect(subscribe).toHaveBeenCalledTimes(3));
1432
- expect(logged.filter((message) => message.includes("realtime unavailable for this account")))
1433
- .toHaveLength(1);
1434
- await handles.dispose();
1435
- });
1436
- it("caps repeated startup retries and cancels the pending retry on dispose", async () => {
1437
- const logged = [];
1438
- const clock = new FakeClock();
1439
- const subscribe = vi.fn(async () => {
1440
- throw new Error("subscribe unavailable");
1441
- });
1442
- const handles = await startEventSync({
1443
- ...happyOpts([]),
1444
- subscribe,
1445
- clock,
1446
- retryInitialMs: 30_000,
1447
- retryMaxMs: 60_000,
1448
- retryRandom: () => 1,
1449
- log: (m) => logged.push(m),
1450
- });
1451
- expect(handles.receiver.connected).toBe(false);
1452
- expect(clock.pendingTimerCount()).toBe(1);
1453
- clock.advance(30_000);
1454
- for (let i = 0; i < 6; i++)
1455
- await Promise.resolve();
1456
- clock.advance(60_000);
1457
- for (let i = 0; i < 6; i++)
1458
- await Promise.resolve();
1459
- clock.advance(60_000);
1460
- for (let i = 0; i < 6; i++)
1461
- await Promise.resolve();
1462
- expect(subscribe).toHaveBeenCalledTimes(4);
1463
- expect(logged.filter((line) => line.includes("next retry in 60000ms"))).toHaveLength(3);
1464
- expect(clock.pendingTimerCount()).toBe(1);
1465
- await handles.dispose();
1466
- expect(clock.pendingTimerCount()).toBe(0);
1467
- clock.advance(10 * 60_000);
1468
- for (let i = 0; i < 6; i++)
1469
- await Promise.resolve();
1470
- expect(subscribe).toHaveBeenCalledTimes(4);
1471
- });
1472
- it("awaits an in-flight startup retry before disposal completes", async () => {
1473
- const clock = new FakeClock();
1474
- const syncCalls = [];
1475
- let releaseSubscribe = null;
1476
- const blockedSubscribe = new Promise((resolve) => {
1477
- releaseSubscribe = resolve;
1478
- });
1479
- const subscribe = vi
1480
- .fn()
1481
- .mockRejectedValueOnce(new Error("initial subscribe unavailable"))
1482
- .mockImplementationOnce(() => blockedSubscribe);
1483
- const receiveMessage = vi.fn(async () => ({
1484
- messages: [{ Body: JSON.stringify(pushEvent()), ReceiptHandle: "retry-receipt" }],
1485
- }));
1486
- const buildSqs = vi.fn(() => ({
1487
- receiveMessage,
1488
- deleteMessage: async () => { },
1489
- changeMessageVisibility: async () => { },
1490
- changeMessageVisibilityBatch: async () => ({ failedEntries: [] }),
1491
- }));
1492
- const handles = await startEventSync({
1493
- ...happyOpts(syncCalls),
1494
- subscribe,
1495
- buildSqs,
1496
- clock,
1497
- retryRandom: () => 1,
1498
- log: () => { },
1499
- });
1500
- clock.advance(30_000);
1501
- await vi.waitFor(() => expect(subscribe).toHaveBeenCalledTimes(2));
1502
- let disposalComplete = false;
1503
- const disposing = handles.dispose().then(() => {
1504
- disposalComplete = true;
1505
- });
1506
- await Promise.resolve();
1507
- expect(disposalComplete).toBe(false);
1508
- releaseSubscribe(subscribeResponse());
1509
- await disposing;
1510
- expect(handles.receiver.connected).toBe(false);
1511
- expect(buildSqs).toHaveBeenCalled();
1512
- for (let i = 0; i < 4; i++)
1513
- await Promise.resolve();
1514
- expect(syncCalls).toHaveLength(0);
1515
- });
1516
- it("keeps the immediate-success path live without scheduling a retry", async () => {
1517
- const handles = await startEventSync({
1518
- ...happyOpts([]),
1519
- });
1520
- expect(handles.receiver.connected).toBe(true);
1521
- await new Promise((resolve) => setImmediate(resolve));
1522
- await handles.dispose();
1523
- });
1524
- it("stops later publishes after refresh discovers a different tenant", async () => {
1525
- const subscribe = vi
1526
- .fn()
1527
- .mockResolvedValueOnce({ ...subscribeResponse(), tenantId: "prs_original" })
1528
- .mockResolvedValueOnce({ ...subscribeResponse(), tenantId: "prs_refreshed" });
1529
- const transportPublish = vi.fn(async (_event) => { });
1530
- const transport = {
1531
- connected: true,
1532
- start: async () => { },
1533
- dispose: async () => { },
1534
- publish: transportPublish,
1535
- };
1536
- const { publishTransport, pushTransportModule, cleanup } = await startWithCapturedPublishTransport((pushTransport) => {
1537
- transportPublish.mockRejectedValue(new pushTransport.PushScopeForbiddenError({
1538
- status: 403,
1539
- operation: "HttpPushTransport: POST /v1/sync/push",
1540
- companyScope: "docs",
1541
- }));
1542
- return { subscribe, transport: transport };
1543
- });
1544
- try {
1545
- await expect(publishTransport.publish(pushEvent({ originTenantId: "prs_original" }))).rejects.toBeInstanceOf(pushTransportModule.RealtimeUnavailableError);
1546
- expect(transportPublish).toHaveBeenCalledOnce();
1547
- expect(subscribe).toHaveBeenCalledTimes(2);
1548
- await expect(publishTransport.publish(pushEvent({ originTenantId: "prs_original", relativePath: "docs/second.md" }))).rejects.toBeInstanceOf(pushTransportModule.RealtimeUnavailableError);
1549
- expect(transportPublish).toHaveBeenCalledOnce();
1550
- expect(subscribe).toHaveBeenCalledTimes(2);
1551
- }
1552
- finally {
1553
- await cleanup();
1554
- }
1555
- });
1556
- it.each(nonScopePublishErrors)("does not refresh after a non-scope %s publish error and rethrows that same error", async (_label, makeError) => {
1557
- const error = makeError();
1558
- const subscribe = vi
1559
- .fn()
1560
- .mockResolvedValueOnce({ ...subscribeResponse(), tenantId: "prs_tenant" });
1561
- const transportPublish = vi.fn(async (_event) => { });
1562
- transportPublish.mockRejectedValue(error);
1563
- const transport = {
1564
- connected: true,
1565
- start: async () => { },
1566
- dispose: async () => { },
1567
- publish: transportPublish,
1568
- };
1569
- const { publishTransport, cleanup } = await startWithCapturedPublishTransport(() => ({ subscribe, transport: transport }));
1570
- try {
1571
- await expect(publishTransport.publish(pushEvent())).rejects.toBe(error);
1572
- expect(transportPublish).toHaveBeenCalledOnce();
1573
- expect(subscribe).toHaveBeenCalledOnce();
1574
- }
1575
- finally {
1576
- await cleanup();
1577
- }
1578
- });
1579
- it("keeps a poll-only handle when identity resolution initially fails", async () => {
1580
- const clock = new FakeClock();
1581
- const handles = await startEventSync({
1582
- ...happyOpts([]),
1583
- resolveTenantId: async () => {
1584
- throw new Error("no canonical person entity for this account");
1585
- },
1586
- clock,
1587
- log: () => { },
1588
- });
1589
- expect(handles.receiver.connected).toBe(false);
1590
- await handles.dispose();
1591
- });
1592
- it("publishBatch ships one event per changed path AFTER being invoked (publish leg)", async () => {
1593
- const published = [];
1594
- const fakeTransport = {
1595
- connected: true,
1596
- start: async () => { },
1597
- dispose: async () => { },
1598
- publish: async (e) => {
1599
- published.push(e);
1600
- },
1601
- };
1602
- const handles = await startEventSync({
1603
- ...happyOpts([]),
1604
- transport: fakeTransport,
1605
- now: () => 1765372800000,
1606
- });
1607
- expect(handles).not.toBeNull();
1608
- // NOTE: paths must exist for content hashing — use this test file itself.
1609
- const abs = new URL(import.meta.url).pathname;
1610
- handles.publishBatch({ paths: new Map([[abs, "docs/self.ts"]]) });
1611
- await vi.waitFor(() => expect(published).toHaveLength(1));
1612
- const ev = published[0];
1613
- expect(ev.relativePath).toBe("docs/self.ts");
1614
- expect(ev.kind).toBe("upsert");
1615
- expect(ev.originDeviceId).toBe("this-device");
1616
- expect(ev.originTenantId).toBe("prs_tenant");
1617
- // Wall-clock sequence numbers (restart-safe monotonicity).
1618
- expect(ev.sequenceNumber).toBe(1765372800000);
1619
- expect(ev.contentHash).toMatch(/^sha256:[0-9a-f]{64}$/);
1620
- await handles.dispose();
1621
- });
1622
- it("disposal clears a deferred publish before tearing down its transport", async () => {
1623
- const clock = new FakeClock();
1624
- const published = [];
1625
- const publish = vi.fn(async (event) => {
1626
- published.push(event);
1627
- });
1628
- const disposeTransport = vi.fn(async () => { });
1629
- const fakeTransport = {
1630
- connected: true,
1631
- start: async () => { },
1632
- dispose: disposeTransport,
1633
- publish,
1634
- };
1635
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), "event-sync-dispose-"));
1636
- const file = path.join(dir, "deferred.md");
1637
- const batch = { paths: new Map([[file, "docs/deferred.md"]]) };
1638
- try {
1639
- fs.writeFileSync(file, "first\n");
1640
- const handles = await startEventSync({
1641
- ...happyOpts([]),
1642
- transport: fakeTransport,
1643
- clock,
1644
- publishMinIntervalMs: 60_000,
1645
- });
1646
- expect(handles).not.toBeNull();
1647
- handles.publishBatch(batch);
1648
- await vi.waitFor(() => expect(published).toHaveLength(1));
1649
- fs.writeFileSync(file, "deferred\n");
1650
- handles.publishBatch(batch);
1651
- await vi.waitFor(() => expect(clock.pendingTimerCount()).toBe(1));
1652
- await handles.dispose();
1653
- expect(clock.pendingTimerCount()).toBe(0);
1654
- expect(disposeTransport).toHaveBeenCalledOnce();
1655
- clock.advance(60_000);
1656
- await Promise.resolve();
1657
- expect(publish).toHaveBeenCalledTimes(1);
1658
- }
1659
- finally {
1660
- fs.rmSync(dir, { recursive: true, force: true });
1661
- }
1662
- });
1663
- it("keeps the publish batch fire-and-forget when a transport publish rejects", async () => {
1664
- const logged = [];
1665
- const rejection = new Error("publish unavailable", {
1666
- cause: new Error("socket reset"),
1667
- });
1668
- const transport = {
1669
- connected: true,
1670
- start: async () => { },
1671
- dispose: async () => { },
1672
- publish: async () => {
1673
- throw rejection;
1674
- },
1675
- };
1676
- const handles = await startEventSync({
1677
- ...happyOpts([]),
1678
- transport: transport,
1679
- log: (message) => logged.push(message),
1680
- });
1681
- expect(handles).not.toBeNull();
1682
- const unhandled = vi.fn();
1683
- process.on("unhandledRejection", unhandled);
1684
- try {
1685
- const abs = new URL(import.meta.url).pathname;
1686
- expect(() => handles.publishBatch({ paths: new Map([[abs, "docs/rejected.ts"]]) })).not.toThrow();
1687
- await vi.waitFor(() => expect(logged.find((line) => line.startsWith("event-sync: publish outcome "))).toBeDefined());
1688
- await new Promise((resolve) => setImmediate(resolve));
1689
- expect(unhandled).not.toHaveBeenCalled();
1690
- const line = logged.find((entry) => entry.startsWith("event-sync: publish outcome "));
1691
- expect(JSON.parse(line.slice("event-sync: publish outcome ".length))).toMatchObject({
1692
- attempted: 1,
1693
- succeeded: 0,
1694
- failed: 1,
1695
- successfulElapsedMs: null,
1696
- omitted: 0,
1697
- attempts: [
1698
- {
1699
- error: {
1700
- name: "Error",
1701
- message: "publish unavailable",
1702
- cause: { message: "socket reset" },
1703
- },
1704
- },
1705
- ],
1706
- });
1707
- }
1708
- finally {
1709
- process.off("unhandledRejection", unhandled);
1710
- await handles?.dispose();
1711
- }
1712
- });
1713
- });
1714
- //# sourceMappingURL=event-sync.test.js.map