Commit Graph
4124 Commits
Author SHA1 Message Date
jbernard077andClaude Fable 5 fae6560766 feat(registry): add hw-title — handwritten title
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:59 -04:00
jbernard077andClaude Fable 5 3beed70e56 feat(registry): add hw-text-cloud — speech bubble
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:59 -04:00
jbernard077andClaude Fable 5 f1a506eb4b feat(registry): add hw-callout-circle — scribble callout circle
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:59 -04:00
jbernard077andClaude Fable 5 95a2ae0a49 feat(registry): add hw-arrow — hand-drawn arrow
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:59 -04:00
jbernard077andClaude Fable 5 d4f1ad0c37 feat(registry): add hw-boil — hand-drawn boil
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:59 -04:00
jbernard077 e9d2792824 feat(registry): add yt-doc-lower-third — documentary lower third 2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 cc98f5fd6d feat(registry): add mk-emphasis-type — background emphasis type
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 1ead7a768a feat(registry): add yt-screen-warp — on-screen display effect
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 44cd520253 feat(registry): add mk-logo-sting — outline logo sting
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 ba774de05c feat(registry): add yt-vertical-fill — vertical media filler
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 4ce35b7cba feat(registry): add mk-line-graph — minimal line graph
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 c4425bfb40 feat(registry): add yt-circle-pointer — pointer circle + countdown
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 2039bf5f44 feat(registry): add mk-progress-stat — count-up stat card
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 4e0a7dda88 feat(registry): add yt-feather-highlight — feathered spotlight
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 63c6cd02ea feat(registry): add mk-usage-arc — hairline arc gauge
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 8948612359 feat(registry): add yt-logo-intro — logo intro sequence
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 eed6adafb0 feat(registry): add mk-cta-button — pill cta button
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 9036e3c76c feat(registry): add yt-prism-title — chromatic fringe title
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 fc40c882e1 feat(registry): add mk-clone-wall-transition — text clone wall transition
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 d924630f23 feat(registry): add yt-avatar-pip — circle pip window
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 ac8d34fb9d feat(registry): add mk-placeholder-grid — rounded media grid
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 a4ef52fcb0 feat(registry): add yt-comment-card — comment cards
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 9be7a6415c feat(registry): add mk-callout-highlight — word-sweep highlight
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 a7f83f6fc6 feat(registry): add yt-lcd-background — scanline board background
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 3e4a4042e5 feat(registry): add mk-specs-list — specs checklist
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 ea5e5e5bb5 feat(registry): add yt-camera-move — camera punch-in
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 95125834e8 feat(registry): add mk-pill-callout — capsule callout chip
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:58 -04:00
jbernard077andClaude Fable 5 61c82135f3 feat(registry): add mk-background — minimal procedural gradient background
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:50:36 -04:00
ukimsanov 7c14438496 feat(core): add media color grading contract 2026-07-06 02:36:17 -07:00
Vance IngallsandClaude Fable 5 3a717fa719 fix(parsers,sdk,studio-server,studio): unify hf-id space across preview, disk, and SDK session (#1981)
* fix(parsers,sdk,studio-server,studio): unify hf-id space across preview, disk, and SDK session

Root-causes the setTiming element_not_found resolver-shadow divergence class:
timeline edits carry hf-ids read from the live preview DOM, but the preview
minted ids AFTER rewriting attributes (and never persisted them for sub-comps),
while the SDK session mints from the raw file — content-keyed minting then
yields different ids for the same element. Template-based comps were worse:
the SDK excluded the whole <template> subtree, so the session had zero
elements and every edit diverged.

- parsers: ensureHfIds now descends into <template> subtrees (linkedom's
  querySelectorAll does not), minting and pinning inner ids
- sdk: buildRoots/buildElement treat <template> as a transparent container,
  and resolution (resolveScoped, animation-id map) searches template subtrees
  via querySelectorAllDeep — template comps now model, resolve, and edit
- studio-server: the sub-comp preview route persists hf-ids to the raw file
  BEFORE the rewrite pipeline (mirrors the main route), pinning one id space
  across served DOM, disk, and SDK session
- studio: resolver-shadow skips structurally-empty sessions (no event, no
  attempt) and tags fail-open emissions with sourceReadFailed so read errors
  are distinguishable from unwired readers in telemetry

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(parsers,sdk,studio-server,studio): scope template descent, guard persist route

Addresses the 10 verified findings from the PR #1981 review:

- Restrict template transparency to COMPOSITION templates
  (<template data-composition-id>) everywhere — ensureHfIds, SDK
  buildChildren, querySelectorAllDeep. A plain <template> (runtime
  clone-source) keeps its old fully-excluded behavior: stamping its
  interior would duplicate one persisted id across every runtime clone,
  and modeling it would show phantom timeline clips.
- Guard the sub-comp persist: only .html files (the wildcard route can
  serve any project path — stamping an SVG corrupted it on disk),
  try/catch the read (file-removed race becomes 404, not 500), salt the
  etag (v2) so pre-fix cached clients don't 304 past the id pin, and
  thread the stamped content into buildSubCompositionHtml so served ids
  match the mint even when the disk write is skipped.
- Rewrite querySelectorAllDeep as a document-order DOM walk — appending
  template matches after top-level matches made duplicate-id tiebreaks
  disagree with the preview's unwrapped DOM (wrong-element edits).
- Recurse sourceMutation.querySelectorAllWithTemplates so server-side
  ops resolve ids at any template depth, matching SDK resolution.
- Replace the empty-session silent skip with ONE tagged session_empty
  event per session — silence would blind the tripwire to exactly the
  modeling-gap class that exposed the template bug. Attempts stay
  uncounted (an unmodelable comp can't cut over).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(studio-server): close TOCTOU in sub-comp hf-id persist (CodeQL js/file-system-race)

Replace the route-level stat/read/persist sequence with stampFileHfIds:
validation (fstat), read, mint, and write-back all go through ONE open
file descriptor (O_NOFOLLOW where supported), so the path cannot be
swapped between validation and write. Falls back to read-only stamping
when the file isn't writable — content-keyed minting means the SDK
derives the same ids from the same bytes even without the disk write.

Addresses miguel-heygen's blocking review on PR #1981.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(studio-server): linear-time template-attr match (CodeQL js/polynomial-redos)

promoteTemplateCompositionId's single-pattern regex backtracked
polynomially on crafted input. Two-step match: grab each <template>
open tag linearly, then find data-composition-id within that short
tag text. Same semantics (first template carrying the attr wins).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 00:16:07 -07:00
Vance IngallsandClaude Fable 5 e9076324e7 feat(cli): figma import telemetry — subcommand labels, typed error codes, figma_import event (#1979)
Closes the observability gaps on the figma integration:
- withFigmaErrors takes a command label (figma:asset|tokens|component) and
  reports the failure inline before its process.exit — the top-level
  trackCommandFailures wrapper never sees self-exiting commands, so typed
  codes (NO_TOKEN, BAD_TOKEN, FORBIDDEN, RATE_LIMITED) were invisible.
  FigmaClientError codes surface as the error name for dashboarding the
  first-run funnel (NO_TOKEN -> later success = onboarding conversion).
- new figma_import event per import: phase, duration, reused (dedup
  effectiveness), tokens variables-vs-styles mode + entry count
  (Enterprise gating rate), unresolved-binding + rasterized-node counts
  (fidelity degradation). No fileKeys, node ids, names, or descriptions.
- /figma skill fires the events beacon (figma-motion / figma-shaders /
  figma-storyboard) for the MCP phases that never touch the CLI.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 23:27:58 -07:00
James RussoandClaude Opus 4.8 232d591479 feat(cli/telemetry): surface unrecognized agents in the agent_runtime=null bucket (#1978)
* feat(cli/telemetry): surface unrecognized agents in the agent_runtime=null bucket

agent_runtime is a closed allowlist: an agent we have no rule for collapses
to null with no trace of what it was, so ~18% of CLI users are unattributable
and new agents stay invisible until reverse-engineered by hand.

Add detectAgentHints(), a self-populating residual signal computed only for
the null bucket (gated off classified events):
- agent_hint: value of AGENT / AI_AGENT (the emerging self-identification
  convention; Crush and Goose set AGENT=<name>) — names agents the allowlist
  misses.
- term_program: raw TERM_PROGRAM (editor name) — catches the IDE-terminal
  class the same way the cursor/windsurf rules do.
- agent_env_hints: sorted, comma-joined "agent-ish" env-var KEY names present
  but matched by no vendor rule — a fingerprint that clusters by agent.

Privacy stays consistent with the existing "never read secret-shaped values"
stance: agent_env_hints emits key names only; the three value-reads are vars
whose sole purpose is non-secret identification, each passed through a strict
short-slug allowlist so anything long/spaced/secret-shaped is dropped.

Breaking down agent_hint / agent_env_hints filtered to agent_runtime IS NULL
AND is_tty=false gives a ranked leaderboard of new agents to promote into
VENDOR_RULES.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(cli/telemetry): guard agent_hint/term_program against short credential-shaped values

Review feedback (Magi, #1978): the short-slug allowlist in sanitizeHint() still
accepted short credential-shaped values (AGENT=sk-ant-api03,
AGENT=AKIAIOSFODNN7EXAMPLE, AGENT=github_pat_abc), so the "never emit a secret"
claim wasn't actually enforced — only overlong values were dropped.

Add a credential-shape guard on top of the slug allowlist:
- known token/credential prefixes (sk-, ghp_, github_pat_, akia, ya29, ...)
- any unbroken alphanumeric run >= 16 chars (key bodies, hex, base64-ish),
  while agent names segment on _/-/. and keep each run short.

Replace the single overlong-value test with the short credential shapes from the
review (parametrized) plus a positive case (gemini_managed_agent) proving real
multi-segment names still pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 22:31:13 -07:00
James 9de41ce316 chore: release v0.7.37 v0.7.37 2026-07-06 05:59:36 +01:00
James RussoandClaude Opus 4.8 2b1109db4c test(lambda): behavioral guard for handler CJS banner shims (#1977)
Miguel's fix (f999b40d) added the require/__filename/__dirname shims to the
Lambda handler bundle after #1932 crashed every render at import with
"__dirname is not defined in ES module scope" (wawoff2's emscripten build
reads __dirname at module scope; it's inlined via producer -> fontCompression).

The accompanying test only grepped build-zip.ts for the banner literals, so it
passes even if the shim is renamed, reordered into a broken form, or if a new
inlined CJS dep needs a global the banner doesn't provide.

Replace it with a behavioral test: extract the banner to _handlerBanner.ts
(build-zip.ts self-executes on import, so it can't be imported directly),
bundle a fixture that touches __dirname/__filename/require with the real
banner, and import the output under real Node -- not the bun test runtime,
which defines __dirname in ESM and would mask a missing shim. The import
faithfully reproduces Lambda's Node ESM environment and fails with the exact
#1932 error when any shim is dropped.

Handler bundle output is unchanged (identical banner string).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 21:51:08 -07:00
Ular Kimsanov 94996d8da9 Merge pull request #1976 from heygen-com/docs-audit-fixes
docs: fix 53 inaccuracies across all documentation
2026-07-05 21:34:05 -07:00
ukimsanov 52d586dd31 docs: fix 53 inaccuracies across all documentation
Exhaustive audit of every MDX file in docs/ against skill references
and package source code. Every API signature, default value, flag,
and technical claim verified against ground truth.
2026-07-05 21:26:41 -07:00
Vance Ingalls c5d725abd0 fix(sdk,studio): resolve animation ids from parsed script, not just DOM-matched elements (#1957)
recordAnimationResolverParity reported a false animation_not_found divergence
for any tween whose selector doesn't currently CSS-match a live DOM element,
because it only checked el.animationIds (DOM-gated). The real server-side op
it shadows resolves purely from the parsed script. Adds
Composition.getAllAnimationIds() as a DOM-independent id set and checks it
too, matching the server's actual resolution behavior.
2026-07-05 20:11:49 -07:00
Miguel Ángel dfa6fedbcd fix(hyperframes-media): surface a clear error when npx can't be resolved on Windows (#1961)
On Windows, resolveSpawnCommand routes `npx` through node + npm's
npx-cli.js (avoiding the un-spawnable npx.cmd), locating that CLI via
npm_execpath. When the script is run directly with `node audio.mjs`
instead of through npm/npx, npm_execpath is unset, so resolution returns
null and spawnP short-circuited to `{status:-1}` — silently. With
stdio:"ignore" hiding everything, callers just reported "TTS failed -
omitted" for every single line, giving no hint that the real cause was
an unresolvable npx. Debugging required reading the source.

Fix: when spawnP hits that null-resolution path, emit a clear one-time
diagnostic naming npm_execpath and the remedy (run via npx/npm, or export
npm_execpath) before returning {status:-1}. One-shot latch so a batch of
lines logs it once, not per line. Behavior is otherwise unchanged — still
returns {status:-1} and spawns nothing.

Test: new tts.spawn.test.mjs case — two consecutive win32 npx calls with
npm_execpath unset both return {status:-1}, nothing is spawned, and the
diagnostic (mentioning npm_execpath) is emitted exactly once. Existing
spawn tests unchanged (7/7 pass).
2026-07-05 21:29:04 -04:00
Miguel Ángel c2862eae1b docs: update README.md 2026-07-05 20:57:24 -04:00
Miguel Ángel e8d19b1b43 chore: release v0.7.36 v0.7.36 2026-07-05 19:25:42 +00:00
Miguel Ángel 98b539df72 fix(cli): prefer real ffmpeg exe over cmd shim (#1958) 2026-07-05 12:24:50 -07:00
Miguel Ángel 2f55ea678a chore: release v0.7.35 v0.7.35 2026-07-05 18:48:24 +00:00
Miguel Ángel f999b40d73 fix(lambda): define dirname in handler bundle 2026-07-05 11:46:48 -07:00
Miguel Ángel b7dcb9e2a3 fix(engine): harden ffmpeg binary resolution 2026-07-05 11:46:38 -07:00
Miguel Ángel b34e623bf8 fix(hyperframes-media): sfx offline path skips (loudly) a missing bundled file 2026-07-05 11:46:30 -07:00
Miguel Ángel 114d31919e chore: release v0.7.34 (#1954) v0.7.34 2026-07-05 10:55:11 -07:00
Miguel Ángel 56d4a7032b fix(engine): preserve DOM mask visibility state (#1953) 2026-07-05 07:24:26 -07:00
Miguel Ángel 78cca797f1 chore: release v0.7.33 v0.7.33 2026-07-04 22:33:27 +00:00
Miguel Ángel bb066077b4 fix(producer): avoid reviving hidden DOM in HDR layers (#1935)
* fix(producer): avoid reviving hidden DOM in HDR layers

* fix(producer): filter transition HDR DOM masks

* fix(producer): keep hidden timed descendants masked
2026-07-04 15:30:56 -07:00
Miguel Ángel 16fe1368ff chore: release v0.7.32 v0.7.32 2026-07-04 21:23:19 +00:00