treefmt v2.5.0traversed 71 files emitted 48 files for processing formatted 48 files (2 changed) in 215ms M crates/ssync-core/src/session_filesystem.rs M crates/ssync-core/src/session_filesystem/pathmap.rs diff --git a/crates/ssync-core/src/session_filesystem.rs b/crates/ssync-core/src/session_filesystem.rs index ef6f593..cfe149f 100644 --- a/crates/ssync-core/src/session_filesystem.rs +++ b/crates/ssync-core/src/session_filesystem.rs @@ -9,14 +9,13 @@ pub use pathmap::PathMap; use std::collections::{HashMap, HashSet}; use std::path::{Path, PathBuf}; +use crate::reconcile::LocalFile; use anyhow::{Context, Result, anyhow, ensure}; use ssync_adapters::{Adapter, SessionIdentity}; -use crate::reconcile::LocalFile; use crate::exclude; use pathmap::Resolver; - /// Session discovery, translation, policy, and mutation for one engine. pub(crate) struct SessionFilesystem { adapters: Vec>, @@ -51,7 +50,6 @@ impl SessionFilesystem { self.resolver = Resolver::new(map, canonical_home); } - /// Every configured session root (watch targets). pub fn roots(&self) -> impl Iterator { self.adapters.iter().map(|a| a.session_root()) @@ -63,7 +61,6 @@ impl SessionFilesystem { .is_some_and(|a| a.is_session_file(path)) } - /// Decode an index key back to its session-root-relative path (the /// inverse of the key encoding): strip the `{agent}/` prefix of a /// configured adapter. @@ -208,7 +205,6 @@ impl SessionFilesystem { .canonical_plaintext(self.adapters[idx].as_ref(), bytes) } - /// Localize and atomically materialize one decrypted wire value. pub async fn write(&mut self, key: &str, plaintext: Vec) -> Result> { let Some((idx, rel)) = self.key_parts(key) else { @@ -279,7 +275,6 @@ fn index_key(id: &SessionIdentity) -> String { format!("{}/{}", id.agent, id.relative_path.display()) } - /// Recursively collect session files under `root` accepted by `adapter`. pub(crate) fn session_files(root: &Path, adapter: &dyn Adapter) -> Vec { let mut out = Vec::new(); @@ -287,11 +282,7 @@ pub(crate) fn session_files(root: &Path, adapter: &dyn Adapter) -> Vec out } -fn for_each_session_file( - root: &Path, - adapter: &dyn Adapter, - mut visit: impl FnMut(PathBuf), -) { +fn for_each_session_file(root: &Path, adapter: &dyn Adapter, mut visit: impl FnMut(PathBuf)) { let mut stack = vec![root.to_path_buf()]; while let Some(dir) = stack.pop() { let Ok(entries) = std::fs::read_dir(&dir) else { @@ -425,7 +416,6 @@ mod tests { SessionFilesystem::new(vec![Box::new(PiAdapter::new("pi", root))]) } - #[tokio::test] async fn snapshot_and_write_round_trip_without_map() { let root = scratch("roundtrip"); @@ -475,9 +465,7 @@ mod tests { ); let dir = root.join("--proj--"); std::fs::create_dir_all(&dir).unwrap(); - let path = dir.join( - "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl", - ); + let path = dir.join("2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"); std::fs::write(&path, b"{\"type\":\"session\",\"version\":3}\n").unwrap(); assert!(filesystem.snapshot().is_empty()); @@ -492,8 +480,7 @@ mod tests { let root = scratch("mapped-roundtrip"); let dir = root.join("--data-Projects-x--"); std::fs::create_dir_all(&dir).unwrap(); - let name = - "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; + let name = "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; let path = dir.join(name); std::fs::write( &path, @@ -502,10 +489,7 @@ mod tests { .unwrap(); let mut filesystem = pi_map(&root); filesystem.set_path_map( - PathMap::new(vec![ - ("/data/Projects".into(), "/canon/Projects".into()), - ]) - .unwrap(), + PathMap::new(vec![("/data/Projects".into(), "/canon/Projects".into())]).unwrap(), None, ); @@ -527,16 +511,13 @@ mod tests { let root = scratch("omp-home"); let dir = root.join("-Projects-x"); std::fs::create_dir_all(&dir).unwrap(); - let name = - "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; + let name = "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; std::fs::write( dir.join(name), b"{\"type\":\"session\",\"version\":3,\"cwd\":\"/data/Projects/x\"}\n", ) .unwrap(); - let mut filesystem = SessionFilesystem::new(vec![Box::new(PiAdapter::new( - "omp", &root, - ))]); + let mut filesystem = SessionFilesystem::new(vec![Box::new(PiAdapter::new("omp", &root))]); filesystem.set_path_map( PathMap::new(vec![("/data".into(), "/canon-home".into())]).unwrap(), None, @@ -551,8 +532,7 @@ mod tests { let root = scratch("mapped-exclude"); let dir = root.join("--data-Projects-x--"); std::fs::create_dir_all(&dir).unwrap(); - let name = - "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; + let name = "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; std::fs::write( dir.join(name), b"{\"type\":\"session\",\"version\":3,\"cwd\":\"/data/Projects/x\"}\n", @@ -560,10 +540,7 @@ mod tests { .unwrap(); let mut filesystem = pi_map(&root); filesystem.set_path_map( - PathMap::new(vec![ - ("/data/Projects".into(), "/canon/Projects".into()), - ]) - .unwrap(), + PathMap::new(vec![("/data/Projects".into(), "/canon/Projects".into())]).unwrap(), None, ); filesystem.set_excludes(HashMap::from([( @@ -632,10 +609,8 @@ mod tests { PathMap::new(vec![("/data".into(), "/canon".into())]).unwrap(), None, ); - let main_key = - "pi/--canon-Projects-x--/2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; - let artifact_key = - "pi/--canon-Projects-x--/2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a/advisor.jsonl"; + let main_key = "pi/--canon-Projects-x--/2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; + let artifact_key = "pi/--canon-Projects-x--/2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a/advisor.jsonl"; assert!( filesystem @@ -647,8 +622,7 @@ mod tests { filesystem .write( main_key, - b"{\"type\":\"session\",\"version\":3,\"cwd\":\"/canon/Projects/x\"}\n" - .to_vec(), + b"{\"type\":\"session\",\"version\":3,\"cwd\":\"/canon/Projects/x\"}\n".to_vec(), ) .await .unwrap() @@ -673,8 +647,7 @@ mod tests { let root = scratch("header-budget"); let project = root.join("--project--"); std::fs::create_dir_all(&project).unwrap(); - let name = - "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; + let name = "2026-05-23T06-55-21-771Z_019e539d-f6ab-71ac-be20-d3ae2b23ea4a.jsonl"; let mut bytes = vec![b'x'; 64 * 1024]; bytes.extend_from_slice(b"\n{\"type\":\"session\",\"cwd\":\"/work/project\"}\n"); std::fs::write(project.join(name), bytes).unwrap(); @@ -706,10 +679,7 @@ mod tests { symlink(&outside, root.join("--project--")).unwrap(); assert!( filesystem - .write( - "pi/--project--/session_id.jsonl", - b"escape".to_vec() - ) + .write("pi/--project--/session_id.jsonl", b"escape".to_vec()) .await .is_err() ); @@ -722,7 +692,10 @@ mod tests { .await .is_err() ); - assert_eq!(std::fs::read(outside.join("session_id.jsonl")).unwrap(), b"outside"); + assert_eq!( + std::fs::read(outside.join("session_id.jsonl")).unwrap(), + b"outside" + ); } #[tokio::test] @@ -736,7 +709,10 @@ mod tests { .await .unwrap() .expect("write must resolve"); - assert_eq!(std::fs::read(root.join("--project--/session_id.jsonl")).unwrap(), b"session"); + assert_eq!( + std::fs::read(root.join("--project--/session_id.jsonl")).unwrap(), + b"session" + ); assert_eq!(stamp.1, 7); assert!(filesystem.delete(key).await.unwrap()); assert!(!root.join("--project--").exists()); diff --git a/crates/ssync-core/src/session_filesystem/pathmap.rs b/crates/ssync-core/src/session_filesystem/pathmap.rs index 429b5e3..2021840 100644 --- a/crates/ssync-core/src/session_filesystem/pathmap.rs +++ b/crates/ssync-core/src/session_filesystem/pathmap.rs @@ -196,10 +196,7 @@ impl Resolver { if let Some(path) = oversized && local_cwd.is_none() { - bail!( - "{}: required session header exceeds 64 KiB", - path.display() - ); + bail!("{}: required session header exceeds 64 KiB", path.display()); } let Some(local_cwd) = local_cwd else { bail!( @@ -475,5 +472,4 @@ mod tests { assert_eq!(m.canonical_of("/any").unwrap(), None); assert_eq!(m.local_of("/any").unwrap(), None); } - }