By AgentWorkforce

Agents that
don’t wait
to be asked.

The runtime for proactive agents — schedules, triggers, watchers, durable wake/sleep. Framework-agnostic.

✦ The shift

Most agents wait to be prompted.
A proactive one already handled it.

Reactive

Wakes up when called.

Polls every N seconds. Forgets between runs. Finishes work that’s no longer relevant.

Proactive

Wakes up because something moved.

Push, not poll. Persistent state. Stops mid-task when the premise stops being true.

✦ The triple

A clock, a watcher, an inbox.

  • the clock

    relaycron

    cron.schedule("0 9 * * *", agent)
  • the watcher

    relayfile

    file.on("change", agent)
  • the inbox

    relaycast

    cast.on("message", agent)

✦ The webhook tax

Eight weeks, or one afternoon.

Without the runtimeserver.ts
app.post("/webhooks/linear", raw, async (req, res) => {
  // verify HMAC, respond <2s, enqueue, dedupe,
  // filter, fetch full payload, load context, fire agent
  // ...for every provider, with their own quirks.
});
With the runtimeagent.ts
import { workspace } from "@proactive/runtime";

workspace("acme/ops").on("change", async (file) => {
  await agent.handle(file);
});

Endpoints, signatures, dedupe, registration, normalisation — handled. Adding a provider is a config line. Read the full breakdown.