Skip to main content

AgentsPreview

Agents

Each workspace has one active authenticated ACP session and a Server-persisted history of that workspace's sessions. The Server schedules the configured ACP executable in the worktree. Clients never launch the CLI or own the session.

Starting or resuming a session replaces the active process without mixing histories between workspaces. Prompts are serialized per workspace.

Owner

AgentUp.Server Agents surface

Tests

Server Agents HTTP smoke, loop soak, capability Provider smoke

REST

/api/workspaces/{workspaceId}/agent · /api/autonomy

  1. Enable the matching ACP package on the Server

  2. Complete subscription sign-in when ACP requires it

  3. Stream prompts and permission decisions over REST/SSE

Route

POST .../authenticate

Where it differs

Desktop

The Agent tab lists the workspace's saved sessions across Codex, Cursor, and Claude with agent, generated description, and last branch, then streams the selected session over SSE. A bound workspace hides the picker and shows that agent. User prompts are right-aligned catalog bubbles. The live agent run stays fully open; the next question collapses tools, searches, and thoughts to a Worked disclosure. Loop phase, task, and stop reason render under the status line.

Mobile

The Agents overview tab lists the workspace's saved sessions across all agent types with agent, generated description, and last branch. A bound workspace hides the picker and shows that agent. Selecting a session resumes it and opens chat as an inner page. session/request_permission is a blocking decision card. The client shows the sign-in URL and Codex device code from the Server and must not launch xdg-open itself.

Session runtime​

The Server stores ACP session IDs and their display metadata under its data directory, partitioned by workspace ID. A generated ACP session title becomes the short description; the current workspace branch is recorded whenever a session is created, resumed, or retitled. Resuming uses ACP session/load in the workspace worktree, and deleting a workspace removes its saved session index.

Message submission returns 202 Accepted after the prompt has been handed to the workspace session; the completed turn arrives over SSE. A second prompt is rejected while a turn is running rather than being executed concurrently. Agent failures become structured operation errors or state events, and stopping an unresponsive adapter escalates from standard-input closure to process-tree termination after a bounded grace period.

GET .../events is an authenticated Server-Sent Events stream. Events have a monotonic ID and the after query parameter replays retained events after a disconnect. ACP session/update notifications are forwarded without discarding their typed payload. session/request_permission requests are suspended until a client posts the selected ACP option to .../permissions. Unsupported ACP client-side requests fail explicitly rather than silently granting access. Slow SSE consumers are disconnected instead of silently losing events.

Capability packages​

Codex, Cursor, and Claude are first-party Agent SDK consumers that emit registry packages. The Server enables those packages, loads their DLLs, and lists ACP agents from enabled agent-kind modules by module id. Unknown enabled agent module ids are listed rather than skipped. Each launch uses IAgentCapability.Launch inside that agent package's Nix environment. Optional auth/login stays on the module. Desktop and Mobile list available agents from Server APIs. nix-shell shell.nix seeds a local enabled set under .agent-up-dev and caches the ACP CLIs there so a repository Server started outside that shell can still find them. Runtime capability E2E sets AGENTUP_SKIP_DEV_AGENT_BOOTSTRAP=1 so that hook does not download those CLIs; the job packs the packages and Desktop enables only docker and dotnet.

When ACP reports that authentication is required, the session stays scheduled and POST .../authenticate starts that agent's subscription login CLI instead of asking the ACP process to open a local browser. The Server streams the printed sign-in URL and any device code to Desktop and Mobile, waits until the CLI exits, then restarts ACP against the Server data directory's agent-cli-home. Agent-Up does not collect API keys.

Agent-Up advertises no terminal-auth capability because the authenticated HTTP client cannot safely proxy an interactive terminal.

Workspace bind and unattended loop​

A workspace may record one bound agent module id. Unbound is the interactive picker. Autonomy stays off until the Server is enabled and the workspace is activated against a policy, a host connection, and assigned issues. Roles prefix the prompt and may filter advertised MCP tools. The full contract is on Autonomy.

Loop coverage​

CI runs the Server loop kernel against a locally-inferring ACP test agent on CPU llama.cpp. Hard invariants fail the run. Pooled task-completion outcomes are compared to a versioned baseline. Scenario files under loop-coverage/ do not name an agent, so the same prompts can drive CPU inference and test-agent-scripted. Concurrency and restart for at least three autonomous workspaces stay in the normal E2E tier. A separate soak check drains hundreds of scripted tasks.

Next in this slice

Autonomy

Bind, policy, unattended loop, roles, scripted ACP, and soak.