Skip to content

[cloud-storage] blobs: attachments, artifact bytes, generated media and downloads onto BlobStore #7425

Closed as not planned

Description

@senamakel

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_DIR OnceLock);
  • 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, keyed artifacts/<id>/<name>. ArtifactMeta holds a blob key, not a path. The desktop keeps an optional "export to Files folder".
  • Attachments → BlobStore, keyed uploads/<thread>/<id>; rehydration reads blobs. Delete legacy.rs absolute-path rehydration after a migration window.
  • provider_cache.rs derived 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_artifact returns 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 /rpc body.
  • Frontend: artifact viewer and attachment chips use the new fields.
  • Update the allowlist comment in scripts/ci/check-storage-bypass.mjs and the baseline.

Acceptance criteria

  • With a URL set, no writes under uploads/ or projects/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.

Activity

  1. added
    refactorStructural code change without a primary behavior change.
    react-uiReact app work in app/src: pages, components, providers, store, and UX.
    rust-coreCore Rust runtime in src/: CLI, core_server, shared infrastructure.
    on Oct 11, 2026
  2. added
    priority: p3Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect.
    on Oct 11, 2026
  3. tinysweeper commented on Oct 11, 2026

    @tinysweeper

    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.

  4. added theissue type on Oct 11, 2026
  5. senamakel commented on Oct 18, 2026

    @senamakel
    MemberAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority: p3Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect.react-uiReact app work in app/src: pages, components, providers, store, and UX.refactorStructural code change without a primary behavior change.rust-coreCore Rust runtime in src/: CLI, core_server, shared infrastructure.

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions