@abloatai/ablo 0.35.0 → 0.37.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 (622) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -1929
  3. package/NOTICE +2 -2
  4. package/README.md +23 -532
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -112
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -161
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +2 -2
  59. package/docs/api-keys.md +13 -12
  60. package/docs/api.md +15 -53
  61. package/docs/audit.md +4 -3
  62. package/docs/cli.md +11 -11
  63. package/docs/client-behavior.md +9 -9
  64. package/docs/concurrency-convention.md +28 -42
  65. package/docs/coordination.md +228 -86
  66. package/docs/data-sources.md +5 -5
  67. package/docs/debugging.md +34 -12
  68. package/docs/deployment.md +8 -8
  69. package/docs/examples/agent-human.md +4 -4
  70. package/docs/examples/ai-sdk-tool.md +1 -1
  71. package/docs/examples/existing-python-backend.md +15 -4
  72. package/docs/examples/nextjs.md +27 -6
  73. package/docs/examples/scoped-agent.md +3 -3
  74. package/docs/examples/server-agent.md +2 -2
  75. package/docs/groups.md +57 -3
  76. package/docs/guarantees.md +37 -10
  77. package/docs/how-it-works.md +32 -8
  78. package/docs/idempotency.md +6 -6
  79. package/docs/identity.md +24 -24
  80. package/docs/index.md +8 -8
  81. package/docs/integration-guide.md +38 -16
  82. package/docs/internal/README.md +18 -0
  83. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  84. package/docs/internal/agent-orchestration.md +58 -0
  85. package/docs/internal/commit-identifiers.md +91 -0
  86. package/docs/internal/concurrency-open-decisions.md +37 -0
  87. package/docs/internal/data-source-reverse-channel.md +150 -0
  88. package/docs/internal/per-field-conflict-detection.md +165 -0
  89. package/docs/internal/postgres-replication.md +64 -0
  90. package/docs/internal/serializable-schema.md +119 -0
  91. package/docs/internal/structure.md +32 -0
  92. package/docs/mcp.md +9 -9
  93. package/docs/migration.md +37 -18
  94. package/docs/projects.md +1 -1
  95. package/docs/quickstart.md +2 -2
  96. package/docs/react.md +24 -13
  97. package/docs/schema-contract.md +3 -3
  98. package/docs/sessions.md +91 -37
  99. package/docs/webhooks.md +9 -9
  100. package/examples/README.md +2 -2
  101. package/examples/data-source/README.md +1 -1
  102. package/examples/data-source/ablo-driver.ts +1 -1
  103. package/examples/data-source/customer-server.ts +1 -1
  104. package/examples/data-source/run.ts +1 -1
  105. package/examples/data-source/schema.ts +1 -1
  106. package/examples/quickstart.ts +2 -2
  107. package/llms.txt +12 -12
  108. package/package.json +64 -174
  109. package/dist/BaseSyncedStore.d.ts +0 -823
  110. package/dist/BaseSyncedStore.js +0 -1955
  111. package/dist/Database.d.ts +0 -335
  112. package/dist/Database.js +0 -1500
  113. package/dist/InstanceCache.d.ts +0 -233
  114. package/dist/InstanceCache.js +0 -1164
  115. package/dist/LazyReferenceCollection.d.ts +0 -177
  116. package/dist/LazyReferenceCollection.js +0 -461
  117. package/dist/Model.d.ts +0 -444
  118. package/dist/Model.js +0 -909
  119. package/dist/ModelRegistry.d.ts +0 -221
  120. package/dist/ModelRegistry.js +0 -537
  121. package/dist/NetworkMonitor.d.ts +0 -26
  122. package/dist/NetworkMonitor.js +0 -77
  123. package/dist/RuntimeContext.d.ts +0 -52
  124. package/dist/RuntimeContext.js +0 -80
  125. package/dist/SyncClient.d.ts +0 -551
  126. package/dist/SyncClient.js +0 -2199
  127. package/dist/adapters/alwaysOnline.d.ts +0 -14
  128. package/dist/adapters/alwaysOnline.js +0 -17
  129. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  130. package/dist/adapters/inMemoryStorage.js +0 -110
  131. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  132. package/dist/ai-sdk/coordinatedTool.js +0 -134
  133. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  134. package/dist/ai-sdk/coordinationContext.js +0 -106
  135. package/dist/ai-sdk/index.d.ts +0 -121
  136. package/dist/ai-sdk/index.js +0 -121
  137. package/dist/ai-sdk/wrap.d.ts +0 -65
  138. package/dist/ai-sdk/wrap.js +0 -39
  139. package/dist/auth/index.d.ts +0 -1
  140. package/dist/auth/index.js +0 -8
  141. package/dist/batching/index.d.ts +0 -55
  142. package/dist/batching/index.js +0 -147
  143. package/dist/cli.cjs +0 -288600
  144. package/dist/client/Ablo.d.ts +0 -231
  145. package/dist/client/Ablo.js +0 -149
  146. package/dist/client/abloClient.d.ts +0 -309
  147. package/dist/client/abloClient.js +0 -13
  148. package/dist/client/clientPrelude.d.ts +0 -52
  149. package/dist/client/clientPrelude.js +0 -60
  150. package/dist/client/consoleLogger.d.ts +0 -35
  151. package/dist/client/consoleLogger.js +0 -44
  152. package/dist/client/coreClient.d.ts +0 -60
  153. package/dist/client/coreClient.js +0 -118
  154. package/dist/client/createInternalComponents.d.ts +0 -46
  155. package/dist/client/createInternalComponents.js +0 -92
  156. package/dist/client/createModelProxy.d.ts +0 -228
  157. package/dist/client/createModelProxy.js +0 -818
  158. package/dist/client/humans.d.ts +0 -48
  159. package/dist/client/humans.js +0 -52
  160. package/dist/client/modelRegistration.d.ts +0 -10
  161. package/dist/client/modelRegistration.js +0 -312
  162. package/dist/client/options.d.ts +0 -461
  163. package/dist/client/options.js +0 -7
  164. package/dist/client/reactiveEngine.d.ts +0 -48
  165. package/dist/client/reactiveEngine.js +0 -910
  166. package/dist/client/resourceTypes.d.ts +0 -12
  167. package/dist/client/resourceTypes.js +0 -10
  168. package/dist/client/schemaConfig.d.ts +0 -44
  169. package/dist/client/schemaConfig.js +0 -185
  170. package/dist/client/validateAbloOptions.d.ts +0 -42
  171. package/dist/client/validateAbloOptions.js +0 -43
  172. package/dist/client/wsMutationExecutor.d.ts +0 -27
  173. package/dist/client/wsMutationExecutor.js +0 -72
  174. package/dist/context.d.ts +0 -29
  175. package/dist/context.js +0 -58
  176. package/dist/coordination/ClaimLog.d.ts +0 -26
  177. package/dist/coordination/ClaimLog.js +0 -32
  178. package/dist/coordination/index.d.ts +0 -1
  179. package/dist/coordination/index.js +0 -8
  180. package/dist/core/DatabaseManager.d.ts +0 -105
  181. package/dist/core/DatabaseManager.js +0 -387
  182. package/dist/core/QueryProcessor.d.ts +0 -75
  183. package/dist/core/QueryProcessor.js +0 -255
  184. package/dist/core/QueryView.d.ts +0 -79
  185. package/dist/core/QueryView.js +0 -218
  186. package/dist/core/StoreManager.d.ts +0 -112
  187. package/dist/core/StoreManager.js +0 -302
  188. package/dist/core/ViewRegistry.d.ts +0 -20
  189. package/dist/core/ViewRegistry.js +0 -55
  190. package/dist/core/index.d.ts +0 -33
  191. package/dist/core/index.js +0 -48
  192. package/dist/core/openIDBWithTimeout.d.ts +0 -65
  193. package/dist/core/openIDBWithTimeout.js +0 -153
  194. package/dist/core/queryUtils.d.ts +0 -45
  195. package/dist/core/queryUtils.js +0 -69
  196. package/dist/core/storeContract.d.ts +0 -145
  197. package/dist/core/storeContract.js +0 -12
  198. package/dist/docs/catalog.d.ts +0 -72
  199. package/dist/docs/catalog.js +0 -227
  200. package/dist/docs/index.d.ts +0 -10
  201. package/dist/docs/index.js +0 -10
  202. package/dist/environment.d.ts +0 -1
  203. package/dist/environment.js +0 -8
  204. package/dist/interfaces/index.d.ts +0 -311
  205. package/dist/interfaces/index.js +0 -9
  206. package/dist/keys/index.d.ts +0 -1
  207. package/dist/keys/index.js +0 -8
  208. package/dist/mutators/RecordingMutation.d.ts +0 -36
  209. package/dist/mutators/RecordingMutation.js +0 -182
  210. package/dist/mutators/Transaction.d.ts +0 -40
  211. package/dist/mutators/Transaction.js +0 -58
  212. package/dist/mutators/UndoManager.d.ts +0 -258
  213. package/dist/mutators/UndoManager.js +0 -658
  214. package/dist/mutators/defineMutators.d.ts +0 -60
  215. package/dist/mutators/defineMutators.js +0 -18
  216. package/dist/mutators/inverseOp.d.ts +0 -126
  217. package/dist/mutators/inverseOp.js +0 -71
  218. package/dist/mutators/mutateActions.d.ts +0 -45
  219. package/dist/mutators/mutateActions.js +0 -105
  220. package/dist/mutators/readerActions.d.ts +0 -33
  221. package/dist/mutators/readerActions.js +0 -57
  222. package/dist/mutators/undoApply.d.ts +0 -51
  223. package/dist/mutators/undoApply.js +0 -117
  224. package/dist/policy/index.d.ts +0 -21
  225. package/dist/policy/index.js +0 -20
  226. package/dist/query/client.d.ts +0 -61
  227. package/dist/query/client.js +0 -137
  228. package/dist/query/types.d.ts +0 -85
  229. package/dist/query/types.js +0 -16
  230. package/dist/react/AbloProvider.d.ts +0 -230
  231. package/dist/react/AbloProvider.js +0 -455
  232. package/dist/react/ClientSideSuspense.d.ts +0 -36
  233. package/dist/react/ClientSideSuspense.js +0 -17
  234. package/dist/react/DefaultFallback.d.ts +0 -24
  235. package/dist/react/DefaultFallback.js +0 -43
  236. package/dist/react/context.d.ts +0 -55
  237. package/dist/react/context.js +0 -29
  238. package/dist/react/index.d.ts +0 -61
  239. package/dist/react/index.js +0 -66
  240. package/dist/react/internalContext.d.ts +0 -33
  241. package/dist/react/internalContext.js +0 -3
  242. package/dist/react/useAblo.d.ts +0 -75
  243. package/dist/react/useAblo.js +0 -102
  244. package/dist/react/useCurrentUserId.d.ts +0 -22
  245. package/dist/react/useCurrentUserId.js +0 -34
  246. package/dist/react/useErrorListener.d.ts +0 -20
  247. package/dist/react/useErrorListener.js +0 -38
  248. package/dist/react/useMutationFailureListener.d.ts +0 -26
  249. package/dist/react/useMutationFailureListener.js +0 -38
  250. package/dist/react/useMutators.d.ts +0 -56
  251. package/dist/react/useMutators.js +0 -84
  252. package/dist/react/useReactive.d.ts +0 -35
  253. package/dist/react/useReactive.js +0 -123
  254. package/dist/react/useSyncStatus.d.ts +0 -59
  255. package/dist/react/useSyncStatus.js +0 -76
  256. package/dist/react/useUndoScope.d.ts +0 -34
  257. package/dist/react/useUndoScope.js +0 -81
  258. package/dist/schema/coordination.d.ts +0 -112
  259. package/dist/schema/coordination.js +0 -129
  260. package/dist/schema/ddl.d.ts +0 -97
  261. package/dist/schema/ddl.js +0 -491
  262. package/dist/schema/ddlLock.d.ts +0 -35
  263. package/dist/schema/ddlLock.js +0 -46
  264. package/dist/schema/diff.d.ts +0 -225
  265. package/dist/schema/diff.js +0 -289
  266. package/dist/schema/generate.d.ts +0 -19
  267. package/dist/schema/generate.js +0 -86
  268. package/dist/schema/index.d.ts +0 -41
  269. package/dist/schema/index.js +0 -76
  270. package/dist/schema/queries.d.ts +0 -201
  271. package/dist/schema/queries.js +0 -144
  272. package/dist/schema/select.d.ts +0 -40
  273. package/dist/schema/select.js +0 -87
  274. package/dist/schema/serialize.d.ts +0 -115
  275. package/dist/schema/serialize.js +0 -262
  276. package/dist/schema/sugar.d.ts +0 -109
  277. package/dist/schema/sugar.js +0 -83
  278. package/dist/schema/syncDeltaRow.d.ts +0 -6
  279. package/dist/schema/syncDeltaRow.js +0 -6
  280. package/dist/server/adapter.d.ts +0 -173
  281. package/dist/server/adapter.js +0 -18
  282. package/dist/server/commit.d.ts +0 -107
  283. package/dist/server/commit.js +0 -1
  284. package/dist/server/index.d.ts +0 -14
  285. package/dist/server/index.js +0 -2
  286. package/dist/server/readConfig.d.ts +0 -80
  287. package/dist/server/readConfig.js +0 -8
  288. package/dist/server/storageMode.d.ts +0 -23
  289. package/dist/server/storageMode.js +0 -17
  290. package/dist/source/adapter.d.ts +0 -81
  291. package/dist/source/adapter.js +0 -22
  292. package/dist/source/adapters/drizzle.d.ts +0 -48
  293. package/dist/source/adapters/drizzle.js +0 -219
  294. package/dist/source/adapters/kysely.d.ts +0 -42
  295. package/dist/source/adapters/kysely.js +0 -205
  296. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  297. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  298. package/dist/source/adapters/memory.d.ts +0 -13
  299. package/dist/source/adapters/memory.js +0 -130
  300. package/dist/source/adapters/prisma.d.ts +0 -63
  301. package/dist/source/adapters/prisma.js +0 -202
  302. package/dist/source/conformance.d.ts +0 -37
  303. package/dist/source/conformance.js +0 -215
  304. package/dist/source/connector.d.ts +0 -95
  305. package/dist/source/connector.js +0 -266
  306. package/dist/source/connectorProtocol.d.ts +0 -154
  307. package/dist/source/connectorProtocol.js +0 -163
  308. package/dist/source/contract.d.ts +0 -195
  309. package/dist/source/contract.js +0 -164
  310. package/dist/source/factory.d.ts +0 -92
  311. package/dist/source/factory.js +0 -286
  312. package/dist/source/footprint.d.ts +0 -111
  313. package/dist/source/footprint.js +0 -0
  314. package/dist/source/idempotency.d.ts +0 -61
  315. package/dist/source/idempotency.js +0 -144
  316. package/dist/source/index.d.ts +0 -23
  317. package/dist/source/index.js +0 -30
  318. package/dist/source/migrations.d.ts +0 -21
  319. package/dist/source/migrations.js +0 -103
  320. package/dist/source/next.d.ts +0 -32
  321. package/dist/source/next.js +0 -25
  322. package/dist/source/pushQueue.d.ts +0 -134
  323. package/dist/source/pushQueue.js +0 -256
  324. package/dist/source/signing.d.ts +0 -92
  325. package/dist/source/signing.js +0 -162
  326. package/dist/source/types.d.ts +0 -401
  327. package/dist/source/types.js +0 -59
  328. package/dist/stores/ObjectStore.d.ts +0 -115
  329. package/dist/stores/ObjectStore.js +0 -393
  330. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  331. package/dist/stores/ObjectStoreContract.js +0 -1
  332. package/dist/stores/SyncActionStore.d.ts +0 -97
  333. package/dist/stores/SyncActionStore.js +0 -504
  334. package/dist/stores/syncAction.d.ts +0 -26
  335. package/dist/stores/syncAction.js +0 -16
  336. package/dist/surface.d.ts +0 -36
  337. package/dist/surface.js +0 -75
  338. package/dist/sync/BootstrapFetcher.d.ts +0 -280
  339. package/dist/sync/BootstrapFetcher.js +0 -962
  340. package/dist/sync/ConnectionManager.d.ts +0 -8
  341. package/dist/sync/ConnectionManager.js +0 -8
  342. package/dist/sync/OnDemandLoader.d.ts +0 -228
  343. package/dist/sync/OnDemandLoader.js +0 -742
  344. package/dist/sync/SubscriptionManager.d.ts +0 -159
  345. package/dist/sync/SubscriptionManager.js +0 -243
  346. package/dist/sync/SyncWebSocket.d.ts +0 -173
  347. package/dist/sync/SyncWebSocket.js +0 -438
  348. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  349. package/dist/sync/awaitClaimGrant.js +0 -6
  350. package/dist/sync/bootstrapApply.d.ts +0 -70
  351. package/dist/sync/bootstrapApply.js +0 -73
  352. package/dist/sync/commitFrames.d.ts +0 -8
  353. package/dist/sync/commitFrames.js +0 -8
  354. package/dist/sync/contextPorts.d.ts +0 -18
  355. package/dist/sync/contextPorts.js +0 -31
  356. package/dist/sync/createClaimStream.d.ts +0 -7
  357. package/dist/sync/createClaimStream.js +0 -7
  358. package/dist/sync/createPresenceStream.d.ts +0 -69
  359. package/dist/sync/createPresenceStream.js +0 -200
  360. package/dist/sync/createSnapshot.d.ts +0 -29
  361. package/dist/sync/createSnapshot.js +0 -118
  362. package/dist/sync/credentialLifecycle.d.ts +0 -7
  363. package/dist/sync/credentialLifecycle.js +0 -7
  364. package/dist/sync/deltaPipeline.d.ts +0 -113
  365. package/dist/sync/deltaPipeline.js +0 -261
  366. package/dist/sync/groupChange.d.ts +0 -113
  367. package/dist/sync/groupChange.js +0 -242
  368. package/dist/sync/participants.d.ts +0 -115
  369. package/dist/sync/participants.js +0 -344
  370. package/dist/sync/persistedPrefix.d.ts +0 -12
  371. package/dist/sync/persistedPrefix.js +0 -22
  372. package/dist/sync/schemaDrift.d.ts +0 -55
  373. package/dist/sync/schemaDrift.js +0 -53
  374. package/dist/sync/schemas.d.ts +0 -70
  375. package/dist/sync/schemas.js +0 -94
  376. package/dist/sync/syncCursor.d.ts +0 -40
  377. package/dist/sync/syncCursor.js +0 -55
  378. package/dist/sync/syncPlan.d.ts +0 -54
  379. package/dist/sync/syncPlan.js +0 -50
  380. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  381. package/dist/sync/wsFrameHandlers.js +0 -8
  382. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  383. package/dist/testing/fixtures/bootstrap.js +0 -59
  384. package/dist/testing/fixtures/deltas.d.ts +0 -83
  385. package/dist/testing/fixtures/deltas.js +0 -136
  386. package/dist/testing/fixtures/httpResponses.d.ts +0 -70
  387. package/dist/testing/fixtures/httpResponses.js +0 -90
  388. package/dist/testing/fixtures/models.d.ts +0 -83
  389. package/dist/testing/fixtures/models.js +0 -272
  390. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  391. package/dist/testing/helpers/reactWrapper.js +0 -67
  392. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  393. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  394. package/dist/testing/helpers/wait.d.ts +0 -30
  395. package/dist/testing/helpers/wait.js +0 -49
  396. package/dist/testing/index.d.ts +0 -23
  397. package/dist/testing/index.js +0 -33
  398. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  399. package/dist/testing/mocks/FakeDatabase.js +0 -10
  400. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  401. package/dist/testing/mocks/MockMutationExecutor.js +0 -186
  402. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  403. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  404. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  405. package/dist/testing/mocks/MockSyncContext.js +0 -72
  406. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  407. package/dist/testing/mocks/MockSyncStore.js +0 -171
  408. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  409. package/dist/testing/mocks/MockWebSocket.js +0 -118
  410. package/dist/transaction/ablo.d.ts +0 -88
  411. package/dist/transaction/ablo.js +0 -33
  412. package/dist/transaction/auth/apiKey.d.ts +0 -152
  413. package/dist/transaction/auth/apiKey.js +0 -419
  414. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  415. package/dist/transaction/auth/bootstrapScope.js +0 -1
  416. package/dist/transaction/auth/capability.d.ts +0 -177
  417. package/dist/transaction/auth/capability.js +0 -199
  418. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  419. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  420. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  421. package/dist/transaction/auth/credentialPolicy.js +0 -125
  422. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  423. package/dist/transaction/auth/credentialSource.js +0 -55
  424. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  425. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  426. package/dist/transaction/auth/identity.d.ts +0 -55
  427. package/dist/transaction/auth/identity.js +0 -210
  428. package/dist/transaction/auth/index.d.ts +0 -162
  429. package/dist/transaction/auth/index.js +0 -304
  430. package/dist/transaction/auth/schemas.d.ts +0 -59
  431. package/dist/transaction/auth/schemas.js +0 -85
  432. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  433. package/dist/transaction/auth/sessionMint.js +0 -85
  434. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
  435. package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
  436. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
  437. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
  438. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  439. package/dist/transaction/coordination/claimMeta.js +0 -52
  440. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  441. package/dist/transaction/coordination/createClaimStream.js +0 -475
  442. package/dist/transaction/coordination/events.d.ts +0 -74
  443. package/dist/transaction/coordination/events.js +0 -7
  444. package/dist/transaction/coordination/index.d.ts +0 -19
  445. package/dist/transaction/coordination/index.js +0 -44
  446. package/dist/transaction/coordination/locator.d.ts +0 -83
  447. package/dist/transaction/coordination/locator.js +0 -82
  448. package/dist/transaction/coordination/schema.d.ts +0 -1473
  449. package/dist/transaction/coordination/schema.js +0 -1013
  450. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  451. package/dist/transaction/coordination/targetConflict.js +0 -103
  452. package/dist/transaction/coordination/trace.d.ts +0 -78
  453. package/dist/transaction/coordination/trace.js +0 -138
  454. package/dist/transaction/durableWrites.d.ts +0 -62
  455. package/dist/transaction/durableWrites.js +0 -71
  456. package/dist/transaction/environment.d.ts +0 -105
  457. package/dist/transaction/environment.js +0 -108
  458. package/dist/transaction/errorCodes.d.ts +0 -403
  459. package/dist/transaction/errorCodes.js +0 -480
  460. package/dist/transaction/errors.d.ts +0 -428
  461. package/dist/transaction/errors.js +0 -686
  462. package/dist/transaction/index.d.ts +0 -20
  463. package/dist/transaction/index.js +0 -20
  464. package/dist/transaction/keys/index.d.ts +0 -87
  465. package/dist/transaction/keys/index.js +0 -207
  466. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  467. package/dist/transaction/log/syncDeltaRow.js +0 -95
  468. package/dist/transaction/logPosition.d.ts +0 -97
  469. package/dist/transaction/logPosition.js +0 -125
  470. package/dist/transaction/logger.d.ts +0 -16
  471. package/dist/transaction/logger.js +0 -7
  472. package/dist/transaction/observability.d.ts +0 -53
  473. package/dist/transaction/observability.js +0 -19
  474. package/dist/transaction/persistence.d.ts +0 -12
  475. package/dist/transaction/persistence.js +0 -11
  476. package/dist/transaction/plugin.d.ts +0 -192
  477. package/dist/transaction/plugin.js +0 -87
  478. package/dist/transaction/policy/types.d.ts +0 -217
  479. package/dist/transaction/policy/types.js +0 -126
  480. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  481. package/dist/transaction/resources/functionalUpdate.js +0 -87
  482. package/dist/transaction/resources/httpResources.d.ts +0 -266
  483. package/dist/transaction/resources/httpResources.js +0 -7
  484. package/dist/transaction/resources/modelOperations.d.ts +0 -319
  485. package/dist/transaction/resources/modelOperations.js +0 -12
  486. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  487. package/dist/transaction/resources/mutationOptions.js +0 -9
  488. package/dist/transaction/resources/where.d.ts +0 -85
  489. package/dist/transaction/resources/where.js +0 -70
  490. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  491. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  492. package/dist/transaction/schema/field.d.ts +0 -126
  493. package/dist/transaction/schema/field.js +0 -265
  494. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  495. package/dist/transaction/schema/loadStrategy.js +0 -46
  496. package/dist/transaction/schema/model.d.ts +0 -379
  497. package/dist/transaction/schema/model.js +0 -123
  498. package/dist/transaction/schema/openapi.d.ts +0 -57
  499. package/dist/transaction/schema/openapi.js +0 -340
  500. package/dist/transaction/schema/relation.d.ts +0 -199
  501. package/dist/transaction/schema/relation.js +0 -104
  502. package/dist/transaction/schema/residency.d.ts +0 -29
  503. package/dist/transaction/schema/residency.js +0 -25
  504. package/dist/transaction/schema/roles.d.ts +0 -249
  505. package/dist/transaction/schema/roles.js +0 -230
  506. package/dist/transaction/schema/schema.d.ts +0 -324
  507. package/dist/transaction/schema/schema.js +0 -305
  508. package/dist/transaction/schema/tenancy.d.ts +0 -139
  509. package/dist/transaction/schema/tenancy.js +0 -190
  510. package/dist/transaction/transactionLayer.d.ts +0 -82
  511. package/dist/transaction/transactionLayer.js +0 -24
  512. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  513. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  514. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  515. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  516. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  517. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  518. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  519. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  520. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  521. package/dist/transaction/transport/commitFrames.js +0 -134
  522. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  523. package/dist/transaction/transport/connectionManager.js +0 -673
  524. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  525. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  526. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  527. package/dist/transaction/transport/heartbeat.js +0 -93
  528. package/dist/transaction/transport/httpClient.d.ts +0 -123
  529. package/dist/transaction/transport/httpClient.js +0 -145
  530. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  531. package/dist/transaction/transport/httpOptions.js +0 -12
  532. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  533. package/dist/transaction/transport/httpTransport.js +0 -1276
  534. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  535. package/dist/transaction/transport/networkProbe.js +0 -207
  536. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  537. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  538. package/dist/transaction/transport/wsTransport.d.ts +0 -576
  539. package/dist/transaction/transport/wsTransport.js +0 -1017
  540. package/dist/transaction/types/assertExact.d.ts +0 -17
  541. package/dist/transaction/types/assertExact.js +0 -1
  542. package/dist/transaction/types/global.d.ts +0 -107
  543. package/dist/transaction/types/global.js +0 -40
  544. package/dist/transaction/types/index.d.ts +0 -205
  545. package/dist/transaction/types/index.js +0 -56
  546. package/dist/transaction/types/modelData.d.ts +0 -10
  547. package/dist/transaction/types/modelData.js +0 -9
  548. package/dist/transaction/types/participant.d.ts +0 -20
  549. package/dist/transaction/types/participant.js +0 -10
  550. package/dist/transaction/types/streams.d.ts +0 -540
  551. package/dist/transaction/types/streams.js +0 -11
  552. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  553. package/dist/transaction/utils/asyncIterator.js +0 -135
  554. package/dist/transaction/utils/duration.d.ts +0 -25
  555. package/dist/transaction/utils/duration.js +0 -45
  556. package/dist/transaction/utils/json.d.ts +0 -57
  557. package/dist/transaction/utils/json.js +0 -276
  558. package/dist/transaction/wire/accountResponses.d.ts +0 -351
  559. package/dist/transaction/wire/accountResponses.js +0 -255
  560. package/dist/transaction/wire/auth.d.ts +0 -49
  561. package/dist/transaction/wire/auth.js +0 -57
  562. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  563. package/dist/transaction/wire/bootstrapReason.js +0 -8
  564. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  565. package/dist/transaction/wire/claimEvent.js +0 -73
  566. package/dist/transaction/wire/claims.d.ts +0 -463
  567. package/dist/transaction/wire/claims.js +0 -229
  568. package/dist/transaction/wire/commit.d.ts +0 -603
  569. package/dist/transaction/wire/commit.js +0 -321
  570. package/dist/transaction/wire/delta.d.ts +0 -250
  571. package/dist/transaction/wire/delta.js +0 -147
  572. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  573. package/dist/transaction/wire/errorEnvelope.js +0 -123
  574. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  575. package/dist/transaction/wire/feedCursor.js +0 -82
  576. package/dist/transaction/wire/feedEvent.d.ts +0 -177
  577. package/dist/transaction/wire/feedEvent.js +0 -39
  578. package/dist/transaction/wire/frames.d.ts +0 -194
  579. package/dist/transaction/wire/frames.js +0 -50
  580. package/dist/transaction/wire/inboundFrames.d.ts +0 -552
  581. package/dist/transaction/wire/inboundFrames.js +0 -116
  582. package/dist/transaction/wire/index.d.ts +0 -50
  583. package/dist/transaction/wire/index.js +0 -74
  584. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  585. package/dist/transaction/wire/listEnvelope.js +0 -42
  586. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  587. package/dist/transaction/wire/modelResponses.js +0 -43
  588. package/dist/transaction/wire/protocol.d.ts +0 -38
  589. package/dist/transaction/wire/protocol.js +0 -38
  590. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  591. package/dist/transaction/wire/protocolVersion.js +0 -83
  592. package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
  593. package/dist/transactions/mutations/MutationQueue.js +0 -2797
  594. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  595. package/dist/transactions/mutations/MutationStore.js +0 -53
  596. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  597. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  598. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  599. package/dist/transactions/mutations/coalesceRules.js +0 -140
  600. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  601. package/dist/transactions/mutations/commitLatency.js +0 -130
  602. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  603. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  604. package/dist/transactions/mutations/commitPayload.d.ts +0 -164
  605. package/dist/transactions/mutations/commitPayload.js +0 -152
  606. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
  607. package/dist/transactions/mutations/deltaConfirmation.js +0 -233
  608. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  609. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  610. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  611. package/dist/transactions/mutations/optimisticApply.js +0 -65
  612. package/dist/transactions/mutations/replayValidation.d.ts +0 -186
  613. package/dist/transactions/mutations/replayValidation.js +0 -163
  614. package/dist/utils/mobxSetup.d.ts +0 -53
  615. package/dist/utils/mobxSetup.js +0 -330
  616. package/dist/webhooks/events.d.ts +0 -43
  617. package/dist/webhooks/events.js +0 -42
  618. package/dist/webhooks/index.d.ts +0 -8
  619. package/dist/webhooks/index.js +0 -8
  620. package/dist/wire/index.d.ts +0 -1
  621. package/dist/wire/index.js +0 -8
  622. package/docs/interaction-model.md +0 -99
