@abloatai/ablo 0.25.0 → 0.27.0

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 (425) hide show
  1. package/AGENTS.md +5 -3
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +104 -88
  4. package/dist/BaseSyncedStore.d.ts +140 -266
  5. package/dist/BaseSyncedStore.js +338 -739
  6. package/dist/Database.d.ts +62 -77
  7. package/dist/Database.js +106 -127
  8. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  9. package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
  10. package/dist/LazyReferenceCollection.d.ts +11 -15
  11. package/dist/LazyReferenceCollection.js +16 -15
  12. package/dist/Model.d.ts +37 -52
  13. package/dist/Model.js +52 -69
  14. package/dist/ModelRegistry.d.ts +46 -25
  15. package/dist/ModelRegistry.js +32 -30
  16. package/dist/NetworkMonitor.d.ts +5 -6
  17. package/dist/NetworkMonitor.js +6 -7
  18. package/dist/SyncClient.d.ts +119 -109
  19. package/dist/SyncClient.js +303 -224
  20. package/dist/SyncEngineContext.d.ts +1 -3
  21. package/dist/SyncEngineContext.js +1 -2
  22. package/dist/adapters/alwaysOnline.d.ts +6 -8
  23. package/dist/adapters/alwaysOnline.js +6 -8
  24. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  25. package/dist/adapters/inMemoryStorage.js +9 -9
  26. package/dist/agent/Agent.d.ts +39 -31
  27. package/dist/agent/Agent.js +35 -23
  28. package/dist/agent/index.d.ts +4 -4
  29. package/dist/agent/index.js +5 -5
  30. package/dist/agent/session.d.ts +47 -44
  31. package/dist/agent/session.js +37 -48
  32. package/dist/agent/types.d.ts +26 -31
  33. package/dist/agent/types.js +6 -7
  34. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  35. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  36. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  37. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
  38. package/dist/ai-sdk/index.d.ts +25 -22
  39. package/dist/ai-sdk/index.js +25 -22
  40. package/dist/ai-sdk/wrap.d.ts +7 -8
  41. package/dist/ai-sdk/wrap.js +2 -2
  42. package/dist/auth/credentialPolicy.d.ts +74 -71
  43. package/dist/auth/credentialPolicy.js +51 -56
  44. package/dist/auth/credentialSource.d.ts +7 -18
  45. package/dist/auth/credentialSource.js +10 -18
  46. package/dist/auth/index.d.ts +59 -58
  47. package/dist/auth/index.js +34 -40
  48. package/dist/auth/schemas.d.ts +5 -4
  49. package/dist/auth/schemas.js +5 -4
  50. package/dist/batching/index.d.ts +19 -21
  51. package/dist/batching/index.js +14 -17
  52. package/dist/cli.cjs +483 -369
  53. package/dist/client/Ablo.d.ts +107 -836
  54. package/dist/client/Ablo.js +174 -833
  55. package/dist/client/ApiClient.d.ts +44 -20
  56. package/dist/client/ApiClient.js +193 -44
  57. package/dist/client/auth.d.ts +51 -60
  58. package/dist/client/auth.js +137 -110
  59. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  60. package/dist/client/claimHeartbeatLoop.js +88 -0
  61. package/dist/client/consoleLogger.d.ts +35 -0
  62. package/dist/client/consoleLogger.js +44 -0
  63. package/dist/client/createInternalComponents.d.ts +14 -17
  64. package/dist/client/createInternalComponents.js +26 -31
  65. package/dist/client/createModelProxy.d.ts +130 -120
  66. package/dist/client/createModelProxy.js +158 -124
  67. package/dist/client/credentialEndpoint.d.ts +61 -0
  68. package/dist/client/credentialEndpoint.js +86 -0
  69. package/dist/client/functionalUpdate.d.ts +29 -27
  70. package/dist/client/functionalUpdate.js +21 -21
  71. package/dist/client/hostedEndpoints.d.ts +21 -0
  72. package/dist/client/hostedEndpoints.js +21 -0
  73. package/dist/client/httpClient.d.ts +58 -54
  74. package/dist/client/httpClient.js +29 -31
  75. package/dist/client/identity.d.ts +15 -20
  76. package/dist/client/identity.js +49 -59
  77. package/dist/client/modelRegistration.d.ts +10 -0
  78. package/dist/client/modelRegistration.js +301 -0
  79. package/dist/client/options.d.ts +373 -0
  80. package/dist/client/options.js +6 -0
  81. package/dist/client/registerDataSource.d.ts +9 -9
  82. package/dist/client/registerDataSource.js +15 -16
  83. package/dist/client/resourceTypes.d.ts +333 -0
  84. package/dist/client/resourceTypes.js +7 -0
  85. package/dist/client/schemaConfig.d.ts +44 -0
  86. package/dist/client/schemaConfig.js +176 -0
  87. package/dist/client/sessionMint.d.ts +17 -13
  88. package/dist/client/sessionMint.js +26 -31
  89. package/dist/client/validateAbloOptions.d.ts +12 -14
  90. package/dist/client/validateAbloOptions.js +9 -10
  91. package/dist/client/writeOptionsSchema.d.ts +18 -16
  92. package/dist/client/writeOptionsSchema.js +23 -20
  93. package/dist/client/wsMutationExecutor.d.ts +28 -0
  94. package/dist/client/wsMutationExecutor.js +71 -0
  95. package/dist/context.d.ts +6 -4
  96. package/dist/context.js +6 -7
  97. package/dist/coordination/index.d.ts +13 -4
  98. package/dist/coordination/index.js +29 -4
  99. package/dist/coordination/schema.d.ts +176 -128
  100. package/dist/coordination/schema.js +197 -133
  101. package/dist/coordination/trace.d.ts +9 -11
  102. package/dist/coordination/trace.js +13 -15
  103. package/dist/core/DatabaseManager.d.ts +5 -8
  104. package/dist/core/DatabaseManager.js +38 -40
  105. package/dist/core/QueryProcessor.d.ts +7 -9
  106. package/dist/core/QueryProcessor.js +27 -34
  107. package/dist/core/QueryView.d.ts +17 -5
  108. package/dist/core/QueryView.js +6 -7
  109. package/dist/core/StoreManager.d.ts +14 -16
  110. package/dist/core/StoreManager.js +26 -25
  111. package/dist/core/ViewRegistry.d.ts +5 -5
  112. package/dist/core/ViewRegistry.js +4 -4
  113. package/dist/core/index.d.ts +18 -13
  114. package/dist/core/index.js +32 -26
  115. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  116. package/dist/core/openIDBWithTimeout.js +57 -54
  117. package/dist/core/queryUtils.d.ts +45 -0
  118. package/dist/core/queryUtils.js +69 -0
  119. package/dist/core/storeContract.d.ts +145 -0
  120. package/dist/core/storeContract.js +12 -0
  121. package/dist/environment.d.ts +28 -0
  122. package/dist/environment.js +21 -0
  123. package/dist/errorCodes.d.ts +118 -101
  124. package/dist/errorCodes.js +277 -260
  125. package/dist/errors.d.ts +170 -165
  126. package/dist/errors.js +161 -151
  127. package/dist/index.d.ts +30 -27
  128. package/dist/index.js +90 -82
  129. package/dist/interfaces/index.d.ts +108 -133
  130. package/dist/interfaces/index.js +5 -4
  131. package/dist/keys/index.d.ts +27 -29
  132. package/dist/keys/index.js +59 -49
  133. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  134. package/dist/mutators/RecordingTransaction.js +31 -37
  135. package/dist/mutators/Transaction.d.ts +18 -26
  136. package/dist/mutators/Transaction.js +14 -20
  137. package/dist/mutators/UndoManager.d.ts +122 -131
  138. package/dist/mutators/UndoManager.js +149 -155
  139. package/dist/mutators/defineMutators.d.ts +24 -37
  140. package/dist/mutators/defineMutators.js +14 -20
  141. package/dist/mutators/inverseOp.d.ts +12 -15
  142. package/dist/mutators/inverseOp.js +12 -15
  143. package/dist/mutators/mutateActions.d.ts +10 -9
  144. package/dist/mutators/mutateActions.js +1 -1
  145. package/dist/mutators/readerActions.d.ts +9 -8
  146. package/dist/mutators/readerActions.js +2 -2
  147. package/dist/mutators/undoApply.d.ts +31 -27
  148. package/dist/mutators/undoApply.js +26 -24
  149. package/dist/policy/index.d.ts +5 -3
  150. package/dist/policy/index.js +5 -3
  151. package/dist/policy/types.d.ts +105 -101
  152. package/dist/policy/types.js +67 -66
  153. package/dist/query/client.d.ts +32 -16
  154. package/dist/query/client.js +103 -72
  155. package/dist/query/types.d.ts +37 -60
  156. package/dist/query/types.js +13 -33
  157. package/dist/react/AbloProvider.d.ts +7 -11
  158. package/dist/react/AbloProvider.js +24 -17
  159. package/dist/react/context.d.ts +27 -146
  160. package/dist/react/context.js +9 -10
  161. package/dist/react/index.d.ts +41 -42
  162. package/dist/react/index.js +37 -38
  163. package/dist/react/internalContext.d.ts +17 -19
  164. package/dist/react/useAblo.d.ts +23 -22
  165. package/dist/react/useAblo.js +17 -15
  166. package/dist/react/useCurrentUserId.d.ts +8 -7
  167. package/dist/react/useCurrentUserId.js +8 -7
  168. package/dist/react/useErrorListener.d.ts +7 -7
  169. package/dist/react/useErrorListener.js +11 -12
  170. package/dist/react/useMutationFailureListener.d.ts +8 -8
  171. package/dist/react/useMutationFailureListener.js +9 -9
  172. package/dist/react/useMutators.d.ts +11 -11
  173. package/dist/react/useMutators.js +10 -4
  174. package/dist/react/useReactive.js +2 -3
  175. package/dist/react/useSyncStatus.d.ts +4 -6
  176. package/dist/react/useUndoScope.d.ts +7 -9
  177. package/dist/react/useUndoScope.js +3 -3
  178. package/dist/schema/coordination.d.ts +21 -25
  179. package/dist/schema/coordination.js +21 -25
  180. package/dist/schema/ddl.d.ts +43 -39
  181. package/dist/schema/ddl.js +75 -68
  182. package/dist/schema/ddlLock.d.ts +35 -0
  183. package/dist/schema/ddlLock.js +46 -0
  184. package/dist/schema/diff.d.ts +99 -61
  185. package/dist/schema/diff.js +43 -34
  186. package/dist/schema/field.d.ts +37 -42
  187. package/dist/schema/field.js +36 -49
  188. package/dist/schema/generate.d.ts +12 -12
  189. package/dist/schema/generate.js +12 -12
  190. package/dist/schema/index.d.ts +5 -4
  191. package/dist/schema/index.js +29 -21
  192. package/dist/schema/model.d.ts +121 -146
  193. package/dist/schema/model.js +24 -35
  194. package/dist/schema/openapi.d.ts +10 -9
  195. package/dist/schema/openapi.js +7 -1
  196. package/dist/schema/queries.d.ts +30 -32
  197. package/dist/schema/queries.js +24 -25
  198. package/dist/schema/relation.d.ts +89 -99
  199. package/dist/schema/relation.js +13 -13
  200. package/dist/schema/residency.d.ts +38 -0
  201. package/dist/schema/residency.js +30 -0
  202. package/dist/schema/roles.d.ts +45 -27
  203. package/dist/schema/roles.js +52 -21
  204. package/dist/schema/schema.d.ts +36 -45
  205. package/dist/schema/schema.js +42 -39
  206. package/dist/schema/select.d.ts +13 -13
  207. package/dist/schema/select.js +13 -13
  208. package/dist/schema/serialize.d.ts +36 -39
  209. package/dist/schema/serialize.js +27 -31
  210. package/dist/schema/sugar.d.ts +17 -32
  211. package/dist/schema/sugar.js +14 -29
  212. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
  213. package/dist/schema/syncDeltaRow.js +89 -0
  214. package/dist/schema/tenancy.d.ts +44 -46
  215. package/dist/schema/tenancy.js +46 -48
  216. package/dist/server/adapter.d.ts +58 -58
  217. package/dist/server/adapter.js +13 -14
  218. package/dist/server/commit.d.ts +60 -64
  219. package/dist/server/index.d.ts +9 -10
  220. package/dist/server/index.js +1 -1
  221. package/dist/server/readConfig.d.ts +70 -0
  222. package/dist/server/readConfig.js +8 -0
  223. package/dist/server/storageMode.d.ts +23 -0
  224. package/dist/server/storageMode.js +17 -0
  225. package/dist/source/adapter.d.ts +31 -26
  226. package/dist/source/adapter.js +10 -10
  227. package/dist/source/adapters/drizzle.d.ts +28 -23
  228. package/dist/source/adapters/drizzle.js +34 -28
  229. package/dist/source/adapters/kysely.d.ts +27 -25
  230. package/dist/source/adapters/kysely.js +28 -26
  231. package/dist/source/adapters/memory.d.ts +8 -7
  232. package/dist/source/adapters/memory.js +10 -9
  233. package/dist/source/adapters/prisma.d.ts +13 -12
  234. package/dist/source/adapters/prisma.js +27 -29
  235. package/dist/source/conformance.d.ts +18 -11
  236. package/dist/source/conformance.js +27 -19
  237. package/dist/source/connector.d.ts +31 -32
  238. package/dist/source/connector.js +30 -28
  239. package/dist/source/connectorProtocol.d.ts +160 -0
  240. package/dist/source/connectorProtocol.js +162 -0
  241. package/dist/source/contract.d.ts +26 -27
  242. package/dist/source/contract.js +28 -29
  243. package/dist/source/factory.d.ts +94 -0
  244. package/dist/source/factory.js +268 -0
  245. package/dist/source/index.d.ts +10 -462
  246. package/dist/source/index.js +17 -421
  247. package/dist/source/migrations.d.ts +9 -9
  248. package/dist/source/migrations.js +9 -9
  249. package/dist/source/next.d.ts +10 -11
  250. package/dist/source/next.js +7 -8
  251. package/dist/source/pushQueue.d.ts +70 -48
  252. package/dist/source/pushQueue.js +36 -29
  253. package/dist/source/signing.d.ts +88 -0
  254. package/dist/source/signing.js +159 -0
  255. package/dist/source/types.d.ts +351 -0
  256. package/dist/source/types.js +43 -0
  257. package/dist/stores/ObjectStore.d.ts +11 -12
  258. package/dist/stores/ObjectStore.js +34 -35
  259. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  260. package/dist/stores/SyncActionStore.d.ts +8 -12
  261. package/dist/stores/SyncActionStore.js +77 -46
  262. package/dist/surface.d.ts +28 -21
  263. package/dist/surface.js +28 -20
  264. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
  265. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
  266. package/dist/sync/ConnectionManager.d.ts +47 -50
  267. package/dist/sync/ConnectionManager.js +74 -70
  268. package/dist/sync/NetworkProbe.d.ts +27 -31
  269. package/dist/sync/NetworkProbe.js +67 -72
  270. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
  271. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
  272. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
  273. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
  274. package/dist/sync/SyncWebSocket.d.ts +175 -250
  275. package/dist/sync/SyncWebSocket.js +431 -769
  276. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  277. package/dist/sync/awaitClaimGrant.js +38 -30
  278. package/dist/sync/bootstrapApply.d.ts +70 -0
  279. package/dist/sync/bootstrapApply.js +73 -0
  280. package/dist/sync/commitFrames.d.ts +44 -0
  281. package/dist/sync/commitFrames.js +94 -0
  282. package/dist/sync/createClaimStream.d.ts +23 -22
  283. package/dist/sync/createClaimStream.js +108 -25
  284. package/dist/sync/createPresenceStream.d.ts +19 -18
  285. package/dist/sync/createPresenceStream.js +25 -26
  286. package/dist/sync/createSnapshot.d.ts +13 -17
  287. package/dist/sync/createSnapshot.js +20 -26
  288. package/dist/sync/credentialLifecycle.d.ts +175 -0
  289. package/dist/sync/credentialLifecycle.js +322 -0
  290. package/dist/sync/deltaPipeline.d.ts +113 -0
  291. package/dist/sync/deltaPipeline.js +261 -0
  292. package/dist/sync/groupChange.d.ts +113 -0
  293. package/dist/sync/groupChange.js +242 -0
  294. package/dist/sync/heartbeat.d.ts +63 -0
  295. package/dist/sync/heartbeat.js +91 -0
  296. package/dist/sync/participants.d.ts +27 -27
  297. package/dist/sync/schemas.d.ts +3 -2
  298. package/dist/sync/schemas.js +14 -10
  299. package/dist/sync/syncCursor.d.ts +40 -0
  300. package/dist/sync/syncCursor.js +55 -0
  301. package/dist/sync/syncPlan.d.ts +54 -0
  302. package/dist/sync/syncPlan.js +50 -0
  303. package/dist/sync/syncPosition.d.ts +54 -49
  304. package/dist/sync/syncPosition.js +57 -52
  305. package/dist/sync/wsFrameHandlers.d.ts +116 -0
  306. package/dist/sync/wsFrameHandlers.js +374 -0
  307. package/dist/testing/fixtures/bootstrap.d.ts +21 -17
  308. package/dist/testing/fixtures/bootstrap.js +12 -6
  309. package/dist/testing/fixtures/deltas.d.ts +31 -34
  310. package/dist/testing/fixtures/deltas.js +30 -33
  311. package/dist/testing/fixtures/models.d.ts +11 -10
  312. package/dist/testing/fixtures/models.js +12 -10
  313. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  314. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  315. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
  316. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
  317. package/dist/testing/helpers/wait.d.ts +13 -8
  318. package/dist/testing/helpers/wait.js +13 -8
  319. package/dist/testing/index.d.ts +4 -4
  320. package/dist/testing/index.js +3 -3
  321. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  322. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  323. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  324. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  325. package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
  326. package/dist/testing/mocks/MockSyncContext.js +16 -45
  327. package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
  328. package/dist/testing/mocks/MockSyncStore.js +11 -11
  329. package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
  330. package/dist/testing/mocks/MockWebSocket.js +22 -21
  331. package/dist/transactions/TransactionQueue.d.ts +190 -221
  332. package/dist/transactions/TransactionQueue.js +424 -822
  333. package/dist/transactions/TransactionStore.d.ts +20 -0
  334. package/dist/transactions/TransactionStore.js +53 -0
  335. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  336. package/dist/transactions/UnconfirmedWrites.js +104 -0
  337. package/dist/transactions/coalesceRules.d.ts +58 -0
  338. package/dist/transactions/coalesceRules.js +140 -0
  339. package/dist/transactions/commitPayload.d.ts +130 -0
  340. package/dist/transactions/commitPayload.js +143 -0
  341. package/dist/transactions/deltaConfirmation.d.ts +58 -0
  342. package/dist/transactions/deltaConfirmation.js +215 -0
  343. package/dist/transactions/optimisticApply.d.ts +49 -0
  344. package/dist/transactions/optimisticApply.js +65 -0
  345. package/dist/transactions/replayValidation.d.ts +99 -0
  346. package/dist/transactions/replayValidation.js +111 -0
  347. package/dist/types/global.d.ts +46 -41
  348. package/dist/types/global.js +20 -19
  349. package/dist/types/index.d.ts +74 -80
  350. package/dist/types/index.js +22 -27
  351. package/dist/types/modelData.d.ts +10 -0
  352. package/dist/types/modelData.js +9 -0
  353. package/dist/types/participant.d.ts +20 -0
  354. package/dist/types/participant.js +10 -0
  355. package/dist/types/streams.d.ts +216 -209
  356. package/dist/types/streams.js +7 -7
  357. package/dist/utils/asyncIterator.d.ts +25 -32
  358. package/dist/utils/asyncIterator.js +25 -32
  359. package/dist/utils/duration.d.ts +12 -15
  360. package/dist/utils/duration.js +12 -15
  361. package/dist/utils/mobxSetup.d.ts +53 -0
  362. package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
  363. package/dist/webhooks/events.d.ts +21 -16
  364. package/dist/webhooks/events.js +10 -8
  365. package/dist/webhooks/index.d.ts +5 -7
  366. package/dist/webhooks/index.js +5 -7
  367. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  368. package/dist/wire/delta.js +114 -0
  369. package/dist/wire/errorEnvelope.d.ts +35 -27
  370. package/dist/wire/errorEnvelope.js +38 -32
  371. package/dist/wire/frames.d.ts +150 -67
  372. package/dist/wire/frames.js +48 -1
  373. package/dist/wire/index.d.ts +18 -13
  374. package/dist/wire/index.js +36 -13
  375. package/dist/wire/listEnvelope.d.ts +16 -23
  376. package/dist/wire/listEnvelope.js +7 -6
  377. package/dist/wire/protocol.d.ts +38 -0
  378. package/dist/wire/protocol.js +38 -0
  379. package/dist/wire/protocolVersion.d.ts +60 -0
  380. package/dist/wire/protocolVersion.js +67 -0
  381. package/docs/api-keys.md +4 -3
  382. package/docs/coordination.md +59 -0
  383. package/docs/examples/existing-python-backend.md +3 -3
  384. package/docs/identity.md +4 -4
  385. package/docs/integration-guide.md +1 -1
  386. package/docs/react.md +1 -1
  387. package/docs/sessions.md +5 -7
  388. package/package.json +24 -21
  389. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  390. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  391. package/dist/client/index.d.ts +0 -36
  392. package/dist/client/index.js +0 -33
  393. package/dist/config/index.d.ts +0 -10
  394. package/dist/config/index.js +0 -12
  395. package/dist/core/query-utils.d.ts +0 -34
  396. package/dist/core/query-utils.js +0 -59
  397. package/dist/interfaces/headless.d.ts +0 -95
  398. package/dist/interfaces/headless.js +0 -41
  399. package/dist/query/index.d.ts +0 -6
  400. package/dist/query/index.js +0 -5
  401. package/dist/realtime/index.d.ts +0 -10
  402. package/dist/realtime/index.js +0 -9
  403. package/dist/schema/plane.d.ts +0 -23
  404. package/dist/schema/plane.js +0 -19
  405. package/dist/schema/sync-delta-row.js +0 -103
  406. package/dist/schema/sync-delta-wire.js +0 -102
  407. package/dist/server/next.d.ts +0 -51
  408. package/dist/server/next.js +0 -47
  409. package/dist/server/read-config.d.ts +0 -67
  410. package/dist/server/read-config.js +0 -8
  411. package/dist/server/storage-mode.d.ts +0 -1
  412. package/dist/server/storage-mode.js +0 -18
  413. package/dist/source/connector-protocol.d.ts +0 -159
  414. package/dist/source/connector-protocol.js +0 -161
  415. package/dist/sync/OfflineFlush.d.ts +0 -9
  416. package/dist/sync/OfflineFlush.js +0 -22
  417. package/dist/sync/OfflineTransactionStore.d.ts +0 -37
  418. package/dist/sync/OfflineTransactionStore.js +0 -263
  419. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  420. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  421. package/dist/transactions/index.d.ts +0 -16
  422. package/dist/transactions/index.js +0 -7
  423. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  424. package/dist/transactions/mutation-error-handler.js +0 -39
  425. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,29 +1,24 @@
