core
S3-compatible blob storage — put, get, list, and presign objects (S3, MinIO, R2, GCS interop)
Components
4 available- blob_getDownloads an object from an S3-compatible store (AWS S3, MinIO, Cloudflare R2, GCS interop) and emits {data, contentType, size}. Use it to read back what blob_put stored, or to pull an externally produced file — a data dump, an uploaded CSV — into the flow. Bucket precedence: request.bucket wins; empty falls back to settings.bucket. Objects larger than maxBytes (default 10485760 = 10 MiB) are refused with a permanent error naming the actual size — blobs travel as in-flow message payloads, so raise maxBytes deliberately, not reflexively. For binary objects set asBase64=true: data is then standard base64 of the object bytes (size still counts the original bytes). Text objects can be read as-is with asBase64=false.
- blob_listLists objects in an S3-compatible store (AWS S3, MinIO, Cloudflare R2, GCS interop) by prefix and emits {items: [{key, size, lastModified, etag}], truncated}. Use it to discover what to blob_get or blob_presign — e.g. all of reports/2026-08/. Bucket precedence: request.bucket wins; empty falls back to settings.bucket. Listing is recursive under the prefix. At most max items are returned (default 100, hard cap 1000); truncated=true means more matched — narrow the prefix rather than paging, there is no cursor. items is an empty array, not an error, when nothing matches.
- blob_presignMints a time-limited presigned URL for one object in an S3-compatible store (AWS S3, MinIO, Cloudflare R2, GCS interop) and emits {url}. The URL carries its own signature: whoever holds it can GET (download) or PUT (upload) that one object over plain HTTP until it expires — no credentials, and the bytes never ride through the flow. Typical use: blob_put a report, blob_presign it, send the link to Slack or email. Bucket precedence: request.bucket wins; empty falls back to settings.bucket. Expiry defaults to 900s (15 min) and is capped at 604800s (7 days — the S3 signing limit; longer requests fail with a permanent error). Signing happens locally; note that a GET URL for a missing key still signs fine — the holder gets a 404 when using it. For in-cluster MinIO endpoints the URL points at the internal host, reachable only where the cluster DNS resolves.
- blob_putUploads an object to an S3-compatible store (AWS S3, MinIO, Cloudflare R2, GCS interop) and emits {bucket, key, etag, size}. Use it to persist anything a flow produced or fetched — a report, a CSV, an attachment — so blob_get can read it back or blob_presign can hand out a download link. Bucket precedence: request.bucket wins; empty falls back to settings.bucket; neither set is an error. Text content goes in data as-is; for binary content set dataBase64=true and pass standard base64 in data — the store receives the decoded bytes. Set contentType (default application/octet-stream) so downloads serve with the right type. Network failures during upload are marked retryable: S3 PutObject is a full-object replace of the same key with the same bytes, so re-running a possibly-landed upload converges on the same stored object.
Release notes
S3-compatible blob storage — put, get, list, and presign objects (S3, MinIO, R2, GCS interop)