Skip to content
oma

Features / Coding Agents

Coding agents that run for hours, not minutes

Assign an issue, walk away, come back to a PR. Run Claude Code itself via the claude-agent-sdk harness, or the built-in harness with structured progress heartbeats — either way the session survives crashes, reports where it's stuck, and can be scheduled to run again on its own.

GitHub Issues board — assign an issue to an agent and it spawns a briefed session
Assign an issue from the board — the agent spawns a session briefed with it.
A coding session running against a configured agent
The session streams progress, survives crashes, and ends in a PR.

How it survives hours unattended

A session's state lives in an append-only event log inside a Durable Object, backed by SQLite — not in the harness process's memory. That one design choice is what makes multi-hour runs safe.

Crash recovery by construction

If the harness crashes mid-turn, the session catches the error, emits session.error, and returns to idle. The next message spins up a fresh harness that reads the full event log and continues — no re-prompting, no lost context.

Structured progress heartbeats

agent.status events carry state, a summary, step/total_steps, and blocked_on — a machine-readable signal, not just free-text messages. The Console Agent → Monitor tab renders the live step bar, blocked-on warning, and heartbeat log. Purely observational, excluded from model context, so it never perturbs the prompt cache.

Two ways to drive the loop

Use the built-in harness for context-engineered tool loops, or the claude-agent-sdk harness to run Claude Code itself inside the sandbox — same event log, same recovery, same heartbeats either way.

GitHub-native loop

Mount a repository as a session resource, let the agent work in the sandbox, and let it report back without a human relaying status by hand.

Repo as a session resource

Attach a GitHub repository with a checkout ref and a vault credential; the agent clones, branches, and pushes from inside its own sandbox.

Ships PRs, not just diffs

claude-agent-sdk runs Claude Code end to end: fix the failing test, commit, push a branch, open the pull request.

Status posted back automatically

A github_comment notify target posts session status to the originating issue or PR when the run goes idle, errors, or terminates — no separate bot to wire up.

The Console ships ready-made GitHub-workflow agent templates — PR babysitter, repo maintainer, and others — so this loop doesn't start from a blank agent config.

Run it on a schedule

A coding agent that only runs when someone remembers to trigger it isn't really unattended. Two primitives cover recurring work.

Agent schedules

A cron expression bound directly to an agent and environment — fires a fresh session with a fixed opening message on a timezone-aware cadence. Update any field later with a partial PATCH, wire per-schedule alerts for failures, and read back a paginated run history. The Console Daily Summary tab rolls those firings into 1 / 7 / 30-day cost and outcome charts. Good for a single recurring maintenance job.

Deployments

A reusable bundle — agent (optionally pinned to a version), environment, vaults, and memory stores — behind a manual, cron, or webhook trigger. Same config fires from a chat button, a CI job, or a schedule.

FAQ

Can I run Claude Code itself, not just a custom loop?

Yes. The claude-agent-sdk harness (self-host Node) runs Claude Code inside the session's sandbox, so the agent has the real Claude Code tool loop, opens PRs, and reports back through the same event log as any other harness.

What happens if a long-running agent crashes mid-task?

Every event is written to an append-only, SQLite-backed log before it's broadcast. If the harness crashes, the session catches the error, emits session.error, and returns to idle. The next message spins up a fresh harness instance that reads the full log, rebuilds context, and continues — no lost work.

How do I watch progress on a multi-hour run?

The harness emits agent.status heartbeats — state, a summary, step/total_steps, and blocked_on when it's waiting on something — on a fixed cadence, purely observational and excluded from model context. The Console Agent → Monitor tab is the live progress feed (step bar, heartbeat log, lag warning).

How do I keep costs down while an agent works for hours?

Pause snapshots the sandbox workspace and destroys the container between turns; resume reprovisions and restores it exactly. An idle long-running agent costs nothing while it waits on a schedule, a review, or a webhook.

Can it run without a human kicking off every session?

Yes. Agent schedules fire sessions on a cron cadence, and deployments bundle an agent with an environment, vaults, and a trigger (manual, cron, or webhook) so the same configured run can fire repeatedly.