4 KiB
Plan: Use short hex IDs for subagents instead of UUIDs
Summary
GitHub issue #126: Subagent IDs are currently full UUID v4 strings (36 chars, e.g. 550e8400-e29b-41d4-a716-446655440000). These are verbose in CLI output and error-prone when referenced by the LLM in tools like send_input, wait, and close_agent. The codebase already truncates agent IDs to 8 chars for display in multiple places. This change replaces UUID generation with a random 8-char hex string (e.g. a3f1b20c) so the full ID matches what's already displayed.
Files to modify
1. lib/crates/fabro-agent/Cargo.toml
- Add
rand.workspace = trueto[dependencies]. (rand = "0.8"is already defined in workspace rootCargo.toml; other crates likefabro-cli,fabro-llm,fabro-workflowalready use it.) - Do not remove
uuid.workspace = true— it's still used insession.rs:58for session IDs.
2. lib/crates/fabro-agent/src/subagent.rs
- Line 67: Replace
uuid::Uuid::new_v4().to_string()withformat!("{:08x}", rand::random::<u32>()). - This generates 8-char lowercase hex strings with ~4 billion possible values — collision-free within a session.
3. lib/crates/fabro-agent/src/cli.rs
Remove the short_id truncation pattern in 5 places. Since IDs are now 8 chars, short_id == agent_id, so use agent_id directly:
- Line 542 (
SubAgentSpawnedhandler): Removelet short_id = &agent_id[..8.min(agent_id.len())];and replace{short_id}with{agent_id}in the format string. - Line 561 (
SubAgentCompletedhandler): Same removal and replacement. - Line 574 (
SubAgentFailedhandler): Same removal and replacement. - Line 583 (
SubAgentClosedhandler): Same removal and replacement. - Line 596 (
SubAgentEventhandler, verbose mode): Same removal and replacement.
4. lib/crates/fabro-cli/src/commands/run_progress.rs
Remove the short_id truncation pattern in 2 places:
- Line 1416 (
SubAgentSpawnedhandler): Removelet short_id = &agent_id[..agent_id.len().min(8)];and replace{short_id}with{agent_id}in the format string. - Line 1432 (
SubAgentCompletedhandler): Same removal and replacement.
Step-by-step implementation
-
Add
randdependency tofabro-agent: Inlib/crates/fabro-agent/Cargo.toml, addrand.workspace = trueto the[dependencies]section (e.g. after theuuid.workspace = trueline). -
Replace UUID generation in
subagent.rs: Inlib/crates/fabro-agent/src/subagent.rsline 67, change:let agent_id = uuid::Uuid::new_v4().to_string();to:
let agent_id = format!("{:08x}", rand::random::<u32>()); -
Remove
short_idtruncation incli.rs: Inlib/crates/fabro-agent/src/cli.rs, for each of the 5 occurrences oflet short_id = &agent_id[..8.min(agent_id.len())];(lines 542, 561, 574, 583, 596):- Delete the
let short_id = ...line. - Replace
{short_id}with{agent_id}in the corresponding format string on the same match arm.
- Delete the
-
Remove
short_idtruncation inrun_progress.rs: Inlib/crates/fabro-cli/src/commands/run_progress.rs, for each of the 2 occurrences oflet short_id = &agent_id[..agent_id.len().min(8)];(lines 1416, 1432):- Delete the
let short_id = ...line. - Replace
{short_id}with{agent_id}in the corresponding format string.
- Delete the
Verification
cargo build --workspace— clean build with no errors.cargo test -p fabro-agent— all existing subagent tests pass. Tests use hardcoded IDs like"sa-1", not UUIDs, so no test changes needed.cargo clippy --workspace -- -D warnings— no new warnings.cargo fmt --check --all— formatting is clean.
Test cases
No new test cases are needed. The existing tests in subagent.rs (e.g. spawn_creates_agent_and_returns_id) already verify that:
agent_idis non-empty- The agent can be looked up by its ID
- Spawn/wait/close/send_input work with the generated IDs
The generated IDs will now be 8 chars instead of 36, but the tests don't assert on length or format, so they pass unchanged.