@abloatai/ablo 0.34.1 → 0.36.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 (536) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +758 -5
  3. package/README.md +56 -502
  4. package/bin/ablo.cjs +39 -0
  5. package/dist/BaseSyncedStore.d.ts +176 -48
  6. package/dist/BaseSyncedStore.js +346 -214
  7. package/dist/Database.d.ts +17 -44
  8. package/dist/Database.js +96 -79
  9. package/dist/InstanceCache.d.ts +31 -6
  10. package/dist/InstanceCache.js +65 -30
  11. package/dist/LazyReferenceCollection.d.ts +3 -3
  12. package/dist/LazyReferenceCollection.js +4 -4
  13. package/dist/Model.d.ts +23 -13
  14. package/dist/Model.js +27 -17
  15. package/dist/ModelRegistry.d.ts +8 -4
  16. package/dist/ModelRegistry.js +20 -18
  17. package/dist/NetworkMonitor.d.ts +3 -1
  18. package/dist/NetworkMonitor.js +7 -5
  19. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  20. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  21. package/dist/SyncClient.d.ts +47 -47
  22. package/dist/SyncClient.js +215 -156
  23. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  24. package/dist/ai-sdk/coordinatedTool.js +1 -1
  25. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  26. package/dist/ai-sdk/coordinationContext.js +1 -1
  27. package/dist/ai-sdk/wrap.d.ts +3 -3
  28. package/dist/ai-sdk/wrap.js +2 -2
  29. package/dist/auth/index.d.ts +1 -156
  30. package/dist/auth/index.js +8 -301
  31. package/dist/client/Ablo.d.ts +42 -287
  32. package/dist/client/Ablo.js +129 -963
  33. package/dist/client/abloClient.d.ts +309 -0
  34. package/dist/client/abloClient.js +13 -0
  35. package/dist/client/clientPrelude.d.ts +52 -0
  36. package/dist/client/clientPrelude.js +60 -0
  37. package/dist/client/consoleLogger.d.ts +2 -2
  38. package/dist/client/coreClient.d.ts +60 -0
  39. package/dist/client/coreClient.js +118 -0
  40. package/dist/client/createInternalComponents.d.ts +8 -4
  41. package/dist/client/createInternalComponents.js +17 -10
  42. package/dist/client/createModelProxy.d.ts +98 -373
  43. package/dist/client/createModelProxy.js +233 -139
  44. package/dist/client/humans.d.ts +69 -0
  45. package/dist/client/humans.js +78 -0
  46. package/dist/client/modelRegistration.d.ts +1 -1
  47. package/dist/client/modelRegistration.js +9 -9
  48. package/dist/client/options.d.ts +73 -17
  49. package/dist/client/reactiveEngine.d.ts +53 -0
  50. package/dist/client/reactiveEngine.js +688 -0
  51. package/dist/client/resourceTypes.d.ts +9 -250
  52. package/dist/client/resourceTypes.js +8 -5
  53. package/dist/client/schemaConfig.d.ts +4 -4
  54. package/dist/client/schemaConfig.js +6 -2
  55. package/dist/client/storeCluster.d.ts +47 -0
  56. package/dist/client/storeCluster.js +118 -0
  57. package/dist/client/storeLifecycle.d.ts +61 -0
  58. package/dist/client/storeLifecycle.js +231 -0
  59. package/dist/client/validateAbloOptions.d.ts +3 -2
  60. package/dist/client/validateAbloOptions.js +1 -1
  61. package/dist/client/wsMutationExecutor.d.ts +3 -3
  62. package/dist/client/wsMutationExecutor.js +3 -3
  63. package/dist/context.d.ts +22 -9
  64. package/dist/context.js +33 -9
  65. package/dist/coordination/ClaimLog.d.ts +26 -0
  66. package/dist/coordination/ClaimLog.js +32 -0
  67. package/dist/coordination/index.d.ts +1 -15
  68. package/dist/coordination/index.js +8 -31
  69. package/dist/core/index.d.ts +3 -3
  70. package/dist/core/index.js +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +230 -0
  73. package/dist/docs/index.d.ts +10 -0
  74. package/dist/docs/index.js +10 -0
  75. package/dist/environment.d.ts +1 -40
  76. package/dist/environment.js +8 -37
  77. package/dist/index.d.ts +44 -36
  78. package/dist/index.js +30 -22
  79. package/dist/interfaces/index.d.ts +44 -134
  80. package/dist/keys/index.d.ts +1 -77
  81. package/dist/keys/index.js +8 -190
  82. package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
  83. package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
  84. package/dist/mutators/Transaction.d.ts +1 -1
  85. package/dist/mutators/Transaction.js +1 -1
  86. package/dist/mutators/UndoManager.d.ts +6 -6
  87. package/dist/mutators/UndoManager.js +5 -5
  88. package/dist/mutators/defineMutators.d.ts +3 -3
  89. package/dist/mutators/defineMutators.js +1 -1
  90. package/dist/mutators/inverseOp.js +2 -2
  91. package/dist/mutators/mutateActions.d.ts +3 -3
  92. package/dist/mutators/mutateActions.js +1 -1
  93. package/dist/mutators/readerActions.d.ts +1 -1
  94. package/dist/mutators/undoApply.d.ts +1 -1
  95. package/dist/mutators/undoApply.js +1 -1
  96. package/dist/policy/index.d.ts +2 -2
  97. package/dist/policy/index.js +1 -1
  98. package/dist/query/client.d.ts +5 -2
  99. package/dist/query/client.js +10 -9
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +18 -8
  103. package/dist/react/AbloProvider.js +10 -9
  104. package/dist/react/context.d.ts +3 -3
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/createAbloReact.d.ts +56 -0
  107. package/dist/react/createAbloReact.js +51 -0
  108. package/dist/react/index.d.ts +6 -5
  109. package/dist/react/index.js +6 -3
  110. package/dist/react/internalContext.d.ts +1 -1
  111. package/dist/react/useAblo.d.ts +12 -5
  112. package/dist/react/useAblo.js +26 -8
  113. package/dist/react/useCurrentUserId.js +1 -1
  114. package/dist/react/useErrorListener.js +1 -1
  115. package/dist/react/useMutationFailureListener.d.ts +2 -2
  116. package/dist/react/useMutationFailureListener.js +1 -1
  117. package/dist/react/useMutators.d.ts +3 -3
  118. package/dist/react/useMutators.js +3 -3
  119. package/dist/react/useUndoScope.d.ts +5 -5
  120. package/dist/react/useUndoScope.js +1 -1
  121. package/dist/schema/coordination.d.ts +69 -10
  122. package/dist/schema/coordination.js +90 -9
  123. package/dist/schema/ddl.js +2 -2
  124. package/dist/schema/diff.d.ts +1 -1
  125. package/dist/schema/generate.js +1 -1
  126. package/dist/schema/index.d.ts +11 -10
  127. package/dist/schema/index.js +22 -18
  128. package/dist/schema/queries.d.ts +27 -27
  129. package/dist/schema/queries.js +23 -23
  130. package/dist/schema/select.d.ts +3 -3
  131. package/dist/schema/select.js +6 -3
  132. package/dist/schema/serialize.d.ts +15 -6
  133. package/dist/schema/serialize.js +20 -3
  134. package/dist/schema/sugar.d.ts +6 -7
  135. package/dist/schema/sugar.js +9 -12
  136. package/dist/schema/syncDeltaRow.d.ts +4 -152
  137. package/dist/schema/syncDeltaRow.js +4 -105
  138. package/dist/server/adapter.d.ts +18 -1
  139. package/dist/server/commit.d.ts +10 -16
  140. package/dist/server/index.d.ts +1 -1
  141. package/dist/server/index.js +1 -1
  142. package/dist/server/readConfig.d.ts +1 -1
  143. package/dist/source/adapter.d.ts +7 -5
  144. package/dist/source/adapter.js +7 -5
  145. package/dist/source/adapters/drizzle.d.ts +1 -1
  146. package/dist/source/adapters/drizzle.js +2 -2
  147. package/dist/source/adapters/kysely.d.ts +1 -1
  148. package/dist/source/adapters/kysely.js +1 -1
  149. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  150. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  151. package/dist/source/adapters/memory.js +1 -1
  152. package/dist/source/adapters/prisma.d.ts +8 -3
  153. package/dist/source/adapters/prisma.js +1 -1
  154. package/dist/source/connector.js +1 -1
  155. package/dist/source/connectorProtocol.d.ts +2 -8
  156. package/dist/source/connectorProtocol.js +3 -2
  157. package/dist/source/contract.d.ts +29 -17
  158. package/dist/source/contract.js +27 -22
  159. package/dist/source/factory.d.ts +1 -1
  160. package/dist/source/idempotency.js +2 -2
  161. package/dist/source/index.d.ts +1 -0
  162. package/dist/source/index.js +3 -0
  163. package/dist/source/next.d.ts +1 -1
  164. package/dist/source/signing.d.ts +9 -2
  165. package/dist/source/signing.js +4 -1
  166. package/dist/source/types.d.ts +6 -4
  167. package/dist/source/types.js +1 -1
  168. package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
  169. package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
  170. package/dist/{core → stores}/DatabaseManager.js +14 -13
  171. package/dist/stores/ObjectStore.d.ts +1 -1
  172. package/dist/{core → stores}/StoreManager.d.ts +9 -26
  173. package/dist/{core → stores}/StoreManager.js +29 -77
  174. package/dist/stores/SyncActionStore.d.ts +4 -2
  175. package/dist/stores/SyncActionStore.js +11 -17
  176. package/dist/stores/syncAction.d.ts +26 -0
  177. package/dist/stores/syncAction.js +16 -0
  178. package/dist/surface.d.ts +3 -3
  179. package/dist/surface.js +6 -4
  180. package/dist/sync/BootstrapFetcher.d.ts +127 -6
  181. package/dist/sync/BootstrapFetcher.js +511 -83
  182. package/dist/sync/ConnectionManager.d.ts +6 -198
  183. package/dist/sync/ConnectionManager.js +6 -677
  184. package/dist/sync/OnDemandLoader.d.ts +5 -2
  185. package/dist/sync/OnDemandLoader.js +61 -21
  186. package/dist/sync/SubscriptionManager.d.ts +13 -2
  187. package/dist/sync/SubscriptionManager.js +23 -5
  188. package/dist/sync/SyncWebSocket.d.ts +27 -510
  189. package/dist/sync/SyncWebSocket.js +76 -954
  190. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  191. package/dist/sync/awaitClaimGrant.js +4 -109
  192. package/dist/sync/bootstrapApply.d.ts +3 -0
  193. package/dist/sync/bootstrapApply.js +2 -2
  194. package/dist/sync/commitFrames.d.ts +6 -40
  195. package/dist/sync/commitFrames.js +6 -97
  196. package/dist/sync/contextPorts.d.ts +18 -0
  197. package/dist/sync/contextPorts.js +31 -0
  198. package/dist/sync/createClaimStream.d.ts +5 -49
  199. package/dist/sync/createClaimStream.js +5 -469
  200. package/dist/sync/createPresenceStream.d.ts +26 -4
  201. package/dist/sync/createPresenceStream.js +28 -20
  202. package/dist/sync/createSnapshot.d.ts +2 -2
  203. package/dist/sync/createSnapshot.js +1 -1
  204. package/dist/sync/credentialLifecycle.d.ts +5 -173
  205. package/dist/sync/credentialLifecycle.js +5 -320
  206. package/dist/sync/deltaPipeline.d.ts +13 -12
  207. package/dist/sync/deltaPipeline.js +21 -4
  208. package/dist/sync/groupChange.d.ts +3 -0
  209. package/dist/sync/groupChange.js +16 -14
  210. package/dist/sync/participants.d.ts +24 -6
  211. package/dist/sync/participants.js +32 -23
  212. package/dist/sync/schemaDrift.d.ts +55 -0
  213. package/dist/sync/schemaDrift.js +53 -0
  214. package/dist/sync/schemas.d.ts +23 -33
  215. package/dist/sync/schemas.js +29 -20
  216. package/dist/sync/syncPlan.d.ts +3 -3
  217. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  218. package/dist/sync/wsFrameHandlers.js +6 -392
  219. package/dist/syncLog/contract.d.ts +20 -0
  220. package/dist/syncLog/contract.js +19 -0
  221. package/dist/syncLog/index.d.ts +1 -0
  222. package/dist/syncLog/index.js +1 -0
  223. package/dist/transaction/ablo.d.ts +88 -0
  224. package/dist/transaction/ablo.js +33 -0
  225. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  226. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  227. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  228. package/dist/transaction/auth/bootstrapScope.js +1 -0
  229. package/dist/transaction/auth/capability.d.ts +212 -0
  230. package/dist/transaction/auth/capability.js +224 -0
  231. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  232. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  233. package/dist/{client → transaction/auth}/identity.js +1 -1
  234. package/dist/transaction/auth/index.d.ts +162 -0
  235. package/dist/transaction/auth/index.js +304 -0
  236. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  237. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  238. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  239. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  240. package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
  241. package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
  242. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
  243. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
  244. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  245. package/dist/transaction/coordination/claimMeta.js +52 -0
  246. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  247. package/dist/transaction/coordination/createClaimStream.js +475 -0
  248. package/dist/transaction/coordination/events.d.ts +74 -0
  249. package/dist/transaction/coordination/events.js +7 -0
  250. package/dist/transaction/coordination/index.d.ts +19 -0
  251. package/dist/transaction/coordination/index.js +45 -0
  252. package/dist/transaction/coordination/locator.d.ts +104 -0
  253. package/dist/transaction/coordination/locator.js +102 -0
  254. package/dist/transaction/coordination/schema.d.ts +1536 -0
  255. package/dist/transaction/coordination/schema.js +1177 -0
  256. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  257. package/dist/transaction/coordination/targetConflict.js +107 -0
  258. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  259. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  260. package/dist/transaction/durableWrites.d.ts +62 -0
  261. package/dist/{client → transaction}/durableWrites.js +28 -3
  262. package/dist/transaction/environment.d.ts +105 -0
  263. package/dist/transaction/environment.js +108 -0
  264. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
  265. package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
  266. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  267. package/dist/{errors.js → transaction/errors.js} +85 -16
  268. package/dist/transaction/footprint.d.ts +111 -0
  269. package/dist/transaction/footprint.js +0 -0
  270. package/dist/transaction/index.d.ts +20 -0
  271. package/dist/transaction/index.js +20 -0
  272. package/dist/transaction/keys/index.d.ts +87 -0
  273. package/dist/transaction/keys/index.js +207 -0
  274. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  275. package/dist/transaction/log/syncDeltaRow.js +95 -0
  276. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  277. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  278. package/dist/transaction/logger.d.ts +16 -0
  279. package/dist/transaction/logger.js +7 -0
  280. package/dist/transaction/observability.d.ts +53 -0
  281. package/dist/transaction/observability.js +19 -0
  282. package/dist/transaction/plugin.d.ts +285 -0
  283. package/dist/transaction/plugin.js +106 -0
  284. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  285. package/dist/{policy → transaction/policy}/types.js +2 -0
  286. package/dist/transaction/resources/httpResources.d.ts +321 -0
  287. package/dist/transaction/resources/httpResources.js +7 -0
  288. package/dist/transaction/resources/modelOperations.d.ts +427 -0
  289. package/dist/transaction/resources/modelOperations.js +12 -0
  290. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  291. package/dist/transaction/resources/mutationOptions.js +9 -0
  292. package/dist/transaction/resources/where.d.ts +101 -0
  293. package/dist/transaction/resources/where.js +115 -0
  294. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  295. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  296. package/dist/{schema → transaction/schema}/field.d.ts +17 -23
  297. package/dist/{schema → transaction/schema}/field.js +5 -5
  298. package/dist/transaction/schema/fieldRef.d.ts +38 -0
  299. package/dist/transaction/schema/fieldRef.js +11 -0
  300. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  301. package/dist/transaction/schema/loadStrategy.js +46 -0
  302. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  303. package/dist/{schema → transaction/schema}/model.js +30 -20
  304. package/dist/transaction/schema/openapi.d.ts +58 -0
  305. package/dist/transaction/schema/openapi.js +501 -0
  306. package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
  307. package/dist/{schema → transaction/schema}/relation.js +7 -7
  308. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  309. package/dist/{schema → transaction/schema}/residency.js +0 -5
  310. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  311. package/dist/{schema → transaction/schema}/roles.js +5 -5
  312. package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
  313. package/dist/{schema → transaction/schema}/schema.js +24 -3
  314. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  315. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  316. package/dist/transaction/transactionLayer.d.ts +82 -0
  317. package/dist/transaction/transactionLayer.js +24 -0
  318. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
  319. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  320. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  321. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  322. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
  323. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  324. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  325. package/dist/transaction/transport/commitFrames.js +134 -0
  326. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  327. package/dist/transaction/transport/connectionManager.js +673 -0
  328. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  329. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  330. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  331. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  332. package/dist/transaction/transport/httpClient.d.ts +131 -0
  333. package/dist/{client → transaction/transport}/httpClient.js +6 -5
  334. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  335. package/dist/transaction/transport/httpOptions.js +12 -0
  336. package/dist/{client → transaction/transport}/httpTransport.js +295 -97
  337. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  338. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  339. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  340. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  341. package/dist/transaction/transport/wsTransport.d.ts +574 -0
  342. package/dist/transaction/transport/wsTransport.js +1023 -0
  343. package/dist/transaction/types/assertExact.d.ts +17 -0
  344. package/dist/transaction/types/assertExact.js +1 -0
  345. package/dist/{types → transaction/types}/global.d.ts +17 -2
  346. package/dist/{types → transaction/types}/global.js +2 -1
  347. package/dist/{types → transaction/types}/index.d.ts +14 -46
  348. package/dist/{types → transaction/types}/index.js +7 -16
  349. package/dist/{types → transaction/types}/streams.d.ts +73 -45
  350. package/dist/transaction/utils/duration.d.ts +50 -0
  351. package/dist/{utils → transaction/utils}/duration.js +32 -0
  352. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  353. package/dist/transaction/utils/json.js +276 -0
  354. package/dist/transaction/wire/accountResponses.d.ts +420 -0
  355. package/dist/transaction/wire/accountResponses.js +290 -0
  356. package/dist/transaction/wire/auth.d.ts +56 -0
  357. package/dist/transaction/wire/auth.js +63 -0
  358. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  359. package/dist/transaction/wire/claimEvent.js +73 -0
  360. package/dist/transaction/wire/claims.d.ts +530 -0
  361. package/dist/transaction/wire/claims.js +327 -0
  362. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  363. package/dist/{wire → transaction/wire}/commit.js +68 -47
  364. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  365. package/dist/{wire → transaction/wire}/delta.js +37 -13
  366. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  367. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  368. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  369. package/dist/transaction/wire/feedCursor.js +82 -0
  370. package/dist/transaction/wire/feedEvent.d.ts +204 -0
  371. package/dist/transaction/wire/feedEvent.js +65 -0
  372. package/dist/transaction/wire/frames.d.ts +194 -0
  373. package/dist/transaction/wire/frames.js +50 -0
  374. package/dist/transaction/wire/inboundFrames.d.ts +562 -0
  375. package/dist/transaction/wire/inboundFrames.js +116 -0
  376. package/dist/transaction/wire/index.d.ts +54 -0
  377. package/dist/transaction/wire/index.js +83 -0
  378. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  379. package/dist/transaction/wire/listEnvelope.js +42 -0
  380. package/dist/transaction/wire/modelMutations.d.ts +31 -0
  381. package/dist/transaction/wire/modelMutations.js +52 -0
  382. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  383. package/dist/transaction/wire/modelResponses.js +43 -0
  384. package/dist/transaction/wire/modelShape.d.ts +78 -0
  385. package/dist/transaction/wire/modelShape.js +74 -0
  386. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
  387. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
  388. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  389. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  390. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  391. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  392. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  393. package/dist/transactions/mutations/commitLatency.js +130 -0
  394. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  395. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  396. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
  397. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
  398. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
  399. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
  400. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  401. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  402. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  403. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
  404. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
  405. package/dist/utils/mobxSetup.d.ts +1 -1
  406. package/dist/utils/mobxSetup.js +5 -2
  407. package/dist/{core → views}/QueryView.d.ts +2 -2
  408. package/dist/{core → views}/QueryView.js +2 -2
  409. package/dist/{core → views}/ViewRegistry.d.ts +1 -1
  410. package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
  411. package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
  412. package/dist/webhooks/events.d.ts +2 -2
  413. package/dist/wire/index.d.ts +1 -34
  414. package/dist/wire/index.js +8 -49
  415. package/docs/agent-messaging.md +3 -3
  416. package/docs/agents.md +20 -13
  417. package/docs/api-keys.md +14 -10
  418. package/docs/api.md +27 -61
  419. package/docs/audit.md +6 -3
  420. package/docs/cli.md +41 -13
  421. package/docs/client-behavior.md +11 -9
  422. package/docs/concurrency-convention.md +49 -57
  423. package/docs/coordination.md +283 -121
  424. package/docs/data-sources.md +7 -5
  425. package/docs/debugging.md +39 -15
  426. package/docs/deployment.md +267 -0
  427. package/docs/examples/agent-human.md +49 -42
  428. package/docs/examples/ai-sdk-tool.md +69 -44
  429. package/docs/examples/existing-python-backend.md +8 -6
  430. package/docs/examples/nextjs.md +129 -47
  431. package/docs/examples/scoped-agent.md +46 -45
  432. package/docs/examples/server-agent.md +46 -26
  433. package/docs/groups.md +87 -30
  434. package/docs/guarantees.md +41 -12
  435. package/docs/how-it-works.md +38 -12
  436. package/docs/idempotency.md +126 -0
  437. package/docs/identity.md +77 -74
  438. package/docs/index.md +172 -86
  439. package/docs/integration-guide.md +31 -19
  440. package/docs/mcp.md +46 -21
  441. package/docs/migration.md +95 -18
  442. package/docs/operating-on-your-database.md +3 -1
  443. package/docs/projects.md +3 -1
  444. package/docs/quickstart.md +22 -5
  445. package/docs/react.md +31 -18
  446. package/docs/schema-contract.md +5 -3
  447. package/docs/session-settings.md +108 -0
  448. package/docs/sessions.md +4 -2
  449. package/docs/webhooks.md +12 -10
  450. package/llms.txt +48 -18
  451. package/package.json +21 -26
  452. package/dist/agent/Agent.d.ts +0 -366
  453. package/dist/agent/Agent.js +0 -514
  454. package/dist/agent/index.d.ts +0 -115
  455. package/dist/agent/index.js +0 -128
  456. package/dist/agent/session.d.ts +0 -93
  457. package/dist/agent/session.js +0 -149
  458. package/dist/agent/types.d.ts +0 -68
  459. package/dist/agent/types.js +0 -9
  460. package/dist/cli.cjs +0 -286329
  461. package/dist/client/durableWrites.d.ts +0 -21
  462. package/dist/client/httpClient.d.ts +0 -80
  463. package/dist/coordination/schema.d.ts +0 -722
  464. package/dist/coordination/schema.js +0 -578
  465. package/dist/schema/openapi.d.ts +0 -29
  466. package/dist/schema/openapi.js +0 -124
  467. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  468. package/dist/testing/fixtures/bootstrap.js +0 -59
  469. package/dist/testing/fixtures/deltas.d.ts +0 -83
  470. package/dist/testing/fixtures/deltas.js +0 -136
  471. package/dist/testing/fixtures/models.d.ts +0 -83
  472. package/dist/testing/fixtures/models.js +0 -272
  473. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  474. package/dist/testing/helpers/reactWrapper.js +0 -67
  475. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  476. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  477. package/dist/testing/helpers/wait.d.ts +0 -30
  478. package/dist/testing/helpers/wait.js +0 -49
  479. package/dist/testing/index.d.ts +0 -23
  480. package/dist/testing/index.js +0 -33
  481. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  482. package/dist/testing/mocks/FakeDatabase.js +0 -10
  483. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  484. package/dist/testing/mocks/MockMutationExecutor.js +0 -192
  485. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  486. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  487. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  488. package/dist/testing/mocks/MockSyncContext.js +0 -71
  489. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  490. package/dist/testing/mocks/MockSyncStore.js +0 -171
  491. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  492. package/dist/testing/mocks/MockWebSocket.js +0 -118
  493. package/dist/transactions/durableWriteStore.js +0 -30
  494. package/dist/utils/duration.d.ts +0 -25
  495. package/dist/utils/json.js +0 -88
  496. package/dist/wire/errorEnvelope.d.ts +0 -55
  497. package/dist/wire/frames.d.ts +0 -197
  498. package/dist/wire/frames.js +0 -49
  499. package/dist/wire/listEnvelope.js +0 -18
  500. package/docs/interaction-model.md +0 -97
  501. /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
  502. /package/dist/{core → query}/QueryProcessor.js +0 -0
  503. /package/dist/{core/storeContract.js → storeContract.js} +0 -0
  504. /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
  505. /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
  506. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  507. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  508. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  509. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  510. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  511. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  512. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  513. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  514. /package/dist/{client → transaction}/persistence.js +0 -0
  515. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  516. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  517. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  518. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  519. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  520. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  521. /package/dist/{types → transaction/types}/modelData.js +0 -0
  522. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  523. /package/dist/{types → transaction/types}/participant.js +0 -0
  524. /package/dist/{types → transaction/types}/streams.js +0 -0
  525. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  526. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  527. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  528. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  529. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  530. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  531. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  532. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  533. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  534. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  535. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
  536. /package/dist/{core → views}/ViewRegistry.js +0 -0
