6624 Commits
Author SHA1 Message Date
James RussoandClaude Opus 5.5 f1391156e0 chore: release v0.9.0 (#6980)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
v0.9.0
2026-11-02 05:14:22 +00:00
WaterrrForever b1316e61d1 fix(cli): diff stops counting a fast move as an extra cut (#6978)
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
2026-11-02 04:50:16 +00:00
Miguel Ángel 6bbda219bb fix(core): a smaller preview copy nobody wants any more no longer swaps in (#6973)
* fix(core): a smaller preview copy nobody wants any more no longer swaps in

* refactor(core): name the dropped copy instead of commenting it
2026-11-02 04:41:07 +00:00
Miguel Ángel 8519f28363 fix(core): a preview video short of data holds the film instead of looping snippets (#6974)
* 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
2026-11-02 04:14:40 +00:00
James Russo 7f48a6894c feat!: remove Plan v1 distributed transport (#6970)
* feat!: remove Plan v1 distributed transport

BREAKING CHANGE: Cloud adapters accept only Plan v2; producer v1 exports are removed.

* ci: authorize Plan v1 cleanup deletions

* docs: avoid citing generated smoke result file

* fix(gcp): reject unsupported plan protocols in workflow

* ci: preserve gcp package size reduction

* fix: reject stale Plan v1 SDK options

* chore: remove retired Plan parity scripts
2026-11-02 04:13:57 +00:00
WaterrrForever 99223d993c fix(cli): diff warns when yours runs at another frame rate (#6976)
A root without data-fps on a 24 fps film rendered at 30 fps, and nothing said so.

fails without the fix: warns about a render at another frame rate
2026-11-02 04:09:30 +00:00
Miguel Ángel f0b2dd0cdb chore: release v0.8.231 (#6971) v0.8.231 2026-11-02 03:34:08 +00:00
Miguel Ángel 9fa02badfc feat(studio): every editor and player shortcut is remappable (#6966)
* 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
2026-11-02 02:38:23 +00:00
Miguel Ángel c06427b063 test(cli): run the real npx shim check only in its own CI job (#6969)
* test(cli): the npx command test builds the command instead of running a real npx

* test(cli): run the real npx shim check only in its own CI job
2026-11-02 02:18:03 +00:00
Miguel Ángel f8309b356e fix(cli): media-treatment reads a relative --grading file from the project folder (#6964) 2026-11-02 01:47:06 +00:00
Miguel Ángel 7c5c1ce849 fix(cli): the browser install hint names only a Chrome that exists (#6954) 2026-11-01 23:54:29 +00:00
Miguel Ángel 6b008cbc2c fix(lint): a scene may use Three.js or Lottie loaded by the parent document (#6961) 2026-11-01 23:53:40 +00:00
Miguel Ángel fb2c28e8aa chore: release v0.8.230 (#6962) v0.8.230 2026-11-01 23:52:11 +00:00
Miguel Ángel 53c93ba68e fix(cli): snapshot shoots a frame again when Chrome drops the screenshot mid-paint (#6941)
* 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
2026-11-01 23:19:16 +00:00
Miguel Ángel 2bce65ee1b fix(cli): add the audio and transcribe topics to hyperframes docs (#6960) 2026-11-01 23:16:56 +00:00
Miguel Ángel 13b42bec3c fix(shader-transitions): keep the loading panel out of snapshot and check captures (#6959) 2026-11-01 22:46:34 +00:00
Miguel Ángel de6ec3811e fix: cache paths follow HYPERFRAMES_CACHE_DIR (#6716)
* 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
2026-11-01 22:44:11 +00:00
Miguel Ángel 57d23598a7 feat(studio): hosts can remap Studio's single-key shortcuts (#6957)
* feat(studio): hosts can remap Studio's single-key shortcuts

* fix(studio): razor exit key and jump-to-in stay live when remapped
2026-11-01 22:40:12 +00:00
Miguel Ángel 8b029f4fb0 fix(parsers): resolve file URLs and Git Bash paths in media sources (#6956)
* fix(parsers): resolve file URLs and Git Bash paths in media sources

* fix(parsers): return a native path for a Git Bash media source
2026-11-01 22:22:54 +00:00
Miguel Ángel 465128d002 fix(cli): media-treatment says which media the file has when the selector matches none (#6958) 2026-11-01 22:22:18 +00:00
Miguel Ángel 5c5794287b fix(cli): say a font or image URL is a download, not a page, when capture is given one (#6952)
* 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
2026-11-01 21:52:04 +00:00
Miguel Ángel 7d8cdfbb8b fix(studio): a preview reload that timed out is tried once more, so an edit is not left unseen (#6953)
* 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
2026-11-01 21:50:31 +00:00
Miguel Ángel 9284e69fff fix(core): accept 65-point .cube LUTs, the size grading apps export (#6921)
* 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
2026-11-01 20:46:08 +00:00
Vance Ingalls 5540f49121 chore: release v0.8.229 (#6951) v0.8.229 2026-11-01 12:42:11 -08:00
Vance IngallsandClaude Opus 5.5 34ddced2d0 fix(cli): keep browser sign-in open through checkout (#6879)
* 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>
2026-11-01 12:29:35 -08:00
Miguel Ángel 0ab4931159 fix(studio): a clip's thumbnail strip stays put while you trim it (#6942)
* 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
2026-11-01 20:16:52 +00:00
WaterrrForever 6b0abb4eb5 fix(cli): a stale mask takes its frame's colours instead of delogo's streaks (#6950)
* 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.
2026-11-01 19:41:17 +00:00
WaterrrForever 7f8ae5b4b6 fix(cli): a masked box follows the frame while the camera moves (#6948)
* 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.
2026-11-01 18:52:06 +00:00
WaterrrForever 0f76a7d01e docs(skills): animated films in reverse-any-video decide code or generation per shot (#6946)
* 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.
2026-11-01 18:28:10 +00:00
Miguel Ángel 3179348d9a chore: release v0.8.228 (#6943)
* chore: release v0.8.228

* docs(release): the v0.8.228 notes say what limiting a mix far over the ceiling costs
v0.8.228
2026-11-01 18:14:51 +00:00
WaterrrForever 12b52e28be docs(skills): reverse-any-video keeps what the original does when check flags it (#6944)
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.
2026-11-01 18:06:50 +00:00
Miguel Ángel d1d631f60a fix(producer): an export over the ceiling limits its peaks and keeps the mix's level (#6940) 2026-11-01 17:18:48 +00:00
Miguel Ángel 89a5953161 fix(core): music keeps playing while a preview video swaps to a new copy (#6937)
* fix(core): music keeps playing while a preview video swaps to a new copy

* refactor(core): drop a comment the constant's name already says
2026-11-01 16:55:53 +00:00
Miguel Ángel f9e8cab67d fix(cli): a render says when it lowered the whole mix, and how to keep the level (#6938) 2026-11-01 16:35:35 +00:00
WaterrrForever aa77770ebe docs(skills): reverse-any-video gets a recipe for animated and painted films (#6933)
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.
2026-11-01 16:24:48 +00:00
Miguel Ángel 7aa3a447e2 chore: release v0.8.227 (#6936) v0.8.227 2026-11-01 16:16:13 +00:00
Miguel Ángel 90f7fe624f fix(engine): GPU renders use the NVENC preset names the host's ffmpeg lists (#6930)
* 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
2026-11-01 15:46:57 +00:00
Miguel Ángel ef250cc9d0 feat(cli): the api exports offloadHeavyMedia and every offloaded file reports its asset_id (#6932)
* 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
2026-11-01 15:46:18 +00:00
Miguel Ángel a23cc59ee1 fix(studio): opening the thumbnail browser no longer stalls the server to read its version (#6931) 2026-11-01 15:43:24 +00:00
WaterrrForever 69400df276 fix(cli): the cut detector keeps real cuts in live footage (#6923)
* fix(cli): the cut detector keeps real cuts in live footage

#6894 left held frames out of every baseline and called any run over 3 frames a fast
move. On live footage that raised the baseline past real jump cuts and dropped blur
transitions between shots. Only animation that moves and holds in turn gets the moving
baseline now, and a run stays a cut when its tones change.

* fix(cli): a wipe through black is a cut, and a cut near a guide's edge is refused

A whip keeps its tones through every frame of the run, so that is the test, not only
the two ends: johnny's wipes between two views of one map match at the ends alone.
foldShort folds pieces of a few frames now. At 0.5 s it let a real cut through to a
paid shot, and the classifier already handles the flashes it was there for. --allow-cuts
is in the skills.

* refactor(cli): name the whip check instead of commenting it
2026-11-01 15:30:29 +00:00
Miguel Ángel 6b3e7a7a95 fix(cli): check and snapshot free video clips the playhead left, halving memory on cut films (#6929)
* fix(cli): check and snapshot free video clips the playhead left, halving memory on cut films

* fix(core): drop the releaseMedia doc comment that raised the file's comment share
2026-11-01 14:50:41 +00:00
WaterrrForever 439d01784c fix(cli): a shot from --first-frame comes back in that frame's shape (#6924)
* fix(cli): a shot from --first-frame comes back in that frame's shape

HeyGen can answer 1344x768 for a 16:9 first frame. The crop only ran with --aspect or
with no first frame, so these shots kept its size. Without --aspect the first frame now
sets the shape.

* refactor(cli): drop a comment the function name already says

* fix(cli): the first frame's shape is the one sent, not the one stored

A phone JPEG with Orientation=6 uploads as portrait but stores landscape pixels, so a correct
portrait answer was cropped to 90x50. The shape now comes from the same conversion the upload uses.

fails without the fix: keeps a portrait shot from a phone photo stored sideways
2026-11-01 14:44:27 +00:00
Miguel Ángel af0d68d612 fix(core): a resized preview video keeps its picture while its new copy loads (#6922)
* fix(core): a resized preview video keeps its picture while its new copy loads

Swapping a video to a copy made for its new size emptied it until the copy
decoded, so the preview showed black for a moment. The swap now shows a still
of the frame it had, as the video's poster, until the new copy can draw.

* fix(core): a held preview still is let go when no file loads back

* chore(core): raise the packed size budget for the held preview still
2026-11-01 12:00:26 +00:00
Miguel Ángel 9aaa3ae675 fix(engine): a video with no source no longer holds capture for 45 seconds (#6926) 2026-11-01 11:16:43 +00:00
Miguel Ángel 58428b44bc fix(engine): passthrough keeps frame count and accepts films whose audio outlasts the picture (#6920)
* fix(engine): passthrough output follows the page frames and holds a short video's last frame

* test(engine): a film whose audio outlasts its video still qualifies for passthrough

* test(engine): passthrough encodes one output frame per page frame when the video is shorter

* test(engine): end the ffprobe options before the file in the passthrough frame count test
2026-11-01 10:42:32 +00:00
Miguel Ángel e5887959bb fix(studio-server): a copy another process holds without progress ends in a named error (#6918)
* fix(studio-server): a copy another process holds without progress ends in a named error

* fix(studio-server): a long source's in-progress piece counts as the owner's progress
2026-11-01 09:47:43 +00:00
Miguel Ángel 8c22ddba0f fix(cli): snapshot warns when self-closed audio or video clips have swallowed the page (#6915) 2026-11-01 06:16:39 +00:00
Miguel Ángel f08f07ab64 chore: release v0.8.226 (#6917) v0.8.226 2026-11-01 06:04:20 +00:00
Miguel Ángel bbd487c6f8 fix(cli): snapshot ends the process once its stills are saved, like render (#6916)
* fix(cli): snapshot ends the process once its stills are saved, like render

* fix(cli): diff ends the process once its result is out, like snapshot
2026-11-01 05:36:49 +00:00
Miguel Ángel 98520366a6 feat(producer): opt-in video layer passthrough for a lone full-canvas video (#6914)
* feat(engine): composite a source video inside the streaming encoder

* feat(engine): opt-in flag and rule for compositing a lone full-timeline video

* feat(producer): opt-in video layer passthrough for a lone full-canvas video

* feat(producer): launch the probe, drop its page and capture PNG when passthrough is on

* refactor(engine): trim the passthrough doc comments to one line

* fix(producer): refuse passthrough when a wrapper or sub-composition paints a background

* chore(producer): mark the in-page layout check as one deliberate unit

* fix(engine): a video left out of capture no longer blocks static-frame dedup

* refactor(engine): shorten two long comments in the static-frame eligibility scan
2026-11-01 05:17:00 +00:00