Skip to content

0.6.0 — supervision, watchers and an MCP server

Choose a tag to compare

@suhail-akhtar suhail-akhtar released this 31 Aug 15:21
· 26 commits to main since this release

What is running, and what happened while you were away

One work ledger. Sub-agents, background agents, backgrounded shell commands, Mini App servers, cron firings and watchers now share one record shape, one id space and one append-only log. There used to be five separate registries, so nothing could answer "what is running right now?" — there was nowhere to ask.

A restart no longer loses work silently. The log is replayed at startup: a process whose pid is still alive keeps running, everything else is marked lost with a reason. A crash used to leave no trace at all — "it finished" and "it never came back" looked identical afterwards.

Limits the platform enforces. Set deadlineMs, maxCostUsd, maxSteps or idleMs once, with an action of report, stop or kill, and stop checking back. Idle is deliberately separate from a deadline: an agent that has worked hard for an hour and one that has made no call in ten minutes are different failures.

Watchers. Wait for a file, a process, an HTTP endpoint, a command, a log pattern or another job, and be woken when it happens. One turn to register, one to be woken by — instead of a full turn per poll.

aico mcp-serve. aico speaks MCP on stdin and stdout, so Claude Code or any MCP client can hand it work. Nothing listens: no socket, no port. Six tools, deliberately not Read/Bash/Edit — the surface is delegation, not remote control. Read-only unless started with --allow-writes, because consent does not transfer: ticking auto-approve for your own session is not the same decision as letting an unattended process edit your repository.

Supervise replaces AgentSupervise, which could see sub-agents and nothing else. Outcomes stay listed until acknowledged — losing a failure to whichever turn glanced at it is how a background job becomes a mystery an hour later.

Fixed — scheduled jobs that quietly did nothing

Four separate causes, all found by running it rather than reading it:

  • cwd was never forwarded to the agent. Every background agent and every cron job ran in the server's directory, so a nightly job pointed at a repository wrote its files somewhere else and looked, from that repository, exactly like a job that had done nothing.
  • Two prompts could hang a headless run forever. The permission gate and AskUserQuestion both wrote to stdout and read stdin — which under mcp-serve are the two halves of the JSON-RPC stream. Headless work now gets a decision from policy, never a dialog.
  • maxConcurrentJobs limited nothing — it counted dispatches, which are fire-and-forget.
  • A slow job stacked copies of itself. One scheduled every minute that takes an hour started sixty.

Also: background agents reported no token usage, so a spend ceiling compared against zero and could never fire; stop reasons were being overwritten by generic ones; and MCP servers with a space in their command failed on Windows with only "MCP process exited unexpectedly" to go on — which is the default Node install path.

Verified

2,273 offline assertions · 190 web UI · 31 web reducer · 35 Mini Apps over real HTTP · plus live suites that drive a real daemon, real child processes, real sockets and real models: 25 watcher · 37 mcp-serve · 13 MCP client · 15 daemon · 18 cron · 28 MCP end-to-end · 11 permission.

Install

npx github:suhail-akhtar/aico#v0.6.0 serve

Requires Node 22.5 or newer. Full notes in CHANGELOG.md.