use super::*;
use std::io::Write;
struct Fixture {
root: PathBuf,
}
impl Fixture {
fn new() -> Self {
static SEQ: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(0);
let seq = SEQ.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
let n = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos();
let root = std::env::temp_dir().join(format!("csift-sub-{}-{n}-{seq}", std::process::id()));
std::fs::create_dir_all(&root).unwrap();
Fixture { root }
}
fn write(&self, rel: &str, contents: &str) -> PathBuf {
let p = self.root.join(rel);
std::fs::create_dir_all(p.parent().unwrap()).unwrap();
let mut f = std::fs::File::create(&p).unwrap();
f.write_all(contents.as_bytes()).unwrap();
p
}
}
impl Drop for Fixture {
fn drop(&mut self) {
let _ = std::fs::remove_dir_all(&self.root);
}
}
const SESS: &str = "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d";
fn layout(fx: &Fixture) -> PathBuf {
let enc = "-Users-testuser-Projects-foo";
let session = fx.write(
&format!("{enc}/{SESS}.jsonl"),
concat!(
"{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":\"hi\"}}\n",
"{\"type\":\"assistant\",\"timestamp\":\"2026-06-07T04:59:58.000Z\",\"message\":{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_x\",\"name\":\"Agent\",\"input\":{\"description\":\"run it\",\"subagent_type\":\"oh-my-claudecode:executor\"}}]}}\n",
"{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"toolu_x\",\"content\":\"SYNC RETURN: the built-in answer\"}]}}\n",
"{\"type\":\"assistant\",\"timestamp\":\"2026-06-07T05:59:55.000Z\",\"message\":{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_w\",\"name\":\"Workflow\",\"input\":{\"description\":\"the wf\"}}]}}\n"
),
);
fx.write(
&format!("{enc}/{SESS}/subagents/agent-aaa111.jsonl"),
concat!(
"{\"type\":\"user\",\"isSidechain\":true,\"agentId\":\"aaa111\",\"sessionId\":\"0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d\",\"timestamp\":\"2026-06-07T05:00:00.000Z\",\"message\":{\"role\":\"user\",\"content\":\"do the thing\"}}\n",
"{\"type\":\"assistant\",\"timestamp\":\"2026-06-07T05:03:20.000Z\",\"message\":{\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"done\"}]}}\n"
),
);
fx.write(
&format!("{enc}/{SESS}/subagents/agent-aaa111.meta.json"),
"{\"agentType\":\"oh-my-claudecode:executor\",\"description\":\"run it\",\"toolUseId\":\"toolu_x\"}",
);
fx.write(
&format!("{enc}/{SESS}/subagents/workflows/wf_abc/agent-bbb222.jsonl"),
concat!(
"{\"type\":\"user\",\"isSidechain\":true,\"agentId\":\"bbb222\",\"timestamp\":\"2026-06-07T06:00:00.000Z\",\"message\":{\"role\":\"user\",\"content\":\"wf task\"}}\n",
"{\"type\":\"assistant\",\"timestamp\":\"2026-06-07T06:01:00.000Z\",\"message\":{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"t\",\"name\":\"Bash\",\"input\":{}}]}}\n"
),
);
fx.write(
&format!("{enc}/{SESS}/subagents/workflows/wf_abc/agent-bbb222.meta.json"),
"{\"agentType\":\"workflow-subagent\"}",
);
fx.write(
&format!("{enc}/{SESS}/subagents/workflows/wf_abc/journal.jsonl"),
concat!(
"{\"type\":\"started\",\"agentId\":\"bbb222\",\"key\":\"v2:abc\"}\n",
"{\"type\":\"result\",\"agentId\":\"bbb222\",\"key\":\"v2:abc\",\"result\":\"WF RETURN: workflow journal payload\"}\n"
),
);
fx.write(
&format!("{enc}/{SESS}/workflows/wf_abc.json"),
"{\"runId\":\"wf_abc\",\"taskId\":\"t9\",\"workflowName\":\"demo-wf\",\"status\":\"completed\",\"agentCount\":1,\"durationMs\":62000,\"totalTokens\":12345,\"totalToolCalls\":7,\"defaultModel\":\"claude-opus-4-8[1m]\",\"startTime\":\"2026-06-07T05:59:55.000Z\"}",
);
session
}
fn teammate_layout(fx: &Fixture) -> PathBuf {
let enc = "-Users-testuser-Projects-foo";
let session = fx.write(
&format!("{enc}/{SESS}.jsonl"),
concat!(
"{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":\"hi\"}}\n",
"{\"type\":\"assistant\",\"timestamp\":\"2026-06-07T05:00:00.000Z\",\"message\":{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_team\",\"name\":\"Agent\",\"input\":{\"description\":\"repro the bug\",\"subagent_type\":\"oh-my-claudecode:qa-tester\",\"name\":\"VSRepro\"}}]}}\n"
),
);
fx.write(
&format!("{enc}/{SESS}/subagents/agent-aVSRepro-68a2a1661c9390c1.jsonl"),
concat!(
"{\"type\":\"user\",\"isSidechain\":true,\"agentId\":\"aVSRepro-68a2a1661c9390c1\",\"sessionId\":\"0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d\",\"timestamp\":\"2026-06-07T05:00:00.500Z\",\"message\":{\"role\":\"user\",\"content\":\"<teammate-message teammate_id=\\\"team-lead\\\">repro it</teammate-message>\"}}\n",
"{\"type\":\"assistant\",\"timestamp\":\"2026-06-07T05:10:00.000Z\",\"message\":{\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"the matrix result\"}]}}\n"
),
);
fx.write(
&format!("{enc}/{SESS}/subagents/agent-aVSRepro-68a2a1661c9390c1.meta.json"),
"{\"agentType\":\"VSRepro\",\"description\":\"repro the bug\",\"name\":\"VSRepro\",\"taskKind\":\"in_process_teammate\",\"teamName\":\"session-25f56dee\",\"color\":\"purple\"}",
);
session
}
mod discovery;
mod ids;
mod lifecycle;
mod topology;