Commit Graph
2009 Commits
Author SHA1 Message Date
Miguel Ángel 619b8bc4d7 chore: release v0.8.207 (#6510) 2026-10-27 04:33:06 +00:00
Miguel Ángel eb6b2c9de9 fix(cli): snapshot counts and lists the stills that are on disk, and fails when some are not (#6511)
* fix(cli): snapshot counts and lists the stills that are on disk, and fails when some are not

The summary counted frames the run had captured, not files that exist, and printed paths
relative to the project. It now checks every still on disk, prints absolute paths, says
"N of M" when some are missing or empty, names them, and exits non-zero.

* fix(cli): snapshot says when it clears an earlier run's stills from the folder

Without --keep, a run removes the stills an earlier run left in the folder before it captures,
so two runs into one -o folder silently erased the first. The behaviour stays; the console
and --json now say "cleared N stills from an earlier run in <folder>". The on-disk comment is
also cut to the comment limit.

* fix(cli): snapshot judges the stills it wrote, not the frames it was asked for

A --zoom target that is not visible skips a frame on purpose, with a warning, and that frame never
reaches the written list. Comparing the files on disk with the requested count turned that into a
failed run. Only a written still that is missing or empty fails now.
2026-10-27 04:29:40 +00:00
Miguel Ángel be036160fe fix(cli): Kokoro speech works when its espeak data path passes 260 characters (#6507)
* fix(cli): Kokoro speech works when its espeak data folder path passes 260 characters on Windows

* test(cli): cache test follows the synth script version
2026-10-27 03:22:49 +00:00
Miguel Ángel 142f246d7c fix(cli): a finished capture no longer fails when Windows refuses to delete its Chrome profile (#6505)
Chrome's profile lockfile is held for a moment after the browser exits, so removing the
capture profile threw EBUSY and a finished capture exited 1. The profile and staging
removals now go through a core helper that retries transient locks and, for cleanup of
finished work, warns instead of failing.
2026-10-27 03:10:11 +00:00
Xuanru LiandJerrai 53d3caeac5 feat(cli): capture can route its traffic through an opt-in upstream proxy (#6499)
* feat(cli): capture can route its traffic through an opt-in upstream proxy

HYPERFRAMES_CAPTURE_PROXY=http://host:port sends the capture browser proxy's
forwarded requests and CONNECT tunnels, and every publicRequest download,
to that proxy by hostname instead of dialing a checked public IPv4. Unset,
behaviour is unchanged.

* fix(cli): keep capture comment share flat and close the new CodeQL findings

Test fixtures record what they receive instead of echoing request data, and
capture --video strips line breaks from a failed download's message before
logging it.

* fix(cli): proxied HTTP downloads send no URL fragment, and a malformed proxy credential is refused

The absolute-form request to the upstream used the URL's href, so a fragment such as
sprite.svg#icon went on the request line, which the pinned path never sends and strict proxies
refuse. A malformed percent-escape in the proxy credentials threw a bare URIError instead of the
usual "not a valid proxy URL" error. The test servers label their echoes text/plain.

* fix(cli): strip line breaks from capture --video errors in the form CodeQL recognizes

* fix(cli): capture --video logs errors through a recognized newline sanitizer

---------

Co-authored-by: Jerrai <jerrai@heygen.com>
2026-10-27 02:52:52 +00:00
Xuanru Li 725f069cb9 feat(cli): skip the preview-server scan when HYPERFRAMES_NO_PREVIEW_DISCOVERY=1 (#6503)
render, check and snapshot open project history, which looks for a running
preview by probing 100 loopback ports and 5190. Behind an egress fence every
probe is refused and reported. Setting HYPERFRAMES_NO_PREVIEW_DISCOVERY=1 makes
historyDeps.findServer return null without a request, so history opens directly.

Refs #6204
2026-10-27 02:34:19 +00:00
Miguel Ángel 63d9435625 test(cli): install-lock concurrency test uses fake timers (#6504) 2026-10-27 01:48:48 +00:00
Miguel Ángel 4539f35170 feat(cli): write one diagnostic report when a command stays silent for 60 s (#6480)
* feat(cli): write one diagnostic report when a command stays silent for 60 s

* feat(cli): load the hang report only when it is asked for

* fix(cli): the hang report is written without announcing itself on stderr

* fix(cli): the hang report leaves out environment values or is not written, and is written once

* refactor(cli): shorten the hang report comment to the line limit
2026-10-27 01:23:43 +00:00
Miguel Ángel a0b0bf5f64 fix(cli): history show --diff works without git on PATH (#6475)
* fix(cli): history show --diff works without git on PATH

* fix(cli): unifiedDiff passes lint and fallow: blocks, shared direction rule, split test

* refactor(cli): split the diff walk and its backtrack into small steps
2026-10-27 01:23:02 +00:00
Miguel Ángel c21a70915f fix(cli): a preview inside a host app's run no longer takes the project's history (#6493) 2026-10-27 00:33:12 +00:00
Miguel Ángel 54d0af57eb feat(engine): render sets a keyframe interval and a peak bitrate cap (#6444)
* feat(engine): encoders cap peak bitrate and place keyframes on a set interval

* style(engine): shorten the rate-cap comment

* style(engine): drop the doc lines the comment ratchet flagged

* feat(producer): mp4 renders honour a keyframe interval and a peak bitrate cap on every encoder path

* style(producer): shorten the delivery encoder file headers

* style(producer): drop a comment line from the segment manifest

* style(producer): shorten the integration test header

* test: delivery encoder tests follow the ffprobe argv contract and run in the integration lane

* feat: the render request, server and Lambda plan carry the keyframe interval and peak bitrate cap

* fix(studio): the Studio render route passes the keyframe interval and bitrate cap to the encoder

* chore(studio-server): drop a comment the helper's name already says

* feat(cli): render and lambda render take --keyframe-interval, --max-bitrate and --buffer-size
2026-10-27 00:29:06 +00:00
Miguel Ángel be4e2e7806 feat(cli): hyperframes open hands the project to the app on Windows and Linux too (#6484) 2026-10-26 23:01:07 +00:00
Miguel Ángel 6b7d6dfb2e test(cli): the mid-render orphan test waits for three Chrome processes alive at once (#6489) 2026-10-26 22:53:12 +00:00
Ular Kimsanov bab9ed58ad chore(cli): tag the studio download link with where it was shown (#6471)
* chore(cli): tag the studio download link with where it was shown

The terminal hint, hyperframes open and the browser editor button now add
src=cli or src=browser-editor to the download link. The download route
already records src, so these downloads stop landing in no source.

* chore(cli): drop the DownloadSource doc comment the type name already says

* chore(cli): leave the no-build fallback link untagged, since only the download route reads src
2026-10-26 21:39:35 +00:00
Miguel Ángel 59d5e4fec8 fix(cli): check and snapshot fail fast on a missing browser path and say while Chrome downloads (#6479)
* fix(cli): check and snapshot fail fast on a missing browser path and say while Chrome downloads

* fix(cli): a non-interactive Chrome download gives up after one stall, naming the env var and doctor
2026-10-26 21:28:41 +00:00
Miguel Ángel 1df003dfb7 fix(cli): a file given as the project folder names the folder to pass (#6476) 2026-10-26 20:51:08 +00:00
Ular Kimsanov 08eeb49795 chore(cli): npm homepage points to hyperframes.heygen.com (#6407)
The hyperframes package had no homepage, so npm linked the GitHub
readme. The publish job rewrites only the name, so this field reaches
npm on the next release.
2026-10-26 19:03:21 +00:00
Miguel Ángel 020e6c99f3 fix(check): a mask that cuts descenders and a shared scene's own selector are handled (#6454)
* fix(check): a mask that cuts descenders and a shared scene's own selector are handled

* test(core): update the page-build goldens for the scoped selector rewrite

* fix(core): a shared scene's authored-id selector rewrites to the mount without a second pattern
2026-10-26 18:58:49 +00:00
Miguel Ángel 6dee9d144c fix(cli): init creates its files where hard links are refused, with no Developer Mode needed (#6463) 2026-10-26 18:50:41 +00:00
Miguel Ángel 306f21a1ba fix(cli): composition path errors name the resolved entry and project directory (#6458) 2026-10-26 18:21:04 +00:00
Miguel Ángel 8f618c5ffe fix(cli): the Windows Chrome check reads the file version, not chrome.exe --version (#6459)
* fix(cli): the Windows Chrome check launches Chrome instead of trusting chrome.exe --version

* refactor(cli): shorten the Windows Chrome version comment to fit the comment ratchet

* test(cli): pin the platform in the Unix Chrome preflight tests so Windows runs them as written

* fix(cli): the Windows Chrome check reads the file version, not chrome.exe --version
2026-10-26 15:39:09 -04: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 Á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 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 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
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
Muzzy5150 0cc14ddb8e fix(cli): validate play and present ports (#6402) 2026-10-26 16:15:54 +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
Muzzy5150 803655a67e fix(cli): isolate benchmark render files (#6403) 2026-10-26 15:32:27 +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
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
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 ff0a56340b chore: release v0.8.203 (#6412) 2026-10-26 07:20:07 -04: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
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
Vance Ingalls f8d51f3146 chore: release v0.8.202 (#6404) 2026-10-26 07:55:04 +00:00
Xuanru Li 257bf285ff feat(cli): skipContrastInMotion moves to HF_TOOL_CONTEXT check-review (#6400)
* 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.

* fix(cli): satisfy comment ratchet for check capability
2026-10-26 07:42:50 +00:00
Xuanru Li afdad4ea38 feat(cli): opt-in check flag that leaves out contrast measured mid-animation (#6396)
* feat(cli): opt-in check flag that leaves out contrast measured mid-animation

`hyperframes check --skip-contrast-in-motion`, or
HYPERFRAMES_CHECK_SKIP_CONTRAST_IN_MOTION=1, leaves out a contrast failure
measured while a GSAP tween on the text or an ancestor is running, or while
the text's cumulative opacity is below 1. Repeating tweens and tweens of 4 s
or longer (camera drifts) do not count as motion. Text no GSAP tween targets
is reported as before. With neither set, check is unchanged.

The motion state is read at the same contrast sample, with no extra seek or
screenshot.

* fix(cli): read contrast motion on current GSAP clocks

* fix(cli): keep infinite timeline motion ambient
2026-10-26 06:22:46 +00:00
Miguel Ángel a11280eef0 perf(cli): lambda deploy warms the video function so the first render does not wait for its image (#6376)
* perf(cli): lambda deploy warms the video function so the first render does not wait for its image

A freshly deployed container-image function loads its image on first use, which added about 12 s to the first render's plan on some deploys. Deploy now invokes the function's warm action once after the stack is up (default on, --no-warm skips it). A failed warm-up prints a warning and the deploy still succeeds.

* chore(cli): move the deploy warm-up to its own file, regenerate the skills manifest

Regenerates skills-manifest.json for the lambda reference change, keeps runDeploy under the complexity gate by pulling the warm step into a helper, and leaves sam.ts untouched.

* fix(cli): the deploy warm-up asks the aws CLI for JSON output whatever the profile sets

A profile configured for text or yaml output made the reply unparseable, which printed a spurious warm-up warning.

* refactor(cli): split the reserved-concurrency notice and warm-up gate out of runDeploy
2026-10-26 05:32:53 +00:00