Skip to main content

paca-acp-bridge

A small local daemon that connects an ACP-type Paca AI agent to a coding CLI running on your own machine — Claude Code, Codex, Gemini CLI, or a custom Agent Client Protocol server. Run it from your project's source directory; it spawns the ACP server there and streams the conversation back to Paca. Nothing is cloned into a cloud sandbox and no source code leaves your machine — Paca only ever sends task requests and receives responses back.

Prerequisites

  • Python 3.12+ (only needed if you don't use uvx, which manages this for you)
  • Node.js (most built-in ACP providers are launched via npx)
  • Your own local auth for whichever provider you pick — e.g. run claude setup-token for Claude Code, or export OPENAI_API_KEY / GEMINI_API_KEY for Codex/Gemini CLI. This is entirely your own local setup, exactly as if you were running that CLI yourself — Paca never sees, stores, or forwards this. Likewise, any MCP servers or skills you've configured for your local ACP client are used as-is; Paca doesn't manage or inject any of that.

Run it

No install step needed — uv fetches and runs it in one shot:

cd /path/to/your/project
uvx paca-acp-bridge run \
  --agent-id <agent-id> \
  --token <token> \
  --server https://your-paca-instance.example.com

(Or uv pip install paca-acp-bridge first, then run paca-acp-bridge run ... the same way.)

--agent-id, --token, and --server can also be set via PACA_ACP_AGENT_ID, PACA_ACP_TOKEN, and PACA_ACP_SERVER. The agent id and token are shown once when you generate (or regenerate) the local bridge token for an ACP agent in Paca's Agents UI — copy the run command shown there.

By default the ACP server operates on your current directory; pass --workspace <path> to point at a different one.

Tools, MCP servers, skills, and git access

ACP agents don't take Paca-managed tool/MCP/skill configuration — the ACP server you run owns all of that, using your own local setup. This also means it has full, native access to whatever git/gh credentials you already have configured locally, so it can clone, commit, push, and open pull requests exactly as if you were driving it yourself in a terminal.

Since Paca doesn't inject anything into an ACP conversation, making your agent Paca-aware — so it uses Paca's MCP tools and task/doc workflow instead of local TODOs and stray markdown files — means installing that yourself into whichever CLI you're running. Paca's Agents UI walks through this for your specific agent (bridge install, skill install, MCP connection), or run it directly from a terminal:

PACA_API_URL=<your-paca-url> \
  curl -fsSL https://raw.githubusercontent.com/Paca-AI/paca/master/scripts/install-paca-skills.sh | bash

PACA_API_URL is required here — the installer fetches skill content from that instance's API (matching the exact version it's running) rather than GitHub. PACA_API_KEY (from Paca → Settings → API Keys) is optional, but also pulls in skills contributed by any plugins enabled on that instance. Run this from the same project directory you'll run the ACP bridge from — Claude Code and Gemini CLI pick the skills up globally either way, but Codex (and anything else that reads AGENTS.md) only sees them if the installer's AGENTS.md output landed in that project. See docs/guides/install-skills.md for details.

How it works

This daemon runs the OpenHands SDK's ACPAgent in its default local mode — the same as the SDK's own quickstart example — which spawns your chosen ACP CLI as a real local subprocess against the current directory. Conversation events stream back to Paca over an authenticated WebSocket (/agent-bridge/ws on your Paca instance) and are stored the same way as any other agent conversation, so the chat UI works identically regardless of where the agent actually ran.

Keep this process running for as long as you want the agent to be reachable from Paca — it reconnects automatically on a dropped connection.

Assistant text arrives in position

ACPAgent streams tool calls as they happen, but buffers the agent's own text for the entire turn and persists it only at the end, inside the FinishAction of the turn's closing event. On its own that means everything the agent said shows up after everything it did.

The daemon subscribes to the conversation's token callbacks and forwards each run of buffered text as a MessageEvent just before whatever event came next, so narration is interleaved with the tool calls it describes. The turn's closing FinishAction/FinishObservation pair is built from the join of those same chunks, so each is blanked when it would be a trailing duplicate of what already streamed — the text is still persisted, in the events it was split into. "Trailing", not just exact, because a turn retried in place after a transient ACP connection error resets the SDK's own accumulated text but not this daemon's buffer, so the surviving attempt's text is still an exact duplicate of the tail of what streamed, not necessarily the whole thing.

Metadata

Release files for paca-acp-bridge 0.12.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for paca-acp-bridge 0.12.5
File Size Uploaded Provenance
paca_acp_bridge-0.12.5.tar.gz 318.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for paca-acp-bridge 0.12.5
File Interpreter ABI Platform
paca_acp_bridge-0.12.5-py3-none-any.whl Python 3 none any Details

Total release size: 333.6 kB

Release files / paca_acp_bridge-0.12.5.tar.gz

Download URL paca_acp_bridge-0.12.5.tar.gz
Size 318.3 kB
Tags Source
SHA-256 checksum
How to use checksums
63b33a3a73728b5c891a7b65c193396d31a71726683569feda145d11a246775f
BLAKE2b-256 checksum
How to use checksums
59392306d76af437d45bba6a4eb47c9d42e16e7bf87eaadf5d2da12afdce57e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / paca_acp_bridge-0.12.5-py3-none-any.whl

Download URL paca_acp_bridge-0.12.5-py3-none-any.whl
Size 15.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1266bc0f4b7e4c6008cac892e0b205c6102a3c92bbafa42d4eef5b49fb2e4b0e
BLAKE2b-256 checksum
How to use checksums
059be15407d1d77203717362a4387b71d6b87639bb8b4d82f9c66f9b3b3ae6b7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for paca-acp-bridge 0.12.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page