1
1
  /**
2
- * `@abloatai/ablo/wire` canonical COMMIT-PATH frame contract.
2
+ * The write-path message shapes for the sync protocol. These cover the frames
3
+ * a client sends to commit work — {@link CommitMessage} (a batch of raw
4
+ * operations) and {@link MutationMessage} (a single named mutation) — and the
5
+ * server's {@link MutationResultMessage} acknowledgement. The same frames flow
6
+ * over a WebSocket connection and over the HTTP commit endpoint.
3
7
  *
4
- * These are the WebSocket (and HTTP-fallback) message shapes for the
5
- * write path: the client's `commit` / `mutation` frames and the server's
6
- * `mutation_result` ack. They live here not in the server app and not
7
- * inlined in the SDK's `SyncWebSocket` so the client, the server, and
8
- * any future `@abloatai/ablo/server` host all import ONE definition
9
- * and cannot drift.
10
- *
11
- * Scope note: the delta/sync frames (`sync_response`, `delta`) are NOT
12
- * here yet — they reference `SyncDelta`, which currently has two
13
- * definitions (server `db/deltas` vs package `core`) pending unification.
14
- * They stay server-local until that lands. Everything in this file
15
- * depends only on package-canonical types (`OnStaleMode`, `ErrorCode`,
16
- * `RequiredCapability`), so it is safe to share today.
17
- *
18
- * Changing any shape here is a wire-contract change — it requires
19
- * coordinated client + server updates.
8
+ * Both the client and the server import these definitions from here, so the two
9
+ * sides cannot drift. Each interface is paired with a Zod validator
10
+ * ({@link commitOperationSchema}, {@link commitPayloadSchema}) pinned to it at
11
+ * compile time, so the runtime check and the type stay in lockstep. Changing
12
+ * any shape in this file changes the wire contract and requires the client and
13
+ * server to update together.
20
14
  */
