@abloatai/ablo 0.59.0 → 0.59.2
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 +45 -0
- package/dist/ai-sdk.js.map +1 -1
- package/docs/agents.md +45 -13
- package/docs/deployment.md +1 -0
- package/docs/options.md +6 -4
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.59.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [0b2fff7]
|
|
8
|
+
- @abloatai/humans@0.59.2
|
|
9
|
+
- @abloatai/transaction@0.59.2
|
|
10
|
+
|
|
11
|
+
## 0.59.1
|
|
12
|
+
|
|
13
|
+
### Plans recognize completed database migrations
|
|
14
|
+
|
|
15
|
+
`ablo plan` now treats a connected PostgreSQL column as evidence that required
|
|
16
|
+
field migration work is complete when the mapped column exists, has the expected
|
|
17
|
+
type, and already enforces `NOT NULL`. The plan reports that verified work once
|
|
18
|
+
instead of demanding a synthetic backfill merely because the active Ablo
|
|
19
|
+
artifact predates the database migration.
|
|
20
|
+
|
|
21
|
+
The same reconciliation now recognizes a risky field-type correction as already
|
|
22
|
+
completed when PostgreSQL has the candidate type, so activation does not demand
|
|
23
|
+
`--force` merely because the active artifact still describes the old type. That
|
|
24
|
+
evidence remains a forward-only contract boundary: reactivating the old artifact
|
|
25
|
+
would disagree with the migrated database. Enum narrowing is not inferred from
|
|
26
|
+
a `TEXT` column because the observed shape does not prove existing values satisfy
|
|
27
|
+
the new constraint.
|
|
28
|
+
|
|
29
|
+
Removing a model from the served schema also no longer implies that Ablo will
|
|
30
|
+
drop its table when the connected database is application-owned and the table is
|
|
31
|
+
still present. The plan reports a compatibility warning, retains the physical
|
|
32
|
+
table, and allows the reviewed metadata activation without `--force`. Ablo-owned
|
|
33
|
+
tables, missing application tables, and unobserved database states remain
|
|
34
|
+
destructive errors.
|
|
35
|
+
|
|
36
|
+
Missing, nullable, incompatible, contradictory, and unobserved database states
|
|
37
|
+
remain blocked. Duplicate physical findings shared by the candidate and active
|
|
38
|
+
schemas are collapsed, while genuine three-state disagreements remain visible
|
|
39
|
+
in both directions.
|
|
40
|
+
|
|
41
|
+
### Batched writes preserve their exact-read evidence
|
|
42
|
+
|
|
43
|
+
Reactive writes that carry captured rows through `reads` now retain those
|
|
44
|
+
dependencies when several writes are sealed into one durable commit, including
|
|
45
|
+
after an offline replay. A premise that became stale is therefore still rejected
|
|
46
|
+
instead of being lost at the batch boundary.
|
|
47
|
+
|
|
3
48
|
## 0.59.0
|
|
4
49
|
|
|
5
50
|
### Schema changes now have one ordered deployment plan
|
package/dist/ai-sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["../src/ai-sdk.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAE7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC;AAYH,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAC5B,KAA2B,EAC3B,
|
|
1
|
+
{"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["../src/ai-sdk.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAE7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC;AAYH,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAC5B,KAA2B,EAC3B,OAAO,GAAiC,EAAE;IAE1C,MAAM,EAAE,OAAO,EAAE,GAAG,2BAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CACzE,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAC5B,QAAQ,EACR,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,EACjE,CAAC,CACF,CAAC;IACF,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,0DAA0D,OAAO,EAAE;KAC7E,CAAC;AACJ,CAAC"}
|
package/docs/agents.md
CHANGED
|
@@ -21,16 +21,49 @@ console.log(matching[0].title);
|
|
|
21
21
|
These are observational reads. Use `read({ id })` only when a later Ablo write
|
|
22
22
|
depends on that exact version and will pass it through `reads`.
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
credential
|
|
28
|
-
the
|
|
24
|
+
Most agents wake on a trigger, read what they need, write a result, and go idle.
|
|
25
|
+
That is a request/response workload, so they use plain HTTP. A resident agent
|
|
26
|
+
that needs pushed deltas, queued-claim grants, or presence selects
|
|
27
|
+
`transport: 'websocket'`. The credential is the identity on both carriers; the
|
|
28
|
+
server resolves the org, scope, and actor from it.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
Short-lived agents use HTTP. Long-running agents may add a multiplexed
|
|
31
|
+
WebSocket without installing the human materializer. People add the `humans()`
|
|
32
|
+
plugin for a local reactive graph. All three operate on the same typed,
|
|
33
|
+
coordinated state and enter the same server-side commit and claim paths.
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
const ablo = Ablo({
|
|
37
|
+
schema,
|
|
38
|
+
apiKey: process.env.ABLO_API_KEY,
|
|
39
|
+
transport: 'websocket',
|
|
40
|
+
cursorStore,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await ablo.ready();
|
|
44
|
+
|
|
45
|
+
for await (const delta of ablo.observe()) {
|
|
46
|
+
await applyToAgentState(delta);
|
|
47
|
+
await delta.checkpoint(); // persist the cursor, then acknowledge it
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The selected WebSocket is shared by commits, row claims and releases,
|
|
52
|
+
subscription changes, pushed deltas, presence, and collaboration events.
|
|
53
|
+
Reconnect sends the last checkpointed position, so an uncheckpointed delta is
|
|
54
|
+
eligible for redelivery. An unsupported protocol version closes explicitly
|
|
55
|
+
instead of silently falling back to a different wire dialect.
|
|
56
|
+
|
|
57
|
+
The client retains no delta backlog while `observe()` is inactive. Starting an
|
|
58
|
+
observer requests replay from the durable checkpoint. An active observer has a
|
|
59
|
+
bounded in-memory backlog; if it falls behind that bound, observation fails
|
|
60
|
+
explicitly and can be restarted from the same durable checkpoint.
|
|
61
|
+
|
|
62
|
+
The public operation names do not change with the carrier. For example,
|
|
63
|
+
`ablo.records.update(...)` and `ablo.records.claim(...)` are the same calls on
|
|
64
|
+
HTTP and WebSocket. HTTP remains available for point reads and administrative
|
|
65
|
+
resources; `context().onChange` uses POST/SSE when HTTP is selected and reuses
|
|
66
|
+
the socket when WebSocket is selected.
|
|
34
67
|
|
|
35
68
|
<Note>
|
|
36
69
|
Agents transact against your **pushed schema**, same as everyone — `ablo.records`
|
|
@@ -62,10 +95,9 @@ await ablo.records.update({ id: record.id, data: { status: "done" } });
|
|
|
62
95
|
|
|
63
96
|
It exposes `get` / `list` / `create` / `update` / `delete`, plus `commits`
|
|
64
97
|
and `claim`. It does **not** expose stateful-only `local` reads or model
|
|
65
|
-
`onChange` subscriptions.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
listener stops.
|
|
98
|
+
`onChange` subscriptions. `context().onChange` is separate: it reuses the
|
|
99
|
+
selected WebSocket transport, or holds one POST/SSE response until the context
|
|
100
|
+
changes on the HTTP transport.
|
|
69
101
|
|
|
70
102
|
## Managed scoped agents
|
|
71
103
|
|
package/docs/deployment.md
CHANGED
|
@@ -127,6 +127,7 @@ runs. In production that resolves to four rows:
|
|
|
127
127
|
|---|---|---|
|
|
128
128
|
| Server, worker, agent, cron | `sk_` in `ABLO_API_KEY` | Defaults from the environment, so most code passes nothing. |
|
|
129
129
|
| Serverless function | `sk_` in `ABLO_API_KEY`, with `transport: 'http'` | Stateless request/response; nothing held open across invocations. |
|
|
130
|
+
| Resident agent | restricted `rk_` or agent-scoped credential, with `transport: 'websocket'` | One multiplexed WebSocket per client and Ablo cell; checkpoint durable deltas before acknowledging. |
|
|
130
131
|
| Browser, read-only | root-bound `pk_` | Publishable, safe to ship, and read-only. |
|
|
131
132
|
| Browser, writing as the signed-in user | `authEndpoint` | A route on your backend mints a short-lived `ek_` per user. |
|
|
132
133
|
|
package/docs/options.md
CHANGED
|
@@ -160,11 +160,13 @@ workflow or deployment lanes.
|
|
|
160
160
|
|
|
161
161
|
## transport
|
|
162
162
|
|
|
163
|
-
The package-root client
|
|
164
|
-
|
|
163
|
+
The package-root client defaults to request/response HTTP. Select
|
|
164
|
+
`transport: 'websocket'` for a resident agent that needs pushed coordination;
|
|
165
|
+
the model, commit, claim, and context vocabulary stays unchanged.
|
|
165
166
|
|
|
166
|
-
|
|
167
|
-
the [React guide](./react.md)
|
|
167
|
+
Local materialized state and reactive reads still belong to the human client
|
|
168
|
+
described in the [React guide](./react.md); selecting WebSocket here adds a
|
|
169
|
+
carrier, not the human materializer.
|
|
168
170
|
|
|
169
171
|
## timeoutMs
|
|
170
172
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abloatai/ablo",
|
|
3
|
-
"version": "0.59.
|
|
3
|
+
"version": "0.59.2",
|
|
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",
|
|
@@ -140,8 +140,8 @@
|
|
|
140
140
|
"directory": "packages/ablo"
|
|
141
141
|
},
|
|
142
142
|
"dependencies": {
|
|
143
|
-
"@abloatai/humans": "^0.59.
|
|
144
|
-
"@abloatai/transaction": "^0.59.
|
|
143
|
+
"@abloatai/humans": "^0.59.2",
|
|
144
|
+
"@abloatai/transaction": "^0.59.2",
|
|
145
145
|
"zod": "^4.4.3"
|
|
146
146
|
},
|
|
147
147
|
"peerDependencies": {
|