Commit Graph
5273 Commits
Author SHA1 Message Date
x 8bf6fd3684 fix(cli): check's render-ready warning advises a --timeout above the new default 2026-11-01 17:03:40 -05:00
x e276b27061 fix(cli): check waits for the composition as long as snapshot and render do 2026-11-01 17:01:02 -05:00
x 4d98ee0b0c test(cli): check waits as long as snapshot for the composition by default 2026-11-01 17:01:01 -05: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) 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
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
2026-11-01 18:14:51 +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
Miguel Ángel 7aa3a447e2 chore: release v0.8.227 (#6936) 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) 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
Miguel Ángel a7075fcb6c feat(studio): a host that draws its own loader can turn off both of Studio's preview loaders (#6911)
* feat(studio): a host that draws its own loader can turn off both of Studio's preview loaders

Player and NLEPreview take loadingUi: 'none', which hides the composition cover
and the 'Preparing preview assets' wait while still reporting that the preview is
loading. suppressLoadingOverlay keeps its narrower meaning: skip only the
composition cover on a later load.

* refactor(studio): name who draws the loader in the value, loadingUi 'studio' | 'host'

The value says the host draws its own loader, so no doc line has to tell it apart
from suppressLoadingOverlay, and the files' comment share does not rise.

* refactor(studio): the loader choice sits outside Player, the stage size beside NLEPreview

Player's draw decision moves to a small helper so the component's complexity does
not rise, and resolvePreviewStageSize moves to its own file so NLEPreview stays
under the 600-line cap with the new prop.

* refactor(studio): Player reads the host's loader choice without another destructured prop

Destructuring one more prop raised Player's cognitive complexity above main's; the
rest of the props carries loadingUi instead.

* refactor(studio): NLEPreview's stage constants live in one small module

* style(studio): format NLEPreview's stage import
2026-11-01 04:32:07 +00:00
Miguel Ángel e181d34edc feat(core): WebKit plays bare audio from a decoded buffer on the audio clock (#6912)
* feat(core): WebKit plays bare audio from a decoded buffer on the audio clock

* fix(core): a handed-over WebKit track goes back to its element when the speed changes
2026-11-01 03:53:30 +00:00
Miguel Ángel 2c1a10f3ad fix(core): Safari keeps playing edits' audio without seeks or rate changes (#6888)
* test(player): play the WebKit audio edits in real Safari on a macOS runner

* fix(core): Safari keeps playing edits' audio without seeks or rate changes

* fix(core): keep the 0.1 s audio sync bound outside WebKit

* fix(core): restore main's audio steering outside WebKit

* fix(core): tell WebKit from the test DOM's user agent

* fix(core): name WebKit's audio start lag instead of commenting it

* fix(core): count embedded WKWebViews as WebKit for audio sync
2026-11-01 03:08:27 +00:00
Miguel Ángel 52a42983db fix(cli): snapshot gives a seek that will not settle its own --timeout, not three minutes (#6910)
* fix(cli): snapshot gives a seek that will not settle its own --timeout, not three minutes

* fix(cli): a seek budget never outlives the protocol timeout; say so in --timeout help
2026-11-01 02:46:55 +00:00
Miguel Ángel 94849bf1e0 refactor(engine): one builder for the video frame filter chain (#6908)
* refactor(engine): one builder for the video frame filter chain

* refactor(engine): keep the filter chain builder module-private until it has a caller
2026-11-01 00:54:54 +00:00
Miguel Ángel f486ad6d49 fix(engine): ffprobe read intervals never carry an exponent (#6909) 2026-11-01 00:53:35 +00:00
Miguel Ángel ef0007b003 test(engine): run the non-PNG probe test on a fake clock (#6907) 2026-11-01 00:16:48 +00:00
Miguel Ángel 32de0196d5 fix(producer): a failed video extraction names which clip files failed (#6905)
* fix(producer): a failed video extraction names which clip files failed

* fix(producer): the extraction source label hides scheme payloads and drive paths

* style(producer): format the extraction source label
2026-11-01 00:09:14 +00:00
Miguel Ángel bba3676a37 feat(core): the playback health reading says which clock the film followed (#6906)
* feat(core): the playback health reading says which clock the film followed

* style(core): format the clock's new reading

* refactor(core): let the clock's names say what the comments said
2026-10-31 23:29:33 +00:00
Miguel Ángel 5ce6b30bdb fix(cli): billing and Desktop handoff read their hosts from settings (#6897)
* fix(cli): billing and Desktop handoff read their hosts from settings

* fix(cli): OAuth client and API hosts read from settings

* test(cli): host and client settings tests run the same on any machine

* chore(cli): format and refresh the skills manifest

* chore(cli): trim a comment

* chore(cli): keep the stylesheet as it was
2026-10-31 22:49:12 +00:00
Miguel Ángel f3cdf2b473 fix(engine): scale static-frame verification budget with the job (#6901)
* fix(engine): scale static-frame verification budget with the job

* fix(engine): keep comment share flat

* fix(engine): drop added comment

* fix(engine): time seek in verify budget, state the policy
2026-10-31 22:48:26 +00:00
Miguel Ángel 8a0b8a9c22 fix(cli): measure ink, one output-folder flag spelling, logo wordmark variant (#6891)
* feat(cli): measure ink reads text size, --out and --output both work, logo --variant wordmark

measure ink reports the bounds, size and lines of text in a region of one frame, so a rebuild can be sized without a script. measure and snapshot take --out and --output for the same folder. media-use resolve --type logo --variant wordmark returns the brand's wordmark when theSVG has one.

* fix(cli): measure ink stays under the complexity and comment limits, one projectOf

* fix(cli): snapshot and measure also accept --output-dir

* fix(cli): projectOf moves without adding comment lines

* fix(cli): measure output alias list type-checks as an argument

* fix(cli): a logo variant never answers a default logo request; test output flags

* style(cli): format the new tests
2026-10-31 22:26:35 +00:00
Miguel Ángel bb3c3b2118 fix(producer): render telemetry reports beyond-viewport capture as the workers used it (#6702)
* fix(producer): render telemetry reports beyond-viewport capture as the workers used it

* fix(producer): apply the sessions' beyond-viewport value at the summary, on every capture path

* chore(engine): drop a comment so the types file's comment share does not rise
2026-10-31 21:42:26 +00:00
Miguel Ángel 5259097261 fix(cli): one cut detector that tells real cuts from flashes and fast moves (#6894)
* fix(cli): one cut detector that tells real cuts from flashes and fast moves

* fix(cli): a flash must come back within a few frames; trim comments, format

* test(cli): the cut fixture gets a 60 s timeout; format

* test(cli): drop a history comment
2026-10-31 21:40:38 +00:00
Miguel Ángel ee50cd2fc0 fix(cli): cloud render uses the composition's data-fps and skips unused heavy files (#6895)
* fix(cli): cloud render uses the composition's data-fps and skips unused heavy files

* fix(cli): satisfy typecheck and comment ratchet for cloud render fps
2026-10-31 21:04:00 +00:00
Miguel Ángel 88f9ae8468 fix(core): a page saved as UTF-16 bundles as its text, not NUL bytes (#6580)
* fix(core): a page saved as UTF-16 bundles as its text, not NUL bytes

* fix(core): render, lint and the asset reader decode UTF-16 pages too
2026-10-31 21:02:41 +00:00
Miguel Ángel b687d06235 chore: release v0.8.225 (#6898) 2026-10-31 20:58:04 +00:00
Miguel Ángel 47fe68562f fix(engine): nested video clips on a frame boundary export every source frame (#6893)
* fix(engine): nested video clips on a frame boundary export every source frame

* fix(engine): drop comment from ffmpeg time formatter
2026-10-31 20:08:23 +00:00
Miguel Ángel 4d44c0d0ab fix(cli): billing top-up opens the pricing page (#6887)
* fix(cli): billing top-up opens the pricing page

* test(cli): pin the top-up link's query fields on every environment
2026-10-31 19:59:49 +00:00
Miguel Ángel 919e138fc2 fix(cli): fill --mask boxes from the picture behind and crop generated clips to the requested aspect (#6892)
* fix(cli): fill --mask boxes from the picture behind and crop generated clips to the requested aspect

* fix(cli): shorten the mask fill comment
2026-10-31 19:48:28 +00:00
Miguel Ángel 2239771efd chore: release v0.8.224 (#6885) 2026-10-31 15:13:39 -04:00
Miguel Ángel ea7d43c616 fix(cli): stopping remove-background on a Mac no longer aborts the process (#6848)
* fix(cli): stopping remove-background on a Mac no longer aborts the process

* fix(cli): a quit after background removal released its session exits at once

* Revert "fix(cli): a quit after background removal released its session exits at once"

This reverts commit 3b9d6ffc24.
2026-10-31 17:08:22 +00:00