Keep the exiting owner alive until signaled descendants stop, accepting zombies awaiting reaping. Bound the synchronous wait and preserve cleanup diagnostics.
Validated with the existing 15 process lifecycle checks and the provider regression suite on macOS.
Snapshot completed surfaces before ordered encoding, reserve queue capacity for the next required frame, and reuse one decoder scene for video exports while keeping pure motion graphics parallel.
Dispose source decoders explicitly and align decoder selection with browser capability checks. Verify macOS frame synchronization, source sampling, alpha, cancellation, limits, and packed exports.
Reuse browser video decoders and bounded sample caches for forward, reverse, held, and looping sources. Composite VideoSamples through Canvas layers before shared-texture encoding. Preserve source color metadata for planar alpha samples.
Validated the 600-frame video project with independent timeline and source-frame barcodes, transparent media composition, tiny-cache reverse sampling, existing provider checks, and an unpacked package render.
Enable opt-in Electron capture through electronPath, reuse deterministic frame preparation and source sampling, and encode ordered shared textures with WebCodecs before FFmpeg muxing. Close request-owned HTTP connections and file streams after capture.
Validated type checking, 82 existing tests, alpha fixtures with explicit browser paths, 600-frame MG sequencing, source sampling, cancellation, limits, fractional rates, and packed-code export on Apple Silicon. Windows and Linux hardware validation remains pending.
* feat: add HTML document output and reusable runtime workers
* refactor: separate document output from shared HTML playback
* refactor: remove execution worker idle retention
* fix: initialize HTML document scripts in browser order
* fix: initialize document animations after browser layout
* fix: cover SVS text template rendering
* fix: detect the SVS sheet close between recipes
parseSvs searched the raw text for </sheet> before parsing, so a quoted
recipe value containing that text was either taken as the close or, with
lastIndexOf, guessed at. Check for the close tag only between recipes
instead, since closingBrace already skips quoted text. A missing close now
reports SVS_ROOT_UNCLOSED and a second close SVS_TRAILING, as on main.
Co-authored-by: Sharky Wang <65097782+rponeawa@users.noreply.github.com>
---------
Co-authored-by: Sharky Wang <65097782+rponeawa@users.noreply.github.com>
evaluateProducerPlan records every Producer failure keyed by its step, but
build-planning.ts read that map only inside the plannedNeeds loop. A Producer
that failed in a step carrying no request, such as assemble-timeline, had its
failure recorded and never surfaced: plan reported "Build plan is valid" and
exited 0 for builds that deterministically fail at Build.
Keep the failures no planned need reports, count them into the verdict and the
exit code, and print each failing step with its message.
render-still-video converted authored sRGB pictures to yuv420p with
FFmpeg's default BT.601 matrix and wrote no color metadata. Players and
Chromium decode untagged HD video as BT.709, so an HD still clip shifted
color, e.g. #20C040 came back as (20,169,62) in a Chrome <video>, which
is also how HyperFrames composites these clips.
Use the same encode tail as the HyperFrames local renderer (#342) for
the single-picture and the multi-picture paths, and add a test that
checks the stream tags and the decoded color of both paths.
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Since 089c39a01 the frame animation runtime kept each CSS animation live
and paused, and set its currentTime to Present-relative time on hf-seek.
HyperFrames' own css and waapi adapters also seek every live document
animation, to absolute composition time, and the last writer wins. A
Present that starts after frame 0 therefore rendered the pose at absolute
time: a media-track Item with a fade disappeared for most of its window.
Read the authored keyframes and timing once, then cancel the CSS animation
and set animation-name to none, as 0.2.13 did, so the engine never
discovers it. On each seek, evaluate the active poses with transient
Animations built from the constructor, which the waapi adapter does not
patch, read the computed values, cancel them and write the pose inline.
This still avoids tabulating every Present frame.
Fixes#372
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Lossless VP9 decodes to the same pixels at every speed setting, so the
alpha encode now passes -row-mt 1 -deadline realtime -cpu-used 8. On a
2 s 1080x1920 alpha clip this takes the encode from 7.65 s to 0.88 s
with identical decoded frames.
Reported in #382.
Node's fetch reports every network failure as "fetch failed" and keeps
the reason on error.cause, which transport() dropped. Users reporting a
failed HypiHub catalogue check could not tell DNS, TLS, a reset or a
timeout apart.
`packages status <name>@<version>` read the machine package home and nothing
else, while the loader finds an external package in two places: the
node_modules chain above whoever requires it, and the machine home addressed by
the version that requirer declares. A package installed where the first half
looks — a pnpm workspace's own node_modules, or the global node_modules a
`npm i -g @hypit/hypit` shares with a `npm i -g @hyperframes/engine` — was
reported `Ready false` and exited 1, and `hypit doctor` then loaded the provider
from it on the next line.
Measured on a global install with an empty machine home, before and after:
@hyperframes/engine@0.7.101 Ready false, exit 1
@hyperframes/engine@0.7.101 Ready true, exit 0
Required by .../packages/provider-hyperframes-local
Installation .../lib/node_modules/@hyperframes/engine
Status now locates the Distribution package that declares the specifier and
asks `locateNodePackage` once, from there — one call covering both places
rather than a second opinion beside the loader, which is how the two came to
disagree. The version is still exact: `distributionPackageDeclaring` matches the
declared range byte for byte, so the requirer is found only at the version asked
for, and the resolved manifest's version is compared again afterwards.
A specifier no Distribution package declares now says so, rather than reporting
a bare `Ready false`, and `install` keeps its own path untouched.
Reading only the machine home remains the answer when there is no Distribution
on disk, because then there is no requirer to resolve from.
Preserve forwarded Result values without eager materialization, advance live Builds from disposable indexes, and bound HyperFrames resource, source-frame, and output work.
Studio opens in the browser's color scheme and a top-bar button switches
between light and dark. A choice that differs from the browser is kept in
localStorage; choosing the browser's own scheme returns to following it.
Each theme-dependent color is written as light-dark(light, dark), with the
dark value unchanged, and data-theme on <html> sets color-scheme. The light
palette uses hypit.ai's warm neutrals. Timeline items tint their track hue
over white, with text and audio waveforms in a deep shade of the same hue.
The hosted callback page fetches the loopback from a public page, and
Chrome preflights that with OPTIONS under Private Network Access. Without
the CORS and PNA headers the auto-forward breaks once Chrome sends the
preflight. Answer OPTIONS and add the allow-origin header to the GET and
error responses.
Co-Authored-By: Claude Code <noreply@anthropic.com>