Commit Graph
6447 Commits
Author SHA1 Message Date
Miguel Ángel 3d45d1b037 fix(engine): audio encodes on FFmpeg 4.4, which has no setts duration option (#6219)
* fix(engine): audio encodes on FFmpeg 4.4, which has no setts duration option

The segmented AAC encode ended its stream with setts=duration, added in FFmpeg 5.0, so every render
with audio failed on Ubuntu 22.04's FFmpeg 4.4. An FFmpeg without the option now encodes the audio in
one pass, which ends the stream at the duration itself.

* fix(engine): keep the setts capability check private to the AAC encoder
2026-10-24 16:10:44 +00:00
Sergey S 24965372db fix(cli): each start sweeps the running markers of CLIs that are gone (#5790)
A CLI killed by a signal never runs its exit listener, so its file in
~/.hyperframes/running stays. Only the background installer swept those
files, and it never runs for an install layout it skips ("Unknown install
layout", e.g. a CLI bundled inside another tool), so the folder only grew:
185 markers since 2026-10-05 on one machine, none of them a live CLI.

registerRunningCli now removes, besides its own file, every file whose pid
is gone, whose name is not a pid, or whose heartbeat is older than
RUNNING_STALE_MS (a reused pid) — the installer's own criterion. The sweep
never throws, so a failure cannot skip the heartbeat or the exit listener.

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

The test reads the running folder's listing instead of checking each path, so no
existence check precedes a write to the same path (CodeQL, file system race).
2026-10-24 15:15:25 +00:00
Miguel Ángel da4386f0d0 perf(aws-lambda): cloud renders plan without reading video bytes and start chunks sooner (#6194)
* perf(engine): a remote source's tail decodes run many at a time, not one per half-core

* perf(producer): the plan logs where its extract stage spends its time

* perf(engine): a window that ends inside its source takes its frame count without a decode

* test(engine): pin the tail-decode slot test to the windows that decode

* style(engine): format the tail-probe window check

* test(engine): deferred counts match extraction on a B-frame NTSC source; VFR is not deferred

* style(engine): format the tail-probe tests

* perf(aws-lambda): a site stores each video's ffprobe JSON, and the plan reads it instead of probing

* test(aws-lambda): a site stores and hands out each video's probe

* style(aws-lambda): format the probe-facts upload and tests

* perf(engine): a site's stored probe also holds the final-frame timestamp the plan would probe for

* test(engine): drop an unused import

* test(aws-lambda): the stored probe holds the ffprobe JSON and the final frame

* test(aws-lambda): the stored probe holds the ffprobe JSON and the final frame

* perf(producer): a distributed chunk encodes while it captures

* perf(producer): the audio task logs where its mix spends its time

One line per audio stage: prepare, groups, mix, master, encode and the peak check, in ms.

* perf(engine): locked warmup ticks stop sleeping once the page is ready

* perf(engine): a window reaching a stored video's end takes its frame count from stored facts

* fix(producer): the cloud audio task logs its phases

* perf(engine): stored facts keep the last packet length so late-start windows skip the tail decode

* fix(engine): a probe spawns without waiting when no stored facts are declared

* chore(aws-lambda): shorten comments over the line limit

* fix(engine): warmup keeps pacing after a failed tick; stored final frames check ffprobe major

* test(engine): the recorded ffprobe major matches the build's own banner

* test(engine): the version-banner probes go through a named binary like the other spawns
2026-10-24 14:30:16 +00:00
Miguel Ángel 80be6ff039 fix(cli): snapshot rejects a negative --at and builds its sheet from its own frames (#6179)
* fix(cli): snapshot rejects a negative --at and builds its sheet from its own frames

* fix(cli): snapshot --at refuses an empty value and trailing junk too

* test(cli): the contact sheet test's fake image reads orientation like the sheet now does
2026-10-24 13:23:36 +00:00
Miguel Ángel 3cbd98890e fix(cli): snapshot seeks into a HEVC cut whose index lands a keyframe early (#6217)
Seeking to a keyframe's own time landed on the one before it, so every candidate failed the
repeat-landing check and the frame was found by decoding from the start of the file. An
accurate seek to the keyframe's time decodes from that earlier keyframe and drops what precedes it.
2026-10-24 13:15:11 +00:00
Miguel Ángel 0eae4946d3 fix(studio-server): a history restore refuses to remove every tracked file (#6175)
* fix(studio-server): a history restore refuses to remove every tracked file

* test(studio-server): compare the held clip by bytes so the adopting check stays fast

* fix(studio-server): history's own hidden records do not count as files a restore keeps

* refactor(studio-server): name the restore guard's check instead of commenting it

* chore(studio-server): re-baseline the packed size budget for the restore guard
2026-10-24 12:51:30 +00:00
Miguel Ángel dd1cba49de test(cli): the lifecycle suite lets background imports settle before it resets modules (#6216) 2026-10-24 12:48:44 +00:00
NavpreetSSidhu 8811f0bfbf docs(skills): say which font faces are bundled and which are fetched (#6197) 2026-10-24 12:15:42 +00:00
Miguel Ángel 1a238171ec test: the lifecycle and thumbnail suites load cold modules in a hook, not in their first test (#6212)
* test(cli): the lifecycle suite warms the CLI module graph in a hook, not in its first test

* test(studio): the thumbnail suite warms puppeteer in a hook and cancels leftover requests
2026-10-24 11:26:33 +00:00
serdarucelandserdarucel 3dc0b97bfd fix(engine): disable Dawn's DXC on Windows so WebGPU requestDevice succeeds (#5830)
The chrome-headless-shell that HyperFrames downloads on Windows ships
without dxil.dll and dxcompiler.dll. Dawn's D3D12 backend loads them in
requestDevice, so the adapter is found but device creation fails and
three.js WebGPURenderer silently falls back to WebGL2.

Pass --disable-dawn-features=use_dxc next to --enable-unsafe-webgpu on
win32.

Refs #5775

Co-authored-by: serdarucel <196021214+serdarucel@users.noreply.github.com>
2026-10-24 11:16:01 +00:00
Miguel Ángel 291144e87d fix(studio): a scene swap no longer keeps the previous preview window in memory (#6207)
* fix(studio): a scene swap no longer keeps the previous preview window in memory

* fix(studio): drop the added comment, the handler's name carries it
2026-10-24 11:12:43 +00:00
Miguel Ángel 700187b855 fix(core): color grading builds a new WebGL context when a lost one is never restored (#6211)
* fix(core): color grading builds a new WebGL context when a lost one is never restored

A context the browser evicts and does not restore left every graded clip hidden for good.
After a grace period the runtime now creates a new shared context and moves each clip onto it.

* refactor(core): split the lost-context rebuild into smaller steps and test its retry
2026-10-24 10:34:16 +00:00
Miguel Ángel 1ab871fb11 fix(producer): a render's page-error count includes what the capture workers saw (#6196)
* fix(producer): a render's page-error count includes what the capture workers saw

* fix(producer): a failed parallel capture still carries its workers' page errors

* fix(producer): every capture failure carries the page's errors, in every stage

* chore(engine): drop a comment the capture classifier's name already says
2026-10-24 10:33:03 +00:00
Miguel Ángel 0a8a78edec fix(engine): renames ride out Windows file locks instead of failing the render (#6210)
* fix(engine): renames ride out Windows file locks instead of failing the render

* fix(producer): the true-peak and segment-manifest renames ride out Windows file locks too
2026-10-24 09:51:28 +00:00
Miguel Ángel c16b783f5e chore: release v0.8.192 (#6206) v0.8.192 2026-10-24 08:51:29 +00:00
Miguel Ángel 381b654335 fix(engine): a clip with data-duration and no data-end ends where its duration says (#6195)
parseAudioElements now resolves end the way core's compileTimingAttrs does. A clip
with no length at all warns, naming the clip, instead of silently playing to the end of
its source.
2026-10-24 08:35:15 +00:00
James RussoandClaude Opus 5.5 17dd4ee347 fix(cli): keep beats audio paths inside the project (#6188)
* fix(cli): keep beats audio paths inside the project

An encoded ../ in the music src decoded to a path outside the project, so
hyperframes beats read that file and wrote beats/<rel>.json outside the
project too. Fail the command when either path escapes.

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

* fix(cli): drop added comment in beats containment check

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

* fix(cli): resolve symlinks in beats path containment

The lexical check let a symlinked folder inside the project send the read
or the beat-file write outside it, and refused an in-project file named
..music.wav. Use the realpath-aware resolveWithinProject and isSafePath
from core for both paths.

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

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 08:23:32 +00:00
Miguel Ángel c324a40a87 fix(cli): lint accepts one composition file as well as a project directory (#6202) 2026-10-24 08:22:53 +00:00
Akshar Patel 316e723409 fix(cli): preserve caption arrays during transcript reimport (#6185) 2026-10-24 08:16:07 +00:00
Akshar Patel 73dda7191c fix(core): preserve images with commas in srcset URLs (#6192) 2026-10-24 08:16:02 +00:00
Rudy Mizrahi Celekli 4153460856 fix(sdk): unsubscribe persistence errors on disposal (#5328)
Signed-off-by: Rudy Celekli <rudy@gradiahq.com>
2026-10-24 08:15:57 +00:00
Rudy Mizrahi Celekli cb40dfb456 fix(lint): reject parser-invalid variable defaults (#5314) 2026-10-24 08:15:52 +00:00
Rudy Mizrahi Celekli 004409e570 fix(cli): preserve authored clip length when moving (#5315)
Signed-off-by: Rudy Celekli <rudy@gradiahq.com>
2026-10-24 08:15:49 +00:00
Monster-GM 6c5ad56e46 fix(producer): forward GPU preference to HDR streaming encoder (#5030) 2026-10-24 08:15:42 +00:00
Diego López e3881bc589 test(engine): synthesize the untagged AV1 fixture with whichever AV1 encoder ffmpeg has (#5379) 2026-10-24 08:15:40 +00:00
Miguel Ángel c523234e8d feat(studio): Tooltip can wrap a long label and cap it at a number of lines (#6199)
* feat(studio): Tooltip can wrap a long label and cap it at a number of lines

* fix(studio): a wrapped Tooltip label breaks a long URL or path too
2026-10-24 08:13:09 +00:00
Miguel Ángel f3d00799e4 fix(cli): remove-background keeps going on CPU when a provider fails on a frame (#6201)
* fix(cli): remove-background keeps going on CPU when a provider fails on a frame

* test(cli): state the frame-failure fallback as the rule it pins
2026-10-24 08:13:03 +00:00
Abdullah M. Nazif d63ff907aa fix(cli): read explicit TTS file input before synthesis (#5306) 2026-10-24 07:31:57 +00:00
Abdullah M. Nazif f937076b26 fix(cli): preserve unrelated package versions during upgrades (#5347) 2026-10-24 07:31:54 +00:00
Abdullah M. Nazif 0e4a0ffbab fix(cli): preserve CSS priority during full-page capture (#5316) 2026-10-24 07:31:52 +00:00
Abdullah M. Nazif 94a265e486 fix(core): sample hue curves across their periodic seam (#5287) 2026-10-24 07:31:49 +00:00
Miguel Ángel b47d745c05 fix(core): color grading rebuilds the graded clips when a lost WebGL context is restored (#6177)
* fix(core): color grading rebuilds the graded clips when a lost WebGL context is restored

A clip shown while the context was lost never got an entry.

* fix(core): drop the added comment line from the color grading restore fix
2026-10-24 07:21:33 +00:00
Rudy Mizrahi Celekli 81c2968545 fix(cli): keep error normalization string-valued for custom JSON (#5723) 2026-10-24 07:20:52 +00:00
Xinyu YANG 879d735ee0 fix(core): keep bundled HTML under V8's max string length (#6134) 2026-10-24 07:19:00 +00:00
Rudy Mizrahi Celekli d338baf873 fix(cli): preserve unicode when truncating feedback links (#5721) 2026-10-24 07:18:47 +00:00
Rudy Mizrahi Celekli 49a7700372 fix(cli): read and patch byte-marked project configs (#5725) 2026-10-24 07:18:44 +00:00
Akshar Patel 3596a7f22b fix(cli): report failed tag installations to scripts and agents (#6086)
* fix(cli): report failed tag installations to scripts and agents

* fix(cli): restore status markers in tag install summaries
2026-10-24 07:18:42 +00:00
Dante 8b1bf6b914 fix(player): include visible playback rate in accessible name (#6032) 2026-10-24 07:18:36 +00:00
Akshar Patel c9ab2796af fix(engine): repeat looped audio through its export slot (#6184) 2026-10-24 07:18:32 +00:00
Akshar Patel 629dd8fb76 fix(lint): ignore inactive mask declarations (#6186) 2026-10-24 07:18:27 +00:00
Miguel Ángel c618c71ad5 fix(cli): snapshot --output clears only the frames it wrote (#6176)
* fix(cli): snapshot --output clears only the frames it wrote

* fix(cli): drop the comment the snapshot name pattern does not need
2026-10-24 06:28:42 +00:00
Miguel Ángel 53e1dfce9e fix(engine): h265 renders no longer fail on hosts with more than 16 cores (#6193)
* fix(engine): h265 renders no longer fail on hosts with more than 16 cores

libx265 rejects more than 16 frame threads, so the thread count taken from the
CPU quota is now capped at 16 for x265. x264 is unchanged.

* fix(engine): pass the encoder to the thread cap in the CFR re-encode
2026-10-24 05:33:56 +00:00
Miguel Ángel ebb057fb62 fix(cli): a check that hits its deadline keeps the findings it already made (#6190) 2026-10-24 05:08:49 +00:00
Abdullah M. Nazif 0b8f5ec8f5 fix(cli): normalize muted targets before applying tolerance (#5291) 2026-10-24 05:01:46 +00:00
Miguel Ángel 3ef28e26c6 test(engine): the GPU probe tests do not start a Chrome from the host cache (#6187) 2026-10-24 04:33:57 +00:00
Miguel Ángel 09d7f1c646 fix(core): release decoded preview audio once no clip uses its source (#6178)
* fix(core): release decoded preview audio once no clip uses its source

The preview transport cached every decoded audio buffer by source until the player was destroyed. Each scheduling pass now drops cached buffers whose source no clip in the document still uses (scene edits, swapped sources), and keeps the rest so playback never re-decodes a clip still in the film.

* fix(core): drop the comment the comment-share ratchet rejects
2026-10-24 04:29:31 +00:00
Miguel Ángel acb47de7d2 perf(producer): the audio task finds sound with a probe and reads URL clips in parallel (#6174)
* perf(producer): the audio task probes each video for sound instead of extracting its frames

* test(producer): the audio task finds a video's sound from a probe, with no frames extracted

* perf(engine): the audio mix reads clips held at a URL many at a time

* style(engine): format the remote clip slot choice

* fix(producer): the audio task places a video's sound in the window extraction would give it

* style(producer): format the slot cases of the script-src audio test
2026-10-24 04:23:15 +00:00
Miguel Ángel 5ebbc8ef6d fix(studio-server): project history no longer copies video, audio or huge files (#6171)
* fix(studio-server): project history no longer copies video, audio or huge files

* fix(studio-server): clean drops old video and audio copies in every history

* fix(studio-server): TypeScript source is not media, so its history is kept

* fix(studio-server): split the media reclaim and point the slow-copy route test at a non-media file

* fix(studio-server): no unused expression when collecting a history's hashes
2026-10-24 04:12:48 +00:00
rumi7911 fa5dbd12c9 docs: clarify Claude Code plugin auto-update steps (#5120) 2026-10-24 04:11:48 +00:00
Abdullah M. Nazif 2a9b9f4e7c fix(cli): audit clipped text beneath transparent composition hosts (#5400) 2026-10-24 04:11:34 +00:00