From 149ce240494bc25515b8df3f1a70e40488b44d6d Mon Sep 17 00:00:00 2001 From: KDR Date: Wed, 22 Jul 2026 17:14:00 -0700 Subject: [PATCH 1/3] =?UTF-8?q?Prepare=20for=20tinycloud=200.3.15:=20iconi?= =?UTF-8?q?k=20connector,=20metadata=20collections,=20probe=20filters,=20c?= =?UTF-8?q?onnectors=20refresh=20(skill=20floor=20=E2=86=92=200.3.15)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documents the 0.3.15 binary (SDK 0.7.21 / spec v0.7.11) across the skill surfaces: - verbs.md: probe --filter operator/path reference (single-pass hybrid search routing note), --type metadata + collections add --metadata, connectors refresh, iconik in the sync grammar + filter matrix (7th metadata-bearing provider, iconik_metadata. custom fields), and the metadata-collection triage pattern. - SKILL.md: cheat-sheet lines for filtered probe, metadata collections, and connectors refresh; gotcha for --filter needing a collection scope and metadata collections being file-level. - glossary.md: metadata collection + source metadata entries; iconik in the data-connector entry. - Skill floor → 0.3.15 (min_version/supported_range, preflight MIN_VERSION); required_features += probe.filters.v1 and library.collections.metadata.v1 (JSON and preflight lists byte-identical; connector features stay optional-account-dependent, as before). - Package/plugin/marketplace/skill versions → 0.3.15; CLAUDE.md contract section gains the 0.3.15 paragraph (features 34→38, verbs stay 16) and maintainer command examples move to 0.3.15. Same merge gate as the 0.3.12/0.3.14 floor raises: this PR merges only after the CDN's channels.stable is 0.3.15. The live-CDN state stays 0.3.14 until the release publishes. Verified: npm test 42/42, shellcheck clean, `claude plugin validate .` passes, the two required-feature lists are byte-identical, and smoke-test.sh 16/16 + preflight ok against a locally built 0.3.15 binary (all four new feature ids present). --- .claude-plugin/marketplace.json | 4 +- .claude-plugin/plugin.json | 2 +- CLAUDE.md | 34 +++++++++--- README.md | 4 +- package.json | 2 +- skills/tinycloud/SKILL.md | 15 +++++- skills/tinycloud/reference/glossary.md | 27 ++++++++-- skills/tinycloud/reference/verbs.md | 75 ++++++++++++++++++++++---- skills/tinycloud/scripts/preflight.sh | 4 +- skills/tinycloud/tinycloud-skill.json | 8 +-- 10 files changed, 143 insertions(+), 32 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 5c71421..01df166 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -7,14 +7,14 @@ }, "metadata": { "description": "Deep video and image work for coding agents: analyze, describe, search, caption, clip, detect faces, and publish via the tinycloud CLI.", - "version": "0.3.14" + "version": "0.3.15" }, "plugins": [ { "name": "tinycloud", "source": "./", "description": "Video and image understanding and editing via the tinycloud CLI (Cloudglue): watch/see/extract/search/ask/face over videos and images, captions, clips, collections, plus one-command workflows for sales coaching, blog posts, ad analysis, meeting breakdowns, and YouTube publishing.", - "version": "0.3.14", + "version": "0.3.15", "author": { "name": "Cloudglue" }, "homepage": "https://tinycloud.sh", "repository": "https://github.com/cloudglue/tinycloud", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index c4896b1..23febd8 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "tinycloud", "displayName": "Tinycloud Video", "description": "Video and image understanding and editing via the tinycloud CLI (Cloudglue): watch/see/extract/search/ask/face over videos and images, captions, clips, collections, and one-command video workflows.", - "version": "0.3.14", + "version": "0.3.15", "author": { "name": "Cloudglue", "url": "https://cloudglue.dev" }, "homepage": "https://tinycloud.sh", "repository": "https://github.com/cloudglue/tinycloud", diff --git a/CLAUDE.md b/CLAUDE.md index 5279713..983f4ae 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -28,16 +28,16 @@ node --test test/unit.test.mjs # just the unit suite TINYCLOUD_TEST_TARBALL=~/Downloads/tinycloud-darwin-arm64.tar.gz npm test # e2e against a real dist tarball # Contract smoke tests against an installed/extracted binary -TINYCLOUD_CMD=/path/to/tinycloud EXPECTED_VERSION=0.3.14 bash scripts/smoke-test.sh +TINYCLOUD_CMD=/path/to/tinycloud EXPECTED_VERSION=0.3.15 bash scripts/smoke-test.sh # Serve a tarball as a fake CDN (modes: --corrupt, --no-manifest) -node test/fixtures/make-fixture-cdn.mjs --tarball .tar.gz --version 0.3.14 --port 8787 +node test/fixtures/make-fixture-cdn.mjs --tarball .tar.gz --version 0.3.15 --port 8787 TINYCLOUD_DIST_URL=http://127.0.0.1:8787 TINYCLOUD_INSTALL_DIR=$(mktemp -d) node bin/tinycloud.js --version --json TINYCLOUD_DIST_URL=http://127.0.0.1:8787 bash install.sh --install-dir $(mktemp -d)/bin # Release manifest tooling (maintainer) -node scripts/generate-manifest.mjs --version 0.3.14 --from-cdn # build manifest + .sha256 sidecars -node scripts/generate-manifest.mjs --check --version 0.3.14 # verify live CDN matches manifest +node scripts/generate-manifest.mjs --version 0.3.15 --from-cdn # build manifest + .sha256 sidecars +node scripts/generate-manifest.mjs --check --version 0.3.15 # verify live CDN matches manifest # Plugin metadata validation claude plugin validate . @@ -103,7 +103,7 @@ stdout (logs on stderr) with `status`: → exit codes 0/0/2/3/3/0/1. `tinycloud commands --json` is the authoritative flag list — verify doc claims against it, not memory (a doc bug shipped once because `--cached` only exists on watch/see/extract/caption/face/workflow). As -of 0.3.14 there are 16 verbs: `see` +of 0.3.15 there are 16 verbs: `see` (0.3.7+) analyzes an **image** (file-level, JPEG/PNG/WebP — the image counterpart of `watch`) and `extract` also takes an image source (features `see.v1`, `extract.images.v1`); 0.3.8 adds @@ -162,7 +162,29 @@ first. Flipping the setting on an existing site is a settings PATCH with no re-upload, reported as the new `settings-only` publish action. Because the skill teaches the flags, the floor was raised to 0.3.14 (the 0.3.12 floor-raise pattern — the dist PR merges only after CDN `channels.stable` = -0.3.14). The host-level `profile` verb and the leading global flags `--home`/`--profile` +0.3.14). 0.3.15 picks up SDK 0.7.21 (spec v0.7.11) — **Iconik connector, +metadata collections, and source-metadata search** (features 34→38, verbs +stay 16): Iconik becomes the seventh metadata-bearing provider +(`iconik://asset/` URIs on `connectors sync`/`inspect`, `--from/--to` on +asset date_created and `--title-search` on `connectors files`, custom +metadata-view fields under `source_metadata.iconik_metadata.`; +feature `library.connectors.iconik.v1`); `library collections create --type +metadata` makes a metadata collection that indexes connector source_metadata ++ user metadata (new `collections add --metadata ''`) into +file-level search documents WITHOUT processing media — free to index, no +processing configs (create rejects `--prompt`/`--schema`), queried via +`probe --scope file`/`ask` (feature `library.collections.metadata.v1`); +`probe --filter ""` (repeatable, ANDed, collection scopes +only; ops `=` `!=` `>` `<` `~=` LIKE `*=` contains-any `&=` contains-all +`^=` in; path prefixes route to source_metadata/metadata/video_info/file +buckets, `file.*` stripped to the bare column) filters before semantic +ranking (feature `probe.filters.v1`); and `library connectors refresh +` re-fetches an existing file's source_metadata from its +connector and re-indexes its metadata collections — free (feature +`library.connectors.refresh.v1`; refresh takes a SOURCE, unlike +inspect/sync which take `[connector-id] `). Because the skill teaches +the new flags/subcommands, the floor was raised to 0.3.15 (same +merge-after-CDN gate). The host-level `profile` verb and the leading global flags `--home`/`--profile` (also `$TINYCLOUD_HOME`; 0.3.3+) relocate state and are intentionally absent from `commands --json` — like the launcher's install/update, they're CLI/host concerns, not video operations. diff --git a/README.md b/README.md index 720d7aa..ef2a146 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,11 @@ The npm package is a small launcher: on first run it downloads the matching platform distribution from Cloudglue's CDN (cached under `~/.tinycloud/versions//`), verifies its checksum, and execs the real binary. The package version pins the binary version, so -`npx @cloudglue/tinycloud@0.3.14` always runs tinycloud 0.3.14. It also adds two +`npx @cloudglue/tinycloud@0.3.15` always runs tinycloud 0.3.15. It also adds two wrapper commands: ```bash -tinycloud install --version 0.3.14 # pre-download a version +tinycloud install --version 0.3.15 # pre-download a version tinycloud install --latest # install latest stable and pin to it tinycloud update # move to latest stable, prune old versions ``` diff --git a/package.json b/package.json index 910089c..482a640 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cloudglue/tinycloud", - "version": "0.3.14", + "version": "0.3.15", "description": "Agent CLI for deep video and image work, by Cloudglue. Downloads the tinycloud binary on first run.", "bin": { "tinycloud": "bin/tinycloud.js" diff --git a/skills/tinycloud/SKILL.md b/skills/tinycloud/SKILL.md index 607fe25..70cdff1 100644 --- a/skills/tinycloud/SKILL.md +++ b/skills/tinycloud/SKILL.md @@ -89,6 +89,8 @@ tinycloud caption ./demo.mp4 --format srt --transcript -o ./tinycloud-output/cap # Find things: local keyword search vs cloud semantic search vs Q&A tinycloud search "pricing" --in ./demo.mp4 --json tinycloud probe "product demo moments" --in collection:col_123 --scope segment --limit 5 --json +tinycloud probe "renewal call" --in collection:col_123 --scope file \ + --filter "source_metadata.parties.email~=%@acme.com" --json # filter by stored fields (0.3.15+) tinycloud ask "What objections came up?" --in ./demo.mp4 --json # Local editing (free, ffmpeg-backed) @@ -110,16 +112,23 @@ tinycloud jobs wait --timeout 120s --json # Collections (0.3.4+) — turn videos into a reusable, queryable knowledge base. # Lifecycle (every --type): create → add → poll show → query → delete. tinycloud library collections list --json -tinycloud library collections create my-desc --type media-descriptions --json # types: media-descriptions | face-analysis | entities (--prompt) | rich-transcripts +tinycloud library collections create my-desc --type media-descriptions --json # types: media-descriptions | face-analysis | entities (--prompt) | rich-transcripts | metadata (0.3.15+) tinycloud library collections add ./demo.mp4 --to col_desc --json # uploads a local source first; enrichment is async (pending) tinycloud library collections show col_desc --json # poll files[].status until completed, then query — # the collection's --type decides the read verb (each line below is a DIFFERENT, matching-type collection): tinycloud ask "what's discussed?" --in collection:col_desc --json # media-descriptions → ask / probe / search tinycloud face search ./person.jpg --in collection:col_faces --json # face-analysis → face list / face search tinycloud library collections entities col_ents ./demo.mp4 --json # entities → collections entities +tinycloud probe "kickoff" --in collection:col_meta --scope file --json # metadata (free, no processing) → probe --scope file / ask tinycloud library collections remove cloudglue://files/ --from col_desc --json tinycloud library collections delete col_desc --json +# Metadata collections (0.3.15+) — index connector source_metadata + user +# metadata into file-level search docs WITHOUT processing media (free): +tinycloud library collections create meetings --type metadata --json +tinycloud library collections add zoom://uuid/ --to col_meta --metadata '{"deal":"acme"}' --json +tinycloud library connectors refresh cloudglue://files/ --json # re-fetch stale source_metadata, re-index (free) + # Publish an HTML artifact to Cloudglue Sites (manage with list / unpublish) tinycloud publish ./tinycloud-output/html/report.html --name report --visibility private --json tinycloud publish list --json @@ -186,6 +195,10 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow added to collections. Local `search` can match cached `see` results. - Do not pass `--background` to `ask`; background jobs exist only for tracked async ops (`watch`, `see`, `extract`). +- `probe --filter` works only with a collection scope (`--in + collection:col_…`), and a `metadata` collection is file-level — probe it + with `--scope file` (segment scope errors). `source_metadata.*` filters are + file-level facts too, so pair them with `--scope file`. - `workflow status` / `workflow resume` are not implemented in 0.3.x; treat `paused`/`partial` as terminal and surface `resume` metadata to the user. - `--no-upload` / `--no-download` make commands refuse cloud upload / local diff --git a/skills/tinycloud/reference/glossary.md b/skills/tinycloud/reference/glossary.md index 6f56176..c4292a7 100644 --- a/skills/tinycloud/reference/glossary.md +++ b/skills/tinycloud/reference/glossary.md @@ -31,19 +31,36 @@ connector?" or an envelope field needs explaining. sales calls". Verbs scope to one with `--in collection:col_…`. Collection ids are stable; display names are not. A collection has a type that decides which verb reads it: `media-descriptions` (default) backs `ask`/`probe`/`search`, - `face-analysis` backs `face list`/`face search`, and `entities` (created with - `--prompt`/`--schema`) backs `library collections entities` (`rich-transcripts` + `face-analysis` backs `face list`/`face search`, `entities` (created with + `--prompt`/`--schema`) backs `library collections entities`, and `metadata` + (0.3.15+) backs `probe --scope file`/`ask` (`rich-transcripts` also exists). Manage them with `library collections create|add|remove|delete` (0.3.4+); every type follows `create → add → poll show → query → delete`. `add` enriches each file asynchronously and returns `pending` — poll `library collections show ` until every `files[].status` is `completed` before querying. +- **Metadata collection (0.3.15+)** — a `--type metadata` collection that + indexes connector `source_metadata` plus user metadata (`collections add + --metadata ''`) into file-level search documents WITHOUT downloading + or processing the media — free to index, no processing configs. Query with + `probe --scope file` (optionally `--filter` on `source_metadata.*` / + `metadata.*` paths) or `ask`; feature id `library.collections.metadata.v1`. +- **Source metadata** — the provider-supplied fields a connector attaches to + a synced file (`source_metadata`: title, participants, dates, tags, AI + summary; Iconik adds `iconik_metadata.` custom fields). Peek it + without creating a file (`connectors inspect`), re-fetch it for an existing + file (`connectors refresh`, 0.3.15+ — also re-indexes metadata + collections), and filter searches on it (`probe --filter + "source_metadata.…"`, 0.3.15+). - **Data connector** — a linked external source of recordings (Zoom, Grain, - Gong, Recall, Google Drive, Dropbox, S3/GCS). `tinycloud library connectors …` + Gong, Recall, Google Drive, Dropbox, Iconik (0.3.15+), S3/GCS). + `tinycloud library connectors …` lists, browses (`files`, with provider-specific filters; rows carry provider metadata on 0.3.11+), peeks one item's provider metadata without syncing - (`inspect`, 0.3.11+), and syncs individual items by URI - (e.g. `grain://recording/`) so they become Cloudglue files. + (`inspect`, 0.3.11+), re-fetches an existing file's stored metadata + (`refresh`, 0.3.15+), and syncs individual items by URI + (e.g. `grain://recording/`, `iconik://asset/`) so they become + Cloudglue files. - **Source** — anything a verb accepts as input: a local path, URL, `cloudglue://files/` URI, connector URI, collection, or a bare file-id UUID (normalized to `cloudglue://files/`; an existing local path of the diff --git a/skills/tinycloud/reference/verbs.md b/skills/tinycloud/reference/verbs.md index 46bb999..d9d41e4 100644 --- a/skills/tinycloud/reference/verbs.md +++ b/skills/tinycloud/reference/verbs.md @@ -144,8 +144,30 @@ place during the scan, nothing is re-billed). ```bash tinycloud probe "" --in collection:col_… [--scope file|segment] [--limit 20] +tinycloud probe "" --in collection:col_… --scope file \ + --filter "source_metadata.host_email=kevin@acme.com" --filter "source_metadata.tags*=demo,intro" ``` +`--filter ` (0.3.15+, feature `probe.filters.v1`; repeatable, +ANDed, collection scopes only) narrows the searched set by stored fields. +A filtered probe runs a single-pass hybrid search over the collection +(deterministic, cheaper) instead of the agentic multi-query deep search, so +`data.summary` is null on that path — read `data.results`. +Ops: `=` `!=` `>` `<` `~=` (SQL LIKE, `%` wildcards) +`*=` (contains any of `a,b`) `&=` (contains all) `^=` (in). Path prefixes +route the filter: `source_metadata.*` (connector-provided fields — e.g. +`source_metadata.topic` for Zoom, `source_metadata.title` for +Gong/Grain/Iconik, `source_metadata.parties.email` for Gong, +`source_metadata.participants.name` for Grain, +`source_metadata.iconik_metadata.` for Iconik custom fields — paths +through arrays match when ANY element matches; ISO datetime fields compare as +strings with `<`/`>`), `metadata.*` (user metadata from `collections add +--metadata`), `video_info.duration_seconds|has_audio`, and +`file.filename|bytes|uri|created_at|id`. source_metadata filters are +file-level facts — pair them with `--scope file`. Probing a `metadata` +collection requires `--scope file` (its documents are file-level; segment +scope errors). + ### ask — grounded Q&A (cloud) ```bash @@ -216,14 +238,15 @@ tinycloud library collections list --json tinycloud library collections show --json # files[].status: pending|processing|completed (readiness) tinycloud library collections sync --artifacts descriptions,transcripts,thumbnails,metadata --json # Collection writes (0.3.4+) — the only write paths in library: -tinycloud library collections create [--type media-descriptions|entities|rich-transcripts|face-analysis] [--description ] [--prompt | --schema ] --json -tinycloud library collections add --to [--no-upload] [--no-download] --json +tinycloud library collections create [--type media-descriptions|entities|rich-transcripts|face-analysis|metadata] [--description ] [--prompt | --schema ] --json +tinycloud library collections add --to [--metadata ''] [--no-upload] [--no-download] --json tinycloud library collections remove --from --json tinycloud library collections delete --json tinycloud library collections entities [--limit ] [--offset ] --json # read a video's entities tinycloud library connectors list --json tinycloud library connectors files [--limit 25] [--page-token ] --json tinycloud library connectors inspect [] --json # metadata peek, no file created (0.3.11+) +tinycloud library connectors refresh --json # re-fetch stored source_metadata (0.3.15+) tinycloud library connectors sync [] --json ``` @@ -231,10 +254,15 @@ tinycloud library connectors sync [] ` or `--schema ` — or `create` errors. `add` +spec — `--prompt ` or `--schema ` — or `create` errors, and a +`metadata` collection takes NO processing configs (`create` rejects +`--prompt`/`--schema`). `add` (`--to `, or `--collection`) resolves the source like `watch`/`extract` — a local file uploads first (or `needs_upload` with `--no-upload`) — and records -the file→collection mapping; `remove` (`--from `) takes a Cloudglue file +the file→collection mapping; `--metadata ''` (0.3.15+) +attaches a JSON object of user metadata to the added file, which metadata +collections index next to the connector's `source_metadata`. `remove` +(`--from `) takes a Cloudglue file id/uri; `delete` removes the whole collection (and cleans the local mirror). Collection ids accept a bare uuid, a `col_…` slug, or `collection:` / `cloudglue://collections/` forms, consistently across read and write paths. @@ -253,33 +281,50 @@ same `create → add → poll show → query → delete` lifecycle): | `face-analysis` | `face list` / `face search` | | `entities` (needs `--prompt`/`--schema`) | `library collections entities ` | | `rich-transcripts` | `collections sync --artifacts transcripts` | +| `metadata` (0.3.15+, free) | `probe --scope file` / `ask` | `collections entities ` returns a video's extracted entities (video- and segment-level, `--limit`/`--offset`) from an `entities` collection. For a one-off per-video pull without standing up a collection, `extract` returns entities/facts directly (free-form query or `--schema`). +**Metadata collections** (0.3.15+, feature `library.collections.metadata.v1`) +index connector `source_metadata` plus user `--metadata` fields into +file-level search documents WITHOUT downloading or processing the media — +indexing is free and near-instant (no describe/transcribe jobs, so `add` +readiness is quick). Add google-drive, dropbox, zoom, gong, recall, grain, or +iconik URIs/share links (or already-synced files) and query with +`probe --scope file` (segment scope errors) or `ask`, using `--filter` on +`source_metadata.*`/`metadata.*` paths to narrow. Use one to triage a large +connector library (titles, participants, dates, tags) before paying for full +processing in a `media-descriptions` collection. + `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 (`grain://recording/`, `gdrive://file/`, `dropbox://`, -`zoom://uuid/`, `s3:///`, …) and share links are accepted: +`zoom://uuid/`, `iconik://asset/` (0.3.15+), `s3:///`, +…) and share links are accepted: Dropbox file share links sync server-side via the connector's OAuth (including login-gated links); `zoom.us/rec/share` links resolve best-effort (Zoom mints a new token per copy — the recording-detail link is the reliable form). Link warnings are advisory and surface in `data.warnings` rather than blocking the sync. Synced files carry provider `source_metadata` (title, -participants, summary) for Grain, Zoom, Recall, Google Drive, Dropbox, and -Gong. Non-connector public URLs (direct media URLs, TikTok, +participants, summary) for Grain, Zoom, Recall, Google Drive, Dropbox, Gong, +and — on 0.3.15+ — Iconik (whose `source_metadata.iconik_metadata.` +carries custom metadata-view fields). Non-connector public URLs (direct media +URLs, TikTok, Loom, public Dropbox links without a connector) sync into a standalone Cloudglue file via direct URL ingestion — same command, no connector needed. YouTube URLs cannot sync; use `tinycloud grab` instead. `connectors files` also takes provider-specific filters: `--from`/`--to` (dates — every provider except S3/GCS; Zoom and Gong default to the last -6 months), `--folder-id` (Google Drive), `--path` (Dropbox), +6 months; Iconik filters on asset date_created), `--folder-id` (Google +Drive), `--path` (Dropbox), `--bucket`/`--prefix` (S3/GCS — bucket required), `--title-search` (Grain, -Zoom, Google Drive, Dropbox, Gong), `--team`/`--meeting-type` (Grain). +Zoom, Google Drive, Dropbox, Gong, Iconik), `--team`/`--meeting-type` +(Grain). Filters a provider can't honor are ignored, and filtered pages can come back short or even empty while more remain — keep paging until `next_page_token` is null. On 0.3.11+ each row also carries provider `metadata` (participants, @@ -294,6 +339,18 @@ nothing richer to inspect. On older binaries it fails with an unknown-command error — fall back to `connectors sync` (idempotent) and read `source_metadata` from the sync envelope instead. +`connectors refresh ` (0.3.15+, feature +`library.connectors.refresh.v1`) re-fetches an EXISTING file's +`source_metadata` live from its connector, updates the stored value, and +re-indexes any metadata collections the file belongs to — free, no media +downloaded. It takes a file id / `cloudglue://files/` URI / synced +connector URL (not a connector id); only connector-synced files have provider +metadata to refresh. Use it when a recording's title/participants changed +upstream or a metadata collection is serving stale fields. On older binaries +it fails with an unknown-command error — re-running `connectors sync` on the +original URI is the closest (idempotent) fallback, though it does not +re-index metadata collections. + ### jobs — async work ```bash diff --git a/skills/tinycloud/scripts/preflight.sh b/skills/tinycloud/scripts/preflight.sh index ff7d75a..4068b5b 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.14" +MIN_VERSION="0.3.15" 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 ask.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.sync.url.v1 workflow.v1 publish.v1 publish.manage.v1 publish.video.v1 publish.link.preview.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 ask.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.sync.url.v1 workflow.v1 publish.v1 publish.manage.v1 publish.video.v1 publish.link.preview.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 94cdfa7..728ed28 100644 --- a/skills/tinycloud/tinycloud-skill.json +++ b/skills/tinycloud/tinycloud-skill.json @@ -1,8 +1,8 @@ { - "skill_version": "0.3.14", + "skill_version": "0.3.15", "tinycloud": { - "min_version": "0.3.14", - "supported_range": ">=0.3.14 <0.4.0", + "min_version": "0.3.15", + "supported_range": ">=0.3.15 <0.4.0", "required_features": [ "envelope.v1", "watch.v1", @@ -13,6 +13,7 @@ "caption.v1", "search.v1", "probe.v1", + "probe.filters.v1", "ask.v1", "clip.v1", "grab.v1", @@ -22,6 +23,7 @@ "library.collections.create.v1", "library.collections.mutate.v1", "library.collections.entities.v1", + "library.collections.metadata.v1", "library.sync.url.v1", "workflow.v1", "publish.v1", From 04ebdb0a42ff1a9ff69c51dd4045edd6f3dd582b Mon Sep 17 00:00:00 2001 From: KDR Date: Wed, 22 Jul 2026 17:23:06 -0700 Subject: [PATCH 2/3] =?UTF-8?q?docs:=20probe=20filter=20wire=20shape=20?= =?UTF-8?q?=E2=80=94=20video=5Finfo.*=20also=20strips=20to=20the=20bare=20?= =?UTF-8?q?field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 983f4ae..f4099f6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -177,7 +177,8 @@ processing configs (create rejects `--prompt`/`--schema`), queried via `probe --filter ""` (repeatable, ANDed, collection scopes only; ops `=` `!=` `>` `<` `~=` LIKE `*=` contains-any `&=` contains-all `^=` in; path prefixes route to source_metadata/metadata/video_info/file -buckets, `file.*` stripped to the bare column) filters before semantic +buckets, `video_info.*`/`file.*` stripped to the bare field the schema +enums) filters before semantic ranking (feature `probe.filters.v1`); and `library connectors refresh ` re-fetches an existing file's source_metadata from its connector and re-indexes its metadata collections — free (feature From 8307e2728b7003a23f558e5a2a00b5560da1e2e5 Mon Sep 17 00:00:00 2001 From: KDR Date: Thu, 23 Jul 2026 11:11:19 -0700 Subject: [PATCH 3/3] =?UTF-8?q?docs(probe):=20filters=20bind=20in=20deep?= =?UTF-8?q?=20search=20=E2=80=94=20drop=20the=20single-pass=20caveat=20(up?= =?UTF-8?q?stream=20kb.filter=20fix=20deployed=20with=200.3.15)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skills/tinycloud/reference/verbs.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/skills/tinycloud/reference/verbs.md b/skills/tinycloud/reference/verbs.md index d9d41e4..27c27a5 100644 --- a/skills/tinycloud/reference/verbs.md +++ b/skills/tinycloud/reference/verbs.md @@ -149,10 +149,9 @@ tinycloud probe "" --in collection:col_… --scope file \ ``` `--filter ` (0.3.15+, feature `probe.filters.v1`; repeatable, -ANDed, collection scopes only) narrows the searched set by stored fields. -A filtered probe runs a single-pass hybrid search over the collection -(deterministic, cheaper) instead of the agentic multi-query deep search, so -`data.summary` is null on that path — read `data.results`. +ANDed, collection scopes only) narrows the searched set by stored fields +before semantic ranking. Criteria are ANDed — with each other and with any +filters the search plans itself — so they can only narrow results. Ops: `=` `!=` `>` `<` `~=` (SQL LIKE, `%` wildcards) `*=` (contains any of `a,b`) `&=` (contains all) `^=` (in). Path prefixes route the filter: `source_metadata.*` (connector-provided fields — e.g.