Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
},
"metadata": {
"description": "Deep video and image work for coding agents: analyze, describe, search, caption, clip, detect faces, and publish via the tinycloud CLI.",
"version": "0.3.17"
"version": "0.3.18"
},
"plugins": [
{
"name": "tinycloud",
"source": "./",
"description": "Video and image understanding and editing via the tinycloud CLI (Cloudglue): watch/see/extract/search/ask/face over videos and images, captions, clips, collections, plus one-command workflows for sales coaching, blog posts, ad analysis, meeting breakdowns, and YouTube publishing.",
"version": "0.3.17",
"version": "0.3.18",
"author": { "name": "Cloudglue" },
"homepage": "https://tinycloud.sh",
"repository": "https://github.com/cloudglue/tinycloud",
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "tinycloud",
"displayName": "Tinycloud Video",
"description": "Video and image understanding and editing via the tinycloud CLI (Cloudglue): watch/see/extract/search/ask/face over videos and images, captions, clips, collections, and one-command video workflows.",
"version": "0.3.17",
"version": "0.3.18",
"author": { "name": "Cloudglue", "url": "https://cloudglue.dev" },
"homepage": "https://tinycloud.sh",
"repository": "https://github.com/cloudglue/tinycloud",
Expand Down
36 changes: 32 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,35 @@ schema/list/show/cancel are free, and failed runs auto-refund. `query` is
also a workflow step node and an agent tool (it joins the LLM tool set,
unlike `login`). Because the skill teaches the verb, the floor was raised
to 0.3.17 (same merge-after-CDN gate — the dist PR merges only after CDN
`channels.stable` = 0.3.17). The host-level `profile` verb and the leading global flags `--home`/`--profile`
`channels.stable` = 0.3.17). 0.3.18 is a **sites-embed v8–v12 parity and
publish-guard release** (no new verbs, flags, or feature ids — verbs stay 17,
features stay 42; the embed features ship in the Cloudglue-served script, so
already-published sites pick them up without republishing): the embed family
the binary teaches moved from v7 to v12 — v8 splits delivery into a core
script plus a lazily-loaded live chunk (`/__cg/embed-live.js`; no
author-facing change, `/__cg/embed.js` stays the only script tag and
generators must never add the chunk themselves), v9 opens up the live
elements (`<cg-chat>` gains `instructions` — a per-site system prompt — and a
Stop button; `<cg-search>` gains `scope`/`modalities`/`label-filters`/
`threshold`/`limit`/`group-by="file"`/`sort-by`; `<cg-deep-search>` streams
its synthesis and takes `exclude-weak-results`; `<cg-face-search>` takes
`threshold`/`limit` and plays hits as short bounded moments; the JS client's
`search`/`faceSearch` accept the full v1 `filter` object), v10 makes every
live panel restylable via `::part()` and emits host events (`cg-results` /
`cg-answer` / `cg-error`, plus cancelable `cg-resultopen`/`cg-citationopen`
to override how moments open), v11 adds `<cg-query>` +
`window.cloudglue.query` (natural-language analytical questions → inline
table + the compiled SQL — the site-side face of the same engine as the
`query` verb; point it at an entities/metadata collection), and v12 adds
`<cg-transcript>` + `window.cloudglue.transcript` (click-to-seek speech
turns that follow a bound player; unbilled) and `<cg-chapters auto>`
self-population. The binary-side change: the publish public-site guard now
also rejects `<cg-query>`, `<cg-transcript>`, and `<cg-chapters auto>` (the
`auto` attribute makes the otherwise public-safe chapters element
private-only; explicit-children `<cg-chapters>` stays public-safe). Because
the skill teaches the new elements and relies on that extended guard, the
floor was raised to 0.3.18 (same merge-after-CDN gate — the dist PR merges
only after CDN `channels.stable` = 0.3.18). The host-level `profile` verb and the leading global flags `--home`/`--profile`
(also `$TINYCLOUD_HOME`; 0.3.3+) relocate state and are intentionally absent
from `commands --json` — like the launcher's install/update, they're CLI/host
concerns, not video operations.
Expand Down Expand Up @@ -285,9 +313,9 @@ of printing JSON. Any script invoking the binary must redirect `</dev/null`
metadata sync) vs live-CDN jobs (`Install + smoke` matrix, npx-against-CDN)
which run only on push to main or manual dispatch — never on PRs, because a
CDN gap would fail every PR.
- The live CDN serves 0.3.14 (latest aliases + v-prefixed pinned tarballs
for 0.3.0 through 0.3.14, with `manifest.json` + `.sha256`
sidecars; `channels.stable` = 0.3.14); all smoke legs are required.
- The live CDN serves 0.3.17 (latest aliases + v-prefixed pinned tarballs
for 0.3.0 through 0.3.17, with `manifest.json` + `.sha256`
sidecars; `channels.stable` = 0.3.17); all smoke legs are required.
- `publish-npm.yml` (tag `v*`): asserts tag == package.json version → gates
on `generate-manifest.mjs --check` against the live CDN → publishes via
npm trusted publishing (OIDC, `id-token: write`, npm ≥ 11.5.1 — no token
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ The npm package is a small launcher: on first run it downloads the matching
platform distribution from Cloudglue's CDN (cached under
`~/.tinycloud/versions/<version>/`), verifies its checksum, and execs the real
binary. The package version pins the binary version, so
`npx @cloudglue/tinycloud@0.3.17` always runs tinycloud 0.3.17. It also adds two
`npx @cloudglue/tinycloud@0.3.18` always runs tinycloud 0.3.18. It also adds two
wrapper commands:

