Phase 3 of #273. Container plumbing for the bundled frontend dist: - flake.nix overlay: `pkgs.hyperhive-frontend` exposed for the agent / manager containers (mirrors the existing `pkgs.hyperhive` pattern); module argument `hyperhiveFrontend = system: self .packages.${system}.frontend` threads the package into the host hive-c0re module without forcing operators to apply the overlay on their host pkgs. - `services.hive-c0re.frontend` option: pinned to the flake's frontend package by default, overridable for custom dashboard SPAs. The hive-c0re systemd service gets `HIVE_STATIC_DIR = ${cfg.frontend}/dashboard` — the Rust binary will pick it up in Phase 4. - `hyperhive.frontend.dist` option: per-container, defaults to `pkgs.hyperhive-frontend`. Override to ship a fully custom agent SPA (advanced; the default + extraFiles flow handles the common 'add files' case). - `hyperhive.frontend.extraFiles` option: attrsOf submodule (mirroring the `hyperhive.extraMcpServers` shape per damocles' request so existing #322-style assertions keep their grip). Each entry has `source` (path relative to agent.nix) and `target` (URL/disk prefix within the merged static tree, defaulting to the attribute name). Operator-named example: the bitburner agent drops `bitburner-dist` into `/bitburner/` alongside the default agent UI at `/`. - `hyperhive.frontend.mergedDist` (readOnly): the runCommand derivation that composes `agent/` from the default dist plus every `extraFiles` entry. Aborts on overwrite so a filename collision becomes a build error rather than a silent dist swap. agent-base.nix + manager.nix set their respective systemd service `HIVE_STATIC_DIR` to this merged path. Until Phase 4 lands, the env var is set but unused — the Rust binaries still serve assets via `include_str!`. The cutover happens in the next commit on this branch. Refs #273.
31 lines
1.2 KiB
Nix
31 lines
1.2 KiB
Nix
{ pkgs, config, ... }:
|
|
{
|
|
imports = [ ./harness-base.nix ];
|
|
|
|
systemd.services.hive-ag3nt = {
|
|
description = "hive-ag3nt harness";
|
|
wantedBy = [ "multi-user.target" ];
|
|
after = [ "network.target" ];
|
|
# systemd units get a minimal PATH by default and don't inherit
|
|
# `environment.systemPackages`. Pointing at `/run/current-system/sw`
|
|
# gives the harness (and any tools claude shells out to via Bash)
|
|
# access to everything declared in `systemPackages` — including
|
|
# anything an agent adds to its own `agent.nix` — without having to
|
|
# touch the service definition.
|
|
path = [ "/run/current-system/sw" ];
|
|
environment = {
|
|
SHELL = "${pkgs.bashInteractive}/bin/bash";
|
|
# Path to the merged agent static dist. The harness serves this
|
|
# via `tower_http::ServeDir` for any request it doesn't route to
|
|
# an API endpoint. `mergedDist` is the agent-default dist with
|
|
# `hyperhive.frontend.extraFiles` layered on top — both come
|
|
# from harness-base.nix.
|
|
HIVE_STATIC_DIR = "${config.hyperhive.frontend.mergedDist}";
|
|
};
|
|
serviceConfig = {
|
|
ExecStart = "${pkgs.hyperhive}/bin/hive-ag3nt serve";
|
|
Restart = "on-failure";
|
|
RestartSec = 2;
|
|
};
|
|
};
|
|
}
|