15
+ import { z } from 'zod';
21
16
  import type { OnStaleMode, StaleNotification, ReadDependency } from '../coordination/index.js';
22
17
  import type { ErrorCode, RequiredCapability } from '../errors.js';
23
18
  /**
24
- * A single operation within a {@link CommitMessage} batch. The atomic unit
25
- * the server's commit executor applies (and, once the mutator seam lands,
26
- * the raw-op fallback path when no named mutator is registered).
19
+ * A single operation within a {@link CommitMessage} batch. Each operation is
20
+ * the smallest unit the server applies atomically one create, update,
21
+ * delete, archive, or unarchive against one model row.
27
22
  */
28
23
  export interface CommitOperation {
29
24
  type: 'CREATE' | 'UPDATE' | 'DELETE' | 'ARCHIVE' | 'UNARCHIVE';
@@ -31,31 +26,70 @@ export interface CommitOperation {
31
26
  id?: string | null;
32
27
  input?: Record<string, unknown> | null;
33
28
  /**
34
- * Per-op client transaction id. Stamped onto `sync_deltas.transaction_id`
35
- * so the originating client can recognize the broadcast as an echo of its
36
- * own optimistic mutation. Distinct from the batch-level `clientTxId`
37
- * (which keys `mutation_log` for retry idempotency).
29
+ * A client-generated transaction id for this one operation. The server
30
+ * stamps it onto the `sync_deltas.transaction_id` column so the originating
31
+ * client can recognize the resulting broadcast as an echo of its own
32
+ * optimistic write. This is distinct from the batch-level `clientTxId` on
33
+ * {@link CommitMessage}, which the server uses to deduplicate retried batches.
38
34
  */
39
35
  transactionId?: string | null;
40
36
  /**
41
- * Watermark from `context.capture`. The server checks whether the target
42
- * has received deltas since this id; if so the operation's `onStale` mode
43
- * applies.
37
+ * A read watermark captured when the client last read this row. The server
38
+ * checks whether the target has changed since this point; if it has, the
39
+ * operation's {@link CommitOperation.onStale} mode decides what happens.
44
40
  */
45
41
  readAt?: number | null;
46
42
  /**
47
- * Mode on stale detection (non-coercion). `'reject'` (default) throws
48
- * AbloStaleContextError; `'overwrite'` applies unconditionally (blind LWW);
49
- * `'notify'` holds the write and returns a `StaleNotification` for the actor
50
- * to resolve.
43
+ * What to do when the server detects the row changed since
44
+ * {@link CommitOperation.readAt}. `'reject'` (the default) fails the
45
+ * operation with a stale-context error; `'overwrite'` applies the write
46
+ * regardless; `'notify'` holds the write and returns a
47
+ * {@link StaleNotification} for the caller to resolve.
51
48
  */
52
49
  onStale?: OnStaleMode | null;
50
+ /**
51
+ * Write even when another participant holds a claim on this row. The default
52
+ * (`false`) rejects the operation with a claimed-entity error while a claim
53
+ * is held. Setting `bypass` overrides that, and the override is recorded. It
54
+ * is honored only for participants the claim guard trusts, such as human and
55
+ * framework identities; a bypass requested by an agent is ignored.
56
+ */
57
+ bypass?: boolean | null;
53
58
  }
54
59
  /**
55
- * Client Server single named-mutation frame. The named-mutator write
56
- * primitive (claim + args), as opposed to the raw-op {@link CommitMessage}
57
- * batch. Server-side mutator dispatch resolves `mutatorName` against the
58
- * host-provided registry.
60
+ * Runtime validator for {@link CommitOperation}. Both commit transports — the
61
+ * WebSocket `commit` frame and the HTTP `/v1/commits` endpoint run this check
62
+ * on every operation before it is applied, so a malformed operation is rejected
63
+ * at the edge. It builds on the shared coordination schema, widening `bypass`
64
+ * to also accept `null` so the validator and the interface match exactly. Note
65
+ * that `readAt` must be a number: it feeds the server's stale-check comparison,
66
+ * so a non-numeric watermark is refused here.
67
+ */
68
+ export declare const commitOperationSchema: z.ZodObject<{
69
+ readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
70
+ onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
71
+ reject: "reject";
72
+ overwrite: "overwrite";
73
+ notify: "notify";
74
+ }>>>;
75
+ type: z.ZodEnum<{
76
+ CREATE: "CREATE";
77
+ UPDATE: "UPDATE";
78
+ DELETE: "DELETE";
79
+ ARCHIVE: "ARCHIVE";
80
+ UNARCHIVE: "UNARCHIVE";
81
+ }>;
82
+ model: z.ZodString;
83
+ id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
84
+ input: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
85
+ transactionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
86
+ bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
87
+ }, z.core.$strip>;
88
+ /**
89
+ * A client-to-server frame that invokes a single named mutation by name and
90
+ * arguments, as opposed to the raw operation batch in {@link CommitMessage}.
91
+ * The server resolves `mutatorName` against the set of mutations registered on
92
+ * it and runs the matching one.
59
93
  */