package/docs/mcp.md CHANGED
@@ -6,7 +6,7 @@ Ablo publishes **two** MCP servers for two different jobs. Don't confuse them:
6
6
 
7
7
  | Server | Purpose | Auth | Tools |
8
8
  |---|---|---|---|
9
- | **Coordination** (`@abloatai/mcp`) | Manage your Ablo the way the CLI does, and let an agent safely read & mutate application data | API key (`sk_…` / `rk_…`) | projects, schema, logs, usage plus `get` / `list` / `create` / `update` / `delete` / `claim` / `release` over your rows |
9
+ | **Coordination** (`@abloatai/mcp`) | Manage your Ablo the way the CLI does, and let an agent safely read & mutate application data | API key (`sk_…` / `rk_…`) | projects, schema, logs, usage: plus `get` / `list` / `create` / `update` / `delete` / `claim` / `release` over your rows |
10
10
  | **Integration-helper** (hosted `/api/mcp`) | Help an AI coding assistant write SDK integration code that compiles | none (public docs) | doc search, export surface, schema lint, scaffold |
11
11
 
12
12
  The coordination server manages your account **and is the data plane** — it is
@@ -37,7 +37,7 @@ claude mcp add ablo -- npx -y @abloatai/mcp
37
37
  | `list_projects` | `ablo projects list` | the org's projects (needs `sk_`) |
