Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ tower-mcp = { version = "0.8", features = ["http", "testing"] }
schemars = "1.2"
regex = "1.12.3"
async-trait = "0.1.89"
futures-core = "0.3"
url = "2.5"

[dev-dependencies]
Expand Down
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,15 @@ That's it! Your agents are now coordinating via Redis.

> **Note:** `tt bootstrap` delegates to an AI agent to download Redis from GitHub and compile it for your machine. Alternatively: `brew install redis` (macOS) or `apt install redis-server` (Ubuntu).

## Runtime Model

`tt spawn` still launches a background `tt agent-loop` worker. The worker now supports two execution modes:

- **One-shot**: default. Each turn spawns a fresh coding CLI process.
- **Persistent streaming**: opt in with `[agent].persistent = true`. Claude-backed workers keep a live `stream-json` subprocess across turns, can accept urgent messages mid-turn, persist a resumable session ID on the agent record, and emit structured per-turn events onto the Redis event stream.

During rollout, unsupported CLIs automatically fall back to the one-shot path even if persistence is enabled.

## 🎯 Mission Mode

Start an autonomous mission that handles multiple GitHub issues with dependency-aware scheduling:
Expand Down
2 changes: 2 additions & 0 deletions docs/src/cli/spawn.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ tt spawn reviewer --role reviewer &
- Repeats until `--max-rounds` reached
4. **Agent stops** with state `Stopped`

By default, each turn uses a fresh CLI subprocess. If `[agent].persistent = true` and the selected CLI has a streaming adapter, `tt agent-loop` keeps one long-lived subprocess alive across turns instead. Today that persistent path is available for Claude-style `stream-json` sessions; unsupported CLIs automatically fall back to the one-shot model.

## Agent Naming

Choose descriptive names. With `--role`, names no longer need to describe the role:
Expand Down
5 changes: 5 additions & 0 deletions src/agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -758,6 +758,9 @@ pub struct Agent {
/// Defaults to created_at if never set.
#[serde(default = "chrono::Utc::now")]
pub last_active_at: DateTime<Utc>,
/// Persistent runtime session identifier for resume-capable CLIs.
#[serde(default)]
pub runtime_session_id: Option<String>,
}

impl Agent {
Expand Down Expand Up @@ -786,6 +789,7 @@ impl Agent {
tasks_completed: 0,
rounds_completed: 0,
last_active_at: now,
runtime_session_id: None,
}
}

Expand Down Expand Up @@ -864,6 +868,7 @@ impl Agent {
tasks_completed: 0,
rounds_completed: 0,
last_active_at: now,
runtime_session_id: None,
}
}
}
Loading
Loading