@cloudglue/tinycloud 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # Tinycloud
2
2
 
3
- Agent CLI for deep video work. Point it at videos and ask for analysis,
4
- dashboards, subtitles, clips, search, or repurposed content — or drive its
5
- verbs directly from your own agent. Powered by [Cloudglue](https://cloudglue.dev).
6
- Learn more at [tinycloud.sh](https://tinycloud.sh).
3
+ Agent CLI for deep video and image work. Point it at videos or images and ask
4
+ for analysis, dashboards, subtitles, clips, search, or repurposed content — or
5
+ drive its verbs directly from your own agent. Powered by
6
+ [Cloudglue](https://cloudglue.dev). Learn more at
7
+ [tinycloud.sh](https://tinycloud.sh).
7
8
 
8
9
  ## Install
9
10
 
@@ -16,11 +17,11 @@ The npm package is a small launcher: on first run it downloads the matching
16
17
  platform distribution from Cloudglue's CDN (cached under
17
18
  `~/.tinycloud/versions/<version>/`), verifies its checksum, and execs the real
18
19
  binary. The package version pins the binary version, so
19
- `npx @cloudglue/tinycloud@0.3.5` always runs tinycloud 0.3.5. It also adds two
20
+ `npx @cloudglue/tinycloud@0.3.7` always runs tinycloud 0.3.7. It also adds two
20
21
  wrapper commands:
21
22
 
22
23
  ```bash
23
- tinycloud install --version 0.3.5 # pre-download a version
24
+ tinycloud install --version 0.3.7 # pre-download a version
24
25
  tinycloud install --latest # install latest stable and pin to it
25
26
  tinycloud update # move to latest stable, prune old versions
26
27
  ```
@@ -116,7 +117,8 @@ go to stderr) — pass `--json`.
116
117
  | Command | What it does |
117
118
  |---|---|
118
119
  | `watch` | Analyze a video → reusable cached context + Cloudglue-ready ref |
119
- | `extract` | Pull structured facts, entities, or moments (free-form or JSON-schema) |
120
+ | `see` | Analyze an image reusable cached context + Cloudglue-ready ref (JPEG/PNG/WebP) |
121
+ | `extract` | Pull structured facts, entities, or moments from a video or image (free-form or JSON-schema) |
120
122
  | `caption` | Subtitles and transcripts (SRT/VTT/ASS) |
121
123
  | `search` | Keyword search over cached video context |
122
124
  | `probe` | Semantic moment/video search over a Cloudglue scope |
@@ -135,15 +137,19 @@ A few common invocations:
135
137
  ```bash
136
138
  # Analyze a video into reusable, cached context + a Cloudglue-ready ref
137
139
  tinycloud watch ./demo.mp4 --json
140
+ # Describe an image — the file-level counterpart of watch (JPEG/PNG/WebP)
141
+ tinycloud see ./photo.jpg --json
138
142
  # Pull structured findings (free-form query here; pass --schema for a fixed shape)
139
143
  tinycloud extract "key moments with timestamps" ./demo.mp4 --json
144
+ # extract also works on an image source (no segment/shot flags on images)
145
+ tinycloud extract "on-screen text and key objects" ./photo.png --json
140
146
  # Subtitles plus a markdown transcript
141
147
  tinycloud caption ./demo.mp4 --format srt --transcript --json
142
148
  # Trim a clip locally — no upload, ffmpeg-backed
143
149
  tinycloud clip cut ./demo.mp4 --start 12 --end 28 -o clip.mp4 --json
144
150
  # Grounded Q&A over one or more videos
145
151
  tinycloud ask "What objections came up?" --in ./demo.mp4 --json
146
- # Detect faces, or match a known face against a video (0.3.4+)
152
+ # Detect faces, or match a known face against a video (0.3.4+; query image: JPEG/PNG)
147
153
  tinycloud face match ./person.jpg ./demo.mp4 --max-faces 10 --json
148
154
  ```
149
155
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudglue/tinycloud",
3
- "version": "0.3.5",
4
- "description": "Agent CLI for deep video work, by Cloudglue. Downloads the tinycloud binary on first run.",
3
+ "version": "0.3.7",
4
+ "description": "Agent CLI for deep video and image work, by Cloudglue. Downloads the tinycloud binary on first run.",
5
5
  "bin": {
6
6
  "tinycloud": "bin/tinycloud.js"
7
7
  },
@@ -1,15 +1,17 @@
1
1
  ---
2
2
  name: tinycloud
3
3
  description: >-
4
- Deep video work via the tinycloud CLI (Cloudglue). Use whenever the task
5
- involves understanding or manipulating video or audio-visual media: analyze
6
- or summarize a video, extract structured facts/moments/entities, generate
7
- captions or transcripts (SRT/VTT), search inside videos, answer questions
8
- about footage, cut/stitch/thumbnail/transcode clips, download remote videos,
9
- browse Cloudglue collections, or run packaged video workflows. Triggers on
10
- video files (.mp4, .mov, .webm, ...), YouTube/video URLs, Cloudglue
11
- collections, or any "what's in this video / make clips / caption this"
12
- request. Every command returns a machine-readable JSON envelope.
4
+ Deep video and image work via the tinycloud CLI (Cloudglue). Use whenever the
5
+ task involves understanding or manipulating video, audio-visual media, or
6
+ images: analyze or summarize a video, describe or analyze an image, extract
7
+ structured facts/moments/entities from a video or image, generate captions or
8
+ transcripts (SRT/VTT), search inside videos, answer questions about footage,
9
+ cut/stitch/thumbnail/transcode clips, download remote videos, browse Cloudglue
10
+ collections, or run packaged video workflows. Triggers on video files (.mp4,
11
+ .mov, .webm, ...), image files (.jpg, .png, .webp), YouTube/video URLs,
12
+ Cloudglue collections, or any "what's in this video / describe this image /
13
+ make clips / caption this" request. Every command returns a machine-readable
14
+ JSON envelope.
13
15
  ---
14
16
 
15
17
  # Tinycloud: video operations for agents
@@ -61,7 +63,7 @@ Full schema and error codes: [reference/envelope.md](reference/envelope.md).
61
63
 
62
64
  ## 2. Core verbs (cheat sheet)
63
65
 
64
- Cloud verbs (`watch extract probe ask publish face`) call the Cloudglue API
66
+ Cloud verbs (`watch see extract probe ask publish face`) call the Cloudglue API
65
67
  using the configured key — usage is billed per the
66
68
  [rate card](https://app.cloudglue.dev/home/billing/rate-card). `search clip
67
69
  setup` are local and free; `grab jobs` are network-only.
@@ -71,9 +73,14 @@ setup` are local and free; `grab jobs` are network-only.
71
73
  # Understand a video (creates reusable cached context + cloud-ready ref)
72
74
  tinycloud watch ./demo.mp4 --json
73
75
 
76
+ # Understand an image — the file-level counterpart of watch (0.3.7+, JPEG/PNG/WebP)
77
+ tinycloud see ./photo.jpg --json
78
+
74
79
  # Pipe context into structured extraction (JSONL flows between pipes)
75
80
  tinycloud watch ./demo.mp4 --json | tinycloud extract "key moments with timestamps" --json
76
81
  tinycloud extract --schema ./schema.json ./demo.mp4 --segment-level --json
82
+ # extract also takes an image source (0.3.7+) — no segment/shot flags on images
83
+ tinycloud extract "on-screen text and key objects" ./photo.png --json
77
84
 
78
85
  # Captions / transcripts
79
86
  tinycloud caption ./demo.mp4 --format srt --transcript -o ./tinycloud-output/captions/ --json
@@ -91,7 +98,7 @@ tinycloud clip burn ./demo.mp4 --subtitle-file ./captions/demo.srt -o ./out.mp4
91
98
 
92
99
  # Faces on a single video (cloud, 0.3.4+) — for collection-scale face search/list, see Collections below
93
100
  tinycloud face detect ./demo.mp4 --json # every face → normalized box + timestamp
94
- tinycloud face match ./person.jpg ./demo.mp4 --max-faces 10 --json # query image, ranked 0–100 similarity
101
+ tinycloud face match ./person.jpg ./demo.mp4 --max-faces 10 --json # query image (JPEG/PNG), ranked 0–100 similarity
95
102
 
96
103
  # Remote videos, async jobs
97
104
  tinycloud grab https://youtu.be/<id> -o ./tinycloud-output/grabbed/ --json
@@ -166,8 +173,16 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow
166
173
  - Sources: local paths, URLs, `cloudglue://files/<id>` URIs,
167
174
  `collection:col_…`, or a bare Cloudglue file-id UUID (normalized to
168
175
  `cloudglue://files/<id>`; an existing local path of the same name wins).
176
+ - Images (0.3.7+): use `see` to describe an image and `extract` to pull
177
+ structured data from one — **JPEG/PNG/WebP only** (HEIC/GIF/BMP are rejected
178
+ with a "transcode first" hint). `watch <image>` and `caption <image>` error
179
+ and redirect you to `see`/`extract` (an image has no video track to analyze
180
+ or speech to caption); images have no segments, so drop `--segment-level`/
181
+ `--segmentation`/`--shot-*` on an image source. A local image uploads first; a
182
+ public `http(s)` image URL is analyzed in place (no upload). Images can't be
183
+ added to collections. Local `search` can match cached `see` results.
169
184
  - Do not pass `--background` to `ask`; background jobs exist only for tracked
170
- async ops (`watch`, `extract`).
185
+ async ops (`watch`, `see`, `extract`).
171
186
  - `workflow status` / `workflow resume` are not implemented in 0.3.x; treat
172
187
  `paused`/`partial` as terminal and surface `resume` metadata to the user.
173
188
  - `--no-upload` / `--no-download` make commands refuse cloud upload / local
@@ -193,6 +208,13 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow
193
208
  (`<cg-playlist>`, `<cg-grid>`, `<cg-chapters>`) rather than hand-rolled
194
209
  players, galleries, or segment-list JS — details in
195
210
  [reference/verbs.md](reference/verbs.md).
211
+ - Live-API discovery components (0.3.6+): the same embed script also defines
212
+ collection-scoped, **private-site-only** elements that let viewers search/chat
213
+ inside a published site — `<cg-chat>`, `<cg-search>`, `<cg-deep-search>`,
214
+ `<cg-face-search>` (chat/search/deep-search need a media-descriptions or
215
+ rich-transcripts collection; face-search needs face-analysis). `publish`
216
+ **hard-rejects** them on a public site → publish with `--visibility private`.
217
+ See [reference/verbs.md](reference/verbs.md).
196
218
 
197
219
  ## 5. Reference (load on demand)
198
220
 
@@ -60,10 +60,12 @@ the exit code alone.
60
60
 
61
61
  `upstream` on a piped command means the upstream envelope was not `ready` —
62
62
  fix the upstream failure, don't retry downstream. `upstream` from a cloud
63
- call itself is a Cloudglue API failure; when it's a request deadline
64
- (retryable, message names `TINYCLOUD_HTTP_TIMEOUT_MS` /
65
- `TINYCLOUD_UPLOAD_TIMEOUT_MS`), the server may still be processingretry
66
- or raise the knob.
63
+ call itself is a Cloudglue API failure; transient ones (request deadline,
64
+ 408/429/5xx, idle-timeout abort) are marked `retryable`, and idempotent reads
65
+ are already auto-retried with backoff before surfacingso a retryable
66
+ `upstream` means the server may still be processing or retries were exhausted:
67
+ retry later or raise the knob the message names (`TINYCLOUD_HTTP_TIMEOUT_MS` /
68
+ `TINYCLOUD_UPLOAD_TIMEOUT_MS`).
67
69
 
68
70
  ## JSON vs JSONL vs text
69
71
 
@@ -41,6 +41,18 @@ connector?" or an envelope field needs explaining.
41
41
  `cloudglue://files/<id>` URI, connector URI, collection, or a bare file-id
42
42
  UUID (normalized to `cloudglue://files/<id>`; an existing local path of the
43
43
  same name wins).
44
+ - **Supported inputs** — local uploads (`watch`, `see`, `extract`, `face`,
45
+ `library collections add`) map by extension: video `.mp4 .mov .webm .mkv .m4v`,
46
+ audio `.mp3 .wav .m4a`, and (for `see`/`extract` only, 0.3.7+) image
47
+ `.jpg .jpeg .png .webp`. Other extensions upload as `application/octet-stream`
48
+ and may be rejected upstream — transcode to a mapped container first
49
+ (`clip transcode`); unsupported image types (HEIC/GIF/BMP) are rejected before
50
+ upload with a "transcode to JPEG, PNG, or WebP" hint. Local uploads are bounded
51
+ by Cloudglue at ~3 GB and 2 s–3 h (connector ingests allow more); a public
52
+ `http(s)` image URL is analyzed in place with no upload. `face match`/`face
53
+ search` query images must be **JPEG or PNG**. Images can't be added to
54
+ collections. Use `grab` for YouTube and `library connectors sync` for share
55
+ links rather than passing those URLs to upload verbs.
44
56
  - **`ref` / `source_id` / `result_id`** — stable identifiers in every
45
57
  envelope. `ref` is a reusable pointer to the analyzed source (including
46
58
  `cloud_ready` and the Cloudglue file id) that pipes between verbs;
@@ -55,6 +67,11 @@ connector?" or an envelope field needs explaining.
55
67
  produces (summary, segments, transcript-ish context). Cached locally and
56
68
  mirrored in Cloudglue, so later `extract`/`ask`/`search` reuse it instead
57
69
  of re-analyzing.
70
+ - **See / image describe (0.3.7+)** — the image counterpart of `watch`:
71
+ `tinycloud see <image>` produces file-level image context (title,
72
+ description, on-screen text) and a reusable `ref`, with no segmentation or
73
+ shots. JPEG/PNG/WebP only; `extract` accepts the same image sources for
74
+ structured pulls.
58
75
  - **Segmentation** — how a video is split for analysis: `chapters`
59
76
  (semantic), `shots` (visual cuts; bounds tunable via
60
77
  `--shot-min-seconds`/`--shot-max-seconds`, sub-second min allowed),
@@ -100,6 +117,14 @@ connector?" or an envelope field needs explaining.
100
117
  events re-dispatched on the element) for custom site HTML, and plays
101
118
  standalone or inside the container components (`<cg-playlist>`,
102
119
  `<cg-grid>`, `<cg-chapters>`) — see reference/verbs.md.
120
+ - **Discovery components (live API, 0.3.6+)** — the same embed script also
121
+ defines four collection-scoped, **private-site-only** elements that let a
122
+ viewer search or chat inside a published site and play results inline via
123
+ `<cg-video>`: `<cg-chat>`, `<cg-search>`, `<cg-deep-search>` (over a
124
+ media-descriptions / rich-transcripts collection) and `<cg-face-search>` (over
125
+ a face-analysis collection). They carry no share id, but `tinycloud publish`
126
+ rejects them on a public site — publish `--visibility private`. See
127
+ reference/verbs.md.
103
128
 
104
129
  ## State and isolation (0.3.3+)
105
130
 
@@ -22,6 +22,11 @@ cat sources.txt | tinycloud watch --json
22
22
 
23
23
  - Piping watch envelopes into `search` / `probe` / `ask` auto-scopes them via
24
24
  `ref.cloudglue_file_id` / collection ids.
25
+ - A verb invoked with an explicit source/scope never reads stdin — only the
26
+ pipe form above (a source-less verb after `|`), `setup --stdin`, and a bare
27
+ `tinycloud` prompt do. When spawning tinycloud non-interactively (a subprocess
28
+ or a script), close or ignore its stdin (`</dev/null`, or Node
29
+ `stdio: ["ignore", …]`) and wrap the call in a timeout as a backstop.
25
30
 
26
31
  ## Multi-video batching
27
32
 
@@ -36,7 +41,7 @@ tinycloud caption ./talks/*.mp4 --format srt -o ./tinycloud-output/captions/ --j
36
41
 
37
42
  ## Async jobs
38
43
 
39
- Long cloud operations (`watch`, `extract`) support `--background`:
44
+ Long cloud operations (`watch`, `see`, `extract`) support `--background`:
40
45
 
41
46
  ```bash
42
47
  tinycloud watch ./long.mp4 --background --json # → status:"pending", meta.job_id
@@ -99,11 +99,20 @@ binary reports in `--version --json`.
99
99
  | `TINYCLOUD_HOME` | Isolated state home — config, sessions, cache, jobs, artifacts, skills (default `~/.tinycloud`; same as `--home`). 0.3.3+ |
100
100
  | `TINYCLOUD_OUT` | Output base for generated files (wins over a config `outputBase`) |
101
101
  | `TINYCLOUD_HTTP_TIMEOUT_MS` | Hard deadline per Cloudglue request (default 120s; `0` disables) |
102
- | `TINYCLOUD_UPLOAD_TIMEOUT_MS` | Deadline for upload-shaped requests (default 60min; `0` disables) |
102
+ | `TINYCLOUD_UPLOAD_TIMEOUT_MS` | Total deadline for upload-shaped requests (default 60min; `0` disables) |
103
+ | `TINYCLOUD_UPLOAD_IDLE_TIMEOUT_MS` | Idle (no-progress) deadline for an upload — aborts a wedged transfer in ~1min instead of waiting out the total upload deadline (default 60s; `0` disables) |
104
+ | `TINYCLOUD_HTTP_RETRIES` | Bounded auto-retries for idempotent (GET/HEAD) Cloudglue calls on transient errors — 408/429/5xx, network blips (default 5; `0` disables) |
105
+ | `TINYCLOUD_JOB_WAIT_TIMEOUT_MS` | Wall-clock budget for async job waits (the `waitForReady` poll behind `watch`/`extract`/`face`) (default 10min; `0` disables) |
106
+ | `TINYCLOUD_MODEL_RETRIES` | Client-side retries for the interactive agent's chat-model turns on transient connection errors (default 5; `0` disables). 0.3.7+ |
103
107
 
104
108
  Every Cloudglue request carries a hard deadline, so a stalled route can never
105
109
  hang the CLI indefinitely; a timeout surfaces as a retryable `upstream` error
106
- envelope whose message names the knob to adjust.
110
+ envelope whose message names the knob to adjust. Idempotent reads (GET/HEAD,
111
+ including the status polls behind async waits) auto-retry transient failures
112
+ (408/429/5xx, network blips, idle-timeout aborts) with backoff + jitter before
113
+ surfacing, and uploads abort early if no progress is seen within the idle
114
+ window. Non-idempotent mutations (upload/create/add/delete) are never
115
+ auto-retried — a retryable `upstream` there is yours to re-issue.
107
116
 
108
117
  ## Profiles & isolated homes (0.3.3+)
109
118
 
@@ -7,7 +7,8 @@ every verb. Regenerate doubts from it instead of trusting prose.
7
7
  | Verb | Cost | Auth | Use |
8
8
  |---|---|---|---|
9
9
  | `watch` | cloud | yes | Analyze a video → reusable context + Cloudglue-ready ref |
10
- | `extract` | cloud | yes | Pull structured facts, entities, or moments |
10
+ | `see` | cloud | yes | Analyze an image reusable context + Cloudglue-ready ref (0.3.7+) |
11
+ | `extract` | cloud | yes | Pull structured facts, entities, or moments (from a video **or** image) |
11
12
  | `caption` | varies | no | Subtitles and transcripts (SRT/VTT/ASS) |
12
13
  | `search` | local | no | Local keyword search over cached context |
13
14
  | `probe` | cloud | yes | Semantic moment/video search over a Cloudglue-ready scope |
@@ -60,9 +61,30 @@ Shot bounds tune `--segment shots` only: min 0.6–600 (fractional/sub-second
60
61
  values catch flash frames and rapid cuts), max 1–600, min ≤ max. Out-of-range
61
62
  or wrong-mode values fail with a validation envelope before any upload. The
62
63
  bounds are part of the cache key, so tuned and default shot passes never
63
- collide.
64
+ collide. `watch` is **video/audio only** — point it at an image and it errors
65
+ ("watch analyzes video/audio; for an image use `tinycloud see`").
64
66
 
65
- ### extractstructured facts
67
+ ### seeanalyze an image (cloud, 0.3.7+)
68
+
69
+ ```bash
70
+ tinycloud see <image> [--visual-only] [--background] --json
71
+ ```
72
+
73
+ The image counterpart of `watch`: file-level image understanding (title +
74
+ description + on-screen text) that produces reusable cached context and a
75
+ Cloudglue-ready ref. Images are **file-level only** — there is no segmentation,
76
+ no shots, no speech/transcript, and no `--start`/`--end` window, so `see` carries
77
+ none of those flags (only `--visual-only` to skip the textual read, plus the
78
+ shared output/cache/upload/source-reuse flags). Accepts **JPEG, PNG, or WebP**;
79
+ other types (HEIC/GIF/BMP/…) are rejected before upload with
80
+ `Unsupported image type for see: <name>. Transcode to JPEG, PNG, or WebP first.`
81
+ A local image uploads first (`needs_upload` without `--no-upload`); a public
82
+ `http(s)` URL that points directly at a JPEG/PNG/WebP image is analyzed **in
83
+ place — no upload** (a URL that can't be recognized as a direct image returns
84
+ `needs_download` — fetch it first with `grab`). Results cache by source +
85
+ options, so re-runs are free.
86
+
87
+ ### extract — structured facts (video or image)
66
88
 
67
89
  ```bash
68
90
  tinycloud extract "<query>" <source> --json # free-form query
@@ -72,8 +94,13 @@ tinycloud extract --schema ./schema.json <source> # JSON-schema-shaped output
72
94
  [--include-thumbnails] [--transcript-mode] [--background]
73
95
  ```
74
96
 
75
- `--shot-min-seconds`/`--shot-max-seconds` work exactly as on `watch`, against
76
- `--segmentation shots`.
97
+ `<source>` may be a video **or an image** (0.3.7+) — same JPEG/PNG/WebP rule
98
+ and local-upload-vs-URL-in-place behavior as `see`. The segmentation flags
99
+ (`--segment-level`/`--segmentation`/`--shot-*`) apply to video only; pass any of
100
+ them with an image source and `extract` rejects it before upload
101
+ (`Images have no segments — drop --segment-level/--segmentation/--shot-* for an
102
+ image source.`). `--shot-min-seconds`/`--shot-max-seconds` work exactly as on
103
+ `watch`, against `--segmentation shots`.
77
104
 
78
105
  ### caption — subtitles and transcripts
79
106
 
@@ -82,6 +109,9 @@ tinycloud caption <source> [--format srt|vtt|ass] [--transcript]
82
109
  [--diarize] [--word-level] [-o <file-or-dir>]
83
110
  ```
84
111
 
112
+ Video/audio only — an image source is rejected ("Images have no speech to
113
+ caption — use `tinycloud see` or `tinycloud extract` to read an image's text.").
114
+
85
115
  ### search — local keyword search (free)
86
116
 
87
117
  ```bash
@@ -89,6 +119,9 @@ tinycloud search "<keyword>" [--in <paths|source-ids|collection-ids|all>]
89
119
  [--field speech|visual|text|entities] [--limit 50]
90
120
  ```
91
121
 
122
+ Searches cached context locally, including cached `see` image results (0.3.7+),
123
+ so a describe you've already run is greppable without another cloud call.
124
+
92
125
  ### probe — semantic search (cloud)
93
126
 
94
127
  ```bash
@@ -143,7 +176,9 @@ tinycloud face search <image> --in collection:col_… [col_…]
143
176
  a normalized 0–1 bounding box (`{top,left,width,height}`) plus a timestamp.
144
177
  `match` takes a query image — a local file (downscaled and sent inline, **never
145
178
  uploaded**) or an http(s) URL — and returns the closest faces ranked by a 0–100
146
- `similarity`. Both upload the *video* first like `watch`/`extract`
179
+ `similarity`. The query image must be a **JPEG or PNG** (Cloudglue face matching
180
+ decodes only JPEG/PNG — webp/heic/gif/bmp are rejected at preflight; a URL must
181
+ likewise point at a JPEG/PNG). Both upload the *video* first like `watch`/`extract`
147
182
  (`needs_upload` without `--no-upload`) and cache by source + options, so re-runs
148
183
  are free. `--fps`/`--start`/`--end` tune sampling and window;
149
184
  `--max-faces`/`--min-similarity` bound `match`, `--limit` bounds `detect`,
@@ -346,6 +381,27 @@ private share — directly or through a container — on a public site. The full
346
381
  reference ships with the binary as `references/cg-video.md` inside the
347
382
  bundled media-artifact skill (under the install's `skills/` directory).
348
383
 
384
+ Discovery components (live API, 0.3.6+): the same `/__cg/embed.js` script also
385
+ defines four **collection-scoped** components that let a viewer search or chat
386
+ *inside* a published site and play the referenced moment inline via `<cg-video>`
387
+ — `<cg-chat>` (conversational Q&A, streaming answers + inline moment citations;
388
+ optional `placeholder`), `<cg-search>` (keyword/transcript text search),
389
+ `<cg-deep-search>` (agentic semantic search), and `<cg-face-search>` (upload or
390
+ paste a face image → matching moments). Each takes `collection="<id>"` (plus
391
+ optional `accent-color` and `--cg-height` CSS sizing); the collection's `--type`
392
+ must match the element — `<cg-chat>`/`<cg-search>`/`<cg-deep-search>` need a
393
+ `media-descriptions` or `rich-transcripts` collection, `<cg-face-search>` needs a
394
+ `face-analysis` collection. Unlike the playback elements they carry **no share
395
+ id**, but their live calls are refused on a public site, so `tinycloud publish`
396
+ **hard-rejects** a page that embeds any of them on a public site — publish with
397
+ `--visibility private`. End to end: build a collection of the right type
398
+ (`library collections create … --type …` → `library collections add` → poll
399
+ `library collections show` until each file is `completed`) → author HTML with
400
+ the component → `tinycloud publish <html> --visibility private`. Full reference
401
+ plus a kitchen-sink page wiring every component (props, JS API, events) ships
402
+ with the binary as `references/cg-video.md` and `references/kitchen-sink.html`
403
+ inside the bundled media-artifact skill.
404
+
349
405
  ### setup — credentials
350
406
 
351
407
  ```bash
@@ -362,18 +418,18 @@ Output: `--json` (force JSONL envelopes), `--pretty` (one JSON array),
362
418
  `--data raw`, `--raw-output` (raw backend payload; disables pipe protocol),
363
419
  `--quiet`, `--verbose`.
364
420
 
365
- Cache — on `watch`, `extract`, `caption`, `face`, and `workflow` only:
421
+ Cache — on `watch`, `see`, `extract`, `caption`, `face`, and `workflow` only:
366
422
  `--refresh` (recompute), `--no-cache` (no persistence), `--cached` (reuse
367
423
  exact-match history). `ask`/`probe` always call the cloud; use `search` for a
368
424
  free cached lookup.
369
425
 
370
426
  Upload/download refusal — on every verb that resolves a source:
371
- `--no-upload` (refuse cloud upload → `needs_upload`) on `watch`/`extract`/
427
+ `--no-upload` (refuse cloud upload → `needs_upload`) on `watch`/`see`/`extract`/
372
428
  `caption`/`face`/`workflow`/`publish` and `library collections add`;
373
429
  `--no-download` (refuse local materialization → `needs_download`) on the same
374
430
  set minus `publish`.
375
431
 
376
- Source reuse (`watch`/`extract`/`caption`): `--source-id <id>`, `--result-id <id>`.
432
+ Source reuse (`watch`/`see`/`extract`/`caption`): `--source-id <id>`, `--result-id <id>`.
377
433
 
378
434
  Sources: local paths, URLs, `cloudglue://files/<id>` URIs,
379
435
  `collection:col_…`, or a bare Cloudglue file-id UUID — bare ids are
@@ -9,11 +9,11 @@ set -u
9
9
 
10
10
  # Mirror tinycloud-skill.json: min_version / supported_range upper bound
11
11
  # (CI diffs these against the manifest).
12
- MIN_VERSION="0.3.4"
12
+ MIN_VERSION="0.3.7"
13
13
  MAX_VERSION_EXCLUSIVE="0.4.0"
14
14
  INSTALL_CMD='curl -fsSL https://app.cloudglue.dev/tinycloud.sh | bash'
15
15
  # Kept in sync with ../tinycloud-skill.json required_features (CI diffs them).
16
- REQUIRED_FEATURES="envelope.v1 watch.v1 extract.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 setup.v1"
16
+ REQUIRED_FEATURES="envelope.v1 watch.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 setup.v1"
17
17
 
18
18
  # 1) Binary present and responsive?
19
19
  if ! command -v tinycloud >/dev/null 2>&1; then
@@ -1,12 +1,14 @@
1
1
  {
2
- "skill_version": "0.3.5",
2
+ "skill_version": "0.3.7",
3
3
  "tinycloud": {
4
- "min_version": "0.3.4",
5
- "supported_range": ">=0.3.4 <0.4.0",
4
+ "min_version": "0.3.7",
5
+ "supported_range": ">=0.3.7 <0.4.0",
6
6
  "required_features": [
7
7
  "envelope.v1",
8
8
  "watch.v1",
9
+ "see.v1",
9
10
  "extract.v1",
11
+ "extract.images.v1",
10
12
  "caption.v1",
11
13
  "search.v1",
12
14
  "probe.v1",
@@ -22,8 +22,8 @@ in order, skipping any that already pass.
22
22
  command -v tinycloud && tinycloud --version --json </dev/null
23
23
  ```
24
24
 
25
- If installed and the JSON reports `"version"` ≥ 0.3.4 (the floor the tinycloud
26
- skill requires), go to step 2. If missing, older than 0.3.4, or no
25
+ If installed and the JSON reports `"version"` ≥ 0.3.7 (the floor the tinycloud
26
+ skill requires), go to step 2. If missing, older than 0.3.7, or no
27
27
  machine-readable version, install or upgrade it — ask the user which they
28
28
  prefer:
29
29