@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 +13 -7
- package/package.json +2 -2
- package/skills/tinycloud/SKILL.md +30 -12
- package/skills/tinycloud/reference/glossary.md +20 -9
- package/skills/tinycloud/reference/pipelines.md +1 -1
- package/skills/tinycloud/reference/setup.md +2 -1
- package/skills/tinycloud/reference/verbs.md +60 -10
- package/skills/tinycloud/scripts/preflight.sh +2 -2
- package/skills/tinycloud/tinycloud-skill.json +5 -3
- package/skills/tinycloud-init/SKILL.md +2 -2
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
|
|
4
|
-
dashboards, subtitles, clips, search, or repurposed content — or
|
|
5
|
-
verbs directly from your own agent. Powered by
|
|
6
|
-
|
|
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.
|
|
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.
|
|
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
|
-
| `
|
|
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.
|
|
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
|
|
5
|
-
involves understanding or manipulating video
|
|
6
|
-
or summarize a video,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
|
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`)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
`
|
|
52
|
-
|
|
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`)
|
|
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
|
|
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
|
|
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
|
-
| `
|
|
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
|
-
###
|
|
67
|
+
### see — analyze 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
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
2
|
+
"skill_version": "0.3.8",
|
|
3
3
|
"tinycloud": {
|
|
4
|
-
"min_version": "0.3.
|
|
5
|
-
"supported_range": ">=0.3.
|
|
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.
|
|
26
|
-
skill requires), go to step 2. If missing, older than 0.3.
|
|
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
|
|