* 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>
The local provider converted sRGB PNG frames to yuv420p without choosing a
matrix or writing color metadata, so FFmpeg used BT.601 while players decode
untagged HD video as BT.709. Convert with BT.709 and tag the stream.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
endpoint-kit now defines the error classes a Provider transport throws
(EndpointTransportError, EndpointHttpError with status and retryAfterMs,
EndpointResponseError, EndpointServiceError) and one decision,
pollAgainOrFail: transport errors and HTTP 429/5xx keep the job pending
for the next poll, honouring Retry-After when given; every other error,
including missing credentials and unusable responses, fails the job.
The six asynchronous Providers (hypihub, beatapi, hiapi, pollo, monid,
tokendance) throw those classes from their request code and route their
poll catch through pollAgainOrFail, replacing the per-Provider status
check that failed on 429 and retried configuration errors until the
operation deadline.
A single failed status request (5xx such as 522, connection failure, or
request timeout) in poll() was returned as a failed operation, so the
driver stopped polling while the remote job continued to run and settle.
The job is now kept pending and polled again after pollIntervalMs; 4xx
responses still fail the operation, and operationTimeoutMs remains the
upper bound.
Applies to hypihub, beatapi, hiapi, pollo, monid and tokendance.