@abloatai/ablo 0.26.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 (398) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +101 -85
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +131 -147
  5. package/dist/Database.d.ts +54 -68
  6. package/dist/Database.js +97 -113
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +37 -52
  12. package/dist/Model.js +46 -61
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +112 -112
  18. package/dist/SyncClient.js +165 -172
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  22. package/dist/adapters/inMemoryStorage.js +9 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +167 -119
  50. package/dist/client/Ablo.d.ts +73 -73
  51. package/dist/client/Ablo.js +125 -160
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +133 -38
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +14 -17
  61. package/dist/client/createInternalComponents.js +25 -30
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +57 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +67 -87
  76. package/dist/client/options.d.ts +134 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +15 -20
  91. package/dist/client/wsMutationExecutor.js +17 -23
  92. package/dist/context.d.ts +6 -4
  93. package/dist/context.js +6 -4
  94. package/dist/coordination/index.d.ts +10 -8
  95. package/dist/coordination/index.js +14 -12
  96. package/dist/coordination/schema.d.ts +176 -128
  97. package/dist/coordination/schema.js +197 -133
  98. package/dist/coordination/trace.d.ts +9 -10
  99. package/dist/coordination/trace.js +13 -14
  100. package/dist/core/DatabaseManager.d.ts +5 -7
  101. package/dist/core/DatabaseManager.js +15 -19
  102. package/dist/core/QueryProcessor.d.ts +7 -9
  103. package/dist/core/QueryProcessor.js +22 -28
  104. package/dist/core/QueryView.d.ts +8 -8
  105. package/dist/core/QueryView.js +2 -2
  106. package/dist/core/StoreManager.d.ts +12 -14
  107. package/dist/core/StoreManager.js +21 -24
  108. package/dist/core/ViewRegistry.d.ts +5 -5
  109. package/dist/core/ViewRegistry.js +4 -4
  110. package/dist/core/index.d.ts +17 -12
  111. package/dist/core/index.js +32 -26
  112. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  113. package/dist/core/openIDBWithTimeout.js +42 -43
  114. package/dist/core/queryUtils.d.ts +45 -0
  115. package/dist/core/queryUtils.js +69 -0
  116. package/dist/core/storeContract.d.ts +63 -61
  117. package/dist/core/storeContract.js +8 -12
  118. package/dist/environment.d.ts +28 -0
  119. package/dist/environment.js +21 -0
  120. package/dist/errorCodes.d.ts +107 -99
  121. package/dist/errorCodes.js +131 -132
  122. package/dist/errors.d.ts +160 -166
  123. package/dist/errors.js +155 -158
  124. package/dist/index.d.ts +30 -27
  125. package/dist/index.js +89 -86
  126. package/dist/interfaces/index.d.ts +102 -113
  127. package/dist/interfaces/index.js +5 -4
  128. package/dist/keys/index.d.ts +27 -29
  129. package/dist/keys/index.js +41 -40
  130. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  131. package/dist/mutators/RecordingTransaction.js +31 -37
  132. package/dist/mutators/Transaction.d.ts +18 -26
  133. package/dist/mutators/Transaction.js +14 -20
  134. package/dist/mutators/UndoManager.d.ts +122 -131
  135. package/dist/mutators/UndoManager.js +145 -156
  136. package/dist/mutators/defineMutators.d.ts +23 -34
  137. package/dist/mutators/defineMutators.js +14 -20
  138. package/dist/mutators/inverseOp.d.ts +12 -15
  139. package/dist/mutators/inverseOp.js +12 -15
  140. package/dist/mutators/mutateActions.d.ts +10 -9
  141. package/dist/mutators/mutateActions.js +1 -1
  142. package/dist/mutators/readerActions.d.ts +9 -8
  143. package/dist/mutators/readerActions.js +2 -2
  144. package/dist/mutators/undoApply.d.ts +31 -27
  145. package/dist/mutators/undoApply.js +26 -24
  146. package/dist/policy/index.d.ts +5 -3
  147. package/dist/policy/index.js +5 -3
  148. package/dist/policy/types.d.ts +104 -100
  149. package/dist/policy/types.js +67 -66
  150. package/dist/query/client.d.ts +28 -23
  151. package/dist/query/client.js +45 -43
  152. package/dist/query/types.d.ts +37 -60
  153. package/dist/query/types.js +13 -33
  154. package/dist/react/AbloProvider.d.ts +1 -1
  155. package/dist/react/AbloProvider.js +2 -2
  156. package/dist/react/context.d.ts +25 -28
  157. package/dist/react/context.js +9 -10
  158. package/dist/react/index.d.ts +41 -42
  159. package/dist/react/index.js +37 -38
  160. package/dist/react/internalContext.d.ts +17 -19
  161. package/dist/react/useAblo.d.ts +23 -22
  162. package/dist/react/useAblo.js +16 -14
  163. package/dist/react/useCurrentUserId.d.ts +8 -7
  164. package/dist/react/useCurrentUserId.js +8 -7
  165. package/dist/react/useErrorListener.d.ts +7 -7
  166. package/dist/react/useErrorListener.js +10 -11
  167. package/dist/react/useMutationFailureListener.d.ts +8 -8
  168. package/dist/react/useMutationFailureListener.js +8 -8
  169. package/dist/react/useMutators.d.ts +11 -11
  170. package/dist/react/useMutators.js +3 -3
  171. package/dist/react/useReactive.js +2 -2
  172. package/dist/react/useSyncStatus.d.ts +4 -6
  173. package/dist/react/useUndoScope.d.ts +7 -9
  174. package/dist/react/useUndoScope.js +1 -1
  175. package/dist/schema/coordination.d.ts +21 -25
  176. package/dist/schema/coordination.js +21 -25
  177. package/dist/schema/ddl.d.ts +43 -39
  178. package/dist/schema/ddl.js +75 -68
  179. package/dist/schema/ddlLock.d.ts +20 -24
  180. package/dist/schema/ddlLock.js +18 -23
  181. package/dist/schema/diff.d.ts +99 -61
  182. package/dist/schema/diff.js +43 -34
  183. package/dist/schema/field.d.ts +37 -42
  184. package/dist/schema/field.js +35 -48
  185. package/dist/schema/generate.d.ts +12 -12
  186. package/dist/schema/generate.js +12 -12
  187. package/dist/schema/index.d.ts +2 -2
  188. package/dist/schema/index.js +21 -23
  189. package/dist/schema/model.d.ts +118 -143
  190. package/dist/schema/model.js +22 -33
  191. package/dist/schema/openapi.d.ts +10 -9
  192. package/dist/schema/openapi.js +5 -3
  193. package/dist/schema/queries.d.ts +29 -31
  194. package/dist/schema/queries.js +23 -25
  195. package/dist/schema/relation.d.ts +89 -99
  196. package/dist/schema/relation.js +13 -13
  197. package/dist/schema/residency.d.ts +16 -13
  198. package/dist/schema/residency.js +16 -13
  199. package/dist/schema/roles.d.ts +36 -43
  200. package/dist/schema/roles.js +31 -37
  201. package/dist/schema/schema.d.ts +33 -42
  202. package/dist/schema/schema.js +31 -32
  203. package/dist/schema/select.d.ts +13 -13
  204. package/dist/schema/select.js +13 -13
  205. package/dist/schema/serialize.d.ts +28 -31
  206. package/dist/schema/serialize.js +27 -31
  207. package/dist/schema/sugar.d.ts +17 -32
  208. package/dist/schema/sugar.js +14 -29
  209. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  210. package/dist/schema/syncDeltaRow.js +89 -0
  211. package/dist/schema/tenancy.d.ts +44 -46
  212. package/dist/schema/tenancy.js +46 -48
  213. package/dist/server/adapter.d.ts +58 -58
  214. package/dist/server/adapter.js +13 -14
  215. package/dist/server/commit.d.ts +60 -64
  216. package/dist/server/index.d.ts +9 -10
  217. package/dist/server/index.js +1 -1
  218. package/dist/server/readConfig.d.ts +70 -0
  219. package/dist/server/readConfig.js +8 -0
  220. package/dist/server/storageMode.d.ts +23 -0
  221. package/dist/server/storageMode.js +17 -0
  222. package/dist/source/adapter.d.ts +30 -25
  223. package/dist/source/adapter.js +10 -10
  224. package/dist/source/adapters/drizzle.d.ts +28 -23
  225. package/dist/source/adapters/drizzle.js +30 -25
  226. package/dist/source/adapters/kysely.d.ts +27 -25
  227. package/dist/source/adapters/kysely.js +24 -23
  228. package/dist/source/adapters/memory.d.ts +8 -7
  229. package/dist/source/adapters/memory.js +9 -8
  230. package/dist/source/adapters/prisma.d.ts +13 -12
  231. package/dist/source/adapters/prisma.js +22 -25
  232. package/dist/source/conformance.d.ts +18 -11
  233. package/dist/source/conformance.js +17 -11
  234. package/dist/source/connector.d.ts +31 -32
  235. package/dist/source/connector.js +28 -28
  236. package/dist/source/connectorProtocol.d.ts +160 -0
  237. package/dist/source/connectorProtocol.js +162 -0
  238. package/dist/source/contract.d.ts +26 -27
  239. package/dist/source/contract.js +28 -29
  240. package/dist/source/factory.d.ts +46 -58
  241. package/dist/source/factory.js +22 -27
  242. package/dist/source/index.d.ts +7 -9
  243. package/dist/source/index.js +12 -14
  244. package/dist/source/migrations.d.ts +9 -9
  245. package/dist/source/migrations.js +9 -9
  246. package/dist/source/next.d.ts +9 -10
  247. package/dist/source/next.js +6 -7
  248. package/dist/source/pushQueue.d.ts +69 -47
  249. package/dist/source/pushQueue.js +32 -28
  250. package/dist/source/signing.d.ts +46 -17
  251. package/dist/source/signing.js +28 -11
  252. package/dist/source/types.d.ts +121 -104
  253. package/dist/source/types.js +13 -14
  254. package/dist/stores/ObjectStore.d.ts +10 -11
  255. package/dist/stores/ObjectStore.js +11 -12
  256. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  257. package/dist/stores/SyncActionStore.d.ts +7 -11
  258. package/dist/stores/SyncActionStore.js +13 -17
  259. package/dist/surface.d.ts +27 -20
  260. package/dist/surface.js +27 -20
  261. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  262. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  263. package/dist/sync/ConnectionManager.d.ts +39 -50
  264. package/dist/sync/ConnectionManager.js +55 -66
  265. package/dist/sync/NetworkProbe.d.ts +24 -29
  266. package/dist/sync/NetworkProbe.js +63 -69
  267. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  268. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  269. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  270. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  271. package/dist/sync/SyncWebSocket.d.ts +139 -165
  272. package/dist/sync/SyncWebSocket.js +191 -223
  273. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  274. package/dist/sync/awaitClaimGrant.js +11 -11
  275. package/dist/sync/bootstrapApply.d.ts +34 -24
  276. package/dist/sync/bootstrapApply.js +27 -19
  277. package/dist/sync/commitFrames.d.ts +21 -20
  278. package/dist/sync/commitFrames.js +18 -18
  279. package/dist/sync/createClaimStream.d.ts +23 -22
  280. package/dist/sync/createClaimStream.js +105 -23
  281. package/dist/sync/createPresenceStream.d.ts +19 -18
  282. package/dist/sync/createPresenceStream.js +25 -26
  283. package/dist/sync/createSnapshot.d.ts +12 -14
  284. package/dist/sync/createSnapshot.js +20 -26
  285. package/dist/sync/credentialLifecycle.d.ts +104 -104
  286. package/dist/sync/credentialLifecycle.js +140 -147
  287. package/dist/sync/deltaPipeline.d.ts +36 -34
  288. package/dist/sync/deltaPipeline.js +64 -65
  289. package/dist/sync/groupChange.d.ts +63 -61
  290. package/dist/sync/groupChange.js +74 -78
  291. package/dist/sync/heartbeat.d.ts +34 -33
  292. package/dist/sync/heartbeat.js +31 -31
  293. package/dist/sync/participants.d.ts +19 -19
  294. package/dist/sync/schemas.d.ts +3 -2
  295. package/dist/sync/schemas.js +14 -10
  296. package/dist/sync/syncCursor.d.ts +17 -21
  297. package/dist/sync/syncCursor.js +17 -21
  298. package/dist/sync/syncPlan.d.ts +28 -36
  299. package/dist/sync/syncPlan.js +18 -19
  300. package/dist/sync/syncPosition.d.ts +54 -49
  301. package/dist/sync/syncPosition.js +57 -52
  302. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  303. package/dist/sync/wsFrameHandlers.js +63 -67
  304. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  305. package/dist/testing/fixtures/bootstrap.js +12 -6
  306. package/dist/testing/fixtures/deltas.d.ts +30 -33
  307. package/dist/testing/fixtures/deltas.js +30 -33
  308. package/dist/testing/fixtures/models.d.ts +11 -10
  309. package/dist/testing/fixtures/models.js +11 -10
  310. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  311. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  312. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  313. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  314. package/dist/testing/helpers/wait.d.ts +13 -8
  315. package/dist/testing/helpers/wait.js +13 -8
  316. package/dist/testing/index.d.ts +3 -3
  317. package/dist/testing/index.js +2 -2
  318. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  319. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  320. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  321. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  322. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  323. package/dist/testing/mocks/MockSyncContext.js +15 -13
  324. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  325. package/dist/testing/mocks/MockSyncStore.js +11 -11
  326. package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
  327. package/dist/testing/mocks/MockWebSocket.js +22 -21
  328. package/dist/transactions/TransactionQueue.d.ts +181 -176
  329. package/dist/transactions/TransactionQueue.js +338 -350
  330. package/dist/transactions/TransactionStore.d.ts +6 -4
  331. package/dist/transactions/TransactionStore.js +6 -4
  332. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  333. package/dist/transactions/UnconfirmedWrites.js +104 -0
  334. package/dist/transactions/coalesceRules.d.ts +41 -17
  335. package/dist/transactions/coalesceRules.js +40 -17
  336. package/dist/transactions/commitPayload.d.ts +48 -52
  337. package/dist/transactions/commitPayload.js +48 -57
  338. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  339. package/dist/transactions/deltaConfirmation.js +37 -45
  340. package/dist/transactions/optimisticApply.d.ts +49 -0
  341. package/dist/transactions/optimisticApply.js +65 -0
  342. package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
  343. package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
  344. package/dist/types/global.d.ts +46 -41
  345. package/dist/types/global.js +20 -19
  346. package/dist/types/index.d.ts +71 -77
  347. package/dist/types/index.js +22 -22
  348. package/dist/types/modelData.d.ts +6 -8
  349. package/dist/types/modelData.js +5 -7
  350. package/dist/types/participant.d.ts +10 -11
  351. package/dist/types/participant.js +6 -8
  352. package/dist/types/streams.d.ts +208 -195
  353. package/dist/types/streams.js +7 -7
  354. package/dist/utils/asyncIterator.d.ts +25 -32
  355. package/dist/utils/asyncIterator.js +25 -32
  356. package/dist/utils/duration.d.ts +12 -15
  357. package/dist/utils/duration.js +12 -15
  358. package/dist/utils/mobxSetup.d.ts +53 -0
  359. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  360. package/dist/webhooks/events.d.ts +21 -16
  361. package/dist/webhooks/events.js +10 -8
  362. package/dist/webhooks/index.d.ts +5 -7
  363. package/dist/webhooks/index.js +5 -7
  364. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  365. package/dist/wire/delta.js +114 -0
  366. package/dist/wire/errorEnvelope.d.ts +30 -31
  367. package/dist/wire/errorEnvelope.js +34 -40
  368. package/dist/wire/frames.d.ts +79 -86
  369. package/dist/wire/frames.js +26 -33
  370. package/dist/wire/index.d.ts +14 -12
  371. package/dist/wire/index.js +30 -26
  372. package/dist/wire/listEnvelope.d.ts +16 -23
  373. package/dist/wire/listEnvelope.js +7 -6
  374. package/dist/wire/protocol.d.ts +25 -32
  375. package/dist/wire/protocol.js +25 -32
  376. package/dist/wire/protocolVersion.d.ts +44 -40
  377. package/dist/wire/protocolVersion.js +44 -40
  378. package/docs/coordination.md +59 -0
  379. package/package.json +11 -10
  380. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  381. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  382. package/dist/core/query-utils.d.ts +0 -34
  383. package/dist/core/query-utils.js +0 -59
  384. package/dist/schema/sync-delta-row.js +0 -103
  385. package/dist/schema/sync-delta-wire.js +0 -102
  386. package/dist/server/read-config.d.ts +0 -67
  387. package/dist/server/read-config.js +0 -8
  388. package/dist/server/storage-mode.d.ts +0 -8
  389. package/dist/server/storage-mode.js +0 -28
  390. package/dist/source/connector-protocol.d.ts +0 -159
  391. package/dist/source/connector-protocol.js +0 -161
  392. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  393. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  394. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  395. package/dist/transactions/mutation-error-handler.js +0 -39
  396. package/dist/transactions/optimistic.d.ts +0 -24
  397. package/dist/transactions/optimistic.js +0 -45
  398. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -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
  }
