Resources
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.
Environment
Section titled “Environment”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.
The ACP runtime
Section titled “The ACP runtime”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.
Retired: Teammate, Schedule and Webhook
Section titled “Retired: Teammate, Schedule and Webhook”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.
| Kind | Replacement |
|---|---|
Teammate | one conversation resumed by channel_id, which is what a Steward’s runs use; or --on e2b |
Schedule | a clock outside Managoat (a CI schedule:, a CronJob) running chant run <op> --on fountain |
Webhook | none upstream; read a run’s outcome from chant run or the conversation’s event stream |
Example
Section titled “Example”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" }],});