Features
What AgentWay actually does
AgentWay is a control plane, not a framework. It attaches to agents you already wrote and gives you one place to watch them, instruct them, and take over when they need a human. Here is each piece, and precisely what it guarantees.
01 · Visibility
Every agent, live, on one screen
Each agent reports what it's doing as it works. The dashboard shows current status, current task, and how long since it last checked in — for every agent you run, in one view.
Because agents check in on a fixed interval, AgentWay also knows when one stops checking in. Nobody has to notice a dead process; it turns red on its own.
-
status
provisioned (registered, never seen),
idle, busy,
pause requested, paused,
offline, terminated. Six of
those are normal;
offlineis an error, because a long-lived agent going quiet is never expected. - heartbeat Liveness of the agent. Miss the interval plus a grace window and the agent is marked offline automatically, with an entry written to its history.
- activity One line of "what I'm doing right now", plus structured detail you choose. Reporting rides along with the heartbeat, so it costs no extra request.
- cadence AgentWay measures how often each agent actually checks in and shows it — so you know what pause latency to expect from that agent before you press anything.
02 · Direction
Send instructions without a deploy
Write an instruction, choose who gets it, send. It's queued durably and delivered on the recipient's next check-in. What your agent does with it is your code's business — but whether it arrived, was acknowledged, and was acted on is recorded precisely.
Three states, never merged.
delivered is something AgentWay can prove.
acknowledged means the SDK confirmed receipt.
acted on is the agent's own claim that it
did something. Collapsing them into one checkmark would be a
lie of convenience.
- targeting One agent, several by name, an entire scope (optionally including nested scopes), everything advertising a capability, or the whole project.
- delivery At-least-once, ordered per recipient. Redelivery is visible as a counter rather than hidden, so an agent doing something irreversible can check before repeating it.
- responses Agents reply in a thread. An agent that cannot comply declines with a reason — far more useful than silence.
- expiry Optional TTL. An agent that was offline for a week shouldn't wake up and act on week-old instructions.
- cancel Retract anything not yet delivered. Already-delivered messages are reported honestly as un-retractable — the agent may already be acting.
03 · Control
Pause in one click
Press pause and the agent stops at its next checkpoint — the top of its own loop — with its state intact. Press resume and it continues. No process killing, no lost work, no orphaned file handles.
The dashboard shows pausing… until the agent confirms it has actually stopped, then paused with the exact moment it happened. You are never guessing about whether the button worked.
Nothing pauses mid-action. If your agent is forty seconds into an API call, the pause lands when that call returns. No tool can safely freeze a process mid-write — doing so leaves sockets and file handles open in a world that moved on. For a loop iterating every few seconds, pause feels instant. For a ten-minute batch, it doesn't, and we show you the real number.
-
checkpoint
Wherever your code calls
agent.running(). You choose the granularity; call it inside long work withagent.should_continue()to make pause more responsive without restructuring anything. -
resume
Lands the agent back on
idle. It picks its own next task — AgentWay doesn't presume to resume the previous one. - restart-safe A paused agent that redeploys comes back paused. Losing a pause across a restart would silently discard your intent.
- terminate A separate, clearly-labelled action for an agent that has hung and will never reach a checkpoint. It stops delivery and liveness tracking and tells the agent to exit — it cannot reach into your host and kill a process, and it says so.
04 · Escalation
Agents that ask instead of guessing
This is the feature that makes unattended operation reasonable. An agent facing a decision above its pay grade stops and asks. It appears in your inbox with the question, the context, and the choices it will accept.
It also means you can grant an agent more authority than you otherwise would — because you know it will check in on the edge cases rather than improvising.
- blocking An agent can declare it is stopped until answered. Those sort to the top of the inbox and drive a "waiting on you" count, because a stalled process is more urgent than a report.
-
options
Offer a fixed choice set (
approve/reject) and the answer is validated against it — safe for your code to branch on directly. - kinds question, approval, blocked, report, error — each with its own severity, so an FYI doesn't look like an emergency.
- liveness A waiting agent keeps heartbeating, so it stays visibly alive instead of being swept offline while it waits for you.
- safeguard You cannot dismiss a blocking question without answering it — that would leave the agent waiting forever. Reply, or terminate it deliberately.
05 · Organisation
Projects, scopes, and a canvas you arrange
A project is a workspace. Inside it, scopes are departments you
name — data, engineering.prod, whatever
matches how you think. Agents live in scopes, and you arrange them
on a canvas that remembers your layout.
Scope granularity is also your security dial: each scope has its own key, so splitting one in two halves the blast radius of a leak. That's your call to make, not ours.
- self-registration Agents create themselves on first run. One key per scope, and no dashboard step per agent — deploy twenty and they populate the canvas on their own.
- project id Declared in your agent's source. If a staging key ends up in a production deploy, registration fails loudly instead of quietly filling the wrong workspace.
-
nesting
Scopes nest (
engineering.prod), and you can broadcast to a scope and everything beneath it. - renaming Rename a scope and agents whose code names the old one keep working through an alias. The dashboard flags the drift so somebody updates the source — a rename is a warning, not an outage.
- roles owner, admin, operator, viewer. Sending directives and pausing needs operator; issuing keys needs admin.
06 · Awareness
Let agents see their own department
Opt in and an agent can read the state of its scope: which peers are working, which are failing, and what happened recently, in order. An agent whose upstream keeps erroring can back off instead of hammering it.
Awareness, not messaging. An agent can observe a peer; it cannot instruct one. Directives stay human-only, which is what keeps every instruction in the system attributable to a person in the audit trail.
- peers() A snapshot: who's in the scope, their status, current activity, recent error count, and whether they're blocked on a human. What you check to decide something.
- scope_feed() A chronological feed of what peers did. What you read to understand something — a snapshot can say an agent has errors, but only a sequence shows they started right after another agent shipped a change.
- opt-in Off by default, and delta-based when on, so agents that don't need it pay nothing for it.
07 · Accountability
A history you can hand to an auditor
Every agent keeps a complete timeline: what it did, what it was told, what it asked, and every operator action taken on it. Human actions go to an append-only audit log that cannot be edited or deleted — enforced in the database, not by convention.
- timeline Per agent, merging its own activity, directives received, replies sent, questions asked, and operator actions into one readable stream.
- audit log Who paused what, when, and why. Who issued or revoked which key. Immutable, and it outlives the objects it describes.
- secrets Keys are stored only as hashes and shown exactly once at creation. The audit trail records a key's public prefix, never its value.
See it with your own agents.
Three lines of Python and your first agent appears on the canvas. Nothing to rewrite.