@@ -231,16 +227,16 @@ export interface WrapToolOptions<TArgs> {
231
227
  announceOnExecute?: boolean;
232
228
  }
233
229
  /**
234
- * Console-backed default logger the SAME gated factory the `Ablo()` client
235
- * uses (`createConsoleLogger`, threshold from `ABLO_LOG_LEVEL`, default
236
- * `warn`), tagged `[agent]` so agent-runtime lines are distinguishable. The
237
- * previous hand-rolled shim ignored the level gate entirely and printed
238
- * `[perception]` engine internals at debug/info by default. Level is resolved
239
- * per construction (not at module load) so `ABLO_LOG_LEVEL` set by the host
240
- * process before building an Agent is honored.
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.
241
237
  *
242
- * Exported for the unit test that pins the gating; consumers pass their own
243
- * `logger` option instead.
238
+ * Exported so a unit test can pin the gating behavior; consumers normally pass
239
+ * their own `logger` option instead.
244
240
  */
245
241
  export declare function defaultAgentLogger(): SyncLogger;
246
242
  export declare class Agent implements PresenceAnnouncer {
@@ -252,11 +248,10 @@ export declare class Agent implements PresenceAnnouncer {
252
248
  * tokens before TTL elapses. Use on the server when the same agent
253
249
  * identity handles many requests.
254
250
  *
255
- * Returns the cache, NOT an `Agent` instance: the long-lived path
256
- * uses `Ablo({kind:'agent'})` over WebSocket, while the `Agent` class
257
- * itself is the short-lived REST helper for AI SDK tool loops. The
258
- * static method lives here so consumers reach for everything
259
- * 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.
260
255
  *
261
256
  * ```ts
262
257
  * const session = Agent.session({ syncServerUrl, schema, issueToken });
@@ -268,8 +263,8 @@ export declare class Agent implements PresenceAnnouncer {
268
263
  get userId(): string;
269
264
  /**
270
265
  * Extract the Agent instance from an AI SDK tool's
271
- * `experimental_context`. Use inside tool `execute` functions to reach
272
- * 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.
273
268
  *
274
269
  * ```ts
275
270
  * execute: async (args, { experimental_context }) => {
@@ -285,9 +280,9 @@ export declare class Agent implements PresenceAnnouncer {
285
280
  */
286
281
  static fromContext(ctx: unknown, toolName?: string): Agent;
287
282
  /**
288
- * Narrower variant of {@link fromContext} that returns `undefined` instead
289
- * of throwing when perception isn't in context. Useful for tools where
290
- * 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.
291
286
  */
292
287
  static tryFromContext(ctx: unknown): Agent | undefined;
293
288
  /**
@@ -44,16 +44,16 @@ import { createConsoleLogger, resolveLogLevel } from '../client/consoleLogger.js
44
44
  import { AbloValidationError } from '../errors.js';
45
45
  // ── Agent ───────────────────────────────────────────────────────
46
46
  /**
47
- * Console-backed default logger the SAME gated factory the `Ablo()` client
48
- * uses (`createConsoleLogger`, threshold from `ABLO_LOG_LEVEL`, default
49
- * `warn`), tagged `[agent]` so agent-runtime lines are distinguishable. The
50
- * previous hand-rolled shim ignored the level gate entirely and printed
51
- * `[perception]` engine internals at debug/info by default. Level is resolved
52
- * per construction (not at module load) so `ABLO_LOG_LEVEL` set by the host
53
- * process before building an Agent is honored.
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
54
  *
55
- * Exported for the unit test that pins the gating; consumers pass their own
56
- * `logger` option instead.
55
+ * Exported so a unit test can pin the gating behavior; consumers normally pass
56
+ * their own `logger` option instead.
57
57
  */
58
58
  export function defaultAgentLogger() {
59
59
  const gated = createConsoleLogger(resolveLogLevel());
@@ -85,11 +85,10 @@ export class Agent {
85
85
  * tokens before TTL elapses. Use on the server when the same agent
86
86
  * identity handles many requests.
87
87
  *
88
- * Returns the cache, NOT an `Agent` instance: the long-lived path
89
- * uses `Ablo({kind:'agent'})` over WebSocket, while the `Agent` class
90
- * itself is the short-lived REST helper for AI SDK tool loops. The
91
- * static method lives here so consumers reach for everything
92
- * 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.
93
92
  *
94
93
  * ```ts
95
94
  * const session = Agent.session({ syncServerUrl, schema, issueToken });
@@ -103,8 +102,8 @@ export class Agent {
103
102
  }
104
103
  /**
105
104
  * Extract the Agent instance from an AI SDK tool's
106
- * `experimental_context`. Use inside tool `execute` functions to reach
107
- * 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.
108
107
  *
109
108
  * ```ts
110
109
  * execute: async (args, { experimental_context }) => {
@@ -130,9 +129,9 @@ export class Agent {
130
129
  return ctx.perception;
131
130
  }
132
131
  /**
133
- * Narrower variant of {@link fromContext} that returns `undefined` instead
134
- * of throwing when perception isn't in context. Useful for tools where
135
- * 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.
136
135
  */
137
136
  static tryFromContext(ctx) {
138
137
  if (!ctx ||
@@ -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>>;
@@ -1,37 +1,35 @@
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 { AbloConnectionError } from '../errors.js';
24
22
  import { getContext } from '../context.js';
25
23
  /**
26
- * Returns a session whose `getAgent` method handles cache, mint,
27
- * sync_groups alignment, and lifecycle. Call `disposeAll()` from
28
- * the consumer's process shutdown hook.
24
+ * Creates a session that hands out connected agents on demand. Its `getAgent`
25
+ * method handles caching, token issuance, sync-group alignment, and connection
26
+ * lifecycle; call `disposeAll` from your process's shutdown hook to close every
27
+ * open connection.
29
28
  *
30
- * Threading: the session is intended to be a long-lived singleton
31
- * shared across requests. The cache is keyed precisely so two
32
- * concurrent requests for the same (user, org, surface, target)
33
- * share one agent + one WS, while different requests get
34
- * independent agents.
29
+ * Treat the session as a long-lived singleton shared across requests. The cache
30
+ * key combines organization, user, surface, and target, so two concurrent
31
+ * requests for the same combination share one agent and one WebSocket, while
32
+ * requests for different combinations get independent agents.
35
33
  */
36
34
  export function createAgentSession(options) {
37
35
  const reissueBufferMs = options.reissueBufferMs ?? 30_000;
@@ -61,21 +59,14 @@ export function createAgentSession(options) {
61
59
  }
62
60
  }
63
61
  const minted = await options.issueToken(identity);
64
- // Sync_groups alignment is the load-bearing detail. The SDK
65
- // ctor's `syncGroups` and the cap mint's `syncGroups`
66
- // MUST overlap or the upgrade intersection is empty and every
67
- // broadcast filter returns false. Use the cap's allowed list
68
- // verbatim — the caller controlled what went in there, so it's
69
- // exactly what the SDK should request.
70
- // `AbloOptions` exposes the URL as `baseURL` (resolved by
71
- // `resolveBaseURL`). Earlier code passed `url:` here `Ablo()`
72
- // silently dropped the unknown field (the cast below masked the
73
- // type error) and `resolveBaseURL` fell through to the hosted
74
- // default `wss://api.abloatai.com`. Staging surfaced the bug
75
- // 2026-05-07 — DNS lookup hit the wrong
76
- // host even though the caller threaded `syncServerUrl` through
77
- // correctly. Forward as `baseURL` so the caller's URL is the only
78
- // source of truth and the package default never silently applies.
62
+ // Request the same sync groups the token grants. The groups requested here
63
+ // and the groups the token allows must overlap; otherwise their intersection
64
+ // is empty and every broadcast is filtered out. The token's allowed list is
65
+ // exactly what to request, since the caller decided what went into it.
66
+ //
67
+ // Pass the URL as `baseURL`, the field the client reads. Any other field name
68
+ // is ignored, in which case the client would fall back to its default host,
69
+ // so `baseURL` keeps the caller's URL the single source of truth.
79
70
  const wsUrl = toWsUrl(options.syncServerUrl);
80
71
  const agentOptions = {
81
72
  baseURL: wsUrl,
@@ -101,11 +92,9 @@ export function createAgentSession(options) {
101
92
  await agent.dispose();
102
93
  }
103
94
  catch { /* ignore */ }
104
- // Route through the gated logger so this obeys ABLO_LOG_LEVEL like every
105
- // other line: a plain consumer-register `error` headline (the unreachable
106
- // URL + code), with the structured fields on a `debug` companion. The
107
- // companion's shape matches the cap-mint logger in `connectAgent.ts` so a
108
- // single search picks both up.
95
+ // Log through the level-gated logger so it honors ABLO_LOG_LEVEL: an
96
+ // `error` headline naming the unreachable URL and code, plus a `debug`
97
+ // companion carrying the structured fields for deeper diagnosis.
109
98
  const log = getContext().logger;
110
99
  log.error(`Agent could not connect to the sync server at ${wsUrl}${code ? ` (${code})` : ''}.`);
111
100
  log.debug('[Agent.session] ws bootstrap failed', {
@@ -135,9 +124,9 @@ export function createAgentSession(options) {
135
124
  cacheByKey.clear();
136
125
  }
137
126
  /**
138
- * Eject a specific cached agent useful when the consumer knows
139
- * the underlying token is invalidated (revocation, role change)
140
- * and wants the next `getAgent` call to mint fresh.
127
+ * Removes and disposes one cached agent. Call it when you know the agent's
128
+ * token is no longer valid — after a revocation or role change, for example —
129
+ * so the next `getAgent` call issues a fresh one.
141
130
  */
142
131
  function evict(identity) {
143
132
  const key = cacheKey(identity);