--path --team --meeting-type \
+ | --filters ''] \
+ [--mode append|refresh] [--delete-missing] [--rate-limit ] [--max-files ] [--thumbnails] [--no-start] --json
+tinycloud library imports list [--limit ] [--offset ] --json
+tinycloud library imports show [--limit ] [--offset ] --json # run history; PENDING while a run executes
+tinycloud library imports run [--mode append|refresh] [--delete-missing|--no-delete-missing] [--max-files ] [--thumbnails|--no-thumbnails] --json
+tinycloud library imports cancel [] --json # no run-id = the latest (only possibly-active) run
+tinycloud library imports delete --json # imported files always stay
```
`collections create|add|remove|delete` are the only writes in an otherwise
@@ -433,6 +443,42 @@ or `ask`, using `--filter` on
connector library (titles, participants, dates, tags) before paying for full
processing in a `media-descriptions` collection.
+**Bulk metadata imports** (0.3.21+, feature `library.collections.imports.v1`)
+are the bulk path INTO a metadata collection — never `add`/`sync` files one
+at a time when a whole corpus is wanted. `library imports create --name
+ --connector ` saves a definition that lists the connector server-side
+(google-drive, dropbox, zoom, gong, recall, grain, iconik — not S3/GCS) and
+imports every matching file's `source_metadata` as collection files:
+thousands to hundreds of thousands of records per run, **free — runs consume
+no credits**. The first run starts immediately (`--no-start` saves the
+definition only), and `create`/`imports run` return **`pending`** while a run
+executes — poll `imports show ` until the envelope goes
+`ready` (progress counters inline: listed, created, updated, skipped,
+indexed, failed, removed), then query with `probe`/`ask`.
+
+Filters are listing passes reusing the `connectors files` flags (`--from`/
+`--to` YYYY-MM-DD UTC, `--title-search`, `--folder-id` Drive, `--path`
+Dropbox — non-recursive, so cover a tree with one pass per folder via
+`--filters '[{"path":"/a"},{"path":"/b"}]'` — `--team`/`--meeting-type`
+Grain); a key the connector can't honor is a clear 400 at create, never
+silently dropped, and no filters means one unfiltered pass over everything.
+Zoom/Gong pin their 6-month default lookback into the stored filters at
+create (pass `--from` to control the window); iconik caps 10k results per
+filter set (split by date windows). Modes: `append` (default) imports new
+files and retries previously-failed ones; `refresh` re-imports everything
+matched, and only refresh runs honor `--delete-missing` (removes ONLY files
+this import brought in that the source stopped returning; a
+`--max-files`-capped run never sweeps). `--rate-limit` tunes upstream
+listing requests/sec (per-connector safe defaults, clamped);
+`--thumbnails` copies Grain/iconik poster images (off by default — slows
+large iconik imports). Definitions are **immutable** (delete + recreate to
+change one); **one run may be active per collection** — triggering while
+busy errors with a clear retryable message; `imports cancel` stops the
+active run (already-imported files stay) and `imports delete` removes the
+definition + run history but never the imported files. On pre-0.3.21
+binaries every `imports` subcommand fails with an unknown-command error —
+fall back to per-file `collections add` / `connectors sync`.
+
`connectors sync` materializes its argument into a Cloudglue file without
starting analysis (idempotent). The connector id is optional — with just a
URI or link, sync routes through the matching connector type. Connector URIs
diff --git a/skills/tinycloud/scripts/preflight.sh b/skills/tinycloud/scripts/preflight.sh
index 1f402d8..521e3a0 100755
--- a/skills/tinycloud/scripts/preflight.sh
+++ b/skills/tinycloud/scripts/preflight.sh
@@ -9,11 +9,11 @@ set -u
# Mirror tinycloud-skill.json: min_version / supported_range upper bound
# (CI diffs these against the manifest).
-MIN_VERSION="0.3.20"
+MIN_VERSION="0.3.21"
MAX_VERSION_EXCLUSIVE="0.4.0"
INSTALL_CMD='curl -fsSL https://app.cloudglue.dev/tinycloud.sh | bash'
# Kept in sync with ../tinycloud-skill.json required_features (CI diffs them).
-REQUIRED_FEATURES="envelope.v1 watch.v1 watch.speech.v1 see.v1 extract.v1 extract.images.v1 caption.v1 search.v1 probe.v1 probe.filters.v1 probe.entities.v1 probe.scope.auto.v1 ask.v1 query.v1 query.export.v1 clip.v1 grab.v1 face.v1 jobs.v1 library.collections.v1 library.collections.create.v1 library.collections.mutate.v1 library.collections.entities.v1 library.collections.metadata.v1 library.collections.describe.v1 library.collections.pagination.v1 library.sync.url.v1 workflow.v1 publish.v1 publish.manage.v1 publish.video.v1 publish.link.preview.v1 publish.link.preview.player.v1 setup.v1"
+REQUIRED_FEATURES="envelope.v1 watch.v1 watch.speech.v1 see.v1 extract.v1 extract.images.v1 caption.v1 search.v1 probe.v1 probe.filters.v1 probe.entities.v1 probe.scope.auto.v1 ask.v1 query.v1 query.export.v1 clip.v1 grab.v1 face.v1 jobs.v1 library.collections.v1 library.collections.create.v1 library.collections.mutate.v1 library.collections.entities.v1 library.collections.metadata.v1 library.collections.describe.v1 library.collections.pagination.v1 library.collections.imports.v1 library.sync.url.v1 workflow.v1 publish.v1 publish.manage.v1 publish.video.v1 publish.link.preview.v1 publish.link.preview.player.v1 setup.v1"
# 1) Binary present and responsive?
if ! command -v tinycloud >/dev/null 2>&1; then
diff --git a/skills/tinycloud/tinycloud-skill.json b/skills/tinycloud/tinycloud-skill.json
index 8047bc9..4b962e4 100644
--- a/skills/tinycloud/tinycloud-skill.json
+++ b/skills/tinycloud/tinycloud-skill.json
@@ -1,8 +1,8 @@
{
- "skill_version": "0.3.20",
+ "skill_version": "0.3.21",
"tinycloud": {
- "min_version": "0.3.20",
- "supported_range": ">=0.3.20 <0.4.0",
+ "min_version": "0.3.21",
+ "supported_range": ">=0.3.21 <0.4.0",
"required_features": [
"envelope.v1",
"watch.v1",
@@ -30,6 +30,7 @@
"library.collections.metadata.v1",
"library.collections.describe.v1",
"library.collections.pagination.v1",
+ "library.collections.imports.v1",
"library.sync.url.v1",
"workflow.v1",
"publish.v1",