60
94
  export interface MutationMessage {
61
95
  type: 'mutation';
@@ -66,10 +100,10 @@ export interface MutationMessage {
66
100
  };
67
101
  }
68
102
  /**
69
- * Client Server "commit this batch of operations" frame. Formerly named
70
- * `batch_ack` / `BatchAckMessage` renamed pre-stable to the customer-facing
71
- * verb (`commit`) consistently across the wire and the SDK method
72
- * (`MutationExecutor.commit`).
103
+ * A client-to-server frame that asks the server to commit a batch of operations
104
+ * atomically. This is the raw-operation counterpart to {@link MutationMessage};
105
+ * it carries a list of {@link CommitOperation} entries plus the batch metadata
106
+ * below.
73
107
  */
74
108
  export interface CommitMessage {
75
109
  type: 'commit';
@@ -77,33 +111,80 @@ export interface CommitMessage {
77
111
  operations: CommitOperation[];
78
112
  clientTxId: string;
79
113
  /**
80
- * Dormant agent-task lineage field. The SDK no longer populates it
81
- * turns/tasks were removed and write attribution now rides on the
82
- * claim (`claim`) id plus the server-stamped actor/capability. Kept
83
- * optional for wire-compat; when present the Hub still validates and
84
- * threads it onto `caused_by_task_id`, but client writes leave it
85
- * `null` (the audit pane treats null as "no prompt-side context").
114
+ * Optional lineage id linking this batch to the task that caused it. When
115
+ * present, the server validates it and records it on the delta's
116
+ * `caused_by_task_id` column for audit trails; when omitted or `null`, the
117
+ * batch simply carries no task attribution.
86
118
  */
87
119
  causedByTaskId?: string | null;
88
120
  /**
89
- * Batch-level read dependencies (the STORM "did anything I looked at
90
- * change?" layer). Each entry is a row (`{model,id,readAt,fields?}`) or a
91
- * sync group (`{group,readAt}`) the batch's writes were premised on; the
92
- * server validates none moved since `readAt` and fires the entry's
93
- * `onStale` disposition over the batch. Omitted only write-targets are
94
- * checked (legacy behavior).
121
+ * The reads this batch's writes were premised on. Each entry names either a
122
+ * specific row (`{ model, id, readAt, fields? }`) or a sync group
123
+ * (`{ group, readAt }`) that must not have changed since its `readAt`
124
+ * watermark. The server checks every entry and applies its `onStale`
125
+ * disposition to the whole batch if one moved. When omitted, only the rows
126
+ * being written are checked for staleness.
95
127
  */
96
128
  reads?: ReadDependency[] | null;
97
129
  };
98
130
  }