@@ -1,514 +0,0 @@
1
- /**
2
- * Agent — AI SDK v6 native hooks for agent awareness.
3
- *
4
- * Slots directly into generateText / streamText / ToolLoopAgent via three
5
- * hooks: prepareStep (inject awareness before each step), onStepFinish
6
- * (announce activity after each step), and wrapTool (wrap mutation tools
7
- * with freshness checks). Stateless REST under the hood — works with any
8
- * API model, no WebSocket.
9
- *
10
- * ```ts
11
- * import { generateText, tool, stepCountIs } from 'ai';
12
- * import { Agent } from '@abloatai/ablo/agent';
13
- *
14
- * const perception = new Agent({
15
- * syncServerUrl: 'http://localhost:8080',
16
- * agentId: 'researcher-1',
17
- * organizationId: 'org-1',
18
- * syncGroups: ['deal:abc'],
19
- * });
20
- *
21
- * const result = await generateText({
22
- * model: 'anthropic/claude-sonnet-4.5',
23
- * messages,
24
- * stopWhen: stepCountIs(10),
25
- * tools: {
26
- * updateSlide: perception.wrapTool(
27
- * tool({
28
- * inputSchema: z.object({ id: z.string(), title: z.string() }),
29
- * execute: async ({ id, title }) => { ... },
30
- * }),
31
- * { entityType: 'Slide', getEntityId: (args) => args.id },
32
- * ),
33
- * },
34
- * prepareStep: perception.prepareStep(), // injects awareness
35
- * onStepFinish: perception.onStepFinish(), // announces activity
36
- * });
37
- * ```
38
- *
39
- * Low-level primitives (gather, checkFreshness, announce) are also exposed
40
- * for custom integrations outside the AI SDK.
41
- */
42
- import { createAgentSession } from './session.js';
43
- import { createConsoleLogger, resolveLogLevel } from '../client/consoleLogger.js';
44
- import { AbloValidationError } from '../errors.js';
45
- // ── Agent ───────────────────────────────────────────────────────
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
- }
67
- export class Agent {
68
- opts;
69
- constructor(options) {
70
- this.opts = {
71
- authToken: options.authToken,
72
- announcer: options.announcer,
73
- syncServerUrl: options.syncServerUrl.replace(/\/+$/, ''),
74
- agentId: options.agentId,
75
- organizationId: options.organizationId,
76
- syncGroups: options.syncGroups,
77
- fetch: options.fetch ?? globalThis.fetch.bind(globalThis),
78
- timeoutMs: options.timeoutMs ?? 5_000,
79
- logger: options.logger ?? defaultAgentLogger(),
80
- };
81
- }
82
- /**
83
- * Build a long-lived agent session — caches `Ablo({kind:'agent'})`
84
- * instances per `(org, user, surface, target)` and refreshes capability
85
- * tokens before TTL elapses. Use on the server when the same agent
86
- * identity handles many requests.
87
- *
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.
92
- *
93
- * ```ts
94
- * const session = Agent.session({ syncServerUrl, schema, issueToken });
95
- * const ablo = await session.getAgent({ userId, organizationId, surfaceClass });
96
- * ```
97
- */
98
- static session = createAgentSession;
99
- /** The fully-qualified userId used on the wire: `agent:<agentId>`. */
100
- get userId() {
101
- return `agent:${this.opts.agentId}`;
102
- }
103
- /**
104
- * Extract the Agent instance from an AI SDK tool's
105
- * `experimental_context`. Use it inside a tool's `execute` function to
106
- * reach the agent without capturing it in a closure.
107
- *
108
- * ```ts
109
- * execute: async (args, { experimental_context }) => {
110
- * const perception = Agent.fromContext(experimental_context);
111
- * const check = await perception.checkFreshness('Slide', args.id, lastSeenAt);
112
- * // ...
113
- * }
114
- * ```
115
- *
116
- * Throws if the context is missing or doesn't contain an Agent.
117
- * @param ctx The `experimental_context` passed to the tool.
118
- * @param toolName Optional tool name for error messages.
119
- */
120
- static fromContext(ctx, toolName) {
121
- if (!ctx ||
122
- typeof ctx !== 'object' ||
123
- !('perception' in ctx) ||
124
- !(ctx.perception instanceof Agent)) {
125
- const where = toolName ? ` (tool: ${toolName})` : '';
126
- throw new AbloValidationError(`Agent.fromContext: experimental_context must contain an Agent in \`perception\`.${where} ` +
127
- `Set \`experimental_context: { perception } satisfies AgentContext\` when calling generateText/streamText.`, { code: 'agent_perception_missing_context' });
128
- }
129
- return ctx.perception;
130
- }
131
- /**
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.
135
- */
136
- static tryFromContext(ctx) {
137
- if (!ctx ||
138
- typeof ctx !== 'object' ||
139
- !('perception' in ctx) ||
140
- !(ctx.perception instanceof Agent)) {
141
- return undefined;
142
- }
143
- return ctx.perception;
144
- }
145
- // ── Outbound: announce activity ──────────────────────────────────────
146
- /**
147
- * Announce this agent's presence/activity. Fire-and-forget — logs errors
148
- * but never throws (presence failures must not block the agent loop).
149
- *
150
- * If a `announcer` was provided (e.g. a connected SyncAgent), routes
151
- * through it to reuse the WebSocket. Otherwise falls back to REST POST.
152
- */
153
- async announce(status, activity) {
154
- // Prefer injected announcer (WebSocket) over REST
155
- if (this.opts.announcer) {
156
- try {
157
- await this.opts.announcer.announce(status, activity);
158
- }
159
- catch (err) {
160
- // Best-effort presence; failing only means peers don't see this
161
- // agent's status. Not consumer-actionable → maintainer register.
162
- this.opts.logger.debug('[perception] announcer error', {
163
- error: err.message,
164
- });
165
- }
166
- return;
167
- }
168
- try {
169
- const res = await this.request('POST', '/api/presence', {
170
- userId: this.userId,
171
- organizationId: this.opts.organizationId,
172
- status,
173
- activity,
174
- syncGroups: this.opts.syncGroups,
175
- });
176
- if (!res.ok) {
177
- this.opts.logger.debug(`[perception] announce failed: ${res.status} ${res.statusText}`);
178
- }
179
- }
180
- catch (err) {
181
- this.opts.logger.debug('[perception] announce error', {
182
- error: err.message,
183
- });
184
- }
185
- }
186
- // ── Inbound: gather context for next LLM call ────────────────────────
187
- /**
188
- * Gather a snapshot of current activity by peers and format it as
189
- * natural-language context for injection into the next LLM prompt.
190
- */
191
- async gather(options) {
192
- const opts = {
193
- maxChars: 2000,
194
- includePresence: true,
195
- excludeSelf: true,
196
- ...options,
197
- };
198
- const snapshot = {
199
- timestamp: Date.now(),
200
- presence: [],
201
- };
202
- if (opts.includePresence) {
203
- snapshot.presence = await this.fetchPresence(opts.excludeSelf);
204
- }
205
- const prompt = this.formatPrompt(snapshot, opts);
206
- return { prompt, snapshot };
207
- }
208
- // ── Freshness check: run before mutations ────────────────────────────
209
- /**
210
- * Check if an entity was modified since `lastSeenAt`. Use before
211
- * executing a mutation to detect stale state.
212
- *
213
- * Returns `{ stale: true, summary }` when the entity changed — feed
214
- * `summary` back to the LLM as a tool result so it can adjust its plan.
215
- */
216
- async checkFreshness(entityType, entityId, lastSeenAt) {
217
- // Parallel fan-out: freshness (entity state vs lastSeenAt) + pending
218
- // claims (other agents about to mutate). Both are advisory — if
219
- // either request fails the check still returns a usable result.
220
- const [queryRes, pendingClaims] = await Promise.all([
221
- this.request('POST', '/api/sync/query', {
222
- organizationId: this.opts.organizationId,
223
- queries: [{ model: entityType, ids: [entityId] }],
224
- }).catch((err) => ({ ok: false, status: 0, _err: err })),
225
- this.fetchPendingClaimsFor(entityType, entityId),
226
- ]);
227
- try {
228
- const res = queryRes;
229
- if (!('ok' in res) || !res.ok) {
230
- return {
231
- stale: false,
232
- reason: 'ok',
233
- summary: `Freshness check inconclusive: ${('status' in res ? res.status : 'error')}`,
234
- pendingClaims,
235
- };
236
- }
237
- const body = (await (res).json());
238
- const rows = body.results?.[0];
239
- const entity = rows?.[0];
240
- if (!entity) {
241
- return {
242
- stale: true,
243
- reason: 'not_found',
244
- summary: `${entityType} ${entityId} no longer exists. Another actor may have deleted it.`,
245
- pendingClaims,
246
- };
247
- }
248
- const updatedAtRaw = entity.updated_at ?? entity.updatedAt;
249
- const lastModifiedBy = entity.updated_by ??
250
- entity.updatedBy ??
251
- entity.created_by;
252
- const lastModifiedAt = typeof updatedAtRaw === 'string'
253
- ? Date.parse(updatedAtRaw)
254
- : typeof updatedAtRaw === 'number'
255
- ? updatedAtRaw
256
- : undefined;
257
- if (lastModifiedAt !== undefined && lastModifiedAt > lastSeenAt) {
258
- const ago = Math.round((Date.now() - lastModifiedAt) / 1000);
259
- return {
260
- stale: true,
261
- reason: 'modified',
262
- currentState: entity,
263
- lastModifiedBy,
264
- lastModifiedAt,
265
- summary: `${entityType} ${entityId} was modified by ${lastModifiedBy ?? 'another actor'} ` +
266
- `${ago}s ago. Your planned change is based on stale state. ` +
267
- `Re-read the entity and adjust your approach.`,
268
- pendingClaims,
269
- };
270
- }
271
- return {
272
- stale: false,
273
- reason: 'ok',
274
- currentState: entity,
275
- lastModifiedBy,
276
- lastModifiedAt,
277
- pendingClaims,
278
- };
279
- }
280
- catch (err) {
281
- // Freshness check is advisory — on error, assume ok and let the
282
- // mutation proceed. Better than blocking the agent on a flaky query.
283
- return {
284
- stale: false,
285
- reason: 'ok',
286
- summary: `Freshness check error: ${err.message}`,
287
- pendingClaims,
288
- };
289
- }
290
- }
291
- /**
292
- * Pull the org's presence, filter to claims targeting the given
293
- * entity (self-claims excluded). Advisory — returns empty on any
294
- * error so `checkFreshness` stays usable when the presence endpoint
295
- * is down. Case-insensitive match on entityType + entityId to absorb
296
- * PascalCase / lowercase divergence.
297
- */
298
- async fetchPendingClaimsFor(entityType, entityId) {
299
- const etLower = entityType.toLowerCase();
300
- const idLower = entityId.toLowerCase();
301
- const entries = await this.fetchPresence(true);
302
- const result = [];
303
- for (const entry of entries) {
304
- if (!entry.activeClaims)
305
- continue;
306
- for (const claim of entry.activeClaims) {
307
- if (claim.entityType.toLowerCase() === etLower &&
308
- claim.entityId.toLowerCase() === idLower) {
309
- result.push(claim);
310
- }
311
- }
312
- }
313
- return result;
314
- }
315
- // ── AI SDK hooks ─────────────────────────────────────────────────────
316
- /**
317
- * Build a `prepareStep` hook for AI SDK's generateText / streamText /
318
- * ToolLoopAgent. Called before each step — injects a system message
319
- * summarizing what other agents are doing right now.
320
- *
321
- * ```ts
322
- * const result = await generateText({
323
- * // ...
324
- * prepareStep: perception.prepareStep({ maxChars: 1500 }),
325
- * });
326
- * ```
327
- */
328
- prepareStep(options) {
329
- const maxChars = options?.maxChars ?? 1500;
330
- const focusFromToolCalls = options?.focusFromToolCalls;
331
- const skipFirstStep = options?.skipFirstStep ?? false;
332
- return async ({ stepNumber, steps, messages }) => {
333
- if (skipFirstStep && stepNumber === 0)
334
- return undefined;
335
- // Derive focus entities from recent tool calls if configured
336
- let focusEntities;
337
- if (focusFromToolCalls && steps.length > 0) {
338
- const focus = new Set();
339
- for (const step of steps) {
340
- for (const call of step.toolCalls ?? []) {
341
- const tokens = focusFromToolCalls(call);
342
- if (tokens)
343
- tokens.forEach((t) => focus.add(t));
344
- }
345
- }
346
- if (focus.size > 0)
347
- focusEntities = [...focus];
348
- }
349
- const { prompt } = await this.gather({ maxChars, focusEntities });
350
- const awareness = { role: 'system', content: prompt };
351
- return {
352
- messages: [...messages, awareness],
353
- };
354
- };
355
- }
356
- /**
357
- * Build an `onStepFinish` hook for AI SDK. Called after each step —
358
- * announces the agent's activity based on the tool calls that just ran.
359
- *
360
- * ```ts
361
- * const result = await generateText({
362
- * // ...
363
- * onStepFinish: perception.onStepFinish(),
364
- * });
365
- * ```
366
- */
367
- onStepFinish(options) {
368
- const resolveActivity = options?.activity ??
369
- ((ctx) => {
370
- const lastCall = ctx.toolCalls?.[ctx.toolCalls.length - 1];
371
- if (!lastCall)
372
- return null;
373
- return {
374
- entityType: 'Tool',
375
- entityId: lastCall.toolName,
376
- action: 'executed',
377
- detail: lastCall.toolName,
378
- };
379
- });
380
- return async (ctx) => {
381
- const activity = resolveActivity(ctx);
382
- if (activity) {
383
- await this.announce('online', activity);
384
- }
385
- };
386
- }
387
- /**
388
- * Wrap an AI SDK tool to check entity freshness before executing. If the
389
- * entity was modified by another actor since the LLM last saw it, returns
390
- * a diff summary as the tool result instead of executing — the LLM adjusts
391
- * its plan rather than blindly overwriting.
392
- *
393
- * ```ts
394
- * tools: {
395
- * updateSlide: perception.wrapTool(
396
- * tool({ inputSchema: ..., execute: ... }),
397
- * { entityType: 'Slide', getEntityId: (args) => args.id },
398
- * ),
399
- * }
400
- * ```
401
- */
402
- wrapTool(originalTool, config) {
403
- const originalExecute = originalTool.execute;
404
- if (!originalExecute)
405
- return originalTool;
406
- const self = this;
407
- const announceOnExecute = config.announceOnExecute ?? true;
408
- const wrappedExecute = async (args, opts) => {
409
- const entityId = config.getEntityId(args);
410
- // No id → nothing to guard, just execute
411
- if (!entityId) {
412
- return originalExecute(args, opts);
413
- }
414
- // Freshness check (skipped when no baseline timestamp is provided)
415
- const lastSeen = config.lastSeenAt?.(args, opts);
416
- if (lastSeen !== undefined && lastSeen > 0) {
417
- const check = await self.checkFreshness(config.entityType, entityId, lastSeen);
418
- if (check.stale && check.summary) {
419
- return check.summary;
420
- }
421
- }
422
- // Announce activity before executing (fire-and-forget)
423
- if (announceOnExecute) {
424
- void self.announce('online', {
425
- entityType: config.entityType,
426
- entityId,
427
- action: 'editing',
428
- });
429
- }
430
- return originalExecute(args, opts);
431
- };
432
- return {
433
- ...originalTool,
434
- execute: wrappedExecute,
435
- };
436
- }
437
- // ── Internal ─────────────────────────────────────────────────────────
438
- async fetchPresence(excludeSelf) {
439
- try {
440
- const url = `/api/presence?orgId=${encodeURIComponent(this.opts.organizationId)}`;
441
- const res = await this.request('GET', url);
442
- if (!res.ok)
443
- return [];
444
- const body = (await res.json());
445
- const entries = body.entries ?? [];
446
- // Filter by overlapping sync groups (presence API returns all org
447
- // entries — the SDK narrows to our scope)
448
- const ours = new Set(this.opts.syncGroups);
449
- return entries.filter((e) => {
450
- if (excludeSelf && e.userId === this.userId)
451
- return false;
452
- return (e.syncGroups ?? []).some((g) => ours.has(g));
453
- });
454
- }
455
- catch {
456
- return [];
457
- }
458
- }
459
- formatPrompt(snapshot, opts) {
460
- const lines = [];
461
- const now = new Date(snapshot.timestamp).toISOString();
462
- lines.push(`[Team context as of ${now}]`);
463
- const focus = new Set(opts.focusEntities ?? []);
464
- const hasFocus = focus.size > 0;
465
- // Sort: focused entities first, then agents, then humans
466
- const relevant = hasFocus
467
- ? snapshot.presence.filter((e) => e.activity && focus.has(`${e.activity.entityType}:${e.activity.entityId}`))
468
- : snapshot.presence;
469
- if (relevant.length === 0) {
470
- lines.push('No other participants active in your scope.');
471
- }
472
- else {
473
- lines.push(hasFocus
474
- ? `Participants working on focused entities (${opts.focusEntities.join(', ')}):`
475
- : `Active participants:`);
476
- for (const entry of relevant) {
477
- const role = entry.isAgent ? 'agent' : 'human';
478
- const base = `- ${role} ${entry.userId} [${entry.status}]`;
479
- if (entry.activity) {
480
- const act = entry.activity;
481
- const detail = act.detail ? ` (${act.detail})` : '';
482
- lines.push(`${base}: ${act.action} ${act.entityType}:${act.entityId}${detail}`);
483
- }
484
- else {
485
- lines.push(base);
486
- }
487
- }
488
- if (hasFocus && relevant.length < snapshot.presence.length) {
489
- const others = snapshot.presence.length - relevant.length;
490
- lines.push(`(${others} other participant${others === 1 ? '' : 's'} active on unrelated entities)`);
491
- }
492
- }
493
- let result = lines.join('\n');
494
- if (result.length > opts.maxChars) {
495
- result = result.slice(0, opts.maxChars - 3) + '...';
496
- }
497
- return result;
498
- }
499
- async request(method, path, body) {
500
- const url = `${this.opts.syncServerUrl}${path}`;
501
- const headers = {
502
- 'Content-Type': 'application/json',
503
- };
504
- if (this.opts.authToken) {
505
- headers.Authorization = `Bearer ${this.opts.authToken}`;
506
- }
507
- return this.opts.fetch(url, {
508
- method,
509
- headers,
510
- body: body ? JSON.stringify(body) : undefined,
511
- signal: AbortSignal.timeout(this.opts.timeoutMs),
512
- });
513
- }
514
- }
@@ -1,115 +0,0 @@
1
- /**
2
- * @abloatai/ablo/agent — Agent SDK helpers
3
- *
4
- * Two entry points depending on agent lifetime:
5
- *
6
- * ─────────────────────────────────────────────────────────────────────────
7
- * Long-lived agents (browser, daemon, persistent Node process)
8
- * ─────────────────────────────────────────────────────────────────────────
9
- * Use the unified `Ablo({...})` factory directly with `kind: 'agent'`.
10
- * The factory holds the WebSocket, reactive subscriptions, mutations, and
11
- * presence/claims — same surface as a browser user, just with a
12
- * server-issued capability token instead of session cookies.
13
- *
14
- * ```ts
15
- * import Ablo from '@abloatai/ablo';
16
- *
17
- * const ablo = Ablo({
18
- * schema,
19
- * url: 'wss://api.example.com',
20
- * organizationId,
21
- * kind: 'agent',
22
- * agentId: 'reviewer-bot',
23
- * capabilityToken: mintedToken,
24
- * syncGroups: [`org:${organizationId}`],
25
- * inMemory: true, // Node has no IndexedDB
26
- * });
27
- *
28
- * await ablo.ready();
29
- * for (const task of ablo.tasks.list({ where: { status: 'pending_review' } })) {
30
- * await ablo.tasks.update(task.id, { status: 'reviewed' });
31
- * }
32
- * ```
33
- *
34
- * For server-side caching across requests, use {@link Agent.session}
35
- * — it caches one engine per identity and refreshes capability tokens
36
- * before expiry.
37
- *
38
- * ─────────────────────────────────────────────────────────────────────────
39
- * Short-lived agents (queue consumer, serverless, API route)
40
- * ─────────────────────────────────────────────────────────────────────────
41
- * Use {@link Agent}. Stateless REST hooks that slot directly into
42
- * the Vercel AI SDK's `generateText` / `streamText`. No WebSocket. Ideal
43
- * for agent-worker jobs that process one task and exit.
44
- *
45
- * ```ts
46
- * import { generateText, tool, stepCountIs } from 'ai';
47
- * import { Agent } from '@abloatai/ablo/agent';
48
- *
49
- * const perception = new Agent({
50
- * syncServerUrl: 'http://localhost:8080',
51
- * agentId: job.id,
52
- * organizationId: job.organizationId,
53
- * syncGroups: [`org:${job.organizationId}`],
54
- * });
55
- *
56
- * await generateText({
57
- * model: 'anthropic/claude-sonnet-4.5',
58
- * messages,
59
- * stopWhen: stepCountIs(10),
60
- * tools: {
61
- * updateSlide: perception.wrapTool(tool({ ... }), {
62
- * entityType: 'Slide',
63
- * getEntityId: (args) => args.id,
64
- * }),
65
- * },
66
- * prepareStep: perception.prepareStep(),
67
- * onStepFinish: perception.onStepFinish(),
68
- * });
69
- * ```
70
- *
71
- * ─────────────────────────────────────────────────────────────────────────
72
- * Idiomatic tool pattern
73
- * ─────────────────────────────────────────────────────────────────────────
74
- * Tools are factory functions that pull ambient state from
75
- * `experimental_context`. The caller builds an {@link AgentContext} once
76
- * and passes it to `generateText`; every tool reaches in.
77
- *
78
- * ```ts
79
- * import { tool } from 'ai';
80
- * import { z } from 'zod';
81
- * import { Agent, type AgentContext } from '@abloatai/ablo/agent';
82
- *
83
- * export const updateSlideTool = () => tool({
84
- * description: 'Update a slide title',
85
- * inputSchema: z.object({ id: z.string(), title: z.string() }),
86
- * execute: async (args, { experimental_context }) => {
87
- * const perception = Agent.fromContext(experimental_context, 'updateSlide');
88
- * const check = await perception.checkFreshness('Slide', args.id, Date.now() - 5000);
89
- * if (check.stale) return check.summary;
90
- * return { ok: true };
91
- * },
92
- * });
93
- * ```
94
- *
95
- * ─────────────────────────────────────────────────────────────────────────
96
- * Composed usage (a long-lived `Ablo({kind:'agent'})` plus an Agent)
97
- * ─────────────────────────────────────────────────────────────────────────
98
- * If you have a long-lived `Ablo` instance AND want AI SDK hooks, pass it
99
- * as the `announcer` to Agent — presence announcements route
100
- * through the existing WebSocket instead of opening new HTTP calls.
101
- *
102
- * ```ts
103
- * const ablo = Ablo({ kind: 'agent', schema, capabilityToken, ... });
104
- * await ablo.ready();
105
- *
106
- * const perception = new Agent({
107
- * ...sharedConfig,
108
- * announcer: ablo, // reuse the WebSocket
109
- * });
110
- * ```
111
- *
112
- * Both `Ablo` and `Agent` implement the
113
- * {@link PresenceAnnouncer} interface.
114
- */
115
- export { Agent } from './Agent.js';