Skip to content

Resources

llms.txt lists every page for an agent

The lexicon types three kinds, the three fountain apply reconciles: Environment, Vault and Agent. Types are generated from a pinned Managoat release’s OpenAPI spec (v0.29.0), so they track the real API. Conversations are deliberately not a resource: they are runs with a status lifecycle, modeled as ops.

A reusable sandbox baseline: packages, repos, setup script, env vars, encrypted secrets, and the networking policy. networking_type is "unrestricted" | "limited"; under limited, egress is restricted to networking_config.allowed_hosts, and with no hosts (or an empty list) the sandbox denies all egress. FTN010 requires the networking intent to be explicit.

setup_timeout_seconds bounds how long the setup script may run, from 1 to 900 seconds with a default of 120. FTN024 checks the range at build, since the generated type is a plain number. Changing the value invalidates the environment’s checkpoints.

secrets is a list of { key, value } pairs, and Vault takes the same field. Neither request schema has it; it comes from fountain’s manifest format, and fountainApply sends it as the inline secrets map. Values are write-only, so write a reference that resolves at build, never a literal (FTN001).

A bag of env-var overrides selected at conversation create. Vault values win on key collision with the environment, which is why agents can carry a vault allowlist upstream (fountain#136). allowed_vault_ids on an Agent is three-state: null allows any tenant vault, [] forbids all, a list is an allowlist.

A named, re-runnable agent configuration: model, runtime, skills (inline SKILL.md or GitHub-sourced with a ref pin), MCP servers, and an optional environment reference, typed, so a dangling reference is a build error instead of a 422 at apply time.

sandbox_mode is still in the spec, deprecated. Every conversation gets a sandbox of its own, and Managoat refuses persistent with 422. FTN025 reports it at build. It also reports a sandbox_provider of daytona or runner and the opencode runtime, which Managoat also removed. For a long-lived machine, resume one conversation by channel_id. Its sandbox keeps its disk across park and wake.

runtime: "acp" launches runtime_command inside the sandbox and speaks the Agent Client Protocol to it. Both are in the spec from fountain v0.21.0, which made model optional for that runtime alone. FTN023 keeps the two together. FTN016 rejects a model on an acp agent, because the model is whatever the command on the other end of the protocol chooses, and rejects an agent on any other runtime that has no model, which fountain refuses at apply.

Managoat removed the team, its scheduler and webhooks (managoat/managoat#2793). The three classes are still exported so an older project builds far enough to be told what replaced them: declaring one fails the build with FTN025, and the serializer never writes it to the manifest.

KindReplacement
Teammateone conversation resumed by channel_id, which is what a Steward’s runs use; or --on e2b
Schedulea clock outside Managoat (a CI schedule:, a CronJob) running chant run <op> --on fountain
Webhooknone upstream; read a run’s outcome from chant run or the conversation’s event stream
import { Environment, Agent } from "@intentius/chant-lexicon-fountain";
export const conciergeEnv = new Environment({
name: "concierge-env",
networking_type: "limited",
networking_config: { allowed_hosts: ["registry.npmjs.org", "github.com"] },
metadata: { "managed-by": "chant" },
});
export const researcher = new Agent({
name: "researcher",
model: "anthropic/claude-sonnet-4-6",
runtime: "claude",
environment: conciergeEnv,
skills: [{ source: "vercel-labs/agent-skills", ref: "main" }],
});

chant