Jiang Bohan d596f4d883 fix(daemon): address review blockers in runtime self-heal path
Three concrete bugs surfaced in GPT-Boy's review of PR #2404. All fail
without these changes against new regression tests in this commit.

1. Recovery used the per-runtime heartbeat ctx for the register HTTP call.
   handleRuntimeGone prunes the dead runtime and calls notifyRuntimeSetChanged
   before the register completes, which lets heartbeatLoop cancel that very
   ctx — the in-flight register would self-cancel.

   Fix: store the daemon root ctx on the Daemon struct in Run(), expose it
   via recoveryContext(), and drop the ctx parameter from handleRuntimeGone
   entirely so no caller can accidentally pass a per-runtime ctx again. The
   poller path already used parentCtx; this brings the heartbeat and WS-ack
   paths in line.

2. reregisterNextAttempt[workspaceID] was kept set for the full 30s coalesce
   window even after a successful re-register. A user deleting a second
   distinct runtime in the same workspace within that window would see
   handleRuntimeGone prune it locally and then skip the register, losing
   that provider until daemon restart.

   Fix: clear the per-workspace slot on success. The per-runtime in-flight
   set still prevents same-event stampedes; the slot is only for coalescing
   concurrent callers triggered by the same initial event. Failure backoff
   is preserved on the failed path.

3. The register response was appended to the surviving runtimeIDs, but
   DaemonRegister returns every configured provider — including the
   unchanged ones. UpsertAgentRuntime keys on (workspace_id, daemon_id,
   provider), so a partial recovery on [rt-claude, rt-codex] returned
   [rt-claude-new, rt-codex] and produced [rt-codex, rt-claude-new,
   rt-codex] with the old append logic. Duplicates leaked through
   allRuntimeIDs(), the WS URL, deregister(), and future recovery state.

   Fix: treat the response as authoritative for the workspace's runtime
   set — replace ws.runtimeIDs with the response IDs, and diff
   runtimeIndex so any old IDs the response did not return are dropped.
   The workspaceState pointer is still not replaced; only fields are
   mutated, so the ensureRepoReady / repoRefreshMu invariant is preserved.

Tests:
- TestHandleRuntimeGone_PartialWorkspaceRecoveryKeepsSibling — workspace
  [rt-claude-1, rt-codex-1], only claude deleted, server upsert behavior
  simulated; ws.runtimeIDs must be exactly the response set, no duplicates.
- TestHandleRuntimeGone_DistinctDeletionsWithinCoalesceWindowBothRecover —
  delete claude (1 register), then within the coalesce window delete codex
  (must produce a 2nd register); both providers present in final state.
- TestHandleRuntimeGone_RecoveryContextSurvivesCallerCancellation — register
  handler asserts r.Context() is not Done at request time, even though no
  caller-provided ctx is forwarded.
- TestHandleRuntimeGone_RecoveryContextStopsOnDaemonShutdown — bounded
  server handler; verifies handleRuntimeGone returns promptly after
  rootCancel, not after the 30s HTTP client timeout.

go test -race ./internal/daemon ./internal/middleware ./internal/daemonws
green.

Co-authored-by: multica-agent <github@multica.ai>
2026-05-11 15:57:21 +08:00
2026-04-22 16:04:34 +08:00

Multica — humans and agents, side by side

Multica

Multica

Your next 10 hires won't be human.

The open-source managed agents platform.
Turn coding agents into real teammates — assign tasks, track progress, compound skills.

CI GitHub stars

Website · Cloud · X · Self-Hosting · Contributing

English | 简体中文

What is Multica?

Multica turns coding agents into real teammates. Assign issues to an agent like you'd assign to a colleague — they'll pick up the work, write code, report blockers, and update statuses autonomously.

No more copy-pasting prompts. No more babysitting runs. Your agents show up on the board, participate in conversations, and compound reusable skills over time. Think of it as open-source infrastructure for managed agents — vendor-neutral, self-hosted, and designed for human + AI teams. Works with Claude Code, Codex, GitHub Copilot CLI, OpenClaw, OpenCode, Hermes, Gemini, Pi, Cursor Agent, Kimi, and Kiro CLI.

Multica board view

Why "Multica"?

Multica — Multiplexed Information and Computing Agent.

The name is a nod to Multics, the pioneering operating system of the 1960s that introduced time-sharing — letting multiple users share a single machine as if each had it to themselves. Unix was born as a deliberate simplification of Multics: one user, one task, one elegant philosophy.

We think the same inflection is happening again. For decades, software teams have been single-threaded — one engineer, one task, one context switch at a time. AI agents change that equation. Multica brings time-sharing back, but for an era where the "users" multiplexing the system are both humans and autonomous agents.

In Multica, agents are first-class teammates. They get assigned issues, report progress, raise blockers, and ship code — just like their human colleagues. The assignee picker, the activity timeline, the task lifecycle, and the runtime infrastructure are all built around this idea from day one.

Like Multics before it, the bet is on multiplexing: a small team shouldn't feel small. With the right system, two engineers and a fleet of agents can move like twenty.

Features

