Agent archetypes
An archetype is a named agent setup: settings to create the agent with, and a NixOS module its container runs. The swarm UI's create form lists the archetypes the swarm knows. Picking one fills the form's permissions, resource caps and inference fields from it, and you can still change each field before you create the agent.
An agent created from an archetype has no agent-configs/<name> repo of its
own. Its hive builds it from the archetype's module, so every agent of that
archetype runs the same configuration. To change what it runs, change the
archetype. Picking "none" creates a custom agent, with its own config repo.
The built-in archetypes
The hyperhive flake ships these:
| archetype | what it sets |
|---|---|
reviewer |
permissions messaging, inbox, execution: the default set without meta. With execution it can run hive-forge, git and other commands. |
android-dev |
installs android-tools (adb, fastboot), Gradle and a JDK; default permissions. |
Where an archetype comes from
A flake declares archetypes in its hyperhiveArchetypes output:
hyperhiveArchetypes.reviewer = {
module = { };
meta = {
description = "Reviews what it is sent.";
permissions = [ "messaging" "inbox" "execution" ];
limits = { memory_max = "4G"; };
inference = { effort = "high"; };
};
};
metais plain data: no derivation, no path, no function. The swarm evaluatesmetaalone.- Every archetype needs a
description.permissions,limitsandinferenceare optional and take the shapesPOST /api/agentstakes. The swarm ignores other keys inmeta. moduleis a NixOS module for the agent's container. A hive imports it into each agent created from the archetype.
Today the swarm reads one flake: the hyperhive source the builder's host runs, so only the built-ins appear.
How the list stays current
-
swarm-controller asks the builder for the list on the queue subject
$SWARM.builder.archetypesonce the queue connects, and every 10 minutes after that. -
The builder evaluates the
metaof eachhyperhiveArchetypesentry on its own hyperhive and nixpkgs sources, and answers with the JSON or the last linesnixprinted:nix eval --json <hyperhive>#hyperhiveArchetypes \ --apply 'builtins.mapAttrs (_: a: a.meta)' -
The controller checks each archetype the way
POST /api/agentschecks its settings and stores the result in theagent-archetypesKV bucket, under the keyhyperhive, when it differs from the stored one. The list leaves out an archetype that fails the check, and its name and reason go into the record'srefusedmap and the controller's journal. -
GET /api/archetypesanswers from that record, and the create form lists from it.
A builder host redeploy can change the list. The next pass, within 10 minutes, picks it up. When no builder answers, the controller keeps the stored list and logs a warning on each pass. A swarm with no builder enabled shows no archetype select.
The stored value:
{
"source": "/nix/store/…-hyperhive-flake-source",
"archetypes": {
"reviewer": {
"description": "…",
"permissions": ["messaging", "inbox", "execution"]
}
},
"refused": { "broken": "limits: …" }
}
Creating an agent from an archetype
The create form sends the picked archetype as archetype on
POST /api/agents, { "source": "hyperhive", "name": "reviewer" }. The
controller refuses with 400 an archetype the stored list doesn't hold, then:
- stores the choice in the
agent-archetypeKV bucket, keyed by agent name, next to the agent's permissions, caps and inference; - queues the creation graph without
CreateRepo,AddRepoMemberandInitAgentConfigRepo. Identity, forge user, docs read, the mints and the wanted state stay, and the deploy waits on those alone.
Destroying the agent deletes its key.
Every hive may read any key of the bucket
($JS.API.DIRECT.GET.KV_agent-archetype.>) and write none; only the
controller writes it.
Deploy swarm-nats-auth before the hives: every provision reads the
agent's key, and a hive whose queue connection predates the grant gets a
refused read, so its Provision nodes fail until it reconnects.
The hive reads the agent's key when it provisions the agent and on every
rebuild, and keeps the last value read in
/var/lib/hyperhive/swarm-agent-archetypes.json, so the meta flake renders
without the queue. When the read fails, a rebuild keeps the value
stored there. For an archetype agent the hive:
- seeds no
proposedorappliedrepo, and gives the meta flake noagent-<name>input.mkAgentimportshyperhive.hyperhiveArchetypes.<name>.modulein place of the agent's own flake, and setsHIVE_ARCHETYPEin the harness environment; - relocks no agent input on a rebuild or a meta-input bump, and ignores the
revof a swarm deploy request; - mounts an empty
/agents/<name>/config/.
The agent's system prompt says it has no config repo and names its archetype.
The hive takes the module from its own hyperhive input. When that input
predates the archetype, the agent's build fails with
this hive's hyperhive input has no archetype <name>. Update the hive's
hyperhive input to fix it.