Decisions

Why lnk-hermes runs Hermes Agent the way it does. Link's own decisions about harnesses are on its Agents Decisions page.

Why carry its state over ASP?

Hermes keeps its own sessions and memory files, and its hub reads and writes them where Hermes does: its SessionDB and its home's files. A switch takes them out whole and puts what happened elsewhere in as Hermes's own sessions, so no summary or injected history stands in for a conversation.

When does Hermes get its packages?

As it's set up. Hermes installs its Anthropic SDK and each connection's library from PyPI the first time it needs them. Left to that, the running harness would need a package registry, which a list of hosts limited to its model and connections refuses. So its adapter's configure, in the same sandbox as the install, installs those its settings need, with Hermes's own installer for them. Its code goes in its home with --dir even for root, whom its installer would otherwise give /usr/local, outside the sandbox and shared by every agent.

How does Hermes use a local model?

As a custom provider at the runtime's /v1 address, for any local runtime lnk model list finds, such as Ollama, LM Studio and llama.cpp.

How do your connections reach Hermes?

Over ACP, the Agent Client Protocol, as they reach every harness: Link's bridge, then the harness hub in lnk-hermes serve, then hermes acp over stdio. Hermes runs none of its channels, so one bot's credential has one reader: a switch or a move never has two harnesses polling it. Each chat is a Hermes session, kept by the hub, whose key is Link's key for the start, which only the bridge holds.

Its tools over ACP

hermes acp runs the editor's toolset by default, a coding agent's. Link sets its ACP's toolset (platform_toolsets.acp) to hermes-api-server, the tools its gateway's agent had, so it keeps them, its MCP servers with them.

Who runs its scheduled jobs?

Link's scheduler, as for every harness whose contract says from: a schedule's message reaches Hermes over ACP, said as the schedule's, and its answer goes where the schedule says. Hermes's own scheduler runs in its gateway, which Link doesn't run, so its cron tools are off (agent.disabled_toolsets: [cronjob]): a job made there would never fire.

How does Hermes get a secret in its config?

By variable: the model's address, which holds the proxy's secret for a model on this machine, is in its .env (LNK_HERMES_MODEL_URL), and its config names it (model.base_url: ${LNK_HERMES_MODEL_URL}), which Hermes reads as it loads its config; so hermes config set never has a secret on its command line, where every user of the machine sees it. Hermes leaves a variable that isn't set as it's written, so nothing waits on the order .env and its config change in. Its tools' addresses are written into config.yaml itself (600).