Skip to content

feat(daemon): wire --daemon mode with DaemonSupervisor #584

@bug-ops

Description

@bug-ops

Parent

Part of #581. Depends on LoopbackChannel and streaming TaskProcessor issues.

Summary

Add --daemon CLI flag that starts Zeph in headless mode: full agent bootstrap, A2A server exposed, components managed by DaemonSupervisor, PID file lifecycle.

Scope

Files: src/main.rs, crates/zeph-core/src/daemon.rs

CLI flag

#[cfg(all(feature = "daemon", feature = "a2a"))]
#[arg(long)]
daemon: bool,

run_daemon() function

  1. Full AppBuilder setup (provider, memory, skills, tools, MCP)
  2. Create LoopbackChannel::pair()
  3. Spawn Agent<LoopbackChannel, T> via agent.run() in dedicated tokio task
  4. Build AgentTaskProcessor with LoopbackHandle
  5. Spawn A2A server
  6. Register both tasks as ComponentHandle under DaemonSupervisor
  7. write_pid_file() on start
  8. supervisor.run() — health monitoring loop
  9. On shutdown signal: remove_pid_file(), graceful cleanup

Init wizard

Update --init wizard to include daemon mode questions.

Acceptance Criteria

  • cargo run --features daemon,a2a -- --daemon starts headless agent
  • PID file created at configured path, removed on shutdown
  • A2A endpoint responds at GET /.well-known/agent-card.json
  • curl POST /a2a returns full agent response (not bare LLM)
  • Ctrl-C triggers graceful shutdown
  • DaemonSupervisor logs component failures

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions