Commit graph hyperhive/hive-c0re
Author SHA1 Message Date
damocles
5b442796ca feat(#2039): list matrix identities in get_agent_meta 2026-06-27 12:43:22 +02:00
damocles
601ed2429d fix(#2031): backtick paths in vacuum doc comments for clippy doc-markdown 2026-06-27 10:14:47 +02:00
damocles
49fc61212b fix(#2031): move bash-tasks + events vacuum agent-side (privsep ownership) 2026-06-27 10:14:47 +02:00
damocles
09603b77b9 feat(#2006): rename manageRootAgent option to ruthless (invert sense) 2026-06-27 00:37:32 +02:00
damocles
4fa17de387 feat(#2006): add services.hyperhive.manageRootAgent to opt out of root-agent auto-management 2026-06-27 00:37:32 +02:00
damocles
3b0a914487 feat(#2035): auto-discover dashboard-provisioned matrix accounts via token+homeserver sidecar 2026-06-27 00:30:04 +02:00
damocles
cc73bc7cd0 fix(#2030): point pending-login warning at the dashboard, not a nonexistent hivectl login verb 2026-06-27 00:26:06 +02:00
damocles
cae1dd8147 feat(#2014): hivectl open verb + Urls host request for web surfaces 2026-06-27 00:21:50 +02:00
damocles
70d1cdc859 feat(#2017): add hivectl agents list verb showing agent status + technical state 2026-06-26 22:28:23 +02:00
damocles
4407967a2f fix(#2018): reword tracker tag in agent_exists doc comment to prose (tracker-tag lint) 2026-06-26 22:13:52 +02:00
damocles
49067ad83e fix(#2018): surface permission error in hivectl agent lookup instead of misleading 'no such agent' 2026-06-26 22:00:13 +02:00
damocles
b0c89af817 chore(#1931): remove non-working hivectl migrate-stats verb 2026-06-26 18:06:46 +02:00
damocles
0d17ae69f4 docs: drop stale 'required infrastructure' framing from ensure_root_agent 2026-06-26 17:42:28 +02:00
damocles
c16eff0d5c fix(#2003): reword root auto-start comment (not 'required infra'; opt-out is a separate host setting) 2026-06-26 17:42:28 +02:00
damocles
916c0b11c5 fix(#2003): drop issue tag from inline comment (tracker-tag lint) 2026-06-26 17:42:28 +02:00
damocles
2cd089b65f fix(#2003): start root container if present-but-stopped on hive-c0re boot 2026-06-26 17:42:28 +02:00
damocles
eba637b36c docs(#1990): fix for_agent ordering doc + add # errors (argus review) 2026-06-26 01:22:20 +02:00
damocles
49db9d6e1c feat(#1990): surface pending recv() message count in get_loose_ends 2026-06-26 01:22:20 +02:00
damocles
678f50f3fb docs(#1989): add # errors doc to rebuild_agent + rebuild (argus review) 2026-06-25 23:59:54 +02:00
damocles
1f0cc010ad fix(#1989): don't relock on meta-update cascade rebuilds (was reverting the bump) 2026-06-25 00:36:52 +02:00
damocles
c68706e899 fix(#1982): migrate-stats tolerates pre-session_id dbs + skips failed agents 2026-06-24 21:33:25 +02:00
damocles
a94fb9955f fix(#1974): pair token cols by array position (argus review) 2026-06-24 21:17:42 +02:00
damocles
5393f0e7d4 feat(#1974): migrate-stats — add session.id/start_type/terminal.type + session.count (review) 2026-06-24 21:15:30 +02:00
damocles
ef6a86872d feat(#1974): hivectl migrate-stats — backfill per-agent token history to otel 2026-06-24 20:48:38 +02:00
damocles
af10a4bfef fix(otel): cumulative metric temporality + metricIntervalMs knob (real metrics-export fix) 2026-06-24 20:28:37 +02:00
atlas
5caec9c1a9 fix(forge): config-repo main is fast-forward-only (no auto force-push)
Per operator directive: a silent automatic force-push is a bug. The
config-repo merge path already never force-pushes (run_merge_config_pr
lands via ff_push_to_main, a non-force git push). So set the branch
protection's enable_force_push to false — main only ever advances by
fast-forward.

The legacy push_config mirror does force-push (it re-points the status
tags and rewinds main on a failed-build rollback); the protection now
rejects those non-ff updates, so the mirror runs best-effort until the
agent-opened PR-merge flow retires it. Docs + comments updated to match.
2026-06-23 22:37:27 +02:00
atlas
60da6c14b4 fix(forge): reword tracker-tag references in doc comments to prose
Address argus review on the config-repo PR surface: 6 issue-number tags
appeared in Rust doc comments in forge.rs; the tracker-tag lint matches
${'#'}NNN in code comments (markdown docs are exempt, doc comments are not).
Reword to prose, no behavior change.
2026-06-23 22:37:27 +02:00
atlas
2fe79aaef5 feat(#1787): make agent-configs/<n> the agent-editable, PR-merge config surface
Wires the per-agent config repo as the editable PR surface the #1838
merge handler (run_merge_config_pr) consumes, without yet retiring the
push_config force-mirror (that waits for #1838 P2 — the agent-opens-PR
MCP surface — so config changes keep working through the transition).

ensure_config_repo now, after creating agent-configs/<name>:
- adds the agent as a WRITE collaborator (can push config-change branches
  + open PRs);
- branch-protects main core-only via apply_config_repo_branch_protection:
  push + merge whitelists are core-only (only hive-c0re lands on main, via
  its verify-and-ff-push handler), operator-team approval required, the
  agent can't push main directly or self-merge.

The protection sets enable_force_push=true as a TRANSITIONAL allowance so
push_config's applied->main force-mirror keeps working until P2 retires it
(a protected branch otherwise rejects force-push). Forgejo's force-push
allowlist is deploy-keys-only — no per-user list — so this is a plain
enable_force_push toggle; only core is in the push-whitelist so only core
can force-push anyway. At P2, flip it to false and keep core in the
push-whitelist so ff_push_to_main still lands.

Agent code repos (AGENTS_ORG) are intentionally untouched — their merge
flow has no auto-merge handler yet, so switching them to core-only-merge
would strand those PRs.

All steps idempotent (runs on every spawn + startup sweep). Updated the
CONFIG_ORG doc comment + docs/forge.md to drop the "mirror-only" framing.
2026-06-23 22:37:27 +02:00
damocles
f7d84f4847 fix(#1957): persist hivectl-start running-agents snapshot in the broker kv table 2026-06-23 22:07:46 +02:00
damocles
ebaf192476 fix(#1953): gate approval cancel on submitter ownership + document submitter_of errors 2026-06-23 22:04:56 +02:00
damocles
3618399d94 fix(#1953): route approval helper-events to the submitter, not the root agent 2026-06-23 22:04:56 +02:00
damocles
21ec7dc23d feat(#1930): forward otel headers credential into agent containers via nspawn --load-credential 2026-06-23 21:16:18 +02:00
damocles
838cc9af9a feat(#1930): move otel stats export to host-level services.hyperhive.otel 2026-06-23 21:16:18 +02:00
damocles
12ed5da11a refactor(#1825): drop MANAGER_NAME special-cases in crash_watch + tombstones 2026-06-23 18:35:23 +02:00
damocles
4c53898382 fix(#1940): carry pr_number on the live approval_added event 2026-06-23 17:28:01 +02:00
damocles
6516d4282e fix(#1932): hivectl start restores only the previously-running agents 2026-06-23 17:25:15 +02:00
damocles
658812c263 feat(#1940): expose pr_number on approvalview for merge_config_pr 2026-06-23 14:50:27 +02:00
damocles
e593547063 feat: make the bootstrap/root container destroyable (drop stale destroy guard + redundant hive-priv manager allows) 2026-06-23 14:50:03 +02:00
damocles
b5420a31fd fix(#1838): drop tracker tag from dashboard merge-config-pr comment (lint) 2026-06-23 13:49:35 +02:00
damocles
96e41c807d fix(#1838): extract dispatch_rebuild_approval so dispatch stays under the clippy line cap 2026-06-23 13:42:20 +02:00
damocles
0b86295776 feat(#1838): run_merge_config_pr handler (verify pr head, ff forge main, deploy) 2026-06-23 13:12:12 +02:00
damocles
5f5626456a wip(#1838): extract deploy_applied_target shared deploy tail + dedup approve dispatch 2026-06-23 13:12:12 +02:00
damocles
449e3fcb7b wip(#1838): add MergeConfigPr approvalkind + match-site arms 2026-06-23 13:12:12 +02:00
iris
684c85686e feat(stats): add an 'all' time range to agent + hive stats
Adds a Window::All option to the per-agent stats page and the hive-wide
rollup, selectable as a new 'all' tab on both.

- hive-ag3nt (per-agent, time-bucketed): All ranges from MIN(started_at)
  to now (fallback to now on an empty table) with an adaptive bucket
  width laddered by span — hourly <=2d, daily <=90d, weekly <=2y, 30-day
  beyond — so the trend series stays bounded (~<=104 buckets) at any age.
- hive-c0re (swarm rollup, not time-bucketed): All sets from=0 so the
  aggregate covers every recorded turn across all agents.
- frontend: an 'all' button on both the agent stats and dashboard hive
  stats window selectors (createTabStrip + fetch already pass the window
  string through, so no JS change needed).

cargo check passes on both crates; FE builds clean. Fixes #1919.
2026-06-22 23:47:20 +02:00
atlas
419f4cd92a forge.rs: reword merge-primitives comment to prose (drop tracker tag from code per hive rule) 2026-06-22 22:12:26 +02:00
atlas
376de8f161 feat(#1838): forge.rs merge primitives for the PR-based config flow
Three forge-side fns + a typed error the c0re approve-handler
(run_merge_config_pr, a follow-up) orchestrates to land an operator-approved
config PR:

- pr_head_sha(repo, pr): git ls-remote refs/pull/<pr>/head — the handler's
  primary drift gate (compare against the approved sha).
- ff_push_to_main(repo, sha): the merge — ls-remote main, strict-ancestor
  pre-check (git merge-base --is-ancestor in the agent's applied repo where
  the orchestration has fetched the sha), then a non-force push sha:main. Two
  independent guards so a raced main surfaces as NotFastForward rather than
  clobbering reviewed history.
- mark_pr_merged(repo, pr, sha): POST pulls/<pr>/merge Do=manually-merged
  MergeCommitID=sha; best-effort HeadDrift detection on non-2xx via a PR-head
  re-read (the handler's pre-merge re-read is the primary gate).

ForgeMergeError {HeadDrift, NotFastForward, Other} (hand-rolled Display/Error/
From<anyhow::Error>, no new dep) so the handler can match recoverable drift
(refresh + re-verify) vs hard-fail. Core token sourced internally.

Uncalled until the handler lands (pub lib API, no dead_code). clippy -D,
unit tests, and treefmt clean.
2026-06-22 22:12:26 +02:00
damocles
4beaeea7b3 meta: non-mutating verify_commit + pre-flight eval before apply 2026-06-22 19:48:59 +02:00
atlas
2b4e928afe feat(#1867): make the internal forge mandatory (remove forge.enable)
The internal forge is the canonical store for the meta flake, every
agent's config repo, and the internal/* repos, so it can no longer be
optional. Remove the services.hyperhive.forge.enable toggle:

- hive-forge.nix: drop the `enable` option; the forge config now
  deploys gated on `services.hyperhive.enable` (it ships with hyperhive).
- hive-c0re.nix: HIVE_FORGE_URL env unconditional; forge-public-URL gate
  drops the enable check (keeps behindGateway).
- hive-gateway.nix: local /etc/hosts forge entry keyed on behindGateway.
- hive-ci.nix: drop the now-moot `forge.ci.enable requires forge.enable`
  assertion (forge is always present); reword the option doc.
- nix/docs/default.nix: drop the `forge.enable = mkForce false` stub
  (option gone); the options-doc eval stays light via hyperhive.enable.
- hive-c0re forge.rs / hivectl.rs: reword 'forge.enable = true' error
  text to 'wait for hive-c0re to start the container' (the runtime
  token-absent path is unchanged — it's a bootstrap-timing check, not
  the opt-out).
- docs/approvals.md, docs/ci.md: drop stale forge.enable references.

Migration: configs that set `services.hyperhive.forge.enable = false`
must drop the line — the forge is now mandatory.

Prereq/companion to #1838 (PR-based config flow, which assumes the forge
is always present).
2026-06-22 19:26:34 +02:00
atlas
dc3d6bc753 fix(#1897): treat empty HYPERHIVE_HIVE_DOMAIN as unset in HiveDomain
Per argus review: std::env::var(..).ok() yields Some("") for an empty
env value, so require_hive_domain would 'succeed' with an empty domain
and emit invalid nix (swarm.peers."" = …). Filter empty so it resolves
to None → the CLI's clear 'domain unset' error fires instead.
2026-06-22 19:07:56 +02:00
atlas
8ea19b3b12 feat(#1897): always auto-fill the hive domain — drop the --domain override
Per operator review (#1899): the hive's own domain should never be
typed by hand. Remove the --domain flag from peer-config and wg init
entirely; both now resolve it from the daemon (HostRequest::HiveDomain).
peer-config errors with a clear hint if the daemon can't answer; wg init
prints the peer block best-effort (skips it, still enables the mesh, if
unresolved). Regenerated docs/tools/hivectl-cli.md.
2026-06-22 19:07:56 +02:00