```bash
tinycloud install --version 0.3.17 # pre-download a version
tinycloud install --version 0.3.18 # pre-download a version
tinycloud install --latest # install latest stable and pin to it
tinycloud update # move to latest stable, prune old versions
```
Expand Down Expand Up @@ -133,7 +133,7 @@ go to stderr) — pass `--json`.
| `library` | Build & query Cloudglue collections (create/add/remove/delete) and browse connectors |
| `jobs` | Poll, wait on, or forget async jobs |
| `workflow` | Run packaged pipeline recipes (see below) |
| `publish` | Publish HTML artifacts as Cloudglue Sites; share videos |
| `publish` | Publish HTML artifacts as Cloudglue Sites (playback embeds everywhere; private sites add live chat/search/query/transcript elements); share videos |
| `setup` | Configure the Cloudglue API key and service connections |
| `login` | Browser sign-in — provisions & saves a Cloudglue API key (0.3.10+) |

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cloudglue/tinycloud",
"version": "0.3.17",
"version": "0.3.18",
"description": "Agent CLI for deep video and image work, by Cloudglue. Downloads the tinycloud binary on first run.",
"bin": {
"tinycloud": "bin/tinycloud.js"
Expand Down
21 changes: 15 additions & 6 deletions skills/tinycloud/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -265,12 +265,21 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow
link (content and playback stay sign-in gated), and platforms cache per exact
URL, so turning it back off does not retract posted cards. Details in
[reference/verbs.md](reference/verbs.md).
- Live-API discovery components (0.3.6+): the same embed script also defines
collection-scoped, **private-site-only** elements that let viewers search/chat
inside a published site — `<cg-chat>`, `<cg-search>`, `<cg-deep-search>`,
`<cg-face-search>` (chat/search/deep-search need a media-descriptions or
rich-transcripts collection; face-search needs face-analysis). `publish`
**hard-rejects** them on a public site → publish with `--visibility private`.
- Live-API components (0.3.6+; the fuller v8–v12 surface is taught from
0.3.18): the same embed script also defines collection-scoped,
**private-site-only** elements that let viewers search/chat/query inside a
published site — `<cg-chat>` (optional `instructions` system prompt +
Stop), `<cg-search>`/`<cg-deep-search>` (tuning attributes; deep search
streams its synthesis), `<cg-face-search>`, `<cg-query>` (analytical
questions → inline table + compiled SQL; point at an entities/metadata
collection), `<cg-transcript>` (click-to-seek speech turns bound to a
player), and `<cg-chapters auto>` (self-populating chapters).
Chat/search/deep-search/transcript/chapters-auto need a media-descriptions
or rich-transcripts collection; face-search needs face-analysis; query runs
over any non-face collection. All are restylable via `::part()` and emit
`cg-results`/`cg-answer`/`cg-error` plus cancelable
`cg-resultopen`/`cg-citationopen` events. `publish` **hard-rejects** all of
them on a public site → publish with `--visibility private`.
See [reference/verbs.md](reference/verbs.md).

## 5. Reference (load on demand)
Expand Down
27 changes: 19 additions & 8 deletions skills/tinycloud/reference/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,14 +169,25 @@ connector?" or an envelope field needs explaining.
sites also take `--preview-title` / `--preview-image`). Opting in makes those
card fields publicly readable — content and playback stay sign-in gated — so
ask the user first. See reference/verbs.md.
- **Discovery components (live API, 0.3.6+)** — the same embed script also
defines four collection-scoped, **private-site-only** elements that let a
viewer search or chat inside a published site and play results inline via
`<cg-video>`: `<cg-chat>`, `<cg-search>`, `<cg-deep-search>` (over a
media-descriptions / rich-transcripts collection) and `<cg-face-search>` (over
a face-analysis collection). They carry no share id, but `tinycloud publish`
rejects them on a public site — publish `--visibility private`. See
reference/verbs.md.
- **Live-API components (0.3.6+; v8–v12 surface taught from 0.3.18)** — the
same embed script also defines collection-scoped, **private-site-only**
elements that let a viewer search, chat, query, or read a transcript inside
a published site and play results inline via `<cg-video>`: `<cg-chat>`
(optional `instructions` system prompt + Stop), `<cg-search>` (tuning:
`scope`/`modalities`/`label-filters`/`threshold`/`limit`/`group-by`/
`sort-by`), `<cg-deep-search>` (streamed synthesis;
`exclude-weak-results`) — over a media-descriptions / rich-transcripts
collection — `<cg-face-search>` (over a face-analysis collection),
`<cg-query>` (analytical questions → inline table + compiled SQL; any
non-face collection, best on entities/metadata), `<cg-transcript>`
(click-to-seek speech turns bound to a player; unbilled), and
`<cg-chapters auto>` (self-populating chapters). All restylable via
`::part()` with host events (`cg-results`/`cg-answer`/`cg-error`,
cancelable `cg-resultopen`/`cg-citationopen`); their implementation loads
lazily from `/__cg/embed-live.js` (automatic — never a second script tag).
They carry no share id, but `tinycloud publish` rejects them on a public
site (0.3.18 extends the guard to query/transcript/chapters-auto) —
publish `--visibility private`. See reference/verbs.md.

