Commit Graph
1293 Commits
Author SHA1 Message Date
Miguel Angel Simon Sierra 194f9a6078 fix(engine): a relative background url keeps only its path in the decode timeout report 2026-11-03 19:09:52 -05:00
Miguel Angel Simon Sierra 7540d84ae0 fix(engine): a background decode timeout is reported at every caller, url redacted 2026-11-03 18:48:19 -05:00
Miguel Ángel 014b4b87f2 fix(engine): capture tolerates a page that returns no list of late background images 2026-11-03 18:48:06 -05:00
Miguel Ángel 1f152376cd fix(engine): a background image that never finishes decoding no longer stalls the frame 2026-11-03 18:47:57 -05:00
WaterrrForever 12ce8c2ffd chore: release v0.9.9 (#7095) 2026-11-03 11:28:41 -05:00
Miguel Ángel 67d11c0a5c fix(engine): a script the page cancelled is not a failed load (#7093) 2026-11-03 15:00:39 +00:00
Miguel Ángel dec465949b feat(engine): a script-load failure names where the script came from and why it failed (#7088)
* feat(engine): a script-load failure names where the script came from and why it failed

* fix(engine): keep the script-load cause helpers private and within the engine size budget
2026-11-03 13:54:20 +00:00
Miguel Ángel 9ceced05e2 chore: release v0.9.8 (#7077) 2026-11-03 09:15:54 +00:00
James RussoandClaude Opus 5.5 8c799ebd1b chore: release v0.9.7 (#7064)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-03 05:21:25 +00:00
James RussoandClaude Opus 5.5 112ba53302 fix(studio): motion blur falls back for a WebGL canvas Studio reaches first (#7060)
* fix(core): motion blur notices a WebGL canvas the Studio page touched first

When a same-origin host page (Studio) reaches a preview element before the
scene does, for example through a MutationObserver record, Chrome gives that
element the host's prototype. The scene's getContext("webgl") then ran the
host's unpatched getContext, so the canvas never reached the accelerated
canvas set, capture motion blur stayed on, and the WebGL canvas froze during
preview playback.

The tracker now records a canvas in the set of the canvas's own window, and
installs itself in a same-origin parent too, compiled with the parent's own
Function. Cross-origin parents are skipped.

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

* fix(studio): track accelerated canvases in Studio's window, not the embedder's

The preview runtime no longer installs the canvas tracker in its parent
window. That ran on every preview boot, so any same-origin page embedding
the player got its getContext wrapped, and a host CSP without
unsafe-eval reported a violation on each load. Studio now installs the
tracker in its own window when its Player module loads, and core
exposes it at @hyperframes/core/page-motion-blur.

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

* chore: keep the comment share of the touched files from rising

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-11-03 03:59:23 +00:00
Miguel Ángel 81b93cf055 fix(cli): snapshot stops Chrome decoding videos it already replaces with extracted frames (#6949)
* fix(cli): snapshot stops Chrome decoding videos it already replaces with extracted frames

* fix(cli): a held video keeps its intrinsic size in snapshot, as in render

* fix(cli): shorten a comment line in the held-video hints
2026-11-03 01:14:27 +00:00
Jerrai 398ef50624 chore: release v0.9.6 (#7037) 2026-11-02 20:19:33 +00:00
Miguel Ángel 3bb0a9a5b5 perf(engine): skip the screenshot on frames the page reports unchanged in beginframe capture (#7027)
* perf(engine): skip the screenshot on frames the page reports unchanged in beginframe capture

* fix(engine): beginframe reuse never returns a frame older than a cross-frame page change

* fix(engine): the BeginFrame reuse test gets a headless shell in the flake gate

* fix(ci): run the headless shell installer through its package

* fix(ci): install the headless shell with bunx, npx finds no bin in the workspace
2026-11-02 19:17:31 +00:00
Miguel Ángel 0bcd816d5b feat(engine): a chunk-fed encoder and the rule for which films may use it, off by default (#7029)
* feat(engine): a chunk-fed encoder and the rule for which films may use it, off by default

* test(engine): end the chunk encoder's ffprobe call with --
2026-11-02 17:53:57 +00:00
Miguel Ángel c14d92a227 chore: release v0.9.5 (#7025) 2026-11-02 16:20:52 +00:00
Miguel Ángel 6fd96ddd04 revert: stop releasing a WebGL context when its clip's window has ended (#7020) 2026-11-02 15:48:12 +00:00
Miguel Ángel 070780c695 fix(producer): a render stops when a capture session sees every composition script fail (#7009)
* fix(producer): a render stops when a capture session sees every composition script fail

* fix(producer): only capture workers decide a script failure; prep sessions stop without recording it

* fix(producer): a script failure in a capture worker still reports as the composition-script error

* style(producer): format the script-failure test
2026-11-02 15:46:50 +00:00
Jerrai 346f0e49fa feat(producer): report browser-computed reference backgrounds (#7007)
* feat(producer): report browser-computed reference backgrounds

Preserve one initial root/page reference across local, streamed and distributed
render results without guessing from film pixels.

— Jerrai

* fix(producer): preserve plan compatibility and optional inspection

Keep reference metadata outside the v2 manifest hash and read it from the
verified execution-plan artifact. Static planning uses a non-gating page
inspection instead of requiring render-worker capabilities.

— Jerrai

* fix(producer): poll readiness independently of animation frames

Use timed polling while the render clock parks animation frames. Cover readiness
that changes after the first check with a short real-browser regression.

— Jerrai

* fix(producer): budget measured reference metadata runtime growth

Producer adds 2,228 compressed bytes over current main. Tests, fixtures and source
maps are already absent from its dist-only tarball. Allow 7,766 bytes of headroom
above the verified 837,234-byte payload while retaining the unpacked limit.

— Jerrai
2026-11-02 14:42:18 +00:00
Miguel Ángel 34a8d48160 chore: release v0.9.4 (#7018) 2026-11-02 14:33:44 +00:00
Miguel Ángel f6536e9f5d chore: release v0.9.3 (#7010) 2026-11-02 12:04:35 +00:00
Miguel Ángel 5e50ac1c47 chore: release v0.9.2 (#6994)
* chore: release v0.9.2

* chore: release v0.9.2
2026-11-02 08:42:46 +00:00
Miguel Ángel 26d6e3eef1 fix(engine): a scene that has ended gives up its WebGL context so the next scene is not slowed (#6984)
* 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
2026-11-02 07:50:16 +00:00
James RussoandClaude Opus 5.5 870569a431 chore: release v0.9.1 (#6987)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-02 07:14:25 +00:00
James RussoandClaude Opus 5.5 f1391156e0 chore: release v0.9.0 (#6980)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-02 05:14:22 +00:00
Miguel Ángel f0b2dd0cdb chore: release v0.8.231 (#6971) 2026-11-02 03:34:08 +00:00
Miguel Ángel fb2c28e8aa chore: release v0.8.230 (#6962) 2026-11-01 23:52:11 +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
Vance Ingalls 5540f49121 chore: release v0.8.229 (#6951) 2026-11-01 12:42:11 -08: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 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 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 f08f07ab64 chore: release v0.8.226 (#6917) 2026-11-01 06:04:20 +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 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 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 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 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 2239771efd chore: release v0.8.224 (#6885) 2026-10-31 15:13:39 -04:00
Miguel Ángel 60f711686c fix(producer): auto renders with color-graded media stay SDR instead of promoting to HDR (#6671)
* fix(producer): auto renders with color-graded media stay SDR instead of promoting to HDR

* fix(producer): keep auto renders SDR when a graded canvas is present
2026-10-31 16:16:06 +00:00
Miguel Ángel 2439b62acd chore: release v0.8.223 (#6869) 2026-10-30 19:11:14 -07:00
Miguel Ángel e28dbe4ce4 chore: release v0.8.222 (#6846) 2026-10-30 18:04:36 +00:00
Jerrai 1116077dab fix(cli): capture treats only 192.0.0.0/24 and 192.0.2.0/24 as reserved, via one shared list (#6853)
* fix(cli): capture's public-address check uses the engine's list; 192.0/16 is not all reserved

Only 192.0.0.0/24 and 192.0.2.0/24 are special-use. The capture proxy blocked all of
192.0.0.0/16, so sites on WordPress VIP (192.0.64.0/18, e.g. nasa.gov at 192.0.66.108)
failed every capture with net::ERR_TUNNEL_CONNECTION_FAILED. isPublicIPv4 now reads the
engine's isBlockedNetworkHost, so capture and asset downloads share one list.

— Jerrai (cutroom-debug)

* refactor(engine): one special-use network list, in a light subpath capture imports

Importing all of @hyperframes/engine into capture's publicNetwork slowed the lookup child's
start-up past publicNetwork.process.test's 6 s mid-lookup exit. The list and
isBlockedNetworkHost move to engine/src/utils/networkPolicy.ts, exported as
@hyperframes/engine/network-policy; urlDownloader and the engine index read it there.

— Jerrai (cutroom-debug)

* test(engine): pin 192.0.0.0/24 and 192.0.2.0/24 blocked, the rest of 192.0/16 public

— Jerrai (cutroom-debug)

* fix(cli): alias the engine's network-policy subpath in the CLI bundle

esbuild's root alias rewrote @hyperframes/engine/network-policy to src/index.ts/network-policy;
the exact-subpath list now carries it. The publicNetwork docstring is cut to keep the file's
comment share under its base.

— Jerrai (cutroom-debug)
2026-10-30 16:21:34 +00:00
Miguel Ángel 4da50e2218 feat(telemetry): render_complete splits capture time into seek, page, screenshot and encoder wait (#6839) 2026-10-30 14:55:06 +00:00