@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
@@ -4,7 +4,7 @@
4
4
  * All SDK classes receive this context at construction time.
5
5
  * It bundles every injectable dependency so constructors stay clean.
6
6
  */
7
- import type { SyncLogger, SyncObservabilityProvider, SyncAnalytics, SessionErrorDetector, OnlineStatusProvider, ModelDebugLoggerContract, MutationExecutor, MutationDispatcher, SyncEngineConfig } from './interfaces/index.js';
7
+ import type { SyncLogger, SyncObservabilityProvider, SyncAnalytics, SessionErrorDetector, OnlineStatusProvider, ModelDebugLoggerContract, MutationExecutor, SyncEngineConfig } from './interfaces/index.js';
8
8
  export interface SyncEngineContext {
9
9
  /** Structured logger */
10
10
  logger: SyncLogger;
@@ -20,8 +20,6 @@ export interface SyncEngineContext {
20
20
  modelDebugLogger?: ModelDebugLoggerContract;
21
21
  /** Backend mutation transport (GraphQL, REST, etc.) */
22
22
  mutationExecutor: MutationExecutor;
23
- /** Offline mutation replay dispatcher */
24
- mutationDispatcher: MutationDispatcher;
25
23
  /** Application-specific sync configuration */
26
24
  config: SyncEngineConfig;
27
25
  }
@@ -26,7 +26,6 @@ export const noopObservability = {
26
26
  captureReconciliation() { },
27
27
  captureDeltaRetryExhausted() { },
28
28
  captureWebSocketError() { },
29
- captureOfflineFlushFailure() { },
30
29
  captureSelfHealing() { },
31
30
  captureClaim() { },
32
31
  captureConflict() { },
@@ -57,7 +56,7 @@ export const browserOnlineStatus = {
57
56
  export const defaultSessionErrorDetector = {
58
57
  isSessionError(error) {
59
58
  if (error && typeof error === 'object' && 'isSessionError' in error) {
60
- return error.isSessionError === true;
59
+ return error.isSessionError;
61
60
  }
62
61
  return false;
63
62
  },
@@ -1,12 +1,10 @@
1
1
  /**
2
- * Always-online network provider for Node.js / agent / sidecar.
3
- *
4
- * The server IS the network it doesn't go offline. If the Postgres
5
- * connection drops, that's a database error, not a network error.
6
- * The "online/offline" concept only applies to browser clients that
7
- * can lose their WiFi connection.
8
- *
9
- * Implements OnlineStatusProvider (same interface as browserOnlineStatus).
2
+ * An {@link OnlineStatusProvider} that always reports the client as online.
3
+ * Server-side runtimes — Node processes, agents, and sidecars — have no
4
+ * browser network stack to lose, so there is no offline state to track. A
5
+ * dropped database connection surfaces as a database error, not a network
6
+ * transition. This is the server-side counterpart to the browser's
7
+ * connectivity-aware provider, which watches the real online/offline signal.
10
8
  */
11
9
  import type { OnlineStatusProvider } from '../interfaces/index.js';
12
10
  /**
@@ -1,12 +1,10 @@
1
1
  /**
2
- * Always-online network provider for Node.js / agent / sidecar.
3
- *
4
- * The server IS the network it doesn't go offline. If the Postgres
5
- * connection drops, that's a database error, not a network error.
6
- * The "online/offline" concept only applies to browser clients that
7
- * can lose their WiFi connection.
8
- *
9
- * Implements OnlineStatusProvider (same interface as browserOnlineStatus).
2
+ * An {@link OnlineStatusProvider} that always reports the client as online.
3
+ * Server-side runtimes — Node processes, agents, and sidecars — have no
4
+ * browser network stack to lose, so there is no offline state to track. A
5
+ * dropped database connection surfaces as a database error, not a network
6
+ * transition. This is the server-side counterpart to the browser's
7
+ * connectivity-aware provider, which watches the real online/offline signal.
10
8
  */
11
9
  /**
12
10
  * Returns an OnlineStatusProvider that always reports online.
@@ -1,14 +1,14 @@
1
1
  /**
2
- * In-memory storage adapter replaces IndexedDB for Node.js / agent / test.
2
+ * An in-memory {@link ObjectStoreContract} implementation for runtimes
3
+ * without IndexedDB, such as Node processes, agents, and tests. It keeps
4
+ * records in a map and maintains simple secondary indexes, satisfying the
5
+ * same contract the IndexedDB-backed store implements — so if the two ever
6
+ * diverge, the mismatch becomes a typecheck error here rather than a silent
7
+ * failure at a call site.
3
8
  *
4
- * Implements {@link ObjectStoreContract}, the shared surface that
5
- * IDB-backed `ObjectStore` also satisfies. Centralized contract so a
6
- * future drift between the two trips a typecheck error here, not
7
- * silently in a caller.
8
- *
9
- * No persistence — cleared on process restart. This is intentional:
10
- * the Node sync-server and agent workers get their state from the
11
- * server's delta stream, not from a local cache.
9
+ * Nothing is persisted; the data is cleared on process restart. That is
10
+ * deliberate: server-side runtimes and agent workers rebuild their state from
11
+ * the server's delta stream rather than from a local cache.
12
12
  */
13
13
  import type { ObjectStoreContract } from '../stores/ObjectStoreContract.js';
14
14
  export declare class InMemoryObjectStore implements ObjectStoreContract {
@@ -1,14 +1,14 @@
1
1
  /**
2
- * In-memory storage adapter replaces IndexedDB for Node.js / agent / test.
2
+ * An in-memory {@link ObjectStoreContract} implementation for runtimes
3
+ * without IndexedDB, such as Node processes, agents, and tests. It keeps
4
+ * records in a map and maintains simple secondary indexes, satisfying the
5
+ * same contract the IndexedDB-backed store implements — so if the two ever
6
+ * diverge, the mismatch becomes a typecheck error here rather than a silent
7
+ * failure at a call site.
3
8
  *
4
- * Implements {@link ObjectStoreContract}, the shared surface that
5
- * IDB-backed `ObjectStore` also satisfies. Centralized contract so a
6
- * future drift between the two trips a typecheck error here, not
7
- * silently in a caller.
8
- *
9
- * No persistence — cleared on process restart. This is intentional:
10
- * the Node sync-server and agent workers get their state from the
11
- * server's delta stream, not from a local cache.
9
+ * Nothing is persisted; the data is cleared on process restart. That is
10
+ * deliberate: server-side runtimes and agent workers rebuild their state from
11
+ * the server's delta stream rather than from a local cache.
12
12
  */
13
13
  export class InMemoryObjectStore {
14
14
  modelName;
@@ -45,14 +45,11 @@ import { createAgentSession } from './session.js';
45
45
  export type { AgentContext } from './types.js';
46
46
  export type { WireClaim } from '../types/streams.js';
47
47
  /**
48
- * Shape returned by the sync server's REST `/api/presence` endpoint.
49
- *
50
- * Local to this module, NOT exported. The server still speaks the
51
- * legacy vocabulary (`userId`, `isAgent`, `updatedAt`); the engine has
52
- * moved on to `participantId` / `participantKind` / `lastActive`.
53
- * `gather()` returns this shape verbatim today; once the server
54
- * adopts the engine names this interface deletes and the response is
55
- * typed as the canonical `Peer`.
48
+ * The record shape the sync server returns from its REST `/api/presence`
49
+ * endpoint. This interface is internal to this module and not exported. Its
50
+ * field names (`userId`, `isAgent`, `updatedAt`) are the wire contract the
51
+ * presence API sends, and {@link Agent.gather} surfaces these records
52
+ * unchanged in the `presence` array of its snapshot.
56
53
  */
57
54
  interface WirePeer {
58
55
  userId: string;
@@ -125,11 +122,10 @@ export interface FreshnessCheck {
125
122
  /** Human-readable summary — feed this back to the LLM when stale. */
126
123
  summary?: string;
127
124
  /**
128
- * Pending-mutation claims from OTHER participants targeting this
129
- * entity (self-claims filtered out). Empty = no one else is
130
- * currently generating against this entity. Non-empty is ADVISORY
131
- * the agent can proceed, wait, or defer. Stale-read protection
132
- * that predates committed deltas.
125
+ * Pending-mutation claims from other participants targeting this
126
+ * entity, with the agent's own claims filtered out. An empty array
127
+ * means no one else is currently generating against the entity. A
128
+ * non-empty array is advisory: the agent can proceed, wait, or defer.
133
129
  */
134
130
  pendingClaims?: WireClaim[];
135
131
  }
@@ -141,14 +137,14 @@ export interface AgentMessage {
141
137
  /** Subset of AI SDK's prepareStep context. */
142
138
  export interface PrepareStepContext<M extends AgentMessage = AgentMessage> {
143
139
  stepNumber: number;
144
- steps: ReadonlyArray<{
145
- toolCalls?: ReadonlyArray<{
140
+ steps: readonly {
141
+ toolCalls?: readonly {
146
142
  toolName: string;
147
143
  input?: unknown;
148
144
  args?: unknown;
149
- }>;
150
- toolResults?: ReadonlyArray<unknown>;
151
- }>;
145
+ }[];
146
+ toolResults?: readonly unknown[];
147
+ }[];
152
148
  messages: M[];
153
149
  model?: unknown;
154
150
  }
@@ -164,12 +160,12 @@ export interface StepFinishContext {
164
160
  stepType?: 'initial' | 'continue' | 'tool-result';
165
161
  finishReason?: string;
166
162
  text?: string;
167
- toolCalls?: ReadonlyArray<{
163
+ toolCalls?: readonly {
168
164
  toolName: string;
169
165
  input?: unknown;
170
166
  args?: unknown;
171
- }>;
172
- toolResults?: ReadonlyArray<unknown>;
167
+ }[];
168
+ toolResults?: readonly unknown[];
173
169
  usage?: {
174
170
  inputTokens?: number;
175
171
  outputTokens?: number;
@@ -230,6 +226,19 @@ export interface WrapToolOptions<TArgs> {
230
226
  */
231
227
  announceOnExecute?: boolean;
232
228
  }
229
+ /**
230
+ * The console-backed logger an {@link Agent} uses when the caller does not
231
+ * supply one. It is the same gated factory the `Ablo()` client uses
232
+ * (`createConsoleLogger`), reads its threshold from the `ABLO_LOG_LEVEL`
233
+ * environment variable (default `warn`), and tags each line with `[agent]` so
234
+ * agent-runtime output is easy to spot. The level is resolved when the logger
235
+ * is built rather than at module load, so an `ABLO_LOG_LEVEL` that the host
236
+ * process sets before constructing an Agent is honored.
237
+ *
238
+ * Exported so a unit test can pin the gating behavior; consumers normally pass
239
+ * their own `logger` option instead.
240
+ */
241
+ export declare function defaultAgentLogger(): SyncLogger;
233
242
  export declare class Agent implements PresenceAnnouncer {
234
243
  private readonly opts;
235
244
  constructor(options: AgentOptions);
@@ -239,11 +248,10 @@ export declare class Agent implements PresenceAnnouncer {
239
248
  * tokens before TTL elapses. Use on the server when the same agent
240
249
  * identity handles many requests.
241
250
  *
242
- * Returns the cache, NOT an `Agent` instance: the long-lived path
243
- * uses `Ablo({kind:'agent'})` over WebSocket, while the `Agent` class
244
- * itself is the short-lived REST helper for AI SDK tool loops. The
245
- * static method lives here so consumers reach for everything
246
- * agent-related under one namespace.
251
+ * Returns the cache rather than an `Agent` instance: the long-lived path
252
+ * uses `Ablo({kind:'agent'})` over a WebSocket, while the `Agent` class
253
+ * itself is the short-lived REST helper for AI SDK tool loops. The static
254
+ * method lives here so everything agent-related sits under one namespace.
247
255
  *
248
256
  * ```ts
249
257
  * const session = Agent.session({ syncServerUrl, schema, issueToken });
@@ -255,8 +263,8 @@ export declare class Agent implements PresenceAnnouncer {
255
263
  get userId(): string;
256
264
  /**
257
265
  * Extract the Agent instance from an AI SDK tool's
258
- * `experimental_context`. Use inside tool `execute` functions to reach
259
- * the perception without closure-capturing it.
266
+ * `experimental_context`. Use it inside a tool's `execute` function to
267
+ * reach the agent without capturing it in a closure.
260
268
  *
261
269
  * ```ts
262
270
  * execute: async (args, { experimental_context }) => {
@@ -272,9 +280,9 @@ export declare class Agent implements PresenceAnnouncer {
272
280
  */
273
281
  static fromContext(ctx: unknown, toolName?: string): Agent;
274
282
  /**
275
- * Narrower variant of {@link fromContext} that returns `undefined` instead
276
- * of throwing when perception isn't in context. Useful for tools where
277
- * awareness is optional (e.g., read-only tools that work without it).
283
+ * A lenient variant of {@link fromContext} that returns `undefined` instead
284
+ * of throwing when no agent is present in the context. Useful for tools
285
+ * where awareness is optional, such as read-only tools that work without it.
278
286
  */
279
287
  static tryFromContext(ctx: unknown): Agent | undefined;
280
288
  /**
@@ -40,17 +40,30 @@
40
40
  * for custom integrations outside the AI SDK.
41
41
  */
42
42
  import { createAgentSession } from './session.js';
43
+ import { createConsoleLogger, resolveLogLevel } from '../client/consoleLogger.js';
43
44
  import { AbloValidationError } from '../errors.js';
44
45
  // ── Agent ───────────────────────────────────────────────────────
45
- // Console-backed default logger. Local to this module so the agent
46
- // SDK doesn't take a transitive dependency on `getContext()` (which
47
- // belongs to the web-app context, not standalone agent workers).
48
- const consoleLogger = {
49
- debug: (msg, ...args) => console.debug('[agent]', msg, ...args),
50
- info: (msg, ...args) => console.info('[agent]', msg, ...args),
51
- warn: (msg, ...args) => console.warn('[agent]', msg, ...args),
52
- error: (msg, ...args) => console.error('[agent]', msg, ...args),
53
- };
46
+ /**
47
+ * The console-backed logger an {@link Agent} uses when the caller does not
48
+ * supply one. It is the same gated factory the `Ablo()` client uses
49
+ * (`createConsoleLogger`), reads its threshold from the `ABLO_LOG_LEVEL`
50
+ * environment variable (default `warn`), and tags each line with `[agent]` so
51
+ * agent-runtime output is easy to spot. The level is resolved when the logger
52
+ * is built rather than at module load, so an `ABLO_LOG_LEVEL` that the host
53
+ * process sets before constructing an Agent is honored.
54
+ *
55
+ * Exported so a unit test can pin the gating behavior; consumers normally pass
56
+ * their own `logger` option instead.
57
+ */
58
+ export function defaultAgentLogger() {
59
+ const gated = createConsoleLogger(resolveLogLevel());
60
+ return {
61
+ debug: (msg, ...args) => { gated.debug('[agent]', msg, ...args); },
62
+ info: (msg, ...args) => { gated.info('[agent]', msg, ...args); },
63
+ warn: (msg, ...args) => { gated.warn('[agent]', msg, ...args); },
64
+ error: (msg, ...args) => { gated.error('[agent]', msg, ...args); },
65
+ };
66
+ }
54
67
  export class Agent {
55
68
  opts;
56
69
  constructor(options) {
@@ -63,7 +76,7 @@ export class Agent {
63
76
  syncGroups: options.syncGroups,
64
77
  fetch: options.fetch ?? globalThis.fetch.bind(globalThis),
65
78
  timeoutMs: options.timeoutMs ?? 5_000,
66
- logger: options.logger ?? consoleLogger,
79
+ logger: options.logger ?? defaultAgentLogger(),
67
80
  };
68
81
  }
69
82
  /**
@@ -72,11 +85,10 @@ export class Agent {
72
85
  * tokens before TTL elapses. Use on the server when the same agent
73
86
  * identity handles many requests.
74
87
  *
75
- * Returns the cache, NOT an `Agent` instance: the long-lived path
76
- * uses `Ablo({kind:'agent'})` over WebSocket, while the `Agent` class
77
- * itself is the short-lived REST helper for AI SDK tool loops. The
78
- * static method lives here so consumers reach for everything
79
- * agent-related under one namespace.
88
+ * Returns the cache rather than an `Agent` instance: the long-lived path
89
+ * uses `Ablo({kind:'agent'})` over a WebSocket, while the `Agent` class
90
+ * itself is the short-lived REST helper for AI SDK tool loops. The static
91
+ * method lives here so everything agent-related sits under one namespace.
80
92
  *
81
93
  * ```ts
82
94
  * const session = Agent.session({ syncServerUrl, schema, issueToken });
@@ -90,8 +102,8 @@ export class Agent {
90
102
  }
91
103
  /**
92
104
  * Extract the Agent instance from an AI SDK tool's
93
- * `experimental_context`. Use inside tool `execute` functions to reach
94
- * the perception without closure-capturing it.
105
+ * `experimental_context`. Use it inside a tool's `execute` function to
106
+ * reach the agent without capturing it in a closure.
95
107
  *
96
108
  * ```ts
97
109
  * execute: async (args, { experimental_context }) => {
@@ -117,9 +129,9 @@ export class Agent {
117
129
  return ctx.perception;
118
130
  }
119
131
  /**
120
- * Narrower variant of {@link fromContext} that returns `undefined` instead
121
- * of throwing when perception isn't in context. Useful for tools where
122
- * awareness is optional (e.g., read-only tools that work without it).
132
+ * A lenient variant of {@link fromContext} that returns `undefined` instead
133
+ * of throwing when no agent is present in the context. Useful for tools
134
+ * where awareness is optional, such as read-only tools that work without it.
123
135
  */
124
136
  static tryFromContext(ctx) {
125
137
  if (!ctx ||
@@ -222,9 +234,10 @@ export class Agent {
222
234
  pendingClaims,
223
235
  };
224
236
  }
225
- const body = (await res.json());
237
+ const body = (await (res).json());
226
238
  const rows = body.results?.[0];
227
- if (!rows || rows.length === 0) {
239
+ const entity = rows?.[0];
240
+ if (!entity) {
228
241
  return {
229
242
  stale: true,
230
243
  reason: 'not_found',
@@ -232,7 +245,6 @@ export class Agent {
232
245
  pendingClaims,
233
246
  };
234
247
  }
235
- const entity = rows[0];
236
248
  const updatedAtRaw = entity.updated_at ?? entity.updatedAt;
237
249
  const lastModifiedBy = entity.updated_by ??
238
250
  entity.updatedBy ??
@@ -4,7 +4,7 @@
4
4
  * Two entry points depending on agent lifetime:
5
5
  *
6
6
  * ─────────────────────────────────────────────────────────────────────────
7
- * LONG-LIVED AGENT (browser, daemon, persistent Node process)
7
+ * Long-lived agents (browser, daemon, persistent Node process)
8
8
  * ─────────────────────────────────────────────────────────────────────────
9
9
  * Use the unified `Ablo({...})` factory directly with `kind: 'agent'`.
10
10
  * The factory holds the WebSocket, reactive subscriptions, mutations, and
@@ -36,7 +36,7 @@
36
36
  * before expiry.
37
37
  *
38
38
  * ─────────────────────────────────────────────────────────────────────────
39
- * SHORT-LIVED AGENT (SQS consumer, serverless, API route)
39
+ * Short-lived agents (queue consumer, serverless, API route)
40
40
  * ─────────────────────────────────────────────────────────────────────────
41
41
  * Use {@link Agent}. Stateless REST hooks that slot directly into
42
42
  * the Vercel AI SDK's `generateText` / `streamText`. No WebSocket. Ideal
@@ -69,7 +69,7 @@
69
69
  * ```
70
70
  *
71
71
  * ─────────────────────────────────────────────────────────────────────────
72
- * IDIOMATIC TOOL PATTERN (ported from vercel-labs/open-agents)
72
+ * Idiomatic tool pattern
73
73
  * ─────────────────────────────────────────────────────────────────────────
74
74
  * Tools are factory functions that pull ambient state from
75
75
  * `experimental_context`. The caller builds an {@link AgentContext} once
@@ -93,7 +93,7 @@
93
93
  * ```
94
94
  *
95
95
  * ─────────────────────────────────────────────────────────────────────────
96
- * COMPOSED (long-lived `Ablo({kind:'agent'})` + Agent together)
96
+ * Composed usage (a long-lived `Ablo({kind:'agent'})` plus an Agent)
97
97
  * ─────────────────────────────────────────────────────────────────────────
98
98
  * If you have a long-lived `Ablo` instance AND want AI SDK hooks, pass it
99
99
  * as the `announcer` to Agent — presence announcements route
@@ -4,7 +4,7 @@
4
4
  * Two entry points depending on agent lifetime:
5
5
  *
6
6
  * ─────────────────────────────────────────────────────────────────────────
7
- * LONG-LIVED AGENT (browser, daemon, persistent Node process)
7
+ * Long-lived agents (browser, daemon, persistent Node process)
8
8
  * ─────────────────────────────────────────────────────────────────────────
9
9
  * Use the unified `Ablo({...})` factory directly with `kind: 'agent'`.
10
10
  * The factory holds the WebSocket, reactive subscriptions, mutations, and
@@ -36,7 +36,7 @@
36
36
  * before expiry.
37
37
  *
38
38
  * ─────────────────────────────────────────────────────────────────────────
39
- * SHORT-LIVED AGENT (SQS consumer, serverless, API route)
39
+ * Short-lived agents (queue consumer, serverless, API route)
40
40
  * ─────────────────────────────────────────────────────────────────────────
41
41
  * Use {@link Agent}. Stateless REST hooks that slot directly into
42
42
  * the Vercel AI SDK's `generateText` / `streamText`. No WebSocket. Ideal
@@ -69,7 +69,7 @@
69
69
  * ```
70
70
  *
71
71
  * ─────────────────────────────────────────────────────────────────────────
72
- * IDIOMATIC TOOL PATTERN (ported from vercel-labs/open-agents)
72
+ * Idiomatic tool pattern
73
73
  * ─────────────────────────────────────────────────────────────────────────
74
74
  * Tools are factory functions that pull ambient state from
75
75
  * `experimental_context`. The caller builds an {@link AgentContext} once
@@ -93,7 +93,7 @@
93
93
  * ```
94
94
  *
95
95
  * ─────────────────────────────────────────────────────────────────────────
96
- * COMPOSED (long-lived `Ablo({kind:'agent'})` + Agent together)
96
+ * Composed usage (a long-lived `Ablo({kind:'agent'})` plus an Agent)
97
97
  * ─────────────────────────────────────────────────────────────────────────
98
98
  * If you have a long-lived `Ablo` instance AND want AI SDK hooks, pass it
99
99
  * as the `announcer` to Agent — presence announcements route
@@ -114,7 +114,7 @@
114
114
  */
115
115
  // ── The entire `/agent` surface — one symbol ────────────────────────────
116
116
  //
117
- // `Agent` is the class AND the namespace for its types. Reach for
117
+ // `Agent` is both the class and the namespace for its types. Reach for
118
118
  // options, context, and session options via dot access:
119
119
  //
120
120
  // import { Agent } from '@abloatai/ablo/agent';
@@ -1,23 +1,21 @@
1
1
  /**
2
- * Agent session cache + lifecycle for server-side `SyncAgent`s.
2
+ * Caches and manages the lifecycle of long-lived agent connections on a server.
3
3
  *
4
- * Captures the pattern every server-side consumer needs:
5
- * 1. Cache `SyncAgent` instances per (org, user, surface, target).
6
- * 2. Re-mint capabilities before TTL elapses.
7
- * 3. Align the SyncAgent ctor's `syncGroups` with the cap allowlist
8
- * so the upgrade-time intersection is non-empty (avoid the
9
- * silent black-hole-broadcast bug).
10
- * 4. Connect / disconnect / dispose lifecycle.
4
+ * Server code that runs AI agents typically needs the same four things, and this
5
+ * module handles all of them:
6
+ * 1. Reuse one connected agent per (organization, user, surface, target)
7
+ * instead of connecting anew on every request.
8
+ * 2. Re-issue the agent's capability token before it expires.
9
+ * 3. Request exactly the sync groups the token allows, so the two lists
10
+ * overlap. If they don't, the agent subscribes to nothing and every
11
+ * broadcast is silently filtered out.
12
+ * 4. Connect, disconnect, and dispose cleanly.
11
13
  *
12
- * What's generic, what isn't:
13
- * - Cache, TTL, sync_groups alignment, lifecycle: SAME for every
14
- * consumer. Lives here.
15
- * - Cap mint: AUTH-FLOW-SPECIFIC. Every consumer has a different
16
- * way to obtain a token (Better Auth cookie forwarding, API key
17
- * exchange, OAuth, etc.). Consumer provides via the
18
- * `issueToken` callback.
19
- *
20
- * The helper itself imports nothing app-specific. Open-source-clean.
14
+ * Everything except obtaining the token is the same for every caller and lives
15
+ * here. Obtaining the token depends on how you authenticate — cookie forwarding,
16
+ * API-key exchange, OAuth, and so on — so you supply that step through the
17
+ * {@link AgentSessionOptions.issueToken} callback. The module itself depends on
18
+ * nothing outside this package.
21
19
  */
22
20
  import { Ablo } from '../client/Ablo.js';
23
21
  import type { Schema, SchemaRecord } from '../schema/schema.js';
@@ -25,11 +23,11 @@ interface IssuedToken {
25
23
  readonly token: string;
26
24
  readonly expiresAtMs: number;
27
25
  /**
28
- * Sync groups allowed by this capability. Must include every group
29
- * the agent will subscribe to the upgrade-time intersection of
30
- * (allowed) (requested) determines effective subscription. Returning
31
- * a list that doesn't include the needed groups produces an empty
32
- * intersection and silent broadcast failure.
26
+ * The sync groups this token grants access to. It must include every group the
27
+ * agent needs to subscribe to. The agent's effective subscription is the
28
+ * overlap between the groups it requests and the groups listed here, so a list
29
+ * that omits a needed group leaves the agent subscribed to nothing and silently
30
+ * receiving no broadcasts.
33
31
  */
34
32
  readonly syncGroups: readonly string[];
35
33
  }
@@ -37,8 +35,9 @@ interface AgentIdentity {
37
35
  readonly userId: string;
38
36
  readonly organizationId: string;
39
37
  /**
40
- * Surface class `'chat'`, `'mcp'`, `'agent_worker'`, etc. Session
41
- * caches per surface so two surfaces don't share token or WS.
38
+ * The kind of surface making the request, such as `'chat'`, `'mcp'`, or
39
+ * `'agent_worker'`. The cache keys on this value, so two surfaces never share a
40
+ * token or a WebSocket connection.
42
41
  */
43
42
  readonly surfaceClass: string;
44
43
  readonly target?: {
@@ -47,40 +46,44 @@ interface AgentIdentity {
47
46
  } | null;
48
47
  }
49
48
  export interface AgentSessionOptions<R extends SchemaRecord = SchemaRecord> {
50
- /** Sync-server WebSocket URL `wss://sync.example.com` or `ws://localhost:3001`. */
49
+ /** WebSocket URL of your sync server, such as `wss://sync.example.com` or `ws://localhost:3001`. */
51
50
  readonly syncServerUrl: string;
52
- /** Schema for the typed model proxy on the returned Ablo. After
53
- * the dual-engine collapse, `Ablo({kind:'agent'})` is the unified
54
- * factory and requires the schema to expose
55
- * `agent.<model>.create/update/delete`. */
51
+ /**
52
+ * Your schema, used to build the typed model proxy on the returned client. The
53
+ * agent client exposes it as `agent.<model>.create/update/delete`.
54
+ */
56
55
  readonly schema: Schema<R>;
57
56
  /**
58
- * Token-issuing callback. Called on cache miss / expiry. Owns the
59
- * consumer's auth flow (Better Auth cookies, API key exchange, OAuth,
60
- * etc.) so the engine stays auth-flow-agnostic.
57
+ * Issues a capability token for the given identity. The session calls it on a
58
+ * cache miss or when the current token is near expiry. Because this callback
59
+ * carries out your authentication flow — cookie forwarding, API-key exchange,
60
+ * OAuth, and so on — the rest of the session stays independent of how you
61
+ * authenticate.
61
62
  */
62
63
  readonly issueToken: (identity: AgentIdentity) => Promise<IssuedToken>;
63
64
  /**
64
- * Soft window before actual expiry to re-mint. Defaults to 30s.
65
- * Avoids races between mint-time and clock-skew at use-time.
65
+ * How long before a token's true expiry the session should re-issue it, in
66
+ * milliseconds. Defaults to 30 seconds. The buffer absorbs clock skew so a
67
+ * token never expires mid-use.
66
68
  */
67
69
  readonly reissueBufferMs?: number;
68
70
  /**
69
- * Optional agent-id strategy. Default: `${surfaceClass}:${userId}`.
70
- * Override when the consumer wants different attribution shape.
71
+ * How to derive the agent's identifier from the request identity. Defaults to
72
+ * `${surfaceClass}:${userId}`. Override it when you want a different shape for
73
+ * attribution.
71
74
  */
72
75
  readonly agentIdFor?: (identity: AgentIdentity) => string;
73
76
  }
74
77
  /**
75
- * Returns a session whose `getAgent` method handles cache, mint,
76
- * sync_groups alignment, and lifecycle. Call `disposeAll()` from
77
- * the consumer's process shutdown hook.
78
+ * Creates a session that hands out connected agents on demand. Its `getAgent`
79
+ * method handles caching, token issuance, sync-group alignment, and connection
80
+ * lifecycle; call `disposeAll` from your process's shutdown hook to close every
81
+ * open connection.
78
82
  *
79
- * Threading: the session is intended to be a long-lived singleton
80
- * shared across requests. The cache is keyed precisely so two
81
- * concurrent requests for the same (user, org, surface, target)
82
- * share one agent + one WS, while different requests get
83
- * independent agents.
83
+ * Treat the session as a long-lived singleton shared across requests. The cache
84
+ * key combines organization, user, surface, and target, so two concurrent
85
+ * requests for the same combination share one agent and one WebSocket, while
86
+ * requests for different combinations get independent agents.
84
87
  */
85
88
  export declare function createAgentSession<R extends SchemaRecord = SchemaRecord>(options: AgentSessionOptions<R>): {
86
89
  getAgent: (identity: AgentIdentity) => Promise<Ablo<R>>;