99
131
  /**
100
- * Wire ack for a `commit` frame. Payload mirrors the canonical
101
- * `CommitReceipt` shape so WebSocket, HTTP `/v1/commits`, and persisted
102
- * `AgentJob.result.receipt` all carry identical fields.
132
+ * Runtime validator for the payload of {@link CommitMessage}. It checks every
133
+ * field the server acts on — `operations`, `clientTxId`, `causedByTaskId`, and
134
+ * `reads` validating each operation with {@link commitOperationSchema} and
135
+ * each read dependency with the shared read-dependency schema.
136
+ */
137
+ export declare const commitPayloadSchema: z.ZodObject<{
138
+ operations: z.ZodArray<z.ZodObject<{
139
+ readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
140
+ onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
141
+ reject: "reject";
142
+ overwrite: "overwrite";
143
+ notify: "notify";
144
+ }>>>;
145
+ type: z.ZodEnum<{
146
+ CREATE: "CREATE";
147
+ UPDATE: "UPDATE";
148
+ DELETE: "DELETE";
149
+ ARCHIVE: "ARCHIVE";
150
+ UNARCHIVE: "UNARCHIVE";
151
+ }>;
152
+ model: z.ZodString;
153
+ id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
154
+ input: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
155
+ transactionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
156
+ bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
157
+ }, z.core.$strip>>;
158
+ clientTxId: z.ZodString;
159
+ causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
160
+ reads: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
161
+ model: z.ZodString;
162
+ id: z.ZodString;
163
+ readAt: z.ZodNumber;
164
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
165
+ onStale: z.ZodOptional<z.ZodEnum<{
166
+ reject: "reject";
167
+ overwrite: "overwrite";
168
+ notify: "notify";
169
+ }>>;
170
+ }, z.core.$strip>, z.ZodObject<{
171
+ group: z.ZodString;
172
+ readAt: z.ZodNumber;
173
+ onStale: z.ZodOptional<z.ZodEnum<{
174
+ reject: "reject";
175
+ overwrite: "overwrite";
176
+ notify: "notify";
177
+ }>>;
178
+ }, z.core.$strip>]>>>>;
179
+ }, z.core.$strip>;
180
+ /**
181
+ * The server's acknowledgement of a {@link CommitMessage}. Its payload mirrors
182
+ * the commit-receipt shape, so a commit acknowledged over a WebSocket, over the
183
+ * HTTP `/v1/commits` endpoint, or read back from a persisted job result all
184
+ * carry the same fields.
103
185
  *
104
- * `object`, `status`, and `ops` are typed optional because pre-unification
105
- * WS clients didn't ship them; servers always populate them on the way out.
106
- * New clients can rely on them.
186
+ * `object`, `status`, and `ops` are optional in the type but the server always
187
+ * populates them, so a current client can rely on them being present.
107
188
  */
