mount
NAME
mount — bridge remote or local storage into the virtual filesystem
SYNOPSIS
mount [--source <url>] [--profile <name>] [--no-probe] [--max-body-mb <n>] <target-path>
mount unmount [--clear-cache] <target-path>
mount list
mount refresh [--bodies] <target-path>
DESCRIPTION
mount bridges remote storage into the SLICC virtual filesystem. After mounting, read_file, write_file, edit_file, and shell commands (ls, cat, rm) all operate on the remote source as if it were a local directory. Reads are cached with TTL + ETag semantics; writes use conditional requests for conflict detection.
Mount descriptors persist across browser and server restarts. Credentials never reach the agent runtime — signing and token injection happen server-side (node-server, swift-server) or in the extension service worker.
BACKENDS
-
Local
Without
--source, opens an OS directory picker. Only works from the cone (requires a user gesture); scoops cannot mount local directories.mount /mnt/local -
S3
Source URI:
s3://<bucket>[/<prefix>]. Supports AWS S3, Cloudflare R2, MinIO, and any S3-compatible service. Auth comes from profile-namespaced secrets (s3.<profile>.*). Use--profileto select credentials when multiple profiles exist.mount --source s3://my-bucket/assets --profile aws /mnt/s3 -
DA (Adobe Document Authoring)
Source URI:
da://<org>/<repo>[/<path>]. Authenticates via the Adobe IMS bearer token from the configured Adobe LLM provider. No DA-specific secrets are needed.mount --source da://my-org/my-repo /mnt/da
OPTIONS
-
--source <url>Remote source URI. Accepts
s3://orda://schemes. Without this flag, falls back to the local FS-Access picker (cone only). -
--profile <name>Which
s3.<profile>.*credential set to use. Defaults todefault. Accepted on DA mounts for symmetry but DA has only one identity in v1. -
--no-probeSkip the mount-time
HEAD bucket(S3) orGET /list(DA) probe. The mount lands immediately even if the source is unreachable; auth errors surface on the first read or write instead. -
--max-body-mb <n>Override the per-mount body-size limit in megabytes. Defaults: S3 = 25 MB, DA = 5 MB. Files exceeding this limit produce
EFBIGbefore any bytes transfer. -
--clear-cache(unmount only)Drop cached listings and bodies for the mount when unmounting. Without this, the cache persists and is reused if you re-mount the same source.
-
--bodies(refresh only)Also conditionally re-fetch bodies whose ETag changed. Without this, only directory listings are diffed.
CREDENTIALS
S3 / R2 / MinIO
S3 mounts read credentials from profile-namespaced secrets. Set them with secret set before mounting:
# AWS S3 (default profile)
secret set s3.default.access_key_id AKIA... --domain "*.amazonaws.com"
secret set s3.default.secret_access_key wJalr... --domain "*.amazonaws.com"
secret set s3.default.region us-east-1 --domain "*.amazonaws.com"
# Cloudflare R2
secret set s3.r2.access_key_id ... --domain "*.r2.cloudflarestorage.com"
secret set s3.r2.secret_access_key ... --domain "*.r2.cloudflarestorage.com"
secret set s3.r2.endpoint https://<acct>.r2.cloudflarestorage.com \
--domain "*.r2.cloudflarestorage.com"
Per-profile keys:
-
s3.<profile>.access_key_idRequired. AWS access key or equivalent.
-
s3.<profile>.secret_access_keyRequired. Matching secret key.
-
s3.<profile>.regionOptional. Defaults to
us-east-1. R2 typically wantsauto. -
s3.<profile>.endpointOptional. Custom host for R2 / MinIO. Omit for AWS.
-
s3.<profile>.session_tokenOptional. For AWS STS temporary credentials.
-
s3.<profile>.path_styleOptional. Set to
"true"for path-style addressing (some MinIO setups). Default is virtual-hosted.
Adobe DA
DA mounts reuse the IMS bearer token from the Adobe LLM provider. No DA-specific secrets are needed. If the user has not authenticated with Adobe, the mount probe fails with EACCES. Authenticate first:
oauth-token adobe
LIFECYCLE
-
mount listShow all active mount points with their source URIs and status.
-
mount unmount [--clear-cache] <path>Tear down a mount. Without
--clear-cache, cached data persists for reuse on next mount. -
mount refresh [--bodies] <path>Re-walk the remote source and diff against the local cache. Prints a structured summary:
Refreshed /mnt/r2: +2 -1 ~3 (47 unchanged, 0 errors)Use after external changes when you need an up-to-date view before the 30 s TTL expires.
CACHING
The RemoteMountCache (IndexedDB-backed under slicc-mount-cache) sits in front of every read and listing. Default TTL is 30 seconds.
- Reads: cache-fresh → zero RTT; cache-stale → conditional
GETwithIf-None-Match(304 keeps the body, 200 replaces it); cache-miss → unconditionalGET. - Writes: existing files use
If-Match: <etag>; new files useIf-None-Match: *. A 412 on a first-attempt PUT surfaces asEBUSY. - Cache keys: entries live under
(mountId, relativePath)so re-mounting at the same target path with a different source produces a fresh namespace.
ERRORS
-
mount: probe failed — profile '…' missing required field 'access_key_id'The named profile is not fully configured. Set credentials with
secret set s3.<profile>.*. -
EACCES: s3 access deniedWrong credentials, wrong region, or the bucket policy denies access.
-
EACCES: da access deniedIMS token expired or user not authenticated with the Adobe provider. Run
oauth-token adobeto re-authenticate. -
EBUSY: remote modified since last read — re-read and retryAnother writer changed the file between your read and write. Re-read with
read_filethen retry the edit. -
EFBIG: body exceeds maxBodyBytesFile exceeds the per-mount size limit (S3 25 MB, DA 5 MB). Pass
--max-body-mb <n>at mount time, or use external tools for very large files. -
mount: cannot mount local directories from a scoop (no UI)Local mounts require a user gesture. Have the cone do the mount, or use S3/DA backends which work from scoops.
EXAMPLES
# Mount a local folder (cone only)
mount /mnt/project
# Mount an S3 bucket with a prefix
mount --source s3://assets-prod/images --profile aws /mnt/images
# Mount a Cloudflare R2 bucket
mount --source s3://static-site --profile r2 /mnt/r2
# Mount an Adobe DA repo
mount --source da://acme-corp/marketing-site /mnt/da
# List all mounts
mount list
# Refresh a mount after external changes
mount refresh --bodies /mnt/da
# Unmount and clear all cached data
mount unmount --clear-cache /mnt/r2
# Work with mounted files normally
ls /mnt/da
read_file /mnt/da/index.html
write_file /mnt/da/new-page.html "<html>..."
rm /mnt/da/old-draft.html
NOTES
- Prefer
lsoverread_filefor navigation — listings are cached and instant within the TTL window. - For DA,
ls -ltriggers oneHEADper file on first call (the/listendpoint omits sizes), then caches. - Recursive
rmon S3 is not supported in v1 — delete files individually. - Mount descriptors persist across restarts. Use
mount listto see what survived a restart andmount unmountto clean up stale entries.
SEE ALSO
secret, oauth-token, fswatch