`services.hyperhive.agent.matrix.enable` was a second source of truth for a fact the account set already carried: after ①-③ the hive-internal `main` account is an ordinary `matrixAccounts` entry, so "does this agent have matrix" and "does this agent have an account" were the same question asked twice, with the boolean able to disagree. The option is gone and a non-empty `matrixAccounts` now gates the daemon unit, its token path-watcher and the injected `extraMcpServers.matrix` entry. That is only a real condition because `matrixAccounts.main` is itself gated: it is declared when `matrix.url != null`, never unconditionally. A `main` with no homeserver is an account the daemon can never log in as, so declaring one always would have made the signal trivially true and turned matrix on for every agent in every hive. With the URL gate, the empty set is reachable exactly for an agent the hive gave no homeserver and whose operator declared no account of its own — the state the old `enable = false` expressed. Assertions: "extras require enable" is deleted, having become the definition of the thing it checked (an external-only account with its own homeserver is now rendered rather than rejected). `main.tokenFile` stays pinned, re-guarded on `? main` instead of on the flag, since `main` is absent whenever the URL is null and an unguarded index would throw there. Both spellings of the option get `mkRemovedOptionModule`, following ../host-modules/deploy.nix's registrationTokenFile pair rather than a silent delete: the definition whose meaning changes is `false`, and left undeclared it would be ignored and hand the agent the tools its operator turned off. Failing the eval with the replacement spelling is the only outcome that cannot. module-eval gains the three arms — URL, nothing, external-only — with the middle one carrying why it exists: it is the only thing in the suite that would notice `main` becoming unconditional again. Refs #4475
213 lines
8.1 KiB
Nix
213 lines
8.1 KiB
Nix
# Deprecation shims for the agent tier's old option namespace.
|
|
#
|
|
# Every per-agent option used to live at the top level, `hyperhive.<name>`,
|
|
# while the host tier has always been under `services.hyperhive.*`. The agent
|
|
# tier moved to `services.hyperhive.agent.<name>`; these entries keep an
|
|
# existing `agent.nix` evaluating (with a deprecation warning) against the old
|
|
# spelling.
|
|
#
|
|
# ⚠️ One entry per LEAF, not per namespace. A single entry for a parent path
|
|
# only covers its children when the parent is a submodule-typed option; every
|
|
# nested option here (`user`, `mcp`, `otel`, …) is a plain attrset of
|
|
# declarations instead, so each leaf needs its own line — the same reason
|
|
# `../host-modules/deploy.nix` renames the CI runner's knobs one by one.
|
|
{ lib, ... }:
|
|
{
|
|
imports = [
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "_bashEnvFragments" ]
|
|
[ "services" "hyperhive" "agent" "_bashEnvFragments" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "allowedRecipients" ]
|
|
[ "services" "hyperhive" "agent" "allowedRecipients" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "autoCompact" ]
|
|
[ "services" "hyperhive" "agent" "autoCompact" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "availableModels" ]
|
|
[ "services" "hyperhive" "agent" "availableModels" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "backendEnvironmentFile" ]
|
|
[ "services" "hyperhive" "agent" "backendEnvironmentFile" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "cargo" "shortMessages" ]
|
|
[ "services" "hyperhive" "agent" "cargo" "shortMessages" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "claudeCodePath" ]
|
|
[ "services" "hyperhive" "agent" "claudeCodePath" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "claudeMarketplaces" ]
|
|
[ "services" "hyperhive" "agent" "claudeMarketplaces" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "claudeMemoryMaxBytes" ]
|
|
[ "services" "hyperhive" "agent" "claudeMemoryMaxBytes" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "claudePlugins" ]
|
|
[ "services" "hyperhive" "agent" "claudePlugins" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "claudePluginsAutoUpdate" ]
|
|
[ "services" "hyperhive" "agent" "claudePluginsAutoUpdate" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "dashboardLinks" ]
|
|
[ "services" "hyperhive" "agent" "dashboardLinks" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "docs" "enable" ]
|
|
[ "services" "hyperhive" "agent" "docs" "enable" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "docs" "source" ]
|
|
[ "services" "hyperhive" "agent" "docs" "source" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "effortLevel" ]
|
|
[ "services" "hyperhive" "agent" "effortLevel" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "extraMcpServers" ]
|
|
[ "services" "hyperhive" "agent" "extraMcpServers" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "extraWebProxies" ]
|
|
[ "services" "hyperhive" "agent" "extraWebProxies" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "forge" "url" ]
|
|
[ "services" "hyperhive" "agent" "forge" "url" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "frontend" "dist" ]
|
|
[ "services" "hyperhive" "agent" "frontend" "dist" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "frontend" "extraFiles" ]
|
|
[ "services" "hyperhive" "agent" "frontend" "extraFiles" ]
|
|
)
|
|
# `frontend.mergedDist` moved with the rest and deliberately has NO entry:
|
|
# it is `readOnly` and ./frontend.nix already defines it, and a rename
|
|
# module contributes a *definition* to its target — so a shim for it makes
|
|
# every evaluation fail with "set multiple times". Nothing could have set
|
|
# it anyway; a reader of the old path now gets "option does not exist",
|
|
# which says the same thing sooner. Same reasoning as the `hostUsersFile`
|
|
# exclusion in ../host-modules/deploy.nix.
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "github" "enable" ]
|
|
[ "services" "hyperhive" "agent" "github" "enable" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "gui" "enable" ]
|
|
[ "services" "hyperhive" "agent" "gui" "enable" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "gui" "vncPort" ]
|
|
[ "services" "hyperhive" "agent" "gui" "vncPort" ]
|
|
)
|
|
(lib.mkRenamedOptionModule [ "hyperhive" "hiveName" ] [ "services" "hyperhive" "agent" "hiveName" ])
|
|
(lib.mkRenamedOptionModule [ "hyperhive" "icon" ] [ "services" "hyperhive" "agent" "icon" ])
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "logs" "queryUrl" ]
|
|
[ "services" "hyperhive" "agent" "logs" "queryUrl" ]
|
|
)
|
|
# `matrix.enable` is deliberately absent from this list: the option it
|
|
# renamed to no longer exists, and a rename pointing at an undeclared
|
|
# option breaks evaluation for everyone. Both of its spellings are
|
|
# `mkRemovedOptionModule` in ./default.nix instead.
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "matrix" "url" ]
|
|
[ "services" "hyperhive" "agent" "matrix" "url" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "matrixAccounts" ]
|
|
[ "services" "hyperhive" "agent" "matrixAccounts" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "mcp" "bashHttpPort" ]
|
|
[ "services" "hyperhive" "agent" "mcp" "bashHttpPort" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "mcp" "httpPort" ]
|
|
[ "services" "hyperhive" "agent" "mcp" "httpPort" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "mcp" "matrixHttpPort" ]
|
|
[ "services" "hyperhive" "agent" "mcp" "matrixHttpPort" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "mcp" "subagentHttpPort" ]
|
|
[ "services" "hyperhive" "agent" "mcp" "subagentHttpPort" ]
|
|
)
|
|
(lib.mkRenamedOptionModule [ "hyperhive" "model" ] [ "services" "hyperhive" "agent" "model" ])
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "otel" "debug" ]
|
|
[ "services" "hyperhive" "agent" "otel" "debug" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "otel" "enable" ]
|
|
[ "services" "hyperhive" "agent" "otel" "enable" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "otel" "endpoint" ]
|
|
[ "services" "hyperhive" "agent" "otel" "endpoint" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "otel" "extraResourceAttributes" ]
|
|
[ "services" "hyperhive" "agent" "otel" "extraResourceAttributes" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "otel" "metricIntervalMs" ]
|
|
[ "services" "hyperhive" "agent" "otel" "metricIntervalMs" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "otel" "protocol" ]
|
|
[ "services" "hyperhive" "agent" "otel" "protocol" ]
|
|
)
|
|
(lib.mkRenamedOptionModule [ "hyperhive" "packages" ] [ "services" "hyperhive" "agent" "packages" ])
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "queue" "natsUrl" ]
|
|
[ "services" "hyperhive" "agent" "queue" "natsUrl" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "queue" "tokenEndpoint" ]
|
|
[ "services" "hyperhive" "agent" "queue" "tokenEndpoint" ]
|
|
)
|
|
# `queue.clientIdFile` / `queue.clientSecretFile` are excluded for the
|
|
# `mergedDist` reason above: both are `readOnly`, so a shim's definition
|
|
# collides with the option's own and breaks every evaluation. They are
|
|
# derived paths no agent config could have set.
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "swarmName" ]
|
|
[ "services" "hyperhive" "agent" "swarmName" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "useApiKey" ]
|
|
[ "services" "hyperhive" "agent" "useApiKey" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "user" "gid" ]
|
|
[ "services" "hyperhive" "agent" "user" "gid" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "user" "name" ]
|
|
[ "services" "hyperhive" "agent" "user" "name" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "user" "passwordlessSudo" ]
|
|
[ "services" "hyperhive" "agent" "user" "passwordlessSudo" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "hyperhive" "user" "uid" ]
|
|
[ "services" "hyperhive" "agent" "user" "uid" ]
|
|
)
|
|
];
|
|
}
|