* fix(engine): a scene that has ended gives up its WebGL context so the next scene is not slowed
* build(engine): raise the engine package size budget for the WebGL release module
* chore(engine): shorten the WebGL release comment
* fix(engine): a scene gives up its WebGL context only when the runtime says its window ended
* chore(engine): drop a comment the type already says
* chore(engine): shorten a comment line
* feat(studio): hosts can ask which Studio action holds a key combination
* fix(studio): the clash check skips a key map entry that is not a combo
* refactor(studio): studioKeyClash in fewer lines
* feat(core): make a heavy clip's lighter copy ahead of time when the host asks
* feat(core): keep the comment share of the proxy transcoder where it was
* feat(core): split the copy-ahead choice so each part stays simple
* feat(core): the preview route passes the copy's urgency as the proxy options expect
Add #6973 and #6978, which merged ahead of the release PR and shipped in
v0.9.0 without an entry. Correct the PLAN_TOO_LARGE upgrade note: the
plan-size cap only applied to Plan v1, and Plan v2 never raises it.
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Step Functions raises States.Runtime for a StringEquals on a missing path
instead of treating it as a non-match, so a state machine input without
PlanProtocol failed at SelectPlanProtocol and never reached the Default
branch. Check presence first in both the SAM template and the CDK stack.
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A regenerated shot never lines up with a whip frame by frame, so diff listed every fast move.
A jump now counts only above the original's own motion around it.
fails without the fix: reads a change no stronger than the original's motion as the same fast move
* fix(core): a preview video short of data holds the film instead of looping snippets
* fix(core): keep the comment share of the runtime files where it was
* feat(studio): shortcut combos in the key resolver
* feat(studio): every editor shortcut is a remappable combo
* refactor(studio): playback keys dispatch through one table
* fix(studio): combo parsing without backtracking, symbol keys match, fewer comments
* style(studio): format the shortcut files
* chore(studio): drop a doc comment the ratchet counts
* chore(studio): drop a doc comment the ratchet counts
* fix(studio): modifier combos fire for playback keys, caption guard and held stop key follow the map
* fix(cli): snapshot shoots a frame again when Chrome drops the screenshot mid-paint
* fix(cli): keep the first screenshot error when the retry fails differently
* fix: cache paths follow HYPERFRAMES_CACHE_DIR
Every place HyperFrames keeps downloaded or built files now takes its
folder from one helper, hyperframesCacheDir() in @hyperframes/core. The
default stays ~/.cache/hyperframes; HYPERFRAMES_CACHE_DIR moves it.
* fix: register the cache-dir subpath for bun and node, and build inspector from core source
* test: the cache-dir override test uses a folder that is absolute on every platform
* fix: the opencv cache follows HYPERFRAMES_CACHE_DIR
* fix(cli): npm installs run in their staging dir, so no cache path reaches a command line
* fix(cli): whisper.cpp is cloned inside its build dir, so no cache path is a git argument
* test(cli): the whisper clone test finds no system whisper on Windows either
* fix(cli): say a font or image URL is a download, not a page, when capture is given one
* fix(cli): word the capture download hint as a likely cause, not a fact
* fix(studio): a preview reload that timed out is tried once more, so an edit is not left unseen
* fix(studio): trim the retry hook's comments to the package's share
* fix(core): accept 65-point .cube LUTs, the size grading apps export
* fix(core): shrink LUTs wider than the GPU texture limit instead of rendering black
* fix(cli): keep browser sign-in open through checkout
The loopback listener timed out after 5 minutes, but plan checkout runs
inside the OAuth flow. A slower purchase ended on ERR_CONNECTION_REFUSED.
Raise the default to 60 minutes, matching pacific's plan-checkout handoff.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(cli): show the sign-in limit and how to recover
The waiting line now states the 60-minute limit and Ctrl+C. After a
timed-out browser login the CLI says to run auth login again.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(cli): drop unverified purchase claim, harden timer test, document limit
Review fixes: the timeout hint no longer says purchases stay on the account
(the CLI cannot observe billing); the no-timer-left test now asserts before
any explicit close() and uses node:http so undici timers cannot pollute the
count; docs mention the 60-minute window and Ctrl+C.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(cli): close the sign-in listener on every path and record Ctrl+C
Ctrl+C is now the advertised exit, but events only flush on exit, which a
default SIGINT skips, so an abandoned login vanished from telemetry. Record
it as aborted and exit 130 through requestCliExit. Close the listener on any
throw, so a failure before the wait can't hold the process for the full
window. Derive the waiting line and timeout message from the listener's own
limit, and name the constant for why it is long, which clears the comment
ratchet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(studio): a clip's thumbnail strip stays put while you trim it
* fix(studio): cover the trim-to-hold link and drop the comment
* refactor(studio): the held trim range lives in its own small hook
* refactor(studio): the thumbnail's held request inputs move into one hook
* chore(studio): drop the hook docstring
* fix(cli): a stale mask takes its frame's colours instead of delogo's streaks
Delogo drew the box's edges across large boxes, and HeyGen painted the streaks into the shot.
Shrink the box to 3x3 and blur it back, so no letter or streak survives.
fails without the fix: leaves no streaks in a box filled while the picture changes
* fix(cli): the stale mask fill drops gblur, which blacked out light boxes
On a 3x3 picture gblur turned light fills black on an FFmpeg 8 build.
Bicubic from 3x3 is already smooth.
* fix(cli): a masked box follows the frame while the camera moves
A temporal median under a moving camera froze older frames in the box, and HeyGen painted them in.
Fill from the box's own edges on each frame when the picture round it changes.
fails without the fix: fills a masked box from the current frame while the picture changes
* fix(cli): the mask scan stops where the guide does, and small boxes still blur
A long guide overflowed the decode buffer.
A narrow box asked for more blur than its chroma plane holds.
* docs(skills): animated films in reverse-any-video decide code or generation per shot
A code-first run scored close to the generated one, except on fine flowing detail.
Build what code can carry, and generate acting, morphs and streamlines.
* docs(skills): clean plates are separate layers, and framing compares a stable shape
Review notes on the animated-film recipe.
A persistent contrast error told the agent to change the original's colours to pass check.
Keep the original's colours and tiny text, and trim two framing lines to stay in budget.
The skill assumed live footage, so an agent on a painted film worked out the path alone.
Says what to tell the person, what stays code, and how to regenerate a shot from its plate.
* fix(engine): GPU renders use the NVENC preset names the host's ffmpeg lists
* fix(engine): one ffmpeg stdout reader for encoder detection and preset listing
* ci(engine): raise the engine unpacked size budget for the NVENC preset reader
* feat(cli): the api exports offloadHeavyMedia and every offloaded file reports its asset_id
* fix(cli): drop the asset_id doc comment that raised the file's comment share