Agents transact against your pushed schema, same as everyone —
ablo.tasks
exists because you defined a task model and ran ablo push. The key
authenticates; the schema defines what you can call.The agent client
SameAblo() entry point as everywhere else — pass transport: 'http'. No
socket, no connection state — just your schema (for types) and an API key.
retrieve / list / create / update / delete, plus commits
and claim. It does not expose the stateful-only surface (get /
getAll / getCount local reads, onChange live subscription) — those need a
live connection, so with transport: 'http' the return type narrows and they
are a compile error, not a runtime surprise.
Coordination — claim, queue, reorder
The differentiator. A claim is a durable lease + FIFO wait-line on a row — “who’s working on this, who’s waiting” — and it’s request/response, so an agent holds it over HTTP. This is how two agents (or an agent and a human) don’t clobber the same record.{ wait: false } for fail-fast dedup: if
someone else has this job, skip it.
Messaging between agents
Use claimdescription and meta for live “what I am doing now” context. Use
ordinary synced rows for handoffs, status notes, and requests that must survive
reconnects or be readable by HTTP agents. The recipe is a messages model
scoped by the same syncGroup field as the work row, with aboutIntentId linking
a message back to the claim it discusses.
See Agent Messaging for the schema and direct
databaseUrl setup.
Humans + agents on one state
There’s no separate “agent mode.” A human editing a record over their WebSocket and an agent acting over HTTP share the same typed state and the same coordination plane: the agent can claim the row a human is editing (and wait in line), and the human sees the agent’s committed changes stream in live — over the human’s own socket, even though the agent committed over HTTP. You write the agent once; it’s a first-class participant, not a bolt-on.How an agent runs
What stays on the live (human) plane
onChange (live subscriptions) and get/getAll/getCount (local synced-pool
reads) require a WebSocket and a local store — they’re for interactive UIs, not
stateless agents. An agent reacts to an external trigger (a job/queue/webhook),
then reads with list/retrieve. See client behavior for
the full surface and guarantees for the coordination semantics.