Skip to content

Add a Fountain engine: fountain acp as an ACP driver - #1

Closed
jhgaylor wants to merge 2 commits into
mainfrom
feat/fountain-driver
Closed

Add a Fountain engine: fountain acp as an ACP driver#1
jhgaylor wants to merge 2 commits into
mainfrom
feat/fountain-driver

Conversation

@jhgaylor

Copy link
Copy Markdown
Owner

Adds Fountain as an OpenMausBot engine. Fountain runs agents in sandboxes on a hosted instance; its CLI's fountain acp speaks ACP on stdio, so this is one more AcpSupport on the existing core (server/drivers/acp/fountain.ts).

How it maps

  • The model picker chooses a Fountain agent (fountain agent list --json, ACP-capable runtimes only) → fountain acp --agent <id>. A failed listing keeps the last catalog.
  • ACP session id = Fountain conversation id, so the resume cursor core already stores survives restarts/machines (session/load replays from the server).
  • fountain acp ignores mcpServers/cwd, so the support declares no MCP integrations. New core hook AcpSupport.mcp (defaults to today's all-true) makes that possible; spawnArgs now also receives the child env so FOUNTAIN_ACP_VAULT / FOUNTAIN_ACP_ENVIRONMENT become --vault / --environment per instance.
  • Credentials are the CLI's: sign-in probed with fountain auth whoami (or trusted from FOUNTAIN_API_KEY); no authenticate RPC is sent.

Registered in builtIn.ts + default fleet as custom-only (beside qwen/hermes), provider mark, docs/fountain.md.

Tests: server/drivers/acp/fountain.test.ts (21) against the shared fake ACP CLI — catalog parsing, argv/env plumbing, sign-in probe, canonical event sequence. Full vitest run server/ 784 passed; pnpm typecheck clean. Verified live against a real instance with server/testing/live-fountain.ts: 24-agent catalog, one turn streamed to turn.completed, conversation visible in fountain conv list.

Not covered (by design, documented): approval cards (fountain#643 — fountain acp doesn't forward permission requests yet), computer/connectors/peer comms, effort control.

🤖 Generated with Claude Code

jhgaylor and others added 2 commits August 19, 2026 00:37
Fountain (BinaryBourbon/fountain) runs agents in sandboxes on a hosted
instance; its CLI's `fountain acp` speaks the Agent Client Protocol on
stdio, so it slots into the existing ACP driver core as one more support
(server/drivers/acp/fountain.ts). Three things are different from every
other ACP harness, and the support encodes each:

- The model picker chooses a Fountain *agent*: an agent already carries
  its model, runtime, skills, MCP servers and environment. The catalog is
  `fountain agent list --json` filtered to ACP-capable runtimes, and the
  pick becomes `fountain acp --agent <id>`. A failed listing keeps the
  last catalog instead of emptying the picker.
- The ACP session id is the Fountain conversation id, so the resume
  cursor core.ts already stores survives restarts and machines.
- `fountain acp` ignores mcpServers/cwd (the agent runs elsewhere), so
  the support declares no MCP integrations. That needed a small core
  hook — AcpSupport.mcp — so a bot is never told it has a computer or
  peers its driver cannot mount. spawnArgs also now receives the child
  env, so per-instance knobs (FOUNTAIN_ACP_VAULT / _ENVIRONMENT →
  --vault / --environment) can become flags.

Credentials stay the CLI's: sign-in is probed with `fountain auth
whoami` (or trusted from FOUNTAIN_API_KEY), and no authenticate RPC is
sent — the adapter advertises none when the CLI is signed in.

Registered in builtIn.ts and the default fleet as a custom-only engine
beside qwen/hermes, with a provider mark, docs/fountain.md, and a test
file that runs the driver against the shared fake ACP CLI (argv, env
plumbing, catalog, sign-in probe, canonical event sequence). Verified
live against a real instance: 24-agent catalog, one turn streamed to
turn.completed, the conversation visible in `fountain conv list`.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
access: "custom" routes the picker to the local-models (inject) pane, where a
catalog of hosted agents never lists — the picker showed "No local models
found". The agents run on a hosted instance and the catalog is a real one,
so the engine is subscription/cloud-rail like claude and codex.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@jhgaylor

Copy link
Copy Markdown
Owner Author

Superseded by upstream PR milind-soni#245 (same branch).

@jhgaylor jhgaylor closed this Aug 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant