Commit graph

69 commits

Author SHA1 Message Date
damocles
cd9831b39e forge-avatar-sync: fix data URI prefix and add jq to service path (closes #197) 2026-05-23 00:17:38 +02:00
damocles
a94b504883 forge_notify: skip-reasons drop-list filter, configurable via agent.nix 2026-05-22 22:29:32 +02:00
damocles
56d0b02c2f nix: drop unused weston-rdp.nix (closes #263) 2026-05-22 17:30:32 +02:00
damocles
4bc5237bea harness: fix sandbox-fallback conflict with lib.mkForce (closes #247) 2026-05-22 15:24:48 +02:00
damocles
6ca72074c4 docs: move sandbox threat model to docs/security.md, add code reference 2026-05-22 12:28:04 +02:00
damocles
a6bd4cf502 harness: document sandbox threat model and credential permission requirements 2026-05-22 10:57:13 +02:00
damocles
6974634326 harness: set sandbox-fallback = true to fix nix builds in containers (fixes #196) 2026-05-22 10:51:10 +02:00
damocles
8d3be74fd2 harness: fix hive-dashboard-links state dir — drop legacy /state, use /agents/*/state 2026-05-21 23:20:13 +02:00
damocles
66c481a07a harness+dashboard: declarative dashboardLinks option (closes #191) 2026-05-21 23:20:13 +02:00
damocles
317d580405 harness: fix tea-login using getent (not in PATH) — hardcode /root 2026-05-21 23:05:13 +02:00
damocles
f762348fca harness: fix tea-login writing to /.config instead of /root/.config 2026-05-21 22:52:37 +02:00
damocles
2d3a87f545 forge-avatar-sync: rasterize SVG at 512px 2026-05-21 22:37:45 +02:00
damocles
94f5f53ca9 harness: rasterize SVG icon to PNG for Forgejo avatar upload (fixes #197) 2026-05-21 22:37:45 +02:00
damocles
03fec39405 forge_notify: flip keepSubscriptions default — agents keep, manager auto-unsubs 2026-05-21 22:33:35 +02:00
damocles
d58a3a3303 manager: keepSubscriptions = true by default 2026-05-21 22:33:35 +02:00
damocles
1adfd604b6 forge_notify: hyperhive.forge.keepSubscriptions NixOS option 2026-05-21 22:33:35 +02:00
iris
dd32774e86 weston-vnc: disable idle blank + lock screen (idle-time=0)
The VNC desktop faded to black after weston's default 300s idle
timeout, and on wake desktop-shell showed its click-to-unlock lock
screen (a green circle) — pointless for an agent desktop viewed
over /screen, and confusing for the operator (issue #180).

Add [core] idle-time=0 to the generated weston.ini. Verified against
weston 14.0.1: idle-time parses to compositor->idle_time, and
weston_compositor_wake arms the idle timer with idle_time*1000 ms;
0 ms makes wl_event_source_timer_update disarm the timer, so the
compositor never transitions to IDLE and desktop-shell never locks.

closes #180
2026-05-21 19:34:10 +02:00
damocles
00281730bb harness: sync agent icon to Forgejo user avatar on rebuild (closes #141) 2026-05-21 18:29:33 +02:00
damocles
72522be8c0 harness: add hyperhive.autoCompact option (default true, false=disable proactive compaction) 2026-05-21 17:41:53 +02:00
iris
39bd46b244 agent icon: add hyperhive.icon option + GET /icon endpoint
Foundation for the per-agent icon feature (#137).

- harness-base.nix: new hyperhive.icon option (nullable path to an
  SVG). An agent commits an SVG into its config repo and references
  it as ./icon.svg; when set it lands at /etc/hyperhive/icon.svg.
- web_ui.rs: GET /icon serves the configured SVG, falling back to the
  bundled hyperhive logo when none is set — so it always returns an
  image and consumers can hit it unconditionally.

Closes #139
2026-05-21 01:06:34 +02:00
damocles
a95ca22b49 hive-forge: single command with subverbs instead of per-verb scripts 2026-05-20 21:45:01 +02:00
damocles
0a4cde88b0 add hive-forge-tools: shell wrappers for common forge API operations 2026-05-20 21:45:01 +02:00
iris
ddd0248619 harness-base: fix python3 -c quoting inside nix string
Two consecutive single quotes ('') inside a Nix indented string (''...'')
are treated as the string-end delimiter, breaking nix evaluation.
Switch the shell -c argument from double-quotes to single-quotes so
the Python string literals use double-quotes instead, avoiding any ''
sequences in the Nix source.
2026-05-20 21:01:26 +02:00
damocles
3c6c257506 fix tea-login: write config.yml directly, always refresh token 2026-05-20 20:51:02 +02:00
iris
e50173f3e1 weston-vnc: fix PAM service name (weston-remote-access, not weston)
weston calls pam_start("weston-remote-access", ...) in libweston/auth.c.
The previous security.pam.services.weston entry created /etc/pam.d/weston
which was never consulted, so PAM fell back to the system default and
rejected all credentials. Renaming to weston-remote-access makes
pam_permit.so actually take effect.

Fixes #92
2026-05-20 20:28:32 +02:00
damocles
4bb3877460 add jq and curl to agent base packages 2026-05-20 20:14:26 +02:00
iris
fceab658f4 weston-vnc: add pam_permit.so for weston service to accept any Apple-DH credentials 2026-05-20 19:59:19 +02:00
iris
1b7d058d3c weston-vnc: restore auth-method=none ini so weston accepts empty Apple-DH credentials 2026-05-20 19:27:41 +02:00
iris
fd433d2406 weston-vnc: revert neatvnc overlay, use full TLS build with --disable-transport-layer-security 2026-05-20 19:12:40 +02:00
iris
3e5d430873 weston-vnc: fix neatvnc overlay to use -Dtls=disabled instead of removing gnutls 2026-05-20 18:02:36 +02:00
iris
a4706d793e weston-vnc: build neatvnc without gnutls to disable RSA/DH auth types 2026-05-20 17:49:26 +02:00
iris
47279f110d weston-vnc: disable VNC auth to fix 'auth failed' in browser screen viewer 2026-05-20 16:58:56 +02:00
damocles
7b3bc3a744 docs: fix stale contextWindowTokens reference in hyperhive.model option 2026-05-20 15:52:13 +02:00
damocles
d3d52349c3 model/context: move context window config to host-level hive-c0re.nix 2026-05-20 15:49:03 +02:00
damocles
7e2f13cad8 model/context: defaults in nix module, no heuristic in rust 2026-05-20 15:49:03 +02:00
damocles
770cbaccf9 model/context: per-model ctx window overrides + expose window size in /api/state 2026-05-20 15:49:03 +02:00
damocles
9064cd3c57 model/context: configurable default model + model-derived context window 2026-05-20 15:49:03 +02:00
iris
29df223650 fix weston-vnc: use /etc/hostname instead of hostname binary, disable TLS
- Replace ${pkgs.coreutils}/bin/hostname with cat /etc/hostname:
  hostname binary is in pkgs.inetutils, not pkgs.coreutils; /etc/hostname
  is always present in NixOS containers and is simpler.
- Add --disable-transport-layer-security: weston VNC requires TLS certs
  by default; since VNC is loopback-only (relayed by the harness WS proxy)
  TLS adds no security benefit and cert generation adds complexity.
2026-05-20 14:27:55 +02:00
iris
37522fd629 nix: replace weston RDP backend with VNC, add hyperhive.gui.enable option
Removes weston-rdp.nix (hyperhive.westonRdp.enable) and adds
weston-vnc.nix (hyperhive.gui.enable).

The ExecStart wrapper script computes a deterministic VNC port via
FNV-1a hash of the agent name (derived from hostname, same algorithm
as lifecycle::agent_web_port) in the range [15900, 16799], then writes
/etc/hyperhive/gui.json {"vnc_port": N, "auth": "none"} for the
harness WebSocket relay (issue #51), and execs weston with the VNC
backend + pixman renderer.

Type=simple so it can never abort nixos-container update; a
misconfigured weston degrades to a restart loop, not a blocked rebuild.

Closes #50
2026-05-20 14:01:53 +02:00
damocles
3c672ed6b2 add allowedBashPatterns NixOS option for finer-grained Bash tool approval 2026-05-20 13:35:28 +02:00
damocles
ba04a5a360 nix: hyperhive.westonRdp.enable — opt-in weston + RDP backend per agent 2026-05-20 11:26:12 +02:00
müde
85c0df2e64 harness: enable nix-command + flakes for all agents 2026-05-17 22:24:24 +02:00
damocles
ca86bcf4bd add claudePluginsAutoUpdate NixOS option, default false 2026-05-17 02:59:51 +02:00
müde
6652ae90ab tea-login: never fail switch-to-configuration
a failed tea-login oneshot used to abort `nixos-container update`
(switch-to-configuration exits 4), which blocked every rebuild
whether the agent needed tea or not. drop `set -e`, exit 0 on
every failure path (mkdir, tea login add, missing forge). also fix
the unit description, which hardcoded /state (manager-only) — sub-
agents have /agents/<name>/state.
2026-05-17 02:58:39 +02:00
müde
411cf86632 nix fmt + rustfmt sweep 2026-05-17 01:40:28 +02:00
müde
0cf120e9e9 harness: default claudeMarketplaces to anthropics/claude-plugins-official
so every agent has the official Anthropic marketplace registered
out of the box and plugin specs like 'foo@claude-plugins-official'
resolve without per-agent.nix wiring. operators add more entries
(community marketplace, etc.) or override to [] to opt out.
2026-05-17 01:38:29 +02:00
müde
597351ca4e harness: declarative claude plugin marketplaces
new `hyperhive.claudeMarketplaces` option (list of strings — URL,
path, or github:owner/repo). harness boot adds each via
`claude plugin marketplace add` before updating + installing the
configured plugins, so specs like `foo@some-marketplace` resolve
on a fresh container. idempotent: 'already exists' stderr is
treated as success.
2026-05-17 01:36:18 +02:00
müde
4a06615c5c fix /state paths: sub-agents use /agents/<name>/state, not /state
sub-agent containers post-refactor bind their state at
/agents/<name>/state (manager keeps the legacy /state — see
lifecycle.rs:751). agent.md still said /state/forge-token; corrected
to /agents/{label}/state/forge-token (template-substituted at
boot). tea-login systemd unit now walks both candidates so the same
harness module works for the manager and sub-agents.
2026-05-16 23:37:49 +02:00
müde
787c058c71 harness: install tea + auto-login from /state/forge-token
agents get `pkgs.tea` (gitea/forgejo CLI) and a tea-login oneshot
that runs `tea login add --url <hyperhive.forge.url> --token
$(cat /state/forge-token)` before the harness starts. idempotent:
exits 0 when the token file is absent (hive-forge not on) or when
~/.config/tea/config.yml already exists. new
`hyperhive.forge.url` option (default http://localhost:3000) so
operators can point at a non-default forge port. claude can now
shell out to `tea repos create`, `tea pulls create`, etc.
2026-05-16 23:35:28 +02:00
müde
6dd17864ac auto-install claude plugins at harness boot
new hyperhive.claudePlugins NixOS option (list of strings) rendered
to /etc/hyperhive/claude-plugins.json. both hive-ag3nt and hive-m1nd
shell out 'claude plugin install <spec>' for each entry once at
startup before the turn loop opens. failures log a warning but don't
abort boot.
2026-05-16 15:17:34 +02:00