@cloudglue/tinycloud 0.3.6 → 0.3.8

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.6` always runs tinycloud 0.3.6. It also adds two
20
+ `npx @cloudglue/tinycloud@0.3.8` always runs tinycloud 0.3.8. It also adds two
20
21
  wrapper commands:
21
22
 
22
23
  ```bash
23
- tinycloud install --version 0.3.6 # pre-download a version
24
+ tinycloud install --version 0.3.8 # 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,8 +137,12 @@ 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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudglue/tinycloud",
3
- "version": "0.3.6",
4
- "description": "Agent CLI for deep video work, by Cloudglue. Downloads the tinycloud binary on first run.",
3
+ "version": "0.3.8",
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
@@ -120,6 +127,8 @@ tinycloud publish list --json
120
127
  tinycloud publish video ./demo.mp4 --visibility public --json
121
128
  # Share a single moment — also returns data.moment_url (0.3.5+)
122
129
  tinycloud publish video ./demo.mp4 --clip-start 18 --clip-end 33 --json
130
+ # Hard clip — the share page plays ONLY the moment (0.3.8+)
131
+ tinycloud publish video ./demo.mp4 --clip-start 18 --clip-end 33 --clip-only --json
123
132
  ```
124
133
 
125
134
  Per-verb details and all flags: [reference/verbs.md](reference/verbs.md).
@@ -166,8 +175,16 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow
166
175
  - Sources: local paths, URLs, `cloudglue://files/<id>` URIs,
167
176
  `collection:col_…`, or a bare Cloudglue file-id UUID (normalized to
168
177
  `cloudglue://files/<id>`; an existing local path of the same name wins).
178
+ - Images (0.3.7+): use `see` to describe an image and `extract` to pull
179
+ structured data from one — **JPEG/PNG/WebP only** (HEIC/GIF/BMP are rejected
180
+ with a "transcode first" hint). `watch <image>` and `caption <image>` error
181
+ and redirect you to `see`/`extract` (an image has no video track to analyze
182
+ or speech to caption); images have no segments, so drop `--segment-level`/
183
+ `--segmentation`/`--shot-*` on an image source. A local image uploads first; a
184
+ public `http(s)` image URL is analyzed in place (no upload). Images can't be
185
+ added to collections. Local `search` can match cached `see` results.
169
186
  - Do not pass `--background` to `ask`; background jobs exist only for tracked
170
- async ops (`watch`, `extract`).
187
+ async ops (`watch`, `see`, `extract`).
171
188
  - `workflow status` / `workflow resume` are not implemented in 0.3.x; treat
172
189
  `paused`/`partial` as terminal and surface `resume` metadata to the user.
173
190
  - `--no-upload` / `--no-download` make commands refuse cloud upload / local
@@ -188,7 +205,8 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow
188
205
  `data.embed_snippet` (`<cg-video>`), which only plays on a private site of
189
206
  the same account. When writing HTML around an embed, use the component's
190
207
  built-ins (`autoplay`+`muted`, `loop`, `start-time`, `exclusive`,
191
- `clip-start`/`clip-end` to frame one "back to moment" clip; JS
208
+ `clip-start`/`clip-end` to frame one "back to moment" clip — plus
209
+ `clip-only`, 0.3.8+, to play nothing but that window; JS
192
210
  `playSegment(start, end?)`) and the container components
193
211
  (`<cg-playlist>`, `<cg-grid>`, `<cg-chapters>`) rather than hand-rolled
194
212
  players, galleries, or segment-list JS — details in
@@ -41,15 +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`, `extract`, `face`,
44
+ - **Supported inputs** — local uploads (`watch`, `see`, `extract`, `face`,
45
45
  `library collections add`) map by extension: video `.mp4 .mov .webm .mkv .m4v`,
46
- audio `.mp3 .wav .m4a`. Other extensions upload as `application/octet-stream`
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`
47
48
  and may be rejected upstream — transcode to a mapped container first