38
38
  | `create_project` | `ablo projects create` | create one (needs `sk_`) |
39
39
  | `tail_logs` | `ablo logs` | recent commits and the actor behind each |
40
- | `get_usage` | | usage in daily buckets |
40
+ | `get_usage` |: | usage in daily buckets |
41
41
 
42
42
  There are no key-management tools. A mint returns the plaintext once — only a
43
43
  hash is kept — so no tool can hand it back later, and returning it at mint time
@@ -57,13 +57,13 @@ Each tool mirrors an SDK verb, scoped to a model + id. Model names come from
57
57
 
58
58
  | Tool | Mirrors | Does |
59
59
  |---|---|---|
60
- | `get_model` | `ablo.<model>.local.retrieve(id)` | read latest state + active claims |
60
+ | `get_model` | `ablo.<model>.local.get(id)` | read latest state + active claims |
61
61
  | `list_records` | `ablo.<model>.list({…})` | cursor-paginated list with filters |
62
62
  | `create_model` | `ablo.<model>.create({ data })` | guarded create |
63
63
  | `update_model` | `ablo.<model>.update({ id, … })` | guarded update |
64
64
  | `delete_model` | `ablo.<model>.delete({ id })` | guarded delete |
65
65
  | `claim_model` | `ablo.<model>.claim({ id })` | acquire / queue a coordination lease |