Multica manages the full agent lifecycle: from task assignment to execution monitoring to skill reuse.

  • Agents as Teammates — assign to an agent like you'd assign to a colleague. They have profiles, show up on the board, post comments, create issues, and report blockers proactively.
  • Autonomous Execution — set it and forget it. Full task lifecycle management (enqueue, claim, start, complete/fail) with real-time progress streaming via WebSocket.
  • Reusable Skills — every solution becomes a reusable skill for the whole team. Deployments, migrations, code reviews — skills compound your team's capabilities over time.
  • Unified Runtimes — one dashboard for all your compute. Local daemons and cloud runtimes, auto-detection of available CLIs, real-time monitoring.
  • Multi-Workspace — organize work across teams with workspace-level isolation. Each workspace has its own agents, issues, and settings.

Quick Install

brew install multica-ai/tap/multica

Use brew upgrade multica-ai/tap/multica to keep the CLI current.

macOS / Linux (install script)

curl -fsSL https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.sh | bash

Use this if Homebrew is not available. The script installs the Multica CLI on macOS and Linux by using Homebrew when it is on PATH, otherwise it downloads the binary directly.

Windows (PowerShell)

irm https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.ps1 | iex

Then configure, authenticate, and start the daemon in one command:

multica setup          # Connect to Multica Cloud, log in, start daemon

Self-hosting? Add --with-server to deploy a full Multica server on your machine:

curl -fsSL https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.sh | bash -s -- --with-server
multica setup self-host

This pulls the official Multica images from GHCR (latest stable by default). Requires Docker. See the Self-Hosting Guide for details. If the selected GHCR tag has not been published yet, fall back to make selfhost-build from a checkout.


Getting Started

1. Set up and start the daemon

multica setup           # Configure, authenticate, and start the daemon

The daemon runs in the background and auto-detects agent CLIs (claude, codex, copilot, openclaw, opencode, hermes, gemini, pi, cursor-agent, kimi, kiro-cli) on your PATH.

2. Verify your runtime

Open your workspace in the Multica web app. Navigate to Settings → Runtimes — you should see your machine listed as an active Runtime.

What is a Runtime? A Runtime is a compute environment that can execute agent tasks. It can be your local machine (via the daemon) or a cloud instance. Each runtime reports which agent CLIs are available, so Multica knows where to route work.

3. Create an agent

Go to Settings → Agents and click New Agent. Pick the runtime you just connected and choose a provider (Claude Code, Codex, GitHub Copilot CLI, OpenClaw, OpenCode, Hermes, Gemini, Pi, Cursor Agent, Kimi, or Kiro CLI). Give your agent a name — this is how it will appear on the board, in comments, and in assignments.

4. Assign your first task

Create an issue from the board (or via multica issue create), then assign it to your new agent. The agent will automatically pick up the task, execute it on your runtime, and report progress — just like a human teammate.


Multica vs Paperclip

Multica Paperclip
Focus Team AI agent collaboration platform Solo AI agent company simulator
User model Multi-user teams with roles & permissions Single board operator
Agent interaction Issues + Chat conversations Issues + Heartbeat
Deployment Cloud-first Local-first
Management depth Lightweight (Issues / Projects / Labels) Heavy governance (Org chart / Approvals / Budgets)
Extensibility Skills system Skills + Plugin system

TL;DR — Multica is built for teams that want to collaborate with AI agents on real projects together.


CLI

The multica CLI connects your local machine to Multica — authenticate, manage workspaces, and run the agent daemon.

Command Description
multica login Authenticate (opens browser)
multica daemon start Start the local agent runtime
multica daemon status Check daemon status
multica setup One-command setup for Multica Cloud (configure + login + start daemon)
multica setup self-host Same, but for self-hosted deployments
multica issue list List issues in your workspace
multica issue create Create a new issue
multica update Update to the latest version

See the CLI and Daemon Guide for the full command reference.


Architecture

┌──────────────┐     ┌──────────────┐     ┌──────────────────┐
│   Next.js    │────>│  Go Backend  │────>│   PostgreSQL     │
│   Frontend   │<────│  (Chi + WS)  │<────│   (pgvector)     │
└──────────────┘     └──────┬───────┘     └──────────────────┘
                            │
                     ┌──────┴───────┐
                     │ Agent Daemon │  runs on your machine
                     └──────────────┘  (Claude Code, Codex, GitHub Copilot CLI,
                                        OpenCode, OpenClaw, Hermes, Gemini,
                                        Pi, Cursor Agent, Kimi, Kiro CLI)
Layer Stack
Frontend Next.js 16 (App Router)
Backend Go (Chi router, sqlc, gorilla/websocket)
Database PostgreSQL 17 with pgvector
Agent Runtime Local daemon executing Claude Code, Codex, GitHub Copilot CLI, OpenClaw, OpenCode, Hermes, Gemini, Pi, Cursor Agent, Kimi, or Kiro CLI

Development

For contributors working on the Multica codebase, see the Contributing Guide.

Prerequisites: Node.js v20+, pnpm v10.28+, Go v1.26+, Docker

make dev

make dev auto-detects your environment (main checkout or worktree), creates the env file, installs dependencies, sets up the database, runs migrations, and starts all services.

See CONTRIBUTING.md for the full development workflow, worktree support, testing, and troubleshooting.

Description
No description provided
Readme 270 MiB
Languages
Go 48.6%
TypeScript 42.8%
MDX 7.1%
PLpgSQL 0.4%
CSS 0.4%
Other 0.6%