Commit Graph
4915 Commits
Author SHA1 Message Date
heygen-rui-bot 0348f90f0c codegen: resync cloud client from EF 8efa202a 2026-10-26 21:38:29 +02:00
Miguel Ángel 74905aeff6 fix(cli): Windows preview and catch-up records move to LOCALAPPDATA, a refused log no longer blocks (#6461)
* fix(cli): Windows preview and catch-up records move to LOCALAPPDATA, a refused log no longer blocks

* fix(cli): a refused preview log falls back to the null device and drops the extra comments

* fix(cli): Windows catch-up record goes under LOCALAPPDATA/hyperframes like the other records
2026-10-26 15:27:54 -04:00
Miguel Ángel 9ebc1f8a13 fix(cli): the check and snapshot project lock works where hard links are refused (#6464)
* fix(cli): the check and snapshot project lock works where hard links are refused

* refactor(cli): drop the project lock comment to fit the comment ratchet
2026-10-26 15:12:20 -04:00
Miguel Ángel 85fdc9aa88 chore: release v0.8.206 (#6469) 2026-10-26 15:00:57 -04:00
Miguel Ángelandlorenzozanee 15367a9f62 fix(studio): a media preview retries after its file or project changes (#6451)
Co-authored-by: lorenzozanee <wyz0707@proton.me>
2026-10-26 18:15:56 +00:00
Miguel Ángelandlorenzozanee 25e5ab733b fix(studio): give the prompt preview editor an accessible name (#6450)
Co-authored-by: lorenzozanee <wyz0707@proton.me>
2026-10-26 18:15:46 +00:00
Miguel Ángel 3e16603d37 fix(render): a PNG's colour tags no longer change its pixels in preview, check, snapshot or render (#6453)
* fix(render): a PNG's colour tags no longer change its pixels in preview, check, snapshot or render

* fix(render): the play and present server also serves a PNG without its colour tags

* fix(render): bundled pages inline a PNG without its colour tags too
2026-10-26 17:48:57 +00:00
Miguel Ángel e3e93aa7fe fix(core): paused preview and render show the same, correct video frame (#6432)
* feat(core): one function gives the media time that shows the frame starting at an instant

* fix(core): paused preview and render show the same, correct video frame

* fix(core): register the media-clock subpath in its descriptor and keep the reason beside the test

* fix(core): media seeks lead by 10 us so Chrome's timestamp rounding never shows the prior frame

* fix(core): generated pages lead media seeks by a literal, on every generator branch
2026-10-26 17:48:51 +00:00
Miguel Ángel 4a5ee73614 fix(producer): a composition with no timeline-registering script no longer waits 45 s at setup (#6436)
* fix(producer): a composition with no timeline-registering script no longer waits 45 s at setup

The render waited the full timeout for every composition that never registers a timeline, such as one driven by canvas or requestAnimationFrame.

* fix(producer): module and importing scripts still count as able to register a timeline

* fix(producer): a failed script keeps the readiness wait, and the page scan runs once
2026-10-26 17:28:56 +00:00
Miguel Ángel 5148326fd6 fix(cli): a killed CLI no longer leaves its child processes running (#6431)
* fix(cli): a killed CLI no longer leaves its child processes running

* test(cli): shorten the reaper fixture comment to fit the comment ratchet
2026-10-26 17:28:50 +00:00
Miguel Ángel 121bf20e99 perf(studio): a scrub's state messages re-read the preview's compositions at most every 500 ms (#6429) 2026-10-26 17:27:26 +00:00
Miguel Ángel f1b5d89a1e perf(studio): the layer walk keeps its selector index, so scrubbing into new scenes is cheaper (#6427)
* perf(studio): the layer walk keeps its selector index, so scrubbing into new scenes is cheaper

* perf(studio): the layer walk keeps its selector index, so scrubbing into new scenes is cheaper
2026-10-26 17:27:19 +00:00
Miguel Ángel 37f14fdcb1 fix(snapshot): video frames keep the colours render gives the same footage (#6425)
* fix(snapshot): video frames keep the colours render gives the same footage

* fix(snapshot): say so once when video colours cannot be matched to render

* test(snapshot): cut the HEVC fixture's encode time so the flake gate stays inside its timeout

* style(snapshot): format the HEVC fixture line
2026-10-26 17:27:13 +00:00
Miguel Ángel ad4d3fad13 fix(producer): convert HEIC images to JPEG at compile time (#6455)
* fix(producer): convert HEIC images to JPEG at compile time

Tiled HEIC photos probe as several video streams, so the media-type
preflight rejected them as image:video, and Chrome cannot decode HEIC.
Sniff the ftyp brands of every <img>, join and rotate the tile grid with
ffmpeg, verify the declared size, and swap in a cached JPEG.

* fix(producer): shorten the HEIC prep comments

* fix(producer): name host tool failures and keep a failed HEIC preview image as authored

Also: HEIC tests run in the integration lane; the primary grid is picked by default disposition.

* chore(producer): raise the package size budget for the HEIC prep
2026-10-26 13:56:13 -04:00
Aron Lee 95aba51e20 test(lint): cover three caption rules that had no tests (#5436)
* test(lint): cover three caption rules that had no tests

Refs #5388

* test(lint): pin the caption CSS gate on the group textShadow rule

Refs #5388
2026-10-26 17:25:18 +00:00
Miguel Ángelandlorenzozanee 37543d223a fix(cli): hide the Windows console for the port lookup and clipboard (#6449)
Co-authored-by: lorenzozanee <lorenzozanee@users.noreply.github.com>
2026-10-26 17:25:01 +00:00
Miguel Ángel d83bf997b0 feat(cli): check catches audio the render would lose or play as silence (#6439)
* feat(cli): check catches audio the render would lose or play as silence

check gains an Audio section, read from the media list the render mixes:
- error: a clip's source has no audio the render can read (its mix fails,
  the film ships without sound)
- warning: a clip starts past the end of its file, or the part it plays
  is silent
- info: the film has no sound at all

The bundle and media list are now built once and shared with the HDR
inspection; the audio pass runs while the browser pass does.

Fixes #2775

* fix(cli): check reports an unreadable audio source the way render handles it

A source with no audio track is refused by render's own media-type rule, now exported from the producer and called by check; a source that does not decode as audio fails the mix and stops the render.

* perf(cli): check samples a long clip at a few spots before reading all of it for silence

Sound at any spot ends the decode; a clip is only called silent after its whole played part is read.

* chore(cli): drop a comment the shared finding helper's name already says
2026-10-26 17:02:57 +00:00
Miguel Ángel 0979e32a8d fix(core): a composition behind a wrapper takes its host's start (#6435)
* fix(core): a composition behind a wrapper takes its host's start

Fixes #4334.

* fix(core): a composition inside a timed wrapper starts with the wrapper

The nearest host or timed wrapper above a mounted root sets its start, so its clock starts when the wrapper shows it, matching how CSS animations already pick their clip.

* test(producer): re-pin the test classification digest
2026-10-26 16:48:57 +00:00
Muzzy5150 0cc14ddb8e fix(cli): validate play and present ports (#6402) 2026-10-26 16:15:54 +00:00
Miguel Ángel 83a29e9209 fix(engine): name the element a failing root composition script looked up (#6430)
* fix(engine): name where a root composition script threw and the element it looked up

* style(engine): format throw-site helper

* fix(engine): shorten the throw-site comment

* fix(engine): name a lookup only when the throwing line holds exactly one
2026-10-26 16:15:42 +00:00
Miguel Angel Simon Sierra b4eab1a8c1 chore: release v0.8.205 2026-10-26 12:41:40 -04:00
Miguel Ángel e34f9f01d8 Merge pull request #6442 from heygen-com/feat/cli-windows-app-download
feat(cli): offer the HyperFrames app download on Windows
2026-10-26 12:40:27 -04:00
Miguel Ángel b76b529372 feat(cli): offer the HyperFrames app download on Windows
The CLI and Studio now point Windows to the app download.

Studio names the Windows download in its install steps.
2026-10-26 12:23:42 -04:00
Miguel Ángel 324671829f feat(cli): hyperframes <dir> opens the project in the app (#6426)
* feat(cli): hyperframes <dir> opens the project in the app

* refactor(cli): one command-word lookup and one rewritten command line for the folder shortcut

* refactor(cli): shorten the folder shortcut comments to fit the comment ratchet
2026-10-26 16:12:41 +00:00
Miguel Ángel d8398c9da7 fix(engine): a video held past its media end keeps following its animation (#6424)
* fix(engine): a video held past its media end keeps following its animation

Fixes #4049.

* fix(engine): drop two comments the names already carry
2026-10-26 16:12:30 +00:00
9ecb13ed69 fix(producer): deduplicate scene font faces before embedding (#6395)
* fix(producer): deduplicate scene font faces before embedding

* fix(producer): address font deduplication review

* docs(help): document render font-face deduplication

The troubleshooting guide this section originally targeted was folded
into docs/help.mdx on main, so the section now lives under the render
troubleshooting entries there.

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

---------

Co-authored-by: James <james.russo@heygen.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-26 16:06:29 +00:00
Muzzy5150 803655a67e fix(cli): isolate benchmark render files (#6403) 2026-10-26 15:32:27 +00:00
kape acd0bc361f fix(producer): honor disabled looping for finite-loop GIF inputs (#3943) 2026-10-26 15:31:13 +00:00
Abdullah M. Nazif dfb7e5a4de fix(media-use): serialize concurrent preference records (#5366)
* fix(media-use): serialize concurrent preference records

* chore: prepare conflict resolution against current main

* fix(media-use): serialize concurrent preference records

* docs(media-use): clarify project preference file guidance

* chore: prepare conflict resolution against current main

* fix(media-use): refresh preference records against main

* chore: prepare conflict resolution against current main

* chore: merge main and refresh preferences skill manifest

* chore: prepare conflict resolution against current main

* chore: merge main and refresh preferences skill manifest

* chore: prepare conflict resolution against current main

* chore: merge main and refresh preferences skill manifest
2026-10-26 15:30:18 +00:00
Miguel Ángel 7d6c02f85a test(player): playbench measures first play, audio joins, automation, cuts and the autoplay fallback (#6418)
* test(player): playbench measures first play, audio joins, automation, cuts and the autoplay fallback

* fix(player): playbench takes-heard windows follow the composition playhead

The host page has no player, so its samples carry no playhead.

The windows fell back to nominal cut times.
2026-10-26 15:15:20 +00:00
Abdullah M. Nazif 2be8bc2b9e fix(cli): preserve UTF-8 across subprocess output chunks (#5273)
* fix(cli): preserve UTF-8 across subprocess output chunks

* chore: prepare conflict resolution against current main

* fix(cli): retain UTF-8 output handling with current main

* chore: prepare conflict resolution against current main

* fix(cli): retain UTF-8 decoding with process teardown updates

* chore: prepare conflict resolution against current main

* fix(cli): preserve decoded subprocess progress on current main

* docs(cli): scope Unicode output guarantees to cancellable workers

* docs(cli): name commands with Unicode-safe diagnostics
2026-10-26 14:58:57 +00:00
Abdullah M. Nazif d1b3471325 fix(cli): describe the restored skip-skills option (#6245)
* fix(cli): describe the restored skip-skills option

* docs(ci): describe the current skills opt-out
2026-10-26 14:58:35 +00:00
SophiaHuangCc 2d695a8436 feat(studio): support GIF export with loop count (#5593)
* feat(studio): support GIF export with loop count

* fix(studio): cap GIF exports at 30 fps

* fix(studio): complete GIF export review follow-ups
2026-10-26 14:57:55 +00:00
Muhtasim Munif Fahim 64cb6556ef fix(lint): add fix hints to the variables-entry and CSS parse findings (#5447)
Closes #5392
2026-10-26 14:57:23 +00:00
jbernard077andClaude Fable 5.1 36a24aeb85 fix(core): the fonts gate starts loading declared faces no laid-out text uses yet (#6415)
* fix(core): the fonts gate starts loading declared faces no laid-out text uses yet

Before composition scripts run, waitForFonts forces one layout and awaits
document.fonts.ready. A face that only script-built text uses has not started
loading at that point, so ready does not wait for it and the script measures
the fallback face. Start every face still unloaded after the forced layout,
under the existing timeout; a load that rejects falls through to the same
timeout warning instead of stopping the scripts.

Refs #5112

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

* fix(core): keep the fonts gate's comment share level; cover a face that never settles

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-26 14:56:59 +00:00
Akshar Patel d507323ef9 fix(player): keep new controls in sync with playback (#6373) 2026-10-26 14:53:06 +00:00
Akshar Patel ec866ed1c5 fix(cli): keep audio timings when trimming long recordings (#6375) 2026-10-26 14:52:41 +00:00
Muhtasim Munif Fahim 85dcc193d5 fix(cli): list the examples init --example accepts in docs examples (#5446)
The examples topic listed title-card and video-edit, which do not exist,
and none of the eight examples in registry/examples. List blank plus the
registry examples with their registry-item descriptions, and add a test
that fails when the topic and registry/examples disagree.

Fixes #5393
2026-10-26 14:22:09 +00:00
Miguel Ángel 2d1b5cfbd2 chore: release v0.8.204 (#6423) 2026-10-26 10:16:23 -04:00
Miguel Ángel f6c26141d8 fix(producer): a media src that resolves to the page itself is no source (#6421)
* fix(producer): a media src that resolves to the page itself is no source

A src of '#', '#t=1', '?' or '?x=1' reads back from the browser as the page URL
plus a suffix. decodedUrlPath strips the suffix, so the probe opened index.html as
a media file and failed the render with 'media sources are text documents'.
Discovery now drops any src whose URL without query and hash equals the page URL,
which also covers the blank and whitespace forms from the earlier fix.

* fix(producer): name the page-itself check instead of commenting it
2026-10-26 13:50:50 +00:00
Miguel Ángel f16c23cd99 fix(engine): a slow first Chrome start no longer drops a render to screenshot capture (#6420)
The beginFrame probe now tells a timeout from a real rejection.

A timeout relaunches Chrome and probes once more with a longer budget.

An unsupported answer still falls back at once.
2026-10-26 13:49:57 +00:00
Miguel Ángel dc56b3d20a perf(studio): the layer walk skips clips the runtime hid, so scrubbing a long film stays smooth (#6416)
The off-canvas indicators (always mounted) and the Layers panel rebuild their layer list every
100 ms while a scrub mutates the preview, and each rebuild read the computed style of every element
of every scene, on screen or not. The runtime already hides everything inside a clip its visibility
pass hid, so those subtrees hold no layer: the walk now skips a clip marked data-hf-clip-hidden
with an inline visibility of hidden. The marker constant moves to studio-preview-mark so the runtime
and Studio share one owner.
2026-10-26 13:22:09 +00:00
Miguel Ángel 575f68cf5b fix(producer): a render whose capture stops advancing fails within minutes (#6413)
* fix(producer): a render whose capture stops advancing fails within minutes

* fix(producer): keep the bounded probe read the stall change dropped

* chore(producer): shorten a test comment

* fix(producer): every retry batch gets its own first-frame window; the stall test waits for the render to settle

A retry that runs as several batches opened one stall window for the whole attempt, so a later batch whose browsers take longer than the no-progress window to land a frame was killed where main would have finished. The window now opens per batch. The stall tests also waited a fixed number of turns for real file IO after the last frame, which failed about 3 runs in 10 on a loaded machine; they now wait for the render to settle.

* fix(producer): a test reads the stall error fields instead of suppressions; size budget follows

* test(producer): split the scripted capture attempt into small helpers

* test(producer): the stall test advances fake time only while the scripted capture waits
2026-10-26 12:20:19 +00:00
Miguel Ángel ff0a56340b chore: release v0.8.203 (#6412) 2026-10-26 07:20:07 -04:00
Miguel Ángel 52b3d32114 fix(studio-server): a failed preview copy reports its causes and what its source is (#6350)
* fix(studio-server): a failed preview copy says why its output could not open

* fix(studio-server): a failed preview copy reports its causes and what its source is

* fix(studio-server): failure reports hide spaced paths and survive a vanished source

* refactor(studio-server): read a probe's result in its own function for the complexity gate

* fix(studio-server): close the source facts function the rebase left open

* fix(studio-server): a failure report reads the source size through one open descriptor
2026-10-26 10:54:09 +00:00
Miguel Ángel 6a977e8db1 fix(producer): chunk capture round-robins only for callers that bill wall time (#6405)
* fix(producer): chunk capture round-robins only for callers that bill wall time

* fix(engine): worker, extraction and encoder sizing read the CPU quota, not the host core count

* Revert "fix(engine): worker, extraction and encoder sizing read the CPU quota, not the host core count"

This reverts commit cdd4d858c8.

* chore(producer): drop the doc comments the comment ratchet rejects
2026-10-26 10:20:08 +00:00
Xuanru Li a39f7b37d9 feat(cli): check-review inspect attaches the inspector's report to each framed finding (#6409)
* feat(cli): skipContrastInMotion moves to HF_TOOL_CONTEXT check-review

The --skip-contrast-in-motion flag and HYPERFRAMES_CHECK_SKIP_CONTRAST_IN_MOTION
env give way to a check-review capability in HF_TOOL_CONTEXT, so only a harness
turns it on. The skill text and manifest go back to main.

* feat(cli): check-review findingFrames saves one plain frame per finding time

With HF_TOOL_CONTEXT check-review.findingFrames, every error/warning finding in
layout or contrast with a real bbox gets frameTime (the middle sample of its
longest held run, by the heldMs gap rule) and frame (the absolute path of an
unannotated full frame shared by every finding at that time). One seek and
screenshot per distinct time, capped at 60 times with errors first, into the
run's snapshot folder; not listed in snapshots, history or events. Without the
capability, output is unchanged.

* docs(cli): finding-frame comments name the check-review capability, not a flag

* fix(cli): validate finding frame times and preserve cancellation

* fix(cli): count finding frame progress toward the check deadline

* feat(cli): check-review inspect attaches the inspector's report to each framed finding

With findingFrames on, the finding-frames page is served with the
inspector's GSAP hooks. After each frame is captured, every finding framed
at that time is inspected by its data-hf-id, else its selector, and the
inspector's own report is attached as the finding's inspect field. A failed
inspection becomes that finding's { error } and never fails the check.
Without the capability nothing changes.

Drops the unused @types/mime-types devDependency that the dependency audit
flags once packages/cli/package.json is touched.

* fix(cli): stop finding inspections after cancellation

* fix(cli): reject ambiguous finding inspection targets

* fix(ci): build inspector before Windows CLI smoke

* fix(cli): parse viewport HTML with explicit server parser
2026-10-26 10:02:49 +00:00
Miguel Ángel 84fd701daa feat(studio): preview copy progress, retry and a remembered quality (#6366)
* feat(studio-server): a copy being made says how far it has got, and can be retried

* feat(core): the preview reports its lighter copies' progress and retries failed ones

* feat(studio): the preview quality and its lighter copies' progress live in the player store

* feat(studio): every host forwards the preview quality, and the choice is kept per computer

* feat(studio): the preview quality knows if a person or the app chose it

* fix(core): the first report of the lighter copies is not held back by the throttle

* test(studio): the preview quality preference test writes under the real key

* fix(core): a quality change reports its copies at once, not after the throttle

* style: format the preview quality files

* feat(core): report how playback is going, and what the preview holds, to the host

* fix(studio): the preview quality levels come from a browser-safe core entry

* style: format the new entry's files

* style: drop two comments the file's ratchet and the citation check refuse

* feat(core): tell which lower levels would give a video a lighter copy

* fix(studio): drop the old level's playback health when the level changes

* feat(studio-server): preview facts carry the probed codec of every video

* refactor(studio): route the preview's reports through a table for the complexity gate

* fix(core): a copy's retry flag is sent on the first ask only, not on every poll

* fix(core): type the health report and restore the player hook's complexity directive

* style: cut four comments the comment ratchet refuses

* fix(studio): keep playerStore.ts within its 600-line cap

* fix(core): a scene mounting does not restart the playback health window

* fix(core): the playback health window restarts only when the display scale changes

* fix(core): a repeated display scale no longer restarts the playback health window

* fix(studio): route the preview's reports by an explicit list of message types
2026-10-26 09:20:07 +00:00
Xuanru Li 12ae82aa8a feat(cli): check-review findingFrames saves one plain frame per finding time (#6401)
* feat(cli): skipContrastInMotion moves to HF_TOOL_CONTEXT check-review

The --skip-contrast-in-motion flag and HYPERFRAMES_CHECK_SKIP_CONTRAST_IN_MOTION
env give way to a check-review capability in HF_TOOL_CONTEXT, so only a harness
turns it on. The skill text and manifest go back to main.

* feat(cli): check-review findingFrames saves one plain frame per finding time

With HF_TOOL_CONTEXT check-review.findingFrames, every error/warning finding in
layout or contrast with a real bbox gets frameTime (the middle sample of its
longest held run, by the heldMs gap rule) and frame (the absolute path of an
unannotated full frame shared by every finding at that time). One seek and
screenshot per distinct time, capped at 60 times with errors first, into the
run's snapshot folder; not listed in snapshots, history or events. Without the
capability, output is unchanged.

* docs(cli): finding-frame comments name the check-review capability, not a flag

* fix(cli): validate finding frame times and preserve cancellation

* fix(cli): count finding frame progress toward the check deadline
2026-10-26 08:28:38 +00:00
Miguel Ángel 1819276fc3 test: real-Chrome and CI smoke pages inline GSAP so they wait on no CDN (#6406)
* test(studio): real-Chrome tests inline GSAP so their page waits on no request

* test(ci): smoke projects inline GSAP so required checks wait on no CDN
2026-10-26 08:20:55 +00:00