Repository navigation
[cloud-storage] blobs: attachments, artifact bytes, generated media and downloads onto BlobStore #7425
Copy link
Copy link
Closed as not planned
Closed as not planned
[cloud-storage] blobs: attachments, artifact bytes, generated media and downloads onto BlobStore#7425
Task
Copy link
Labels
priority: p3Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect.Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect.react-uiReact app work in app/src: pages, components, providers, store, and UX.React app work in app/src: pages, components, providers, store, and UX.refactorStructural code change without a primary behavior change.Structural code change without a primary behavior change.rust-coreCore Rust runtime in src/: CLI, core_server, shared infrastructure.Core Rust runtime in src/: CLI, core_server, shared infrastructure.
Description
Parent: #7419
Context
Nothing in the core uses BlobStore yet. Large user data sits on pod-local disk:
- uploads:
agent/attachments/mod.rs:288,legacy.rs:143,provider_source.rs:232, under<action_dir>/uploads/<thread>/…; AttachmentStash(ATTACHMENTS_DIROnceLock);- artifact content:
agent/artifacts/files.rs:141, under~/OpenHuman/projects/Files; - generated media:
media/generation/artifact_tool.rs:203; - documents and slides:
tools/impl/{document,presentation}/mod.rs; - downloads:
integrations/file_storage/tools/download.rs:84.
ArtifactMeta.path (agent/artifacts/types.rs:87) is an absolute local path that is returned to clients. The storage-bypass allowlist says "the port has no blob store", which is stale.
Scope
- Artifact bytes →
BlobStore, keyedartifacts/<id>/<name>.ArtifactMetaholds a blob key, not a path. The desktop keeps an optional "export to Files folder". - Attachments →
BlobStore, keyeduploads/<thread>/<id>; rehydration reads blobs. Deletelegacy.rsabsolute-path rehydration after a migration window. -
provider_cache.rsderived readouts → blob cache, regenerated on a miss. - Generated media, docs, slides and downloads write to blobs, and to the action dir only when the agent asked for a file in its working directory.
- RPC:
ai.get_artifactreturns bytes or a presigned URL (depends on the S3 driver sub-issue). Add an upload/download route so large attachments don't travel base64 inside the 43 MiB/rpcbody. - Frontend: artifact viewer and attachment chips use the new fields.
- Update the allowlist comment in
scripts/ci/check-storage-bypass.mjsand the baseline.
Acceptance criteria
- With a URL set, no writes under
uploads/orprojects/Files(test). - An artifact created on pod A downloads from pod B.
- Existing desktop artifacts stay readable after upgrade (migration regression test).
Verification
Run the affected tests against the memory, sqlite: and mongodb:// drivers (scripts/test-rust-with-mock.sh / pnpm test:rust), plus node scripts/ci/check-storage-bypass.mjs (the baseline must shrink), node scripts/ci/check-feature-forwarding.mjs and pnpm rust:layout. The upstream submodule PR lands first, then the gitlink bump. Existing desktop data needs an import path with a regression test.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
priority: p3Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect.Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect.react-uiReact app work in app/src: pages, components, providers, store, and UX.React app work in app/src: pages, components, providers, store, and UX.refactorStructural code change without a primary behavior change.Structural code change without a primary behavior change.rust-coreCore Rust runtime in src/: CLI, core_server, shared infrastructure.Core Rust runtime in src/: CLI, core_server, shared infrastructure.
Activity
tinysweeper commentedon Oct 11, 2026
Planned migration work item under the cloud-storage epic: move artifact bytes, attachments, generated media, docs/slides and downloads from pod-local disk onto BlobStore, switch ArtifactMeta to blob keys, add RPC routes for large blobs, update the frontend and the storage-bypass baseline. This is scoped, planned enhancement work (nothing is currently broken), not a duplicate of any candidate issue — the S3 driver (#7420) is a dependency, not a duplicate.
Labelled
priority: p3.senamakel commentedon Oct 18, 2026
Superseded by the 2026-10-18 re-audit of epic #7419 against main
a48737721c. Much of this issue landed through #7522 and #7973; the remaining work is split into one-PR leaves on the senamakel forks:The per-area audit, with the status of this issue's checklist, is linked from the #7419 body. Closing as superseded.