Agent Library
For AI Agents: the Markdown version of this page is at https://ankole.agentbull.com/en-US/docs/agent-library/index.md. The documentation index is at https://ankole.agentbull.com/en-US/llms.txt.
The Agent Library is the answer to one question: what is this agent actually allowed to do? It is the catalog of skills and Agent Plugins a deployment instance ships, plus the per-agent state that decides which of them are on for a given agent. This page maps that model against the real code in Ankole.AIAgent.Library.
The decisive property, stated up front: the skills and plugins themselves are filesystem bundles, not database rows. PostgreSQL holds enablement, registry semantics, and file observations — sparse per-agent overrides on top of instance-wide defaults. The bytes and versions stay in the instance library; the database only records who has what turned on.
Two kinds of capability
The library keeps two related but distinct things:
- A Skill is a filesystem bundle, identified by a
SKILL.md. Skill names are lowercase, start with a letter, and use only letters, digits,_, and-, up to 64 characters. A skill is eitherbuiltin(shipped with the app image, synced fromapp/library/skills) orinstalled(agent-installed under worker-visible storage). Theagent_skillsrow records enablement, source kind, content hash, and sync time — it is explicitly not a file-content table. - An Agent Plugin is a standard Codex Plugin package, plus Ankole’s optional
workspace-template/initialization directory. Package bytes and versions live in the instance library; PostgreSQL stores only sparse per-agent enablement overrides. Plugin identifiers follow the same format rules as skill names.
The two are connected: an Agent Plugin can carry skills, and skill rows record their agent_plugin_id for parent-enablement and catalog presentation. But Agent Plugin membership is independent metadata — it does not change how a skill is loaded.
Enablement: default, then override
An agent’s effective capabilities are resolved by walking the catalog with two layers:
- Instance-wide defaults —
default_enabledon each skill, and the global plugin defaults an operator sets. - Per-agent overrides —
enabled_overrideon a skill row, or an Agent Plugin override scoped to one agent.
The resolution is the effective_enabled field the capability endpoints return: take the default, apply the override if one exists. A capability with no override inherits the default; a capability with an override honors the override. The catalog is bounded at 256 plugins, so the resolution stays cheap and the surface stays legible.
This is the model the Console’s Agent Library capabilities routes expose: set the global default, then narrow or widen it per agent.
Recall-only Skill discovery
A shipped standalone Skill or Agent Plugin member can declare brain-recall-only: true. Shipped Skills share one global name space, so Plugin membership does not change the Skill name. Agent-installed Skills do not participate in this mode.
The Agent Library sends the Worker the complete effective Skill set. Ordinary Skills enter the model-visible Skill catalog. Recall-only Skills stay in the loadable set for skill_view, but the catalog omits them. A library sweep projects only their name, description, and tags into Brain as lightweight records at lazyload-agent-skills/<skill-name>; Skill bodies, resources, and Agent-specific lessons remain in their owning file and database paths.
The projection is shared and remains present when an Agent disables a Skill. Brain queries and skill_view both apply that Agent’s current effective Plugin and Skill state, so a disabled record cannot consume a retrieval slot or be loaded. Re-enabling the capability restores the existing projection.
Durable Agent documents and Skill lessons
Alongside capabilities, the library holds the agent’s own writable documents and Agent-specific Skill guidance:
- Durable Agent documents are
mission,soul,design, andconfidentiality_policy, the foursource_kindvalues accepted by the container table. The first two define responsibility and behavior.designstores the design system for visual work.confidentiality_policyguides audience selection when the Agent writes to Brain. They live inagent_library_container_entriesand use content hashes. - Skill lessons are immutable semantic rows in
agent_skill_lessons. Each row belongs to one Agent and one Skill, and records its author, evidence, lease state, and retirement history. Dreaming writes evidence-backed leased lessons. An operator can add a human lesson with no lease or retire any lesson.
A Skill view reads the Skill files and renders eligible lessons under Agent-specific additions. The base SKILL.md does not change. See Skill lessons for the evidence, review, and delivery rules.
Sync: keeping the registry honest
Because skills are filesystem bundles, the database registry has to track the filesystem. Two sync paths do that:
sync_builtin_skillsreconciles theapp/library/skillstree against the builtin skill rows, returning whether anything changed, the content hash, and the counts of skills and files. It runs from the app image, so a new image can add or update builtin skills on the next sync.sync_agent_skillsreconciles one agent’s installed skills against what the worker-visible storage actually shows, andreplace_installed_skill_observationswrites the observed file set. A skill that disappears from storage is reflected in the registry; a skill that appears is picked up.
Sync is read-and-reconcile, not push-and-pray. The content_hash is what makes a sync idempotent: the same tree produces the same hash, and only a real change writes a row.
The operator surface
The Console routes already covered in the Console page drive this model. The capability routes, in particular:
| Method | Path | Purpose |
|---|---|---|
GET |
/agent-library/capabilities |
Global catalog with defaults |
PUT |
/agent-library/agent-plugins/:id |
Set a plugin’s global default |
PUT |
/agent-library/skills/:id |
Set a skill’s global default |
GET |
/agents/:agent_uid/library-capabilities |
One agent’s effective capabilities |
PUT |
/agents/:agent_uid/library-capabilities/agent-plugins/:id |
Override a plugin for one agent |
PUT |
/agents/:agent_uid/library-capabilities/skills/:id |
Override a skill for one agent |
GET |
/agents/:agent_uid/library-documents |
List the agent’s mission/soul/design/confidentiality policy |
PUT |
/agents/:agent_uid/library-documents/:document_kind |
Set one document |
GET |
/agents/:agent_uid/skill-lessons |
List active and retired Skill lessons |
POST |
/agents/:agent_uid/skill-lessons |
Add a human Skill lesson |
POST |
/agents/:agent_uid/skill-lessons/:lesson_id/retire |
Retire a Skill lesson |
Reading /agents/:agent_uid/library-capabilities triggers an agent-skill sync, so what the operator sees is the registry reconciled against current storage — not a stale snapshot.
What the Agent Library is not
It is not a marketplace and not a hot-load system. The skills and plugins are trusted, first-party bundles that ship with the deployment instance or are installed into worker-visible storage; there is no third-party discovery, no isolation machinery beyond what the worker already provides. The database is not the source of the skill bytes — those live on the filesystem, and the registry only tracks what it sees. And the library is not where the model’s tools are defined; it is where the operator decides which capabilities an agent may bring to a turn. Crossing from “enabled” into “actually invoked” is the Agent Computer Worker’s job, at turn time.
Next steps
- For the routes that configure the library, read the Console page.
- For Agent-specific process guidance, read Skill lessons.
- For the worker that runs an enabled skill during a turn, read the Actor Runtime page.
- For the agent Principal a library is scoped to, read Principal and AuthZ.