66
- | `release_claim` | | release the lease so others proceed |
66
+ | `release_claim` |: | release the lease so others proceed |
67
67
 
68
68
  The agent-facing contract — the safe loop, the "derive idempotency keys from
69
69
  the business event" rule, and the error-code playbook — ships as a loadable
@@ -94,9 +94,9 @@ claude mcp add --transport http ablo https://<your-app>/api/mcp
94
94
 
95
95
  The endpoint is identical for every client — only the config surface differs:
96
96
 
97
- - **Claude Code** run the `claude mcp add` command above; verify with `/mcp list`, remove with `claude mcp remove ablo`.
98
- - **Cursor** add the server to `~/.cursor/mcp.json` (macOS / Linux), then restart.
99
- - **Windsurf** add the same JSON via Settings → Cascade → MCP, then restart.
97
+ - **Claude Code:** run the `claude mcp add` command above; verify with `/mcp list`, remove with `claude mcp remove ablo`.
98
+ - **Cursor:** add the server to `~/.cursor/mcp.json` (macOS / Linux), then restart.
99
+ - **Windsurf:** add the same JSON via Settings → Cascade → MCP, then restart.
100
100
 
101
101
  Cursor and Windsurf use the same config shape:
102
102
 
@@ -120,7 +120,7 @@ Each client then lists the Ablo tools (`search_ablo_docs`, `get_recipe`, `get_ap
120
120
  | `get_recipe` | Returns the full markdown of one doc by name (e.g. `readme`, `quickstart`, `schema-contract`, `integration-guide`, `api`, `guarantees`). |
121
121
  | `get_api_surface` | Returns the structured export list for an SDK subpath (`@abloatai/ablo`, `./react`, `./schema`, `./testing`, …). Call with no argument to list every subpath. |
122
122
  | `validate_schema` | Lints `defineSchema` source against the DSL rules (camelCase fields, lowercase model keys, `scope`/`grants` sync groups, valid `load` strategies, no legacy builders) and returns a structured issue list. Runs no code. |
123
- | `scaffold_app` | Emits a starter file tree for a schema-first integration `next`, `node-agent`, or `plain`, with a `data-source` (your own database) endpoint. |
123
+ | `scaffold_app` | Emits a starter file tree for a schema-first integration: `next`, `node-agent`, or `plain`, with a `data-source` (your own database) endpoint. |
124
124
 
125
125
  #### Resources
126
126
 
@@ -132,7 +132,7 @@ loading everything into context.
132
132
 
133
133
  Reusable, parameterised templates that drive an end-to-end flow:
134
134
 
135
- - `integrate-sync-engine` — wire the SDK into an existing project.
135
+ - `integrate-ablo` — wire the SDK into an existing project.
136
136
  - `add-agent` — add an agent worker that coordinates via claims and
137
137
  conflict-safe writes.
138
138
  - `define-schema` — design a Zod-first schema from a description, then run
package/docs/migration.md CHANGED
@@ -13,7 +13,8 @@ change when you upgrade.
13
13
 
14
14
  | Version | What changed | What to do |
15
15
  |---|---|---|
16
- | **0.35.0** | Synchronous reads moved under `local`, mirroring the async verbs | `get(id)` → `local.retrieve(id)`; `getAll(options)` `local.list(options)`; `getCount(options)` `local.count(options)` |
16
+ | **0.36.0** | `ttlSeconds` deprecated on the join surfaces in favour of `ttl` | `useJoin({ scope, ttlSeconds: '5m' })` → `useJoin({ scope, ttl: '5m' })`; same for `ParticipantJoinOptions`. Both spellings work until 0.37.0 |
17
+ | **0.35.0** | Synchronous reads moved under `local`, mirroring the async verbs | `get(id)` → `local.get(id)`; `getAll(options)` → `local.list(options)`; `getCount(options)` → `local.count(options)` |
17
18
  | **0.35.0** | `causedByTaskId` write option + seven `turn_*` error codes removed | Delete the `causedByTaskId` argument from writes; a branch on `turn_validation_failed` was unreachable and can go with it |
18
19
  | **0.34.0** | Presence verb renamed `watch` → `join` | `ablo.<model>.watch(ids)` → `ablo.<model>.join(ids)`; `useWatch` → `useJoin`; the `WatchOptions` / `UseWatchOptions` / `UseWatchReturn` types → `JoinOptions` / `UseJoinOptions` / `UseJoinReturn`; error code `model_watch_not_configured` → `model_join_not_configured` |
19
20
  | **0.28.0** | Removed React placeholders that had no working runtime | `usePresence` → `usePeers` or `useJoin`; `useClaim` → `ablo.<model>.claim`; `SyncGroupProvider` / `useSyncGroup` → `useJoin({ scope })` |
@@ -31,13 +32,31 @@ change when you upgrade.
31
32
 
32
33
  ---
33
34
 
34
- ## 0.35.0 the synchronous reads move under `local`
35
+ ## 0.36.0: one lease is spelled `ttl`
36
+
37
+ ```diff
38
+ - useJoin({ scope: { documents: [id] }, ttlSeconds: '5m' })
39
+ + useJoin({ scope: { documents: [id] }, ttl: '5m' })
40
+ ```
41
+
42
+ `ablo.<model>.join(ids, { ttl })` has always said `ttl`, and so does every other
43
+ lease in the SDK: `claim`'s `ttl`, `ClaimLeaseOptions.ttl`. The lower-level join
44
+ surfaces said `ttlSeconds` while accepting exactly the same values, including
45
+ duration strings, so a `ttl: '5m'` handed down from the model verb arrived as
46
+ `ttlSeconds: '5m'`, a field asserting a unit its value did not carry.
47
+
48
+ Both spellings work until 0.37.0, and `ttl` wins if you pass both. The wire is
49
+ unchanged: it has always carried seconds and still does.
50
+
51
+ ---
52
+
53
+ ## 0.35.0: the synchronous reads move under `local`
35
54
 
36
55
  ```diff
37
56
  - const task = ablo.tasks.get(id);
38
57
  - const open = ablo.tasks.getAll({ where: { status: 'open' } });
39
58
  - const count = ablo.tasks.getCount({ where: { status: 'open' } });
40
- + const task = ablo.tasks.local.retrieve(id);
59
+ + const task = ablo.tasks.local.get(id);
41
60
  + const open = ablo.tasks.local.list({ where: { status: 'open' } });
42
61
  + const count = ablo.tasks.local.count({ where: { status: 'open' } });
43
62
  ```
@@ -53,7 +72,7 @@ in most codebases it is outnumbered many times over by `Map.get` and
53
72
  the compiler name the sites — each one is a type error at exactly the call that
54
73
  has to move.
55
74
 
56
- ## 0.35.0 `causedByTaskId` and the `turn_*` error codes removed
75
+ ## 0.35.0: `causedByTaskId` and the `turn_*` error codes removed
57
76
 
58
77
  0.9.2 retired the `turn` primitive but left one field standing: `causedByTaskId`
59
78
  on the write options bag. It was never usable. The server validated it against a
@@ -85,7 +104,7 @@ migration of its own.
85
104
 
86
105
  ---
87
106
 
88
- ## 0.34.0 presence verb renamed `watch` → `join`
107
+ ## 0.34.0: presence verb renamed `watch` → `join`
89
108
 
90
109
  The model-level presence verb read like a data subscription but delivered
91
110
  presence — who else is on a row and what they hold — so it now says what it
@@ -108,7 +127,7 @@ no compatibility alias — rename the call sites and the `WatchOptions` /
108
127
 
109
128
  ---
110
129
 
111
- ## 0.28.0 dead React multiplayer placeholders removed
130
+ ## 0.28.0: dead React multiplayer placeholders removed
112
131
 
113
132
  Four React exports looked usable but had no live implementation:
114
133
 
@@ -123,7 +142,7 @@ Four React exports looked usable but had no live implementation:
123
142
  There is no compatibility alias: the replacement APIs were already the only
124
143
  working paths.
125
144
 
126
- ## 0.11.0 `intent` → `claim` rename completed
145
+ ## 0.11.0: `intent` → `claim` rename completed
127
146
 
128
147
  > **Historical note:** this section documents the 0.11.0 transition.
129
148
  > `useClaim` was subsequently removed in 0.28.0 because its provider callback
@@ -166,7 +185,7 @@ contending holders (`AbloClaimedError.claims` and a policy reason folded into th
166
185
  message), and `participantKind` is the canonical `'user' | 'agent' | 'system'`
167
186
  on presence and claim state.
168
187
 
169
- ## 0.10.0 environment enum `sandbox` / `production`; stateless HTTP transport
188
+ ## 0.10.0: environment enum `sandbox` / `production`; stateless HTTP transport
170
189
 
171
190
  ### Environment enum rename (the only breaking change)
172
191
 
@@ -222,7 +241,7 @@ await ablo.tasks.update({ id, data: { status: 'done' } });
222
241
 
223
242
  ---
224
243
 
225
- ## 0.9.2 `turn` / agent-`tasks` removed; `intents` deprecated
244
+ ## 0.9.2: `turn` / agent-`tasks` removed; `intents` deprecated
226
245
 
227
246
  The SDK's coordination surface is now exactly two things: `ablo.<model>` writes
228
247
  and `claim`. The parallel `turn` / agent-`tasks` mechanism was redundant —
@@ -271,7 +290,7 @@ everywhere you coordinate concurrent work.
271
290
 
272
291
  ---
273
292
 
274
- ## 0.9.0 one options object per verb; disposable `claim`
293
+ ## 0.9.0: one options object per verb; disposable `claim`
275
294
 
276
295
  Every model verb takes a single options object, so the id, the data, and every
277
296
  modifier are named siblings. Reactive local reads stay on the synchronous
@@ -285,7 +304,7 @@ modifier are named siblings. Reactive local reads stay on the synchronous
285
304
  + await ablo.tasks.retrieve({ id })
286
305
 
287
306
  - useAblo((ablo) => ablo.tasks.retrieve(id)) ?? serverTask
288
- + useAblo((ablo) => ablo.tasks.local.retrieve(id)) ?? serverTask
307
+ + useAblo((ablo) => ablo.tasks.local.get(id)) ?? serverTask
289
308
  ```
290
309
 
291
310
  `claim` now returns a disposable handle instead of taking a callback. The handle
@@ -305,7 +324,7 @@ options object.
305
324
 
306
325
  ---
307
326
 
308
- ## 0.8.0 callable `claim` namespace
327
+ ## 0.8.0: callable `claim` namespace
309
328
 
310
329
  The flat coordination methods are gone; everything lives under `claim`.
311
330
 
@@ -318,7 +337,7 @@ The flat coordination methods are gone; everything lives under `claim`.
318
337
 
319
338
  ---
320
339
 
321
- ## 0.7.0 legacy React hooks removed
340
+ ## 0.7.0: legacy React hooks removed
322
341
 
323
342
  The query/mutation hooks were replaced by the single `useAblo()` accessor over
324
343
  typed model methods.
@@ -340,7 +359,7 @@ shape with the canonical `{ type, code, message, doc_url, request_id }` envelope
340
359
 
341
360
  ---
342
361
 
343
- ## 0.6.0 `onChange` and the Resource → Model rename
362
+ ## 0.6.0: `onChange` and the Resource → Model rename
344
363
 
345
364
  ```diff
346
365
  - ablo.tasks.subscribe(cb)
@@ -356,7 +375,7 @@ Also renamed: `Ablo.Resource.*` → `Ablo.Model.*`, `ModelTarget.resource` →
356
375
 
357
376
  ---
358
377
 
359
- ## 0.5.0 intent-handle method renames
378
+ ## 0.5.0: intent-handle method renames
360
379
 
361
380
  On the model intent handle (`ablo.<model>.intent(id)`):
362
381
 
@@ -373,7 +392,7 @@ unchanged at this release. (They were later folded under `claim` in 0.9.2.)
373
392
 
374
393
  ---
375
394
 
376
- ## 0.3.0 umbrella `<AbloProvider>`
395
+ ## 0.3.0: umbrella `<AbloProvider>`
377
396
 
378
397
  One provider component now owns the full React lifecycle. `<SyncProvider>`,
379
398
  `createAbloContext()`, and `withSync` were removed.
@@ -407,10 +426,10 @@ old code or old docs, this is the through-line:
407
426
 
408
427
  | Release | State of coordination |
409
428
  |---|---|
410
- | 0.4.0 | `ablo.<model>.intent(id)` introduced per-entity intent handle |
429
+ | 0.4.0 | `ablo.<model>.intent(id)` introduced: per-entity intent handle |
411
430
  | 0.5.0 | Intent-handle methods renamed to claim vocabulary (`acquire`→`claim`, …) |
412
431
  | 0.8.0 | Callable `claim` namespace (`claim(id)`, `claim.state`, `claim.queue`, …) |
413
432
  | 0.9.0 | `claim` returns an `await using` disposable handle |
414
- | 0.9.2 | `intents` deprecated and made `@internal` **`claim` is the one coordination API** |
433
+ | 0.9.2 | `intents` deprecated and made `@internal`: **`claim` is the one coordination API** |
415
434
 
416
435
  For the full chronological history, see the [Changelog](../CHANGELOG.md).
package/docs/projects.md CHANGED
@@ -95,5 +95,5 @@ another org's project ids 404 — never confirm existence across orgs.
95
95
 
96
96
  | Code | Status | Meaning |
97
97
  |------|--------|---------|
98
- | `project_scope_denied` | 403 | The model/resource belongs to another project in your org use a key minted for that project. |
98
+ | `project_scope_denied` | 403 | The model/resource belongs to another project in your org: use a key minted for that project. |
99
99
  | `project_slug_taken` | 409 | A project with this slug already exists in the organization. |
@@ -215,12 +215,12 @@ const updated = await ablo.weatherReports.update({
215
215
  console.log({ id: updated.id, status: updated.status }); // { id: '...', status: 'ready' }
216
216
  ```
217
217
 
218
- Read a single row back with `retrieve({ id })`. It resolves to the row, or to
218
+ Read a single row back with `get({ id })`. It resolves to the row, or to
219
219
  `undefined` when no row has that id — so narrow it once, then the fields are
220
220
  fully typed:
221
221
 
222
222
  ```ts
223
- const report = await ablo.weatherReports.retrieve({ id: created.id });
223
+ const report = await ablo.weatherReports.get({ id: created.id });
224
224
  if (!report) throw new Error(`weatherReports ${created.id} not found`);
225
225
 
226
226
  console.log(report.status); // 'ready'
package/docs/react.md CHANGED
@@ -27,6 +27,7 @@ the thing, then pass it.
27
27
  ```ts
28
28
  // lib/ablo.ts
29
29
  import Ablo from '@abloatai/ablo';
30
+ import { createAbloReact } from '@abloatai/ablo/react';
30
31
  import { schema } from '@/ablo/schema';
31
32
 
32
33
  // The browser never holds your API key. It mints a short-lived session token
@@ -35,8 +36,18 @@ export const ablo = Ablo({
35
36
  schema,
36
37
  authEndpoint: '/api/ablo-session',
37
38
  });
39
+
40
+ // The typed binding: capture the schema once, and every component imports
41
+ // born-typed hooks from this file — `useAblo()` takes no type arguments,
42
+ // and a selector's `ablo` parameter knows your models.
43
+ export const { AbloProvider, useAblo } = createAbloReact(schema);
38
44
  ```
39
45
 
46
+ Import `AbloProvider` and `useAblo` from `lib/ablo` rather than from the
47
+ package, and the schema generic never appears at a call site again — the
48
+ same one-binding-file convention as tRPC's `createTRPCReact` or
49
+ react-redux's typed hooks.
50
+
40
51
  ## AbloProvider
41
52
 
42
53
  Mount it once near the root of your tree. It owns the connection, the local
@@ -67,10 +78,10 @@ export function Providers({
67
78
 
68
79
  | Prop | Default | Purpose |
69
80
  | ----------- | ---------------- | --------------------------------------------------------------------------------------------------------- |
70
- | `client` | | **Required.** The `Ablo({ schema, apiKey })` instance. It carries the schema and connection config. |
81
+ | `client` |: | **Required.** The `Ablo({ schema, apiKey })` instance. It carries the schema and connection config. |
71
82
  | `userId` | resolved from auth | App participant id for app-owned fields and your `identityRoles`. Not the security boundary. |
72
83
  | `fallback` | neutral spinner | Rendered during the *first* bootstrap only. Pass a branded skeleton, `null`, or `'passthrough'`. |
73
- | `onError` | | Engine / WebSocket / bootstrap errors. Wire to Sentry / Datadog. |
84
+ | `onError` |: | Engine / WebSocket / bootstrap errors. Wire to Sentry / Datadog. |
74
85
 
75
86
  Everything that used to be a provider prop — `schema`, `url`, `apiKey`,
76
87
  `teamIds`, `syncGroups`, `persistence`, `bootstrapMode` — now lives on
@@ -79,7 +90,7 @@ identity comes from, and why the API key never reaches the browser, is the whole
79
90
  of [Identity & Sync Groups](./identity.md) — read that if it isn't obvious how
80
91
  org / team / user map to what a participant can see.
81
92
 
82
- ## useAblo model client
93
+ ## useAblo: model client
83
94
 
84
95
  ```tsx
85
96
  'use client';
@@ -87,7 +98,7 @@ org / team / user map to what a participant can see.
87
98
  import { useAblo } from '@abloatai/ablo/react';
88
99
 
89
100
  export function ReportView({ report: serverReport }: { report: { id: string; location: string } }) {
90
- const report = useAblo((ablo) => ablo.weatherReports.local.retrieve(serverReport.id)) ?? serverReport;
101
+ const report = useAblo((ablo) => ablo.weatherReports.local.get(serverReport.id)) ?? serverReport;
91
102
  const active = useAblo((ablo) => ablo.weatherReports.claim.state({ id: serverReport.id }));
92
103
  const claimed = Boolean(active);
93
104
 
@@ -97,7 +108,7 @@ export function ReportView({ report: serverReport }: { report: { id: string; loc
97
108
 
98
109
  The hook:
99
110
 
100
- 1. Uses the same `ablo.<model>.local.retrieve(id)` / `.local.list()` methods you'd call anywhere
111
+ 1. Uses the same `ablo.<model>.local.get(id)` / `.local.list()` methods you'd call anywhere
101
112
  else in the SDK — the hook just makes them reactive.
102
113
  2. Tracks the model fields read by the selector and re-renders when confirmed
103
114
  deltas arrive.
@@ -112,7 +123,7 @@ effects, or writes:
112
123
  const abloClient = useAblo();
113
124
  ```
114
125
 
115
- Prefer selector reads like `useAblo((ablo) => ablo.<model>.local.retrieve(id))`. Older hooks
126
+ Prefer selector reads like `useAblo((ablo) => ablo.<model>.local.get(id))`. Older hooks
116
127
  also accept a string model name; prefer the selector form shown above.
117
128
 
118
129
  For collections, keep the selector on the model client too:
@@ -130,12 +141,12 @@ const reports = useAblo((ablo) =>
130
141
  ## Server Load
131
142
 
132
143
  ```tsx
133
- const report = await ablo.weatherReports.retrieve({ id });
144
+ const report = await ablo.weatherReports.get({ id });
134
145
  ```
135
146
 
136
147
  Use `retrieve` in Server Components when the row may not be in the local pool
137
148
  yet — it hydrates from the local store and the server, and returns a Promise, so
138
- `await` it. (Server reads come in two shapes: `retrieve({ id })` for one row and
149
+ `await` it. (Server reads come in two shapes: `get({ id })` for one row and
139
150
  `list({ where })` for many; both are async. The synchronous local reads are
140
151
  the `local` reads, used in render below.)
141
152
 
@@ -180,7 +191,7 @@ imperative work after an event or effect.
180
191
 
181
192
  See [API reference](/docs/api) for the full options surface.
182
193
 
183
- ## useJoin scoped presence + read interest
194
+ ## useJoin: scoped presence + read interest
184
195
 
185
196
  `useJoin` is the React form of `ablo.<model>.join`. It joins multiplayer for a
186
197
  scope on the engine's existing socket (one TCP connection, N logical
@@ -209,10 +220,10 @@ Options (`UseJoinOptions`):
209
220
 
210
221
  | Option | Default | Effect |
211
222
  | --- | --- | --- |
212
- | `scope` | | Model-form scope (`{ slideDecks: id }`), resolved through the schema. Omit for engine-wide. |
213
- | `claim` | `false` | Acquire a write-claim on the scope (sent so peers observe it; pins the scope so it never warm-drops while held). A viewer is not a claimant leave `false` for read-only. |
223
+ | `scope` |: | Model-form scope (`{ slideDecks: id }`), resolved through the schema. Omit for engine-wide. |
224
+ | `claim` | `false` | Acquire a write-claim on the scope (sent so peers observe it; pins the scope so it never warm-drops while held). A viewer is not a claimant: leave `false` for read-only. |
214
225
  | `hydrate` | `false` | Backfill the scope's current rows into the pool once on enter, then keep them fresh via the live tail. Set `true` for deep-linked / never-opened entities. Single-flight; soft-fails. |
215
- | `ttlSeconds` | | Lease TTL for the scope claim. |
226
+ | `ttlSeconds` |: | Lease TTL for the scope claim. |
216
227
  | `paused` | `false` | Tear down and don't re-join while true. |
217
228
 
218
229
  Returns (`UseJoinReturn`): `{ participant, peers, claims, status, error }`.
@@ -220,7 +231,7 @@ Returns (`UseJoinReturn`): `{ participant, peers, claims, status, error }`.
220
231
  write-claims; `status` is the join lifecycle. Auto-cleans up on unmount or when
221
232
  `paused` flips true.
222
233
 
223
- ## usePeers read-only presence
234
+ ## usePeers: read-only presence
224
235
 
225
236
  `usePeers` is a *pure reader* of the presence stream already flowing on the
226
237
  connection. Unlike `useJoin`, it does **not** enter/leave a scope (no
@@ -12,7 +12,7 @@ defineSchema(...) -> ablo.<model>.create/retrieve/update/claim(...)
12
12
  That one object drives:
13
13
 
14
14
  - typed model clients in trusted server runtimes,
15
- - React selectors through `useAblo((ablo) => ablo.<model>.local.retrieve(id))`,
15
+ - React selectors through `useAblo((ablo) => ablo.<model>.local.get(id))`,
16
16
  - agent and background-worker writes,
17
17
  - Data Source request/response shape when your database stays canonical,
18
18
  - hosted schema push, migration planning, and schema-version gating.
@@ -70,14 +70,14 @@ readable, you just don't author them.
70
70
  Use async reads when the row may not be local:
71
71
 
72
72
  ```ts
73
- const report = await ablo.weatherReports.retrieve({ id: reportId });
73
+ const report = await ablo.weatherReports.get({ id: reportId });
74
74
  const ready = await ablo.weatherReports.list({ where: { status: 'ready' } });
75
75
  ```
76
76
 
77
77
  Use synchronous local reads in render after data has synced:
78
78
 
79
79
  ```ts
80
- const report = ablo.weatherReports.local.retrieve(reportId);
80
+ const report = ablo.weatherReports.local.get(reportId);
81
81
  const pending = ablo.weatherReports.local.list({ where: { status: 'pending' } });
82
82
  ```
83
83
 
package/docs/sessions.md CHANGED
@@ -10,20 +10,23 @@ difference is the subject and how much authority it carries.
10
10
  One resource mints both:
11
11
 
12
12
  ```ts Your backend (sk_)
13
- // A logged-in person's browser session — full authority within their org.
13
+ // A logged-in person's browser session — only the operations this UI needs.
14
14
  const userSession = await ablo.sessions.create({
15
15
  user: { id: currentUser.id },
16
+ can: { tasks: ['read', 'update'], workspaces: ['read'] },
16
17
  });
17
18
 
18
- // A scoped agent sessiongated to exactly the operations you name.
19
- const agentSession = await ablo.sessions.create({
20
- agent: { id: 'agent:task-writer' },
21
- can: { Task: ['read', 'update'], Workspace: ['read'] },
19
+ // Recommended agent pathreturns a ready, scoped client.
20
+ const agent = await ablo.agents.create({
21
+ name: 'task-writer',
22
+ can: { tasks: ['read', 'update'], workspaces: ['read'] },
22
23
  });
23
24
  ```
24
25
 
25
- `user` mints an `ek_` (ephemeral key); `agent` mints an `rk_` (restricted key).
26
- You pass `user` **or** `agent` never both.
26
+ `sessions.create({ user, can })` mints an `ek_` (ephemeral key).
27
+ `agents.create({ can })` mints and manages an `rk_` (restricted key). Use the
28
+ lower-level `sessions.create({ agent, can })` only when another runtime needs
29
+ the raw agent token.
27
30
 
28
31
  It exists because of one rule: **the browser can never hold a secret.** Your
29
32
  `sk_` lives on the server; the browser only ever holds a minted session token
@@ -45,15 +48,24 @@ For a logged-in person using your app. Mint on a backend route that has already
45
48
  authenticated the user:
46
49
 
47
50
  ```ts Your backend route (session-authed)
48
- const { token } = await ablo.sessions.create({
51
+ import { credentialEndpointSuccessSchema } from '@abloatai/ablo/auth';
52
+
53
+ const { token, expiresAt } = await ablo.sessions.create({
49
54
  user: { id: currentUser.id }, // who the session acts as
55
+ can: { tasks: ['read', 'update'] },
50
56
  // syncGroups: [...], // optional; defaults to the user's org + user
51
57
  });
52
- return Response.json({ token }); // return ONLY the token to the browser
58
+ return Response.json(
59
+ credentialEndpointSuccessSchema.parse({
60
+ token,
61
+ expiresAt,
62
+ credentialKind: 'ephemeral',
63
+ }),
64
+ { headers: { 'Cache-Control': 'no-store' } },
65
+ );
53
66
  ```
54
67
 
55
- A user session has **full data authority** within its org no operation
56
- allowlist. It's the human acting as themselves.
68
+ `can` is required. The mint fails closed when the grant is absent or empty.
57
69
 
58
70
  Point a browser `Ablo` client's `authEndpoint` at that route, and pass
59
71
  the **instance** to [`<AbloProvider>`](/react). The client fetches the token,
@@ -84,7 +96,7 @@ the socket. Need custom headers or a
84
96
  body on the exchange? `authEndpoint` also accepts an async resolver that
85
97
  returns the token.
86
98
 
87
- ## Agent sessions (`rk_`)
99
+ ## Agents (`rk_`)
88
100
 
89
101
  For a non-human actor — an agent or automation that should only do **specific**
90
102
  operations. The `can` map is the permission boundary, and it's **typed against
@@ -92,23 +104,45 @@ your schema** — the model keys are your schema's models, so a typo is a compil
92
104
  error, not a silent over-grant:
93
105
 
94
106
  ```ts
95
- const session = await ablo.sessions.create({
96
- agent: { id: 'agent:task-writer' },
97
- can: { Task: ['read', 'update'] }, // typed off the schema — no magic strings
107
+ const agent = await ablo.agents.create({
108
+ name: 'task-writer',
109
+ can: { tasks: ['update'] }, // typed off the schema — no magic strings
98
110
  ttlSeconds: 600,
99
111
  });
100
112
 
101
- const agent = Ablo({ schema, apiKey: session.token }); // the agent's scoped client
113
+ await agent.tasks.update({ id, data });
114
+ await agent.dispose();
102
115
  ```
103
116
 
104
- `can: { Task: ['update'] }` serializes to the wire allowlist `task.update`; the
105
- server rejects any commit whose operation isn't listed. Operations are
106
- `'read' | 'create' | 'update' | 'delete'`.
117
+ The returned client refreshes its own short-lived credential. A write grant
118
+ automatically includes the corresponding read, so
119
+ `can: { tasks: ['update'] }` is enforced as `task.update` plus `task.read`.
120
+ Operations are `'read' | 'create' | 'update' | 'delete'`.
121
+
122
+ For a reusable grant, use TypeScript's `satisfies`. It checks the object against
123
+ the schema while preserving its narrow literals—there is no string parser or
124
+ second permission model:
125
+
126
+ ```ts
127
+ import type { CapabilityGrant } from '@abloatai/ablo/auth';
128
+ import { schema } from './ablo.schema';
129
+
130
+ const taskWriterCan = {
131
+ tasks: ['update'],
132
+ } satisfies CapabilityGrant<typeof schema>;
133
+
134
+ const agent = await ablo.agents.create({ can: taskWriterCan });
135
+ ```
136
+
137
+ `documents` instead of `tasks`, or `'write'` instead of `'update'`, is a compile
138
+ error. At runtime the SDK parses the same grant with the schema-bound Zod
139
+ contract before minting, and the server validates it again against the active
140
+ pushed schema.
107
141
 
108
142
  <Note>
109
- Use `sessions.create({ agent })` to mint a scoped agent credential, then write
110
- with `ablo.<model>.update(...)` / `ablo.commits.create(...)` under a `claim`.
111
- This is the path for custom runtimes, MCP sessions, and protocol-level integrations.
143
+ Use `sessions.create({ agent, can })` when a separate runtime, MCP process, or
144
+ protocol integration needs the raw token. For an agent running in the current
145
+ server process, prefer `agents.create({ can })`.
112
146
  </Note>
113
147
 
114
148
  ## Mint
@@ -120,7 +154,7 @@ for the actor.
120
154
  | Param | For | Meaning |
121
155
  |---|---|---|
122
156
  | `user` / `agent` | both | The actor. `id` becomes the token's `participantId`. Pass exactly one. |
123
- | `can` | agent | Per-model operation allowlist, typed off the schema. |
157
+ | `can` | both | Required non-empty per-model operation allowlist, typed off the schema. |
124
158
  | `syncGroups` | both | Narrow the session below its default scope. Omit to inherit. |
125
159
  | `ttlSeconds` | both | Lifetime in seconds. Defaults to `900` (15m). |
126
160
  | `userMeta` | both | Opaque identity blob echoed back to the client. |
@@ -129,8 +163,28 @@ for the actor.
129
163
 
130
164
  Sessions are **short-lived by design** (~15 minutes) and, for browsers,
131
165
  **auto-refreshed** — the provider re-mints ahead of expiry, so a session never
132
- drops at the boundary. A revoked or signed-out actor simply stops getting a fresh
133
- token; the old one expires on its own. There's nothing to revoke by hand.
166
+ drops at the boundary. Signing out stops refresh and the old token expires on
167
+ its own.
168
+
169
+ Revoke immediately when a token is exposed or an actor loses access:
170
+
171
+ ```ts
172
+ await ablo.sessions.revoke({ id: session.id });
173
+ ```
174
+
175
+ Agent sessions can rotate with overlap so a worker can adopt the replacement
176
+ before the previous token expires:
177
+
178
+ ```ts
179
+ const replacement = await ablo.sessions.rotate({
180
+ id: session.id,
181
+ graceSeconds: 300,
182
+ ttlSeconds: 900,
183
+ });
184
+ ```
185
+
186
+ Browser `ek_` sessions rotate through `authEndpoint`; do not distribute rotated
187
+ browser tokens manually.
134
188
 
135
189
  ### Offline & sign-out
136
190
 
@@ -145,20 +199,19 @@ those two lifetimes separate, which means:
145
199
  connectivity or tab focus returns. The user stays signed in for as long as
146
200
  your underlying session is valid, however brief or long the network drop.
147
201
  - **The user is signed out only when the underlying session is genuinely
148
- rejected** — i.e. your `authEndpoint` responds **`401`/`403`** because the
149
- cookie (or IdP session) is missing, expired, or revoked. That's the one
150
- signal the provider treats as terminal.
202
+ gone** — your `authEndpoint` responds `401` with the canonical
203
+ `{ error: { code: 'session_expired' } }` body. An unrelated `401` or `403`
204
+ is a policy/configuration failure, not proof that the login ended.
151
205
 
152
206
  This mirrors the OAuth refresh-token rule (Okta/Auth0/Authgear): only a
153
207
  rejection of the *long-lived* credential ends the session — a network failure
154
208
  never does.
155
209
 
156
210
  <Note>
157
- Your `authEndpoint` contract follows from this: return the token on success,
158
- respond **`401`/`403`** only when the user's session is actually gone, and let
159
- network/`5xx` failures surface as errors. Don't collapse "can't reach the mint
160
- endpoint" into "session expired" — returning a `401` for a transient blip will
161
- bounce a still-valid user to your sign-in page.
211
+ Use `credentialEndpointSuccessSchema` and `credentialEndpointErrorSchema` from
212
+ `@abloatai/ablo/auth` on the route. Return `session_expired` only when the
213
+ application login is actually gone, and let network/`5xx` failures surface as
214
+ errors.
162
215
  </Note>
163
216
 
164
217
  ## Scope
@@ -175,8 +228,8 @@ Your schema lives in a **project** — you push it once (`npx ablo push`) and ev
175
228
  session you mint resolves against it. The flow for serving end-users:
176
229
 
177
230
  1. **Push your schema** to your project.
178
- 2. **Mint an `ek_` per user** `sessions.create({ user: { id } })`. Your users
179
- commit to that one schema.
231
+ 2. **Mint an `ek_` per user:** `sessions.create({ user: { id }, can })`. Your
232
+ users commit to that one schema with only the operations in `can`.
180
233
 
181
234
  **Your users do not have Ablo accounts.** You authenticate them however you
182
235
  already do; your server's `sk_` mints the `ek_`. By default the session lands in
@@ -205,6 +258,7 @@ const { token } = await mintUserSessionKey({
205
258
  organizationId: schemaOwnerOrgId,
206
259
  projectId: schemaProjectId,
207
260
  },
261
+ operations: ['task.read', 'task.update'],
208
262
  ttlSeconds: 3600,
209
263
  });
210
264
  ```
@@ -234,6 +288,6 @@ compromise — which is exactly why it never leaves your server.
234
288
  | | User session (`ek_`) | Agent session (`rk_`) |
235
289
  |---|---|---|
236
290
  | For | a **person** in the browser | an **agent** / automation |
237
- | Authority | full, within their org | narrow (explicit `can` allowlist) |
238
- | Mint | `ablo.sessions.create({ user: { id } })` | `ablo.sessions.create({ agent: { id }, can })` |
291
+ | Authority | narrow (explicit `can` allowlist) | narrow (explicit `can` allowlist) |
292
+ | Mint | `ablo.sessions.create({ user: { id }, can })` | `ablo.sessions.create({ agent: { id }, can })` |
239
293
  | Lives where | the user's **browser** | the agent runtime |