## State and isolation (0.3.3+)

Expand Down
76 changes: 58 additions & 18 deletions skills/tinycloud/reference/verbs.md
Original file line number Diff line number Diff line change
Expand Up @@ -654,26 +654,66 @@ private share — directly or through a container — on a public site. The full
reference ships with the binary as `references/cg-video.md` inside the
bundled media-artifact skill (under the install's `skills/` directory).

Discovery components (live API, 0.3.6+): the same `/__cg/embed.js` script also
defines four **collection-scoped** components that let a viewer search or chat
*inside* a published site and play the referenced moment inline via `<cg-video>`
— `<cg-chat>` (conversational Q&A, streaming answers + inline moment citations;
optional `placeholder`), `<cg-search>` (keyword/transcript text search),
`<cg-deep-search>` (agentic semantic search), and `<cg-face-search>` (upload or
paste a face image → matching moments). Each takes `collection="<id>"` (plus
optional `accent-color` and `--cg-height` CSS sizing); the collection's `--type`
must match the element — `<cg-chat>`/`<cg-search>`/`<cg-deep-search>` need a
`media-descriptions` or `rich-transcripts` collection, `<cg-face-search>` needs a
`face-analysis` collection. Unlike the playback elements they carry **no share
id**, but their live calls are refused on a public site, so `tinycloud publish`
**hard-rejects** a page that embeds any of them on a public site — publish with
Live-API components (0.3.6+; expressive surface below is sites embed v8–v12,
taught from 0.3.18): the same `/__cg/embed.js` script also defines
**collection-scoped** components that let a viewer search, chat, query, or
read a transcript *inside* a published site and play the referenced moment
inline via `<cg-video>`. Their implementation loads lazily from a second
chunk (`/__cg/embed-live.js`) the moment a page uses one — automatic; never
emit that file as a script tag, `/__cg/embed.js` stays the only script load.

- `<cg-chat>` — conversational Q&A, streaming answers + inline moment
citations, built-in Stop button. Optional `instructions` (the per-site
system prompt — persona, tone, scope) and `placeholder`.
- `<cg-search>` — keyword/transcript text search. Optional tuning: `scope`
(`segment` | `file`), `modalities`, `label-filters` (space/comma lists),
`threshold`, `limit`, `group-by="file"`, `sort-by` (`score` |
`item_count`). Malformed values degrade to defaults, never an error.
- `<cg-deep-search>` — agentic semantic search; the synthesis streams in and
result cards land as found. Optional `scope`, `limit`,
`exclude-weak-results`.
- `<cg-face-search>` — upload or paste a face image → matching moments,
played as short bounded clips. Optional `threshold`, `limit`.
- `<cg-query>` (embed v11) — natural-language analytical question → inline
table + row count, with the compiled SQL shown under the answer (the
site-side face of the `query` verb's engine). Optional `max-rows`. Point
it at an entities or metadata collection — often a **different id** than
the one chat/search use on the same page.
- `<cg-transcript share-id collection [for]>` (embed v12) — click-to-seek
speech turns with timestamps + speakers; with `for="<player-id>"` the
active turn follows the playhead, without it turns open as modal clips.
Unbilled. Height via `--cg-height`.
- `<cg-chapters auto share-id collection>` (embed v12) — chapters
self-populate from the live API instead of baked-in `<cg-chapter>`
children; auto chapters always seek-and-continue. The `auto` attribute
makes the otherwise public-safe chapters element private-site-only.

Every live panel is restylable from page CSS via `::part()` hooks
(`panel`/`input`/`send`/`status`/`results`, per-card `result*`; chat adds
`log`/`message`(+role)/`bubble`/`citation`/`stop`) and emits host events:
`cg-results`, `cg-answer`, `cg-error` (carries the HTTP status), plus the
**cancelable** `cg-resultopen`/`cg-citationopen` — `preventDefault()` swaps
the built-in clip mount for your own handling (embed v10). A
`window.cloudglue` JS client (responses/search/deepSearch/faceSearch/query/
transcript/sharesForFiles/renderCitations) backs fully custom UIs.

Each collection-scoped element takes `collection="<id>"` (plus optional
`accent-color` and `--cg-height` CSS sizing); the collection's `--type` must
match the element — `<cg-chat>`/`<cg-search>`/`<cg-deep-search>`/
`<cg-transcript>`/`<cg-chapters auto>` need a `media-descriptions` or
`rich-transcripts` collection, `<cg-face-search>` needs a `face-analysis`
collection, `<cg-query>` runs over any non-face collection. Their live calls
are refused on a public site, so `tinycloud publish` **hard-rejects** a page
that embeds any of them on a public site (0.3.18 extends the guard to
`<cg-query>`/`<cg-transcript>`/`<cg-chapters auto>`) — publish with
`--visibility private`. End to end: build a collection of the right type
(`library collections create … --type …` → `library collections add` → poll
`library collections show` until each file is `completed`) → author HTML with
the component → `tinycloud publish <html> --visibility private`. Full reference
plus a kitchen-sink page wiring every component (props, JS API, events) ships
with the binary as `references/cg-video.md` and `references/kitchen-sink.html`
inside the bundled media-artifact skill.
`library collections show` until each file is `completed`; for `<cg-query>`,
`query schema --in collection:<id>` shows what's queryable) → author HTML
with the component → `tinycloud publish <html> --visibility private`. Full
reference plus a kitchen-sink page wiring every component (props, JS API,
events) ships with the binary as `references/cg-video.md` and
`references/kitchen-sink.html` inside the bundled media-artifact skill.

### setup — credentials

Expand Down
2 changes: 1 addition & 1 deletion skills/tinycloud/scripts/preflight.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ set -u

# Mirror tinycloud-skill.json: min_version / supported_range upper bound
# (CI diffs these against the manifest).
MIN_VERSION="0.3.17"
MIN_VERSION="0.3.18"
MAX_VERSION_EXCLUSIVE="0.4.0"
INSTALL_CMD='curl -fsSL https://app.cloudglue.dev/tinycloud.sh | bash'
# Kept in sync with ../tinycloud-skill.json required_features (CI diffs them).
Expand Down
6 changes: 3 additions & 3 deletions skills/tinycloud/tinycloud-skill.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"skill_version": "0.3.17",
"skill_version": "0.3.18",
"tinycloud": {
"min_version": "0.3.17",
"supported_range": ">=0.3.17 <0.4.0",
"min_version": "0.3.18",
"supported_range": ">=0.3.18 <0.4.0",
"required_features": [
"envelope.v1",
"watch.v1",
Expand Down
Loading