108
189
  export interface MutationResultMessage {
109
190
  type: 'mutation_result';
@@ -116,25 +197,27 @@ export interface MutationResultMessage {
116
197
  lastSyncId?: number;
117
198
  ops?: number;
118
199
  /**
119
- * Stale-context notifications for `onStale: 'notify' ops whose
120
- * premise moved concurrently. Present only on a successful ack that hit a
121
- * notify-resolved conflict; the client surfaces these via the
122
- * `conflict:notified` event and the commit receipt instead of rejecting.
200
+ * Notifications for operations that used `onStale: 'notify'` and whose
201
+ * premise changed while the batch was being applied. Present only on a
202
+ * successful acknowledgement that resolved such a conflict; the client
203
+ * surfaces each one through its `conflict:notified` event and the commit
204
+ * receipt rather than failing the write.
123
205
  */
124
206
  notifications?: StaleNotification[];
125
207
  /**
126
- * Ids of UPDATE/DELETE targets that matched ZERO rows (don't exist or are
127
- * outside the org). Present (non-empty) only when a write missed. The
128
- * client turns this into a loud `AbloNotFoundError` for the affected
129
- * caller instead of treating the no-op as success.
208
+ * Ids of update or delete targets that matched no rows because they do
209
+ * not exist or fall outside the caller's organization. Present and
210
+ * non-empty only when a write missed. The client raises a not-found error
211
+ * for the affected caller rather than treating the no-op as a success.
130
212
  */
131
213
  missingIds?: string[];
132
214
  error?: {
133
215
  code: ErrorCode;
134
216
  message: string;
135
217
  field?: string;
136
- /** Structured rejection body (x402-style) emitted when the cap
137
- * verifier denies the commit. */
218
+ /** The capability the commit required but the caller lacked. Present when
219
+ * the commit was denied for want of a capability, so the client can tell
220
+ * the caller exactly what to obtain. */
138
221
  requiredCapability?: RequiredCapability;
139
222
  };
140
223
  };
@@ -1 +1,48 @@
1
- export {};
1
+ /**
2
+ * The write-path message shapes for the sync protocol. These cover the frames
3
+ * a client sends to commit work — {@link CommitMessage} (a batch of raw
4
+ * operations) and {@link MutationMessage} (a single named mutation) — and the
5
+ * server's {@link MutationResultMessage} acknowledgement. The same frames flow
6
+ * over a WebSocket connection and over the HTTP commit endpoint.
7
+ *
8
+ * Both the client and the server import these definitions from here, so the two
9
+ * sides cannot drift. Each interface is paired with a Zod validator
10
+ * ({@link commitOperationSchema}, {@link commitPayloadSchema}) pinned to it at
11
+ * compile time, so the runtime check and the type stay in lockstep. Changing
12
+ * any shape in this file changes the wire contract and requires the client and
13
+ * server to update together.
14
+ */
15
+ import { z } from 'zod';
16
+ // The runtime schema primitives are imported straight from the coordination
17
+ // schema module to keep this file's runtime dependencies limited to Zod.
18
+ import { commitOperationSchema as coordinationCommitOperationSchema, readDependencySchema, } from '../coordination/schema.js';
19
+ /**
20
+ * Runtime validator for {@link CommitOperation}. Both commit transports — the
21
+ * WebSocket `commit` frame and the HTTP `/v1/commits` endpoint — run this check
22
+ * on every operation before it is applied, so a malformed operation is rejected
23
+ * at the edge. It builds on the shared coordination schema, widening `bypass`
24
+ * to also accept `null` so the validator and the interface match exactly. Note
25
+ * that `readAt` must be a number: it feeds the server's stale-check comparison,
26
+ * so a non-numeric watermark is refused here.
27
+ */
28
+ export const commitOperationSchema = coordinationCommitOperationSchema.extend({
29
+ bypass: z.boolean().nullish(),
30
+ });
31
+ // Pins the schema to the interface: this fails to compile if either side drifts.
32
+ const _commitOperationContract = true;
33
+ void _commitOperationContract;
34
+ /**
35
+ * Runtime validator for the payload of {@link CommitMessage}. It checks every
36
+ * field the server acts on — `operations`, `clientTxId`, `causedByTaskId`, and
37
+ * `reads` — validating each operation with {@link commitOperationSchema} and
38
+ * each read dependency with the shared read-dependency schema.
39
+ */
40
+ export const commitPayloadSchema = z.object({
41
+ operations: z.array(commitOperationSchema),
42
+ clientTxId: z.string(),
43
+ causedByTaskId: z.string().nullish(),
44
+ reads: z.array(readDependencySchema).nullish(),
45
+ });
46
+ // Pins the schema to the payload type: fails to compile if either side drifts.
47
+ const _commitPayloadContract = true;
48
+ void _commitPayloadContract;
@@ -1,24 +1,29 @@
1
1
  /**
2
- * `@abloatai/ablo/wire` the canonical HTTP/frame WIRE CONTRACT, with no
3
- * client-runtime (mobx / react / IndexedDB) dependency, so a server-side
4
- * consumer — a Next.js route handler, an edge function — can import the
5
- * envelope producers without pulling in the whole sync client.
2
+ * The wire contract for the sync protocol: the HTTP envelope shapes and the
3
+ * write-path frames, with no dependency on the client runtime. A server — a
4
+ * route handler, an edge function — can import the envelope producers here
5
+ * without pulling in the full sync client.
6
6
  *
7
- * Two halves, both Stripe-shaped and used across every Ablo surface:
8
- * - ERROR egress — {@link errorEnvelope} / {@link ErrorEnvelope} /
9
- * {@link statusForType} turn any thrown value into
10
- * `{ type, code, param, message, doc_url, request_id }`.
11
- * - LIST egress — {@link listEnvelope} / {@link ListEnvelope} stamp the
7
+ * It has two halves, used across every endpoint:
8
+ * - Error responses — {@link errorEnvelope}, {@link ErrorEnvelope}, and
9
+ * {@link statusForType} turn any thrown value into the uniform
10
+ * `{ type, code, param, message, doc_url, request_id }` body.
11
+ * - List responses — {@link listEnvelope} and {@link ListEnvelope} stamp the
12
12
  * uniform `{ object: 'list', data, has_more, next_cursor }` collection.
13
13
  *
14
- * The {@link AbloError} hierarchy + {@link docUrlForCode} + the wire-PARSE
15
- * helpers are re-exported so a route can THROW the right typed error and
16
- * SERIALIZE it through a single import.
14
+ * The {@link AbloError} hierarchy, {@link docUrlForCode}, and the wire-parsing
15
+ * helpers are re-exported too, so a single import lets a route throw the right
16
+ * typed error and serialize it back out.
17
17
  */
18
18
  export { errorEnvelope, statusForType } from './errorEnvelope.js';
19
19
  export type { ErrorEnvelope } from './errorEnvelope.js';
20
20
  export { listEnvelope } from './listEnvelope.js';
21
21
  export type { ListEnvelope } from './listEnvelope.js';
22
+ export { commitOperationSchema, commitPayloadSchema } from './frames.js';
23
+ export { PROTOCOL_VERSION, MIN_SUPPORTED_PROTOCOL_VERSION, WS_CLOSE_PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER, protocolVersionProblem, } from './protocolVersion.js';
22
24
  export type { CommitOperation, MutationMessage, CommitMessage, MutationResultMessage, } from './frames.js';
23
- export { AbloError, AbloAuthenticationError, AbloPermissionError, AbloValidationError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloServerError, AbloStaleContextError, AbloClaimedError, CapabilityError, SyncSessionError, docUrlForCode, translateHttpError, errorFromWire, toAbloError, ERROR_CONTRACT_VERSION, } from '../errors.js';
25
+ export { participantKindSchema, confirmationStateSchema, syncDeltaActionSchema, wireDeltaDataSchema, participantRefSchema, syncDeltaWireCoreSchema, clientSyncDeltaSchema, serverSyncDeltaSchema, } from './delta.js';
26
+ export type { ParticipantKind, ConfirmationState, SyncDeltaAction, WireDeltaData, ParticipantRef, SyncDeltaWireCore, ClientSyncDelta, ServerSyncDelta, } from './delta.js';
27
+ export { AbloError, AbloAuthenticationError, AbloPermissionError, AbloValidationError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloServerError, AbloStaleContextError, AbloClaimedError, CapabilityError, SyncSessionError, docUrlForCode, translateHttpError, errorFromWire, toAbloError, ERROR_CONTRACT_VERSION, errorCodeSpec, } from '../errors.js';
24
28
  export type { ErrorCode, WireErrorCode } from '../errors.js';
29
+ export { PING_INTERVAL_MS, LEASE_TTL_MS, WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL, } from './protocol.js';
@@ -1,21 +1,44 @@
1
1
  /**
2
- * `@abloatai/ablo/wire` the canonical HTTP/frame WIRE CONTRACT, with no
3
- * client-runtime (mobx / react / IndexedDB) dependency, so a server-side
4
- * consumer — a Next.js route handler, an edge function — can import the
5
- * envelope producers without pulling in the whole sync client.
2
+ * The wire contract for the sync protocol: the HTTP envelope shapes and the
3
+ * write-path frames, with no dependency on the client runtime. A server — a
4
+ * route handler, an edge function — can import the envelope producers here
5
+ * without pulling in the full sync client.
6
6
  *
7
- * Two halves, both Stripe-shaped and used across every Ablo surface:
8
- * - ERROR egress — {@link errorEnvelope} / {@link ErrorEnvelope} /
9
- * {@link statusForType} turn any thrown value into
10
- * `{ type, code, param, message, doc_url, request_id }`.
11
- * - LIST egress — {@link listEnvelope} / {@link ListEnvelope} stamp the
7
+ * It has two halves, used across every endpoint:
8
+ * - Error responses — {@link errorEnvelope}, {@link ErrorEnvelope}, and
9
+ * {@link statusForType} turn any thrown value into the uniform
10
+ * `{ type, code, param, message, doc_url, request_id }` body.
11
+ * - List responses — {@link listEnvelope} and {@link ListEnvelope} stamp the
12
12
  * uniform `{ object: 'list', data, has_more, next_cursor }` collection.
13
13
  *
14
- * The {@link AbloError} hierarchy + {@link docUrlForCode} + the wire-PARSE
15
- * helpers are re-exported so a route can THROW the right typed error and
16
- * SERIALIZE it through a single import.
14
+ * The {@link AbloError} hierarchy, {@link docUrlForCode}, and the wire-parsing
15
+ * helpers are re-exported too, so a single import lets a route throw the right
16
+ * typed error and serialize it back out.
17
17
  */
18
18
  export { errorEnvelope, statusForType } from './errorEnvelope.js';
19
19
  export { listEnvelope } from './listEnvelope.js';
20
+ // The write-path frame contract: the message shapes shared by the client and
21
+ // the server. The runtime Zod validators sit beside the interfaces and are
22
+ // pinned to them, and they gate every operation and payload on both commit
23
+ // transports.
24
+ export { commitOperationSchema, commitPayloadSchema } from './frames.js';
25
+ // Protocol versioning: the single integer the client and server compare to
26
+ // confirm they can speak to each other, plus the WebSocket close code used to
27
+ // reject a mismatch. See protocolVersion.ts for the changelog and deploy rules.
28
+ export { PROTOCOL_VERSION, MIN_SUPPORTED_PROTOCOL_VERSION, WS_CLOSE_PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER, protocolVersionProblem, } from './protocolVersion.js';
29
+ // The read-path delta contract: the shape the server broadcasts to clients as the
30
+ // payload of a `delta` or `sync_response` frame, together with the shared
31
+ // participant vocabulary it carries. Both ends derive their delta type from these
32
+ // schemas, so the client and server cannot drift apart.
33
+ export { participantKindSchema, confirmationStateSchema, syncDeltaActionSchema, wireDeltaDataSchema, participantRefSchema, syncDeltaWireCoreSchema, clientSyncDeltaSchema, serverSyncDeltaSchema, } from './delta.js';
20
34
  // The error surface a wire consumer needs to throw, classify, and serialize.
21
- export { AbloError, AbloAuthenticationError, AbloPermissionError, AbloValidationError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloServerError, AbloStaleContextError, AbloClaimedError, CapabilityError, SyncSessionError, docUrlForCode, translateHttpError, errorFromWire, toAbloError, ERROR_CONTRACT_VERSION, } from '../errors.js';
35
+ export { AbloError, AbloAuthenticationError, AbloPermissionError, AbloValidationError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloServerError, AbloStaleContextError, AbloClaimedError, CapabilityError, SyncSessionError, docUrlForCode, translateHttpError, errorFromWire, toAbloError, ERROR_CONTRACT_VERSION,
36
+ // The table mapping each error code to its HTTP status and retryable flag —
37
+ // plain data a server can use to resolve a code's canonical status the same
38
+ // way the client's error serializer does.
39
+ errorCodeSpec, } from '../errors.js';
40
+ // Protocol timing constants — the 30-second ping cadence and the lease window
41
+ // derived from it, shared by the client heartbeat and the server keepalive,
42
+ // claim leasing, and presence expiry (see protocol.ts) — plus the WebSocket
43
+ // subprotocols used during the authenticated handshake.
44
+ export { PING_INTERVAL_MS, LEASE_TTL_MS, WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL, } from './protocol.js';
@@ -1,24 +1,16 @@
1
1
  /**
2
- * The canonical Ablo LIST envelope the one shape every endpoint that returns
3
- * a collection uses, so a consumer can detect + paginate any list uniformly
4
- * instead of learning a per-endpoint payload key (`{ keys }`, `{ origins }`,
5
- * `{ events }`, `{ buckets }`…).
2
+ * The envelope every endpoint that returns a collection wraps its results in.
3
+ * Because the shape is always the same `{ object: 'list', data, has_more,
4
+ * next_cursor }` a consumer can detect and paginate any list the same way,
5
+ * instead of learning a different payload key for each endpoint.
6
6
  *
7
- * `{ object: 'list', data: [...], has_more, next_cursor }` is the shape the
8
- * hosted `GET /v1/models/:model` endpoint already emits (apps/sync-server
9
- * `routes/query.ts`) and that `@ablo/mcp` already consumes promoted here so
10
- * sync-web's dashboard lists, the SDK, and any future surface produce the
11
- * identical envelope from one definition.
12
- *
13
- * The field NAMES are Stripe's (`object`/`has_more`/`next_cursor`), not
14
- * PlanetScale's (`type`/`cursor_start`/`has_next`): the rest of the Ablo API is
15
- * Stripe-modeled, so this keeps one vocabulary across the surface. The
16
- * PlanetScale discipline we deliberately borrow is *"every list is the same
17
- * envelope"* — not the concrete key names.
7
+ * The list endpoints emit this shape and the {@link listEnvelope} helper
8
+ * produces it, so every list across the API reads from one definition. The
9
+ * generic type parameter carries the row type of `data`.
18
10
  */
19
11
  export interface ListEnvelope<T> {
20
- /** Discriminator always `'list'`. Lets a generic client recognise a
21
- * paginated collection without per-endpoint special-casing. */
12
+ /** Always the literal `'list'`. Lets a generic client recognize a collection
13
+ * response without special-casing each endpoint. */
22
14
  readonly object: 'list';
23
15
  /** The page of results. Always present (an empty array when there are none),
24
16
  * never omitted, so `body.data` is a stable access path. */
@@ -31,13 +23,14 @@ export interface ListEnvelope<T> {
31
23
  readonly next_cursor: string | null;
32
24
  }
33
25
  /**
34
- * Stamp the uniform {@link ListEnvelope} onto an already-resolved page of rows.
26
+ * Wraps an already-fetched page of rows in the uniform {@link ListEnvelope}.
35
27
  *
36
- * Pagination stays the caller's responsibility (fetch `limit + 1`, decide
37
- * `hasMore`, derive the cursor from the last row's order key) — this only
38
- * applies the envelope so no endpoint hand-rolls the shape. The defaults model
39
- * the common "small, unpaginated collection" case (`has_more: false`,
40
- * `next_cursor: null`); a paginated endpoint passes both explicitly.
28
+ * Pagination stays the caller's job fetch one more row than the limit to
29
+ * decide `hasMore`, and derive the cursor from the last row's sort key. This
30
+ * helper only applies the envelope so no endpoint has to build the shape by
31
+ * hand. The defaults describe a small, unpaginated collection
32
+ * (`has_more: false`, `next_cursor: null`); a paginated endpoint passes both
33
+ * explicitly.
41
34
  */
42
35
  export declare function listEnvelope<T>(data: readonly T[], opts?: {
43
36
  hasMore?: boolean;
@@ -1,11 +1,12 @@
1
1
  /**
2
- * Stamp the uniform {@link ListEnvelope} onto an already-resolved page of rows.
2
+ * Wraps an already-fetched page of rows in the uniform {@link ListEnvelope}.
3
3
  *
4
- * Pagination stays the caller's responsibility (fetch `limit + 1`, decide
5
- * `hasMore`, derive the cursor from the last row's order key) — this only
6
- * applies the envelope so no endpoint hand-rolls the shape. The defaults model
7
- * the common "small, unpaginated collection" case (`has_more: false`,
8
- * `next_cursor: null`); a paginated endpoint passes both explicitly.
4
+ * Pagination stays the caller's job fetch one more row than the limit to
5
+ * decide `hasMore`, and derive the cursor from the last row's sort key. This
6
+ * helper only applies the envelope so no endpoint has to build the shape by
7
+ * hand. The defaults describe a small, unpaginated collection
8
+ * (`has_more: false`, `next_cursor: null`); a paginated endpoint passes both
9
+ * explicitly.
9
10
  */
10
11
  export function listEnvelope(data, opts = {}) {
11
12
  return {
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The timing constants both sides of the protocol must agree on: the ping
3
+ * cadence and the lease window derived from it. Defining them here once keeps
4
+ * the client and the server from skewing apart — a change to the ping interval
5
+ * that did not also move the lease window would make claim expiry and presence
6
+ * timeouts disagree between the two.
7
+ *
8
+ * {@link PING_INTERVAL_MS} is how often the connection pings to prove it is
9
+ * alive. {@link LEASE_TTL_MS} is how long a claim or presence entry stays valid
10
+ * without a renewing ping. On the client, these set the heartbeat cadence and
11
+ * the fallback expiry for a claim taken without an explicit lease. On the
12
+ * server, they set the keepalive interval, the lease granted per keepalive, and
13
+ * the presence-entry lifetime, so a silently disconnected client drops off the
14
+ * roster within one lease window.
15
+ *
16
+ * The lease is three ping intervals long and is renewed on every ping, so a
17
+ * live holder always has at least two intervals of runway and a silent one
18
+ * lapses about two missed pings after it stops renewing. The window measures
19
+ * liveness, not how long a task may run: widening the lease without also
20
+ * widening the ping makes holders flap, and neither value should be redefined
21
+ * anywhere else.
22
+ */
23
+ export declare const PING_INTERVAL_MS = 30000;
24
+ export declare const LEASE_TTL_MS: number;
25
+ /**
26
+ * The WebSocket subprotocols that carry the bearer credential out of the URL.
27
+ *
28
+ * A browser cannot set an `Authorization` header on a WebSocket, so the client
29
+ * offers the token as a `Sec-WebSocket-Protocol` value — `ablo.bearer.<token>` —
30
+ * alongside the real `ablo.sync.v1` protocol the server selects. This keeps the
31
+ * credential out of the query string, which access logs, proxies, and browser
32
+ * history would otherwise capture. The server reads the token from the
33
+ * subprotocol and echoes back only `ablo.sync.v1`, never the token-bearing
34
+ * value. Both the client and the server import these constants, so the
35
+ * handshake format cannot drift.
36
+ */
37
+ export declare const WS_BEARER_SUBPROTOCOL_PREFIX = "ablo.bearer.";
38
+ export declare const WS_SYNC_SUBPROTOCOL = "ablo.sync.v1";
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The timing constants both sides of the protocol must agree on: the ping
3
+ * cadence and the lease window derived from it. Defining them here once keeps
4
+ * the client and the server from skewing apart — a change to the ping interval
5
+ * that did not also move the lease window would make claim expiry and presence
6
+ * timeouts disagree between the two.
7
+ *
8
+ * {@link PING_INTERVAL_MS} is how often the connection pings to prove it is
9
+ * alive. {@link LEASE_TTL_MS} is how long a claim or presence entry stays valid
10
+ * without a renewing ping. On the client, these set the heartbeat cadence and
11
+ * the fallback expiry for a claim taken without an explicit lease. On the
12
+ * server, they set the keepalive interval, the lease granted per keepalive, and
13
+ * the presence-entry lifetime, so a silently disconnected client drops off the
14
+ * roster within one lease window.
15
+ *
16
+ * The lease is three ping intervals long and is renewed on every ping, so a
17
+ * live holder always has at least two intervals of runway and a silent one
18
+ * lapses about two missed pings after it stops renewing. The window measures
19
+ * liveness, not how long a task may run: widening the lease without also
20
+ * widening the ping makes holders flap, and neither value should be redefined
21
+ * anywhere else.
22
+ */
23
+ export const PING_INTERVAL_MS = 30_000;
24
+ export const LEASE_TTL_MS = 3 * PING_INTERVAL_MS;
25
+ /**
26
+ * The WebSocket subprotocols that carry the bearer credential out of the URL.
27
+ *
28
+ * A browser cannot set an `Authorization` header on a WebSocket, so the client
29
+ * offers the token as a `Sec-WebSocket-Protocol` value — `ablo.bearer.<token>` —
30
+ * alongside the real `ablo.sync.v1` protocol the server selects. This keeps the
31
+ * credential out of the query string, which access logs, proxies, and browser
32
+ * history would otherwise capture. The server reads the token from the
33
+ * subprotocol and echoes back only `ablo.sync.v1`, never the token-bearing
34
+ * value. Both the client and the server import these constants, so the
35
+ * handshake format cannot drift.
36
+ */
37
+ export const WS_BEARER_SUBPROTOCOL_PREFIX = 'ablo.bearer.';
38
+ export const WS_SYNC_SUBPROTOCOL = 'ablo.sync.v1';