mirror of
https://github.com/spacedriveapp/spacedrive.git
synced 2025-12-11 20:15:30 +01:00
4.9 KiB
4.9 KiB
id, title, status, assignee, parent, priority, tags, whitepaper, last_updated, related_tasks
| id | title | status | assignee | parent | priority | tags | whitepaper | last_updated | related_tasks | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VSS-001 | SdPath::Sidecar Variant Integration | To Do | james | CORE-008 | High |
|
Section 4.1.5 | 2025-11-01 |
|
Description
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.
Implementation Files
core/src/domain/addressing.rs- AddSidecarvariant to enumcore/src/domain/addressing/parser.rs- Parsesidecar://URIscore/src/domain/addressing/display.rs- Display formattingcore/src/domain/addressing/resolver.rs- Resolution logiccore/src/ops/sidecar/types.rs- Ensure compatibility
Tasks
Add SdPath Variant
- Add
Sidecar { content_id, kind, variant, format }toSdPathenum - Implement
SdPath::sidecar()helper method - Add
is_sidecar()predicate method - Update
Clone,Debug,PartialEqderives
URI Parsing
- Implement
parse_sidecar()forsidecar://scheme - Parse format:
sidecar://{uuid}/{kind_dir}/{variant}.{ext} - Validate UUID, kind, variant, format
- Return helpful errors for malformed URIs
Display Implementation
- Implement
Displaytrait for sidecar paths - Format as
sidecar://{uuid}/{kind}/{variant}.{ext} - Handle special characters in variants
- Add
to_uri()method
Resolution Integration
- Add
resolve_sidecar()method to resolver - Implement resolution modes (blocking, async, fetch-only)
- Integrate with existing
SidecarManager::compute_path() - Handle missing sidecars (enqueue generation)
- Handle remote sidecars (return device reference)
Testing
- Unit tests for URI parsing (valid/invalid cases)
- Unit tests for display formatting
- Unit tests for resolution with various modes
- Integration test: parse → resolve → access
- Edge cases: special chars, missing sidecars, remote devices
Acceptance Criteria
SdPath::Sidecarvariant exists with all required fields- Can parse
sidecar://uuid/kind/variant.extstrings - Display format matches specification
- Helper methods work ergonomically
- Resolution integrates with SidecarManager
- Missing sidecars trigger generation in async mode
- Remote sidecars return device references
- All unit tests pass
- Documentation updated in
docs/core/addressing.mdx
Example Usage
// 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/grid@2x.webp")?;
assert_eq!(parsed, thumb);
// Display as URI
assert_eq!(thumb.display(), "sidecar://550e8400.../thumbs/grid@2x.webp");
// 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),
}
Implementation Notes
URI Format Specification
sidecar://{content_uuid}/{kind_directory}/{variant}.{extension}
Examples:
sidecar://550e8400-e29b-41d4-a716-446655440000/thumbs/grid@2x.webp
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/grid@2x.webp # All grid thumbnails
sidecar://550e8400.../thumbs/* # All thumbnails for one content
sidecar://{uuid}/* # All sidecars for content
Resolution Modes
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,
}
Integration with Existing Code
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.
Timeline
Estimated: 3-4 days focused work
- Day 1: Add enum variant, helper methods, basic parsing
- Day 2: Display implementation, resolution logic
- Day 3: Testing, edge cases, error handling
- Day 4: Documentation, examples, polish