Human-in-the-loop for Eve

Let your Eve agent ask a human on their phone.

One file in agent/channels turns every approval your Eve agent raises into a push notification.

The integration

Add it to your Eve agent

Install @pushary/eve and drop pusharyChannel() into agent/channels as a one-line file. Eve already parks a turn whenever a tool gated with approval or the built-in ask_question needs an answer, and Pushary renders that request on the phone of the person who should decide. The turn stays parked while it waits, so nothing is held open and an approval can sit for hours at zero idle compute.

npm i @pushary/eveone file
// agent/channels/pushary.ts
import { pusharyChannel } from "@pushary/eve"
export default pusharyChannel()

Or ask on purpose, from a tool

The channel covers what Eve already pauses on. When you want the agent to ask a question Eve would not otherwise stop for, the same package ships two tool files. Eve discovers them by filename, and pusharyAskHuman() blocks until the person answers.

two calls
// agent/tools/ask-human.ts
import { pusharyAskHuman } from "@pushary/eve"
export default pusharyAskHuman()

// agent/tools/connect-phone.ts
import { pusharyConnectPhone } from "@pushary/eve"
export default pusharyConnectPhone()

Why you need it

Eve pauses the agent. Pushary reaches the human.

Eve parks a turn whenever a tool gated with approval or the built-in ask_question needs an answer, and it renders those as buttons in Slack. What it has no opinion about is who to interrupt when nobody is watching Slack. Pushary supplies that half and puts the same request on the phone the person carries. Because the wait is backed by the decisions ledger rather than the process, an Eve session that resumes on a different machine finds its pending question still there.

How it works

From ask to resume

Connect the phone once, then ask a human from the tool or step that guards the action. The waiting, the delivery, and the record are handled for you.

  1. 01

    Install the package

    Run npm i @pushary/eve. Set PUSHARY_API_KEY and PUSHARY_WEBHOOK_SECRET, and set PUSHARY_CALLBACK_ORIGIN if the agent is not deployed on Vercel.

  2. 02

    Add the channel file

    Create agent/channels/pushary.ts as a one-line default export of pusharyChannel(). It mounts the answer route plus message, stop, and reset.

  3. 03

    Run user-scoped auth

    The channel asks the session principal by default, so every end-user is their own approver. Bind a fixed person with pusharyChannel({ externalId }) for single-user agents and scheduled runs.

  4. 04

    Act on the decision

    The tap posts back to the answer route, which verifies the webhook signature and a per-request routing signature, then resumes the parked turn with the matching response.

A decision is a yes or no confirm, a multiple-choice select, or a free-text input. Every one is stored with its outcome and kept in the audit log.

The Partner plan

Your agent asks your users, not just you

Ship the agent to real users and let each of them approve their own decisions from their phone, under your brand.

$99/ month, every framework included

Your users never see a Pushary login or bill.

Your users answer on their own phones

The externalId is your own id for the end-user. Connect their phone once with a keyless one-tap link, and every approval lands with the right person. No account, no app, no key on their side.

Durable, fail-closed waits

The agent stays open on a durable wait backed by a decisions ledger. If nobody answers in the window you set, the decision comes back denied, so a timeout or a restart never turns into an unapproved action.

Phone-first delivery

Pushary reaches the person on the device they carry: native app push first, then PWA push notifications, then Slack if you route it there. You do not build a delivery pipeline.

Signed webhooks and an audit trail

Every decision is written to a durable ledger you can query and export, and resolved decisions post a signed webhook to your callback URL. You have the record of who approved what and when.

FAQ

Questions, answered

Is there an Eve package for Pushary?
Yes. @pushary/eve is published on npm. It exports pusharyChannel() for agent/channels, plus pusharyAskHuman() and pusharyConnectPhone() as tool files. There is also @pushary/eve-extension, the mountable extension form of the two tools.
What does the Pushary channel cover?
Every request Eve parks on. That is any tool gated with approval from eve/tools/approval, and the built-in ask_question. Eve renders those as buttons in Slack, and the channel renders the same requests as a push notification on a phone.
Who does the channel ask by default?
The session principal. Run user-scoped auth so each end-user is their own principal, and the channel asks that user. To bind a specific person, pass pusharyChannel({ externalId }).
What happens if nobody answers an Eve confirm?
It fails closed. A declined, expired, or unanswered confirm is reported as not approved, so the agent does not take the guarded action and can say why it stopped. The request stays in the ledger, which means an unanswered question is visible afterwards rather than lost.
Does this survive an Eve session resuming later?
Yes. Both the Eve session and the Pushary wait are durable, and they are durable independently. The pending decision lives in the ledger rather than in the process that created it, so a session that resumes minutes or hours later still resolves against the answer the person gave.
Do my users need a Pushary account or app?
No. They connect a phone with one tap, keyed to your own id. There is no account, no app, and no key on their side.

Let your Eve agent ask a human.

Connect a user with one tap, ask a human with one call, and act on a fail-closed decision. Every decision is saved to a durable ledger you can audit.

Partner plan, $99 a month. Your users never see a Pushary login or bill.