Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
187bb51
Re-key managed runtimes by relay pair
Jul 19, 2026
5be38c6
Add pair runtime lifecycle commands
Jul 19, 2026
1f705da
Discover agent relay memberships with bounded auth
Jul 19, 2026
065fdf7
Require runtime marker before receipt protection
Jul 19, 2026
e18707b
Ingest pair-scoped runtime lifecycle frames
Jul 19, 2026
ea5f796
Harden pair receipt and lifecycle validation
Jul 19, 2026
279d312
Replace restored pair runtime before respawn
Jul 19, 2026
4608f72
feat(acp): model lazy pool lifecycle
Jul 19, 2026
772d9ce
feat(desktop): add pair-scoped agent runtime UI
Jul 19, 2026
093e0d6
fix(desktop): align managed runtime identity contract
Jul 19, 2026
d95b6c4
test(desktop): expose managed runtime pair selectors
Jul 19, 2026
e757959
feat(desktop): route managed runtime lifecycle frames
Jul 19, 2026
0d38c61
fix(desktop): handle dropped lifecycle frames
Jul 19, 2026
6cd7b5b
test: add agents-everywhere live harness fixtures
Jul 19, 2026
22dbdc5
Fix restore eager-spawn + startup race (F1/F2)
Jul 19, 2026
14b2271
fix(desktop): keep pair runtime lifecycle authoritative
Jul 19, 2026
873ef6e
fix(desktop): keep pair runtime presence honest
Jul 19, 2026
2a0ae2b
test: exercise agents everywhere across two relays
Jul 19, 2026
635511e
fix(desktop): stop every runtime pair for an agent
Jul 19, 2026
8d6fa16
fix(desktop): preserve runtime pairs across bounces
Jul 19, 2026
7207394
fix(desktop): retain pair restart snapshots
Jul 19, 2026
d702701
fix(desktop): keep pair runtime tracked when stop fails
Jul 20, 2026
22c647d
fix(desktop): scope sidebar agent controls to community
Jul 21, 2026
6c57258
fix(desktop): make agent status, stop, and bootstrap pair-scoped
matt2e Jul 21, 2026
6e748dc
fix(desktop+acp): close remaining agents-everywhere review gaps
matt2e Jul 21, 2026
481cb61
refactor(desktop): split team hooks out of agents hooks.ts
matt2e Jul 21, 2026
d8ff41c
fix(desktop): terminate orphan before erasing pair receipt on stop
matt2e Jul 22, 2026
4dbf954
Merge origin/main into eva/agents-everywhere
Jul 22, 2026
5e52399
Ignore legacy per-record relay pin for zero-touch cutover
Jul 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,14 @@ The justfile also ships `just goose key="$AGENT_NSEC"` (foreground) and
same env. See `crates/buzz-acp/README.md` for parallel agents, heartbeats,
respond-to gates, and forum subscriptions.

To exercise deferred ACP startup, add `BUZZ_ACP_LAZY_POOL=true` before launching
`buzz-acp`. The harness should connect, authenticate, subscribe, and publish
online presence without starting the configured ACP child. The first accepted,
flushable mention should start exactly one child and then dispatch the queued
message. Automated coverage in `pool_lifecycle_state` pins single-wake,
retry/backoff, and stale-result behavior; it does not replace this real
relay/process smoke test.

Send the agent a task — switch your shell back to the **sender** identity
from step 4 and @mention the agent:

Expand Down
1 change: 1 addition & 0 deletions crates/buzz-acp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ All configuration is via environment variables (or CLI flags — every env var h
| Flag | Env Var | Default | Description |
|------|---------|---------|-------------|
| `--agents` | `BUZZ_ACP_AGENTS` | `1` | Number of agent subprocesses (1–32). |
| `--lazy-pool` | `BUZZ_ACP_LAZY_POOL` | `false` | Connect, subscribe, and queue accepted work before starting ACP/LLM subprocesses. The first accepted event wakes one pool initialization task; failures retry with bounded exponential backoff while work remains. |
| `--heartbeat-interval` | `BUZZ_ACP_HEARTBEAT_INTERVAL` | `0` | Seconds between heartbeat prompts. `0` = disabled. Must be `0` or ≥10 when enabled. |
| `--heartbeat-prompt` | `BUZZ_ACP_HEARTBEAT_PROMPT` | (built-in) | Custom heartbeat prompt text. Conflicts with `--heartbeat-prompt-file`. |
| `--heartbeat-prompt-file` | `BUZZ_ACP_HEARTBEAT_PROMPT_FILE` | — | Read heartbeat prompt from a file. Conflicts with `--heartbeat-prompt`. |
Expand Down
22 changes: 22 additions & 0 deletions crates/buzz-acp/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,10 @@ pub struct CliArgs {
/// Publish encrypted ACP observer frames over the relay.
#[arg(long, env = "BUZZ_ACP_RELAY_OBSERVER", default_value_t = false)]
pub relay_observer: bool,

/// Connect and subscribe before starting the ACP/LLM subprocess pool.
#[arg(long, env = "BUZZ_ACP_LAZY_POOL", default_value_t = false)]
pub lazy_pool: bool,
}

/// Merged NIP-01 subscription filter for a single channel.
Expand Down Expand Up @@ -537,6 +541,8 @@ pub struct Config {
pub has_generated_codex_config: bool,
/// Whether to publish encrypted observer frames through the relay.
pub relay_observer: bool,
/// Whether ACP/LLM subprocess initialization is deferred until accepted work arrives.
pub lazy_pool: bool,
/// Agent owner pubkey (hex). Used for `--respond-to=owner-only` gate.
/// Replaces the old REST-based owner lookup.
pub agent_owner: Option<String>,
Expand Down Expand Up @@ -993,6 +999,7 @@ impl Config {
persona_env_vars,
has_generated_codex_config,
relay_observer: args.relay_observer,
lazy_pool: args.lazy_pool,
agent_owner: args.agent_owner.map(|s| s.trim().to_ascii_lowercase()),
no_base_prompt: args.no_base_prompt,
base_prompt_content,
Expand Down Expand Up @@ -1361,6 +1368,7 @@ mod tests {
persona_env_vars: vec![],
has_generated_codex_config: false,
relay_observer: false,
lazy_pool: false,
agent_owner: None,
no_base_prompt: false,
base_prompt_content: None,
Expand Down Expand Up @@ -2026,6 +2034,20 @@ channels = "ALL"
assert!(err.to_string().contains("turn liveness interval must be 0"));
}

#[test]
fn lazy_pool_defaults_off() {
let key = "0".repeat(64);
assert!(!CliArgs::parse_from(["buzz-acp", "--private-key", &key]).lazy_pool);
}

#[test]
fn lazy_pool_cli_flag_enables_deferred_startup() {
let key = "0".repeat(64);
let args = CliArgs::try_parse_from(["buzz-acp", "--private-key", &key, "--lazy-pool=true"]);
assert!(args.is_err(), "bool flags do not take an explicit value");
assert!(CliArgs::parse_from(["buzz-acp", "--private-key", &key, "--lazy-pool"]).lazy_pool);
}

#[test]
fn test_summary_includes_agents_and_heartbeat() {
let config = test_config(SubscribeMode::Mentions);
Expand Down
Loading
Loading