48
- (`clip transcode`). Local uploads are bounded by Cloudglue at ~3 GB and
49
- 2 s–3 h (connector ingests allow more). `face match`/`face search` query
50
- images must be **JPEG or PNG**. Use `grab` for YouTube and
51
- `library connectors sync` for share links rather than passing those URLs to
52
- upload verbs.
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.
53
56
  - **`ref` / `source_id` / `result_id`** — stable identifiers in every
54
57
  envelope. `ref` is a reusable pointer to the analyzed source (including
55
58
  `cloud_ready` and the Cloudglue file id) that pipes between verbs;
@@ -64,6 +67,11 @@ connector?" or an envelope field needs explaining.
64
67
  produces (summary, segments, transcript-ish context). Cached locally and
65
68
  mirrored in Cloudglue, so later `extract`/`ask`/`search` reuse it instead
66
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.
67
75
  - **Segmentation** — how a video is split for analysis: `chapters`
68
76
  (semantic), `shots` (visual cuts; bounds tunable via
69
77
  `--shot-min-seconds`/`--shot-max-seconds`, sub-second min allowed),
@@ -100,12 +108,15 @@ connector?" or an envelope field needs explaining.
100
108
  an HLS stream; one active share per (file, visibility). Adding
101
109
  `--clip-start`/`--clip-end` (seconds, 0.3.5+) also returns `data.moment_url`,
102
110
  the share page bounded to that "back to moment" window (also reachable as
103
- `?s=<start>&e=<end>` on a `share_url`). Private shares
111
+ `?s=<start>&e=<end>` on a `share_url`); adding `--clip-only` (0.3.8+,
112
+ feature `publish.video.moment.hard.v1`) upgrades it to a hard clip —
113
+ `&clip=hard`, the page plays only the moment. Private shares
104
114
  embed via the `data.embed_snippet` `<cg-video>` tag, which only plays on a
105
115
  private published site of the same account. The embed has playback
106
116
  attributes (`autoplay`+`muted`, `loop`, `start-time`, `poster`,
107
117
  `accent-color`, `exclusive`, and `clip-start`/`clip-end` to frame a single
108
- "back to moment" clip) and a JS API (`playSegment`, `seekTo`, media
118
+ "back to moment" clip `clip-only`, 0.3.8+, plays nothing but that
119
+ window) and a JS API (`playSegment`, `seekTo`, media
109
120
  events re-dispatched on the element) for custom site HTML, and plays
110
121
  standalone or inside the container components (`<cg-playlist>`,
111
122
  `<cg-grid>`, `<cg-chapters>`) — see reference/verbs.md.
