.tasks/core/VSS-001-sdpath-integration.md
Integrate sidecars as a first-class SdPath variant, enabling unified addressing and standard file operations. This elevates sidecars from specialized infrastructure to full VDFS citizens.
See workbench/core/storage/VIRTUAL_SIDECAR_SYSTEM_V2.md Section "SdPath Integration" for complete specification.
core/src/domain/addressing.rs - Add Sidecar variant to enumcore/src/domain/addressing/parser.rs - Parse sidecar:// URIscore/src/domain/addressing/display.rs - Display formattingcore/src/domain/addressing/resolver.rs - Resolution logiccore/src/ops/sidecar/types.rs - Ensure compatibilitySidecar { content_id, kind, variant, format } to SdPath enumSdPath::sidecar() helper methodis_sidecar() predicate methodClone, Debug, PartialEq derivesparse_sidecar() for sidecar:// schemesidecar://{uuid}/{kind_dir}/{variant}.{ext}Display trait for sidecar pathssidecar://{uuid}/{kind}/{variant}.{ext}to_uri() methodresolve_sidecar() method to resolverSidecarManager::compute_path()SdPath::Sidecar variant exists with all required fieldssidecar://uuid/kind/variant.ext stringsdocs/core/addressing.mdx// Create sidecar path
let thumb = SdPath::sidecar(
content_uuid,
SidecarKind::Thumb,
"grid@2x",
SidecarFormat::Webp,
);
// Parse from URI
let parsed = SdPath::from_uri("sidecar://550e8400.../thumbs/[email protected]")?;
assert_eq!(parsed, thumb);
// Display as URI
assert_eq!(thumb.display(), "sidecar://550e8400.../thumbs/[email protected]");
// Resolve to physical path
let resolved = resolver.resolve(thumb).await?;
match resolved {
ResolvedPath::Local(path) => read_file(path),
ResolvedPath::Pending => wait_for_generation(),
ResolvedPath::Remote(device_id, path) => fetch_from_device(device_id, path),
}
sidecar://{content_uuid}/{kind_directory}/{variant}.{extension}
Examples:
sidecar://550e8400-e29b-41d4-a716-446655440000/thumbs/[email protected]
sidecar://550e8400-e29b-41d4-a716-446655440000/ocr/ocr.json
sidecar://550e8400-e29b-41d4-a716-446655440000/embeddings/all-MiniLM-L6-v2.json
Glob patterns:
sidecar://*/thumbs/[email protected] # All grid thumbnails
sidecar://550e8400.../thumbs/* # All thumbnails for one content
sidecar://{uuid}/* # All sidecars for content
pub enum SidecarResolveMode {
/// Error if not available locally
LocalOnly,
/// Generate locally, block until ready
GenerateBlocking,
/// Generate locally, return pending
GenerateAsync,
/// Fetch from remote if available, else generate
FetchOrGenerate,
/// Fetch only, never generate
FetchOnly,
}
The SidecarManager service already exists with all the path computation logic. This task integrates it with the SdPath abstraction:
// Before: Direct SidecarManager usage
let path = sidecar_manager.compute_path(uuid, kind, variant, format)?;
// After: Through SdPath
let sidecar = SdPath::sidecar(uuid, kind, variant, format);
let resolved = resolver.resolve(sidecar)?;
Existing SidecarManager methods become implementation details behind the resolver.
Estimated: 3-4 days focused work