@cloudglue/tinycloud 0.3.12 → 0.3.14
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 +2 -2
- package/package.json +1 -1
- package/skills/tinycloud/SKILL.md +16 -1
- package/skills/tinycloud/reference/glossary.md +14 -2
- package/skills/tinycloud/reference/verbs.md +65 -4
- package/skills/tinycloud/scripts/preflight.sh +2 -2
- package/skills/tinycloud/tinycloud-skill.json +4 -3
package/README.md
CHANGED
|
@@ -17,11 +17,11 @@ The npm package is a small launcher: on first run it downloads the matching
|
|
|
17
17
|
platform distribution from Cloudglue's CDN (cached under
|
|
18
18
|
`~/.tinycloud/versions/<version>/`), verifies its checksum, and execs the real
|
|
19
19
|
binary. The package version pins the binary version, so
|
|
20
|
-
`npx @cloudglue/tinycloud@0.3.
|
|
20
|
+
`npx @cloudglue/tinycloud@0.3.14` always runs tinycloud 0.3.14. It also adds two
|
|
21
21
|
wrapper commands:
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
tinycloud install --version 0.3.
|
|
24
|
+
tinycloud install --version 0.3.14 # pre-download a version
|
|
25
25
|
tinycloud install --latest # install latest stable and pin to it
|
|
26
26
|
tinycloud update # move to latest stable, prune old versions
|
|
27
27
|
```
|
package/package.json
CHANGED
|
@@ -206,12 +206,27 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow
|
|
|
206
206
|
`data.embed_snippet` (`<cg-video>`), which only plays on a private site of
|
|
207
207
|
the same account. When writing HTML around an embed, use the component's
|
|
208
208
|
built-ins (`autoplay`+`muted`, `loop`, `start-time`, `exclusive`,
|
|
209
|
+
`playbackrates` — speed-menu rates, default `1 1.5 2`, shown at every
|
|
210
|
+
player size; embed v7 —
|
|
209
211
|
`clip-start`/`clip-end` to frame one "back to moment" clip — plus
|
|
210
212
|
`clip-only`, 0.3.8+, to play nothing but that window; JS
|
|
211
|
-
`playSegment(start, end?)`) and the container components
|
|
213
|
+
`playSegment(start, end?)`, `playbackRate` get/set) and the container components
|
|
212
214
|
(`<cg-playlist>`, `<cg-grid>`, `<cg-chapters>`) rather than hand-rolled
|
|
213
215
|
players, galleries, or segment-list JS — details in
|
|
214
216
|
[reference/verbs.md](reference/verbs.md).
|
|
217
|
+
- Link previews (0.3.14+): how a pasted link unfurls in Slack/iMessage/Notion.
|
|
218
|
+
A **public** site's card comes from the HTML you generate — put `og:title`,
|
|
219
|
+
`og:description`, `og:image` (absolute URL — a share's `preview_url` works),
|
|
220
|
+
`og:url`, and `twitter:card` in the `<head>` of every public page, or the
|
|
221
|
+
link renders as a bare URL (bots don't run JS; never emit
|
|
222
|
+
`twitter:player`/`og:video`). A **private** site or share never reaches the
|
|
223
|
+
bot, so its card is off by default — opt in with `--link-preview full`
|
|
224
|
+
(private sites also take `--preview-title` / `--preview-image`; a private
|
|
225
|
+
share reuses its own title, description, and thumbnail). ⚠️ Ask the user
|
|
226
|
+
before turning it on: it makes those card fields readable by anyone with the
|
|
227
|
+
link (content and playback stay sign-in gated), and platforms cache per exact
|
|
228
|
+
URL, so turning it back off does not retract posted cards. Details in
|
|
229
|
+
[reference/verbs.md](reference/verbs.md).
|
|
215
230
|
- Live-API discovery components (0.3.6+): the same embed script also defines
|
|
216
231
|
collection-scoped, **private-site-only** elements that let viewers search/chat
|
|
217
232
|
inside a published site — `<cg-chat>`, `<cg-search>`, `<cg-deep-search>`,
|
|
@@ -122,12 +122,24 @@ connector?" or an envelope field needs explaining.
|
|
|
122
122
|
embed via the `data.embed_snippet` `<cg-video>` tag, which only plays on a
|
|
123
123
|
private published site of the same account. The embed has playback
|
|
124
124
|
attributes (`autoplay`+`muted`, `loop`, `start-time`, `poster`,
|
|
125
|
-
`accent-color`, `exclusive`,
|
|
125
|
+
`accent-color`, `exclusive`, `playbackrates` — space-separated
|
|
126
|
+
playback-speed-menu rates, default `1 1.5 2`, shown at every player size
|
|
127
|
+
(sites embed v7) — and `clip-start`/`clip-end` to frame a single
|
|
126
128
|
"back to moment" clip — `clip-only`, 0.3.8+, plays nothing but that
|
|
127
|
-
window) and a JS API (`playSegment`, `seekTo`, media
|
|
129
|
+
window) and a JS API (`playSegment`, `seekTo`, `playbackRate` get/set, media
|
|
128
130
|
events re-dispatched on the element) for custom site HTML, and plays
|
|
129
131
|
standalone or inside the container components (`<cg-playlist>`,
|
|
130
132
|
`<cg-grid>`, `<cg-chapters>`) — see reference/verbs.md.
|
|
133
|
+
- **Link preview** — the Open Graph card a platform (Slack, iMessage, Notion,
|
|
134
|
+
Discord) renders when someone pastes a site or share link. Public sites and
|
|
135
|
+
shares always preview: a public site's card comes from the `og:*` tags in
|
|
136
|
+
the HTML you generate, a public share's from its title/description/thumbnail.
|
|
137
|
+
Private sites and shares are redirected to sign-in before an unfurl bot sees
|
|
138
|
+
anything, so they render a bare "Sign in" card unless opted in with
|
|
139
|
+
`--link-preview full` (0.3.14+, feature `publish.link.preview.v1`; private
|
|
140
|
+
sites also take `--preview-title` / `--preview-image`). Opting in makes those
|
|
141
|
+
card fields publicly readable — content and playback stay sign-in gated — so
|
|
142
|
+
ask the user first. See reference/verbs.md.
|
|
131
143
|
- **Discovery components (live API, 0.3.6+)** — the same embed script also
|
|
132
144
|
defines four collection-scoped, **private-site-only** elements that let a
|
|
133
145
|
viewer search or chat inside a published site and play results inline via
|
|
@@ -319,7 +319,8 @@ tinycloud workflow <name> <source> [--param k=v] [--segment <s>] [--out <dir>]
|
|
|
319
319
|
|
|
320
320
|
```bash
|
|
321
321
|
tinycloud publish <html-file-or-dir> [--name <site-name>]
|
|
322
|
-
[--visibility public|private]
|
|
322
|
+
[--visibility public|private]
|
|
323
|
+
[--link-preview none|full] [--preview-title <text>] [--preview-image <url>] --json
|
|
323
324
|
tinycloud publish list --json # sites for this account, with URLs
|
|
324
325
|
tinycloud publish unpublish <site-ref> --json # site_id, site name, or the --name label
|
|
325
326
|
```
|
|
@@ -343,11 +344,49 @@ site itself gets a generated name (e.g. `young-fire-2486`) shown by
|
|
|
343
344
|
`publish list`. `unpublish` resolves any of: the `site_id` UUID, the
|
|
344
345
|
generated site name, or your `--name` label.
|
|
345
346
|
|
|
347
|
+
**Link previews (0.3.14+, `publish.link.preview.v1`)** — how a pasted link
|
|
348
|
+
unfurls in Slack, iMessage, Notion, Discord. The two visibilities work
|
|
349
|
+
completely differently:
|
|
350
|
+
|
|
351
|
+
- **Public site** — needs no flags. Its HTML reaches the unfurl bot verbatim,
|
|
352
|
+
so the card *is* whatever Open Graph tags the page carries. **Emit them in
|
|
353
|
+
the `<head>` of every public page you generate** — `og:title`,
|
|
354
|
+
`og:description`, `og:image` (an **absolute** URL — a share's `preview_url`
|
|
355
|
+
works), `og:url`, `twitter:card` — because a regenerated page without them
|
|
356
|
+
silently reverts the card to a bare link. Bots don't run JavaScript, so the
|
|
357
|
+
tags must be in the static HTML. Never emit `twitter:player` or `og:video`
|
|
358
|
+
(unfurlers ignore them for our domains and can degrade the card).
|
|
359
|
+
- **Private site** — the edge gate redirects bots to sign-in before any HTML
|
|
360
|
+
is served, so OG tags in the page are never seen and the link unfurls as a
|
|
361
|
+
bare "Sign in" card. Opt in instead with `--link-preview full`, plus
|
|
362
|
+
`--preview-title` (falls back to the generated site name) and
|
|
363
|
+
`--preview-image` (**must be publicly fetchable** — site assets sit behind
|
|
364
|
+
the same gate the bot can't pass, so use a share's `preview_url`; prefer a
|
|
365
|
+
long-lived unsigned URL, since unfurl caches hold the exact URL). The card
|
|
366
|
+
description is the site description. Pass `""` to either flag to clear it.
|
|
367
|
+
|
|
368
|
+
`--link-preview` is flippable on an **existing** site without republishing
|
|
369
|
+
content: the run reports `action: "settings-only"` (a settings PATCH, no
|
|
370
|
+
re-upload, no new version). The state comes back as `data.link_preview` (plus
|
|
371
|
+
`data.preview_title` / `data.preview_image_url`) and shows in `publish list`
|
|
372
|
+
rows as `link-preview=full`. `--preview-title`/`--preview-image` require
|
|
373
|
+
`--link-preview full`, and a non-absolute `--preview-image` errors before any
|
|
374
|
+
upload.
|
|
375
|
+
|
|
376
|
+
⚠️ **Ask the user before opting a private site in.** `--link-preview full`
|
|
377
|
+
makes the card title, the site description, and the card image readable by
|
|
378
|
+
anyone who fetches the link — the user-agent check only *routes*; the setting
|
|
379
|
+
is the security boundary. Nothing else leaks (no site content, video, tokens,
|
|
380
|
+
or cookies; the site stays sign-in gated). Platforms cache per exact URL and
|
|
381
|
+
rehost the image, so flipping back to `none` stops *future* unfurls but does
|
|
382
|
+
not retract already-posted cards.
|
|
383
|
+
|
|
346
384
|
### publish video — share a video
|
|
347
385
|
|
|
348
386
|
```bash
|
|
349
387
|
tinycloud publish video <source> [--visibility public|private] # default public
|
|
350
|
-
[--name <title>] [--segment-id <id>] [--clip-start <s> --clip-end <e> [--clip-only]]
|
|
388
|
+
[--name <title>] [--segment-id <id>] [--clip-start <s> --clip-end <e> [--clip-only]]
|
|
389
|
+
[--link-preview none|full] --json
|
|
351
390
|
tinycloud publish video list [--in <source>] [--visibility public|private] --json
|
|
352
391
|
tinycloud publish video unpublish <share-id | source> --json # --visibility disambiguates
|
|
353
392
|
```
|
|
@@ -385,18 +424,40 @@ feature id.
|
|
|
385
424
|
`&clip=hard` and fall back to the soft window. It shapes the viewing
|
|
386
425
|
experience, not access control — anyone with the bare `share_url` still has
|
|
387
426
|
the whole video; restrict access with `--visibility private`.
|
|
427
|
+
- Link previews (0.3.14+): a PUBLIC share page always unfurls in Slack with a
|
|
428
|
+
card built from its title, description, and thumbnail. A PRIVATE share is
|
|
429
|
+
redirected to sign-in before the bot sees anything, so it unfurls as a bare
|
|
430
|
+
"Sign in" card unless you pass `--link-preview full`, which serves bots a
|
|
431
|
+
metadata-only stub built from those same three fields. It comes back as
|
|
432
|
+
`data.share.link_preview`, and re-running flips it on an existing share
|
|
433
|
+
(a PATCH — no new share). Playback stays sign-in gated in every mode.
|
|
434
|
+
⚠️ Ask the user first: `full` makes the share's title, description, and
|
|
435
|
+
thumbnail readable by anyone who fetches the link, and platforms cache per
|
|
436
|
+
exact URL, so turning it back off does not retract already-posted cards.
|
|
388
437
|
|
|
389
438
|
When generating custom site HTML around a `<cg-video>` embed, use the
|
|
390
439
|
component's built-ins instead of reinventing them. It defaults to a
|
|
391
440
|
responsive 16:9 dark placeholder (override with plain page CSS on the
|
|
392
441
|
`cg-video` selector); mount-time attributes: `autoplay` (pair with `muted` or
|
|
393
|
-
browsers block it), `loop`, `start-time`, `poster`, `accent-color`,
|
|
442
|
+
browsers block it), `loop`, `start-time`, `poster`, `accent-color`,
|
|
443
|
+
`playbackrates` (speed menu — next paragraph), and
|
|
394
444
|
`exclusive` (put it on every player in a gallery so starting one pauses the
|
|
395
445
|
rest). Its JS API queues until ready — `playSegment(start, end?)`,
|
|
396
|
-
`seekTo()`, `play()`/`pause()` — and media events
|
|
446
|
+
`seekTo()`, `play()`/`pause()`, `playbackRate` (get/set) — and media events
|
|
447
|
+
are re-dispatched on the
|
|
397
448
|
element (`timeupdate`, `ended`, `cg-ready`); prefer `playSegment` over
|
|
398
449
|
hand-rolled seek logic for "click a moment to play that segment" pages.
|
|
399
450
|
|
|
451
|
+
Playback speed (sites embed v7): every `<cg-video>` shows a playback-speed
|
|
452
|
+
menu at every player size — including narrow grid cells and phones — with
|
|
453
|
+
default rates `1 1.5 2`. Supply your own list with the space-separated
|
|
454
|
+
`playbackrates` attribute (e.g. `playbackrates="0.5 1 1.5 2"`), and get/set
|
|
455
|
+
the speed from page code via the `playbackRate` JS property (safe to set
|
|
456
|
+
before mount; non-positive and non-numeric values are ignored — the viewer
|
|
457
|
+
can always change it from the menu). The speed menu ships in the
|
|
458
|
+
Cloudglue-served embed script, so it is not gated on a tinycloud version and
|
|
459
|
+
already-published sites pick it up without republishing.
|
|
460
|
+
|
|
400
461
|
To frame a single moment inside the full recording — a cited highlight you
|
|
401
462
|
want to share on its own — add `clip-start`/`clip-end` (seconds) to a bare
|
|
402
463
|
`<cg-video>`: the player draws a clip-length badge, a clip-region strip with a
|
|
@@ -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.14"
|
|
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 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 setup.v1"
|
|
16
|
+
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"
|
|
17
17
|
|
|
18
18
|
# 1) Binary present and responsive?
|
|
19
19
|
if ! command -v tinycloud >/dev/null 2>&1; then
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"skill_version": "0.3.
|
|
2
|
+
"skill_version": "0.3.14",
|
|
3
3
|
"tinycloud": {
|
|
4
|
-
"min_version": "0.3.
|
|
5
|
-
"supported_range": ">=0.3.
|
|
4
|
+
"min_version": "0.3.14",
|
|
5
|
+
"supported_range": ">=0.3.14 <0.4.0",
|
|
6
6
|
"required_features": [
|
|
7
7
|
"envelope.v1",
|
|
8
8
|
"watch.v1",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"publish.v1",
|
|
28
28
|
"publish.manage.v1",
|
|
29
29
|
"publish.video.v1",
|
|
30
|
+
"publish.link.preview.v1",
|
|
30
31
|
"setup.v1"
|
|
31
32
|
],
|
|
32
33
|
"envelope_schema": "1",
|