@abloatai/ablo 0.61.0 → 0.62.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.62.0
4
+
5
+ Every live client now exposes one session-owned `ablo.presence` projection.
6
+ `active` shows the current session's announced activity and `others` shows the
7
+ other visible sessions. The reactive client adds `forModel(model, id?)` to
8
+ narrow the same projection without opening another connection. Read, claim,
9
+ create, update, and delete activity share one typed, model-addressable contract
10
+ and remain attributable to their originating human or agent session.
11
+
12
+ Claims and presence now have separate owners: the durable claim authority
13
+ decides admission, queuing, fencing, expiry, and release, while presence
14
+ projects that lifecycle for live collaborators. Cross-replica HTTP callers
15
+ resolve and release claims against the shared authority instead of a
16
+ process-local roster. An object-form claim also returns its protected row
17
+ snapshot in the acquisition request, removing the post-grant read race and an
18
+ extra round trip.
19
+
20
+ This replaces the earlier participant-oriented presence stream and its raw
21
+ wire event vocabulary. Migrate `PresenceStream`, `Peer`, `Activity`,
22
+ `PresenceUpdate*`, and `PresenceKind` consumers to `Ablo.Presence`,
23
+ `Ablo.PresenceSession`, and `Ablo.PresenceActivity`; read the projection through
24
+ `ablo.presence.active`, `ablo.presence.others`, or
25
+ `ablo.presence.forModel(model, id?)`. The low-level `presence_update` event,
26
+ frame-handler members, presence schemas, and claim-stream participant setters
27
+ are removed because session identity and typed presence snapshot/patch frames
28
+ now own that lifecycle.
29
+
30
+ Admission and other transient failures now expose machine-actionable
31
+ `recovery`, `retryable`, and `retryAfterSeconds` fields through the branded
32
+ package, including session issuance and headless model requests. The headless
33
+ client automatically replays an admission-rejected request after the requested
34
+ delay, without restarting the surrounding claim workflow. Queued HTTP claims
35
+ heartbeat through their known model and row target, so one holder releasing
36
+ cannot make the next queued ticket appear lost during promotion. A visibility
37
+ miss while the fence is minted is retried only inside the ticket's last
38
+ server-acknowledged lease window.
39
+
3
40
  ## 0.61.0
4
41
 
5
42
  ### Existing database connections repair in place
@@ -2,9 +2,9 @@ export * from '@abloatai/transaction/coordination';
2
2
  /**
3
3
  * Coordination vocabulary that the streams module declares.
4
4
  *
5
- * A caller that holds a claim, watches presence, or types an activity feed
6
- * needs these names, and coordination is where they belong — so they are
5
+ * A caller that holds a claim needs these names, and coordination is where
6
+ * they belong — so they are
7
7
  * surfaced here rather than leaving callers to reach into the type module.
8
8
  */
9
- export type { Activity, Claim, ClaimTarget } from '@abloatai/transaction/types/streams';
9
+ export type { Claim, ClaimTarget } from '@abloatai/transaction/types/streams';
10
10
  //# sourceMappingURL=coordination.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../src/coordination.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AAEnD;;;;;;GAMG;AACH,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../src/coordination.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AAEnD;;;;;;GAMG;AACH,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC"}
@@ -157,13 +157,20 @@ see. Options on the claim:
157
157
  - `{ maxQueueDepth }` rejects if the wait line is already too deep.
158
158
 
159
159
  While waiting, schema clients learn when the claim clears from the live claim
160
- stream, so they never poll.
160
+ stream, so they never poll. Headless HTTP clients poll the same durable queue;
161
+ the model client keeps the row target on each heartbeat, so a holder releasing
162
+ cannot make the queued ticket unresolvable by id. During fence minting, it also
163
+ keeps polling through a visibility miss only while the server's last enqueue or
164
+ heartbeat acknowledgement still guarantees that ticket is live.
161
165
 
162
166
  ## Errors
163
167
 
164
168
  All SDK errors extend `AbloError`. `type` is the class-name discriminator, such
165
169
  as `AbloStaleContextError`; `code` is the wire condition, such as
166
170
  `stale_context`. Use `instanceof` in-process and `type` after serialization.
171
+ Every error also exposes a typed `recovery` classification and `retryable`
172
+ boolean. When the server requests a minimum delay, `retryAfterSeconds` is
173
+ present on the same error for both 429 and 503 responses.
167
174
 
168
175
  | Error | Typical cause |
169
176
  |---|---|
@@ -196,8 +203,14 @@ Model writes are retry-safe by default because the SDK attaches an idempotency
196
203
  key. If you provide your own key, keep it stable for retries of the same logical
197
204
  operation and never reuse it for a different payload.
198
205
 
199
- Retry transport failures and 5xx with backoff. Do not blindly retry validation,
200
- permission, idempotency, or stale-context errors without changing the request.
206
+ Retry transport failures and 5xx with backoff. For example, an
207
+ `instance_at_capacity` error has `recovery === 'transient'`; wait at least
208
+ `retryAfterSeconds` before replaying the unchanged request. The headless HTTP
209
+ client performs that exact replay within `timeoutMs`; importantly, it does not
210
+ restart a larger claim/read/write workflow around the rejected request. If the
211
+ deadline is exhausted, the same actionable error reaches the caller. Do not
212
+ blindly retry validation, permission, idempotency, or stale-context errors
213
+ without changing the request.
201
214
 
202
215
  ## Logging
203
216
 
@@ -242,7 +242,7 @@ examples/
242
242
  inngest-agent/ events, functions, steps, endpoint, AI composition
243
243
  ```
244
244
 
245
- Do not add Inngest to `packages/agent`. A dedicated `@abloatai/inngest` package
245
+ Do not add Inngest orchestration to the Ablo core. A dedicated `@abloatai/inngest` package
246
246
  is justified only after multiple real applications reveal substantial
247
247
  reusable behavior beyond a small function or step wrapper.
248
248
 
@@ -178,7 +178,7 @@ The repository's
178
178
  [`examples/temporal-agent`](../../../../examples/temporal-agent/README.md)
179
179
  contains a Workflow, Activities, Worker, client, durable AI SDK tool, and a
180
180
  simulated lost-response retry. It is a standalone application on purpose:
181
- Temporal stays out of Ablo's core packages and out of `packages/agent`.
181
+ Temporal stays out of Ablo's core packages; applications own their agent composition.
182
182
 
183
183
  A dedicated `@abloatai/temporal` package should be introduced only after
184
184
  multiple production integrations reveal substantial, stable behavior that
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abloatai/ablo",
3
- "version": "0.61.0",
3
+ "version": "0.62.0",
4
4
  "description": "The public Ablo SDK for coordinated reads, commits, claims, observation, and reactive applications.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -145,8 +145,8 @@
145
145
  "directory": "packages/ablo"
146
146
  },
147
147
  "dependencies": {
148
- "@abloatai/humans": "^0.61.0",
149
- "@abloatai/transaction": "^0.61.0",
148
+ "@abloatai/humans": "^0.62.0",
149
+ "@abloatai/transaction": "^0.62.0",
150
150
  "zod": "^4.4.3"
151
151
  },
152
152
  "peerDependencies": {