Commit Graph

710 Commits

Author SHA1 Message Date
rpone c080acd929 fix(html-local): preserve GPU export frame rates across FFmpeg versions 2026-10-28 23:54:32 +08:00
rpone feefcbb933 test(html-local): align budget expectations with configured defaults 2026-10-26 20:13:56 +08:00
rpone 608b595988 perf(html-local): tune default source and frame queue budgets 2026-10-25 04:48:17 +08:00
rpone 3b360f2917 fix(html-local): isolate video layer decoding and serialize texture imports 2026-10-25 04:13:43 +08:00
rpone a6a9171da5 fix(html-local): launch macOS renderer as a background app 2026-10-25 03:12:47 +08:00
rpone 29bde0f1cf fix(html-local): release GPU surfaces before mux and output validation 2026-10-25 02:50:42 +08:00
rpone ae2e0b332f fix(html-local): manage pinned Electron and package browser media assets 2026-10-25 02:46:03 +08:00
rpone 4e77b8f798 fix(html-local): wait for descendant termination during exit cleanup
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.
2026-10-25 01:57:08 +08:00
rpone 61eb15cf76 perf(html-local): pipeline GPU snapshots with bounded ordered encoding
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.
2026-10-25 01:57:03 +08:00
rpone a78652cf9a perf(html-local): decode source video directly in GPU scenes
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.
2026-10-25 01:07:36 +08:00
rpone e412b679f0 feat(html-local): add shared-texture GPU video export
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.
2026-10-25 00:02:19 +08:00
Sharky Wang dc2b7a8f31 perf(media-local): reuse video frames that meet normalization requirements (#389)
* Reuse H.264 frames that already match the normalized media clock

* Limit video reuse to common H.264 profiles and levels
2026-10-14 23:04:31 +08:00
Sharky Wang 398ce9c6d1 feat: add embeddable HTML document output (#387)
* 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
2026-10-14 03:09:09 +08:00
rpone 8260cdc17d docs: clarify optional component and partner provider installation 2026-10-10 02:02:32 +08:00
kashorin 4400f3363f chore(packages): record initial ecosystem releases 2026-10-10 01:51:27 +08:00
kashorin 68f1693645 refactor: publish video-domain packages independently for 0.3.1 2026-10-09 18:13:50 +08:00
kashorin ff7582a3ff test(provider): follow package version in user agent 2026-10-09 04:13:49 +08:00
kashorin 8bac90166a fix(release): identify package provenance 2026-10-09 04:05:46 +08:00
kashorin e81c3762fc fix(release): exclude Python interpreter caches 2026-10-09 03:53:40 +08:00
kashorin 4bcda61494 fix: preserve cross-platform release diagnostics 2026-10-09 01:44:00 +08:00
kashorin 6314a9e79e merge: absorb SVS closing-text fix into recipe 2026-10-09 01:36:24 +08:00
Chi-Wei Lee ef62b07e15 fix: allow sheet closing text in SVS recipes (#377)
* 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>
2026-10-09 01:33:14 +08:00
kashorin 5885c00b70 fix(timeline): preflight exact authored frame boundaries 2026-10-09 01:16:09 +08:00
kashorin f946760a3f docs: finish the 0.3 public documentation audit 2026-10-09 01:07:26 +08:00
kashorin 91d98a1b2d refactor: unify Studio items and temporal inverses 2026-10-09 00:35:10 +08:00
kashorin d7b38b7094 refactor: make caption cues authored content 2026-10-09 00:34:14 +08:00
Flandern e0f26d189a fix(timeline): preflight exact-frame placements (#355) 2026-10-08 23:15:45 +08:00
牵强 d56b5281e6 fix: report Producer failures that no request carries in plan (#348)
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.
2026-10-08 22:28:19 +08:00
HEOJUNFO 31c358d4f0 fix: encode still-video clips with BT.709 and tag the output (#363)
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>
2026-10-08 22:28:13 +08:00
Zhihuang Lin 3a561a9425 fix: keep frame animations of later Presents off HyperFrames' adapters (#373)
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>
2026-10-08 22:28:06 +08:00
Sharky Wang 06daf6f760 perf(media): encode lossless alpha Normalize at libvpx's fastest speed (#383)
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.
2026-10-08 22:04:18 +08:00
kashorin a4c25ea76b refactor: make narrative projection an explicit author relation 2026-10-08 15:42:44 +08:00
kashorin 91fd9328f5 docs: align production guidance with the 0.3 model 2026-10-08 14:38:45 +08:00
kashorin 682b221c81 refactor: require named temporal values at component boundaries 2026-10-08 14:38:26 +08:00
kashorin 9559574f74 refactor: make caption timing a complete unit table 2026-10-08 14:13:14 +08:00
kashorin 43a8250b0b refactor: give models and kits independent package ownership 2026-10-07 20:45:22 +08:00
kashorin 5c96c3812c refactor: return optional components to their package owners 2026-10-07 20:45:22 +08:00
kashorin 25520fecdf refactor: compose CLI and Studio from owned capabilities 2026-10-07 20:45:22 +08:00
kashorin 52942f9c1a refactor: collapse execution onto a single local runtime 2026-10-07 20:45:22 +08:00
kashorin cc03502862 refactor: consolidate media and image execution owners 2026-10-07 20:44:29 +08:00
kashorin 589062efaf refactor: own HTML programs and local frame rasterization 2026-10-07 20:44:29 +08:00
kashorin 836349e8e8 refactor: separate temporal anchors from audiovisual composition 2026-10-07 20:44:29 +08:00
kashorin db4e545d1e refactor: rebuild the domain-neutral language host 2026-10-07 20:44:28 +08:00
kashorin 190c54c435 refactor: close temporal domain ownership 2026-10-07 20:44:28 +08:00
kashorin 205bfeb98d refactor: establish the adaptive composition model 2026-10-07 20:44:28 +08:00
Sharky Wang adc0c5fcbf fix: include the network cause in transport errors (#376)
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.
2026-10-01 11:23:51 +08:00
Sharky Wang 32baae6dfd fix(cli): resolve packages status the way a Build resolves (#361)
`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.
2026-09-26 19:51:55 +08:00
kashorin 089c39a012 perf: localize build and render working sets
Preserve forwarded Result values without eager materialization, advance live Builds from disposable indexes, and bound HyperFrames resource, source-frame, and output work.
2026-09-26 06:38:25 +08:00
Sharky Wang 9ac471d108 feat(studio): add a light theme that follows the browser (#353)
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.
2026-09-24 15:00:46 +08:00
rpone 78d7436071 fix(oauth): answer the callback preflight for Chrome Private Network Access
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>
2026-09-23 18:43:41 +08:00