@@ -41,7 +41,7 @@ tinycloud caption ./talks/*.mp4 --format srt -o ./tinycloud-output/captions/ --j
41
41
 
42
42
  ## Async jobs
43
43
 
44
- Long cloud operations (`watch`, `extract`) support `--background`:
44
+ Long cloud operations (`watch`, `see`, `extract`) support `--background`:
45
45
 
46
46
  ```bash
47
47
  tinycloud watch ./long.mp4 --background --json # → status:"pending", meta.job_id
@@ -101,8 +101,9 @@ binary reports in `--version --json`.
101
101
  | `TINYCLOUD_HTTP_TIMEOUT_MS` | Hard deadline per Cloudglue request (default 120s; `0` disables) |
102
102
  | `TINYCLOUD_UPLOAD_TIMEOUT_MS` | Total deadline for upload-shaped requests (default 60min; `0` disables) |
103
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 3; `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
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+ |
106
107
 
107
108
  Every Cloudglue request carries a hard deadline, so a stalled route can never
108
109
  hang the CLI indefinitely; a timeout surfaces as a retryable `upstream` error
@@ -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
@@ -280,7 +313,7 @@ generated site name, or your `--name` label.
280
313
 
281
314
  ```bash
282
315
  tinycloud publish video <source> [--visibility public|private] # default public
283
- [--name <title>] [--segment-id <id>] [--clip-start <s> --clip-end <e>] --json
316
+ [--name <title>] [--segment-id <id>] [--clip-start <s> --clip-end <e> [--clip-only]] --json
284
317
  tinycloud publish video list [--in <source>] [--visibility public|private] --json
285
318
  tinycloud publish video unpublish <share-id | source> --json # --visibility disambiguates
286
319
  ```
@@ -307,6 +340,17 @@ feature id.
307
340
  private-share sign-in. Optional — omit it for a plain full-video share. The
308
341
  same window is just `?s=<start>&e=<end>` appended to a `share_url`, so you
309
342
  can hand-build a moment link from an existing share without re-publishing.
343
+ - Hard clip (0.3.8+): add `--clip-only` to a `--clip-start`/`--clip-end` pair
344
+ (it requires both — the command errors before anything uploads) and
345
+ `data.moment_url` ends in `?s=<start>&e=<end>&clip=hard`: the share page
346
+ plays ONLY the moment (trimmed stream; the seek bar is the clip) instead of
347
+ the full video with a "back to moment" overlay. The flag survives the
348
+ pending → re-run flow (the `next` hint carries it), and the same suffix
349
+ works hand-built on an existing `share_url`. Gated by the
350
+ `publish.video.moment.hard.v1` feature id; older share pages ignore
351
+ `&clip=hard` and fall back to the soft window. It shapes the viewing
352
+ experience, not access control — anyone with the bare `share_url` still has
353
+ the whole video; restrict access with `--visibility private`.
310
354
 
311
355
  When generating custom site HTML around a `<cg-video>` embed, use the
312
356
  component's built-ins instead of reinventing them. It defaults to a
@@ -327,7 +371,13 @@ live playhead, snaps the first play to `clip-start`, and auto-pauses at
327
371
  "↺ Back to moment" pill — a manual scrub-out is never forced back. Both are
328
372
  required and `clip-end` is ignored unless it is greater than `clip-start`; the
329
373
  pair is `<cg-video>`-only (not read on `<cg-playlist-item>`/`<cg-grid-item>`).
330
- Rule of thumb: one moment `clip-start`/`clip-end` on a `<cg-video>`; several
374
+ Adding `clip-only` (embed v6, 0.3.8+) hardens the window: the player shows
375
+ only the clip, with the timeline re-based to it — no badge, strip, or pill,
376
+ because there is nothing to scrub back to. It is honored only alongside a
377
+ valid `clip-start`/`clip-end` pair, and older embed scripts ignore it,
378
+ degrading to the soft behavior above.
379
+ Rule of thumb: one moment → `clip-start`/`clip-end` on a `<cg-video>`
380
+ (`clip-only` if viewers should see nothing but the moment); several
331
381
  segments a viewer navigates between → `<cg-chapters>` (below).
332
382
 
333
383
  For multi-video or segment-navigation pages, prefer the container components
@@ -385,18 +435,18 @@ Output: `--json` (force JSONL envelopes), `--pretty` (one JSON array),
385
435
  `--data raw`, `--raw-output` (raw backend payload; disables pipe protocol),
386
436
  `--quiet`, `--verbose`.
387
437
 
388
- Cache — on `watch`, `extract`, `caption`, `face`, and `workflow` only:
438
+ Cache — on `watch`, `see`, `extract`, `caption`, `face`, and `workflow` only:
389
439
  `--refresh` (recompute), `--no-cache` (no persistence), `--cached` (reuse
390
440
  exact-match history). `ask`/`probe` always call the cloud; use `search` for a
391
441
  free cached lookup.
392
442
 
393
443
  Upload/download refusal — on every verb that resolves a source:
394
- `--no-upload` (refuse cloud upload → `needs_upload`) on `watch`/`extract`/
444
+ `--no-upload` (refuse cloud upload → `needs_upload`) on `watch`/`see`/`extract`/
395
445
  `caption`/`face`/`workflow`/`publish` and `library collections add`;
396
446
  `--no-download` (refuse local materialization → `needs_download`) on the same
397
447
  set minus `publish`.
398
448
 
399
- Source reuse (`watch`/`extract`/`caption`): `--source-id <id>`, `--result-id <id>`.
449
+ Source reuse (`watch`/`see`/`extract`/`caption`): `--source-id <id>`, `--result-id <id>`.
400
450
 
401
451
  Sources: local paths, URLs, `cloudglue://files/<id>` URIs,
402
452
  `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.6",
2
+ "skill_version": "0.3.8",
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