Commit Graph
891 Commits
Author SHA1 Message Date
Vance IngallsandClaude Opus 4.6 c230d71066 fix(skills): correct template iframe path to ../templates/ from .hyperframes/
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 14:04:36 -07:00
Vance IngallsandClaude Opus 4.6 e912936f20 feat(skills): slower card lift and fade, 1.6s total animation
Scale 1→1.06 over first 45%, then 1.06→1.08 while fading out
over remaining 55%. Phase 2 triggers at 900ms mid-fade.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 14:00:19 -07:00
Vance IngallsandClaude Opus 4.6 36c7440003 feat(skills): staggered fade with subtle card lift on template select
Background fades to black (0.5s), card scales up 6% and holds,
then card fades out after background is dark. No dramatic zoom.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:58:46 -07:00
Vance IngallsandClaude Opus 4.6 bb863dba64 fix(skills): correct transform-origin to pull card zoom toward center
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:57:14 -07:00
Vance IngallsandClaude Opus 4.6 3e673b812e fix(skills): flip transform-origin direction for card zoom
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:56:33 -07:00
Vance IngallsandClaude Opus 4.6 9be255febf feat(skills): dynamic transform-origin scales card toward viewport center
Calculates offset from card center to viewport center and sets
transform-origin so the zoom always converges on the middle of
the screen regardless of card position.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:55:50 -07:00
Vance IngallsandClaude Opus 4.6 a459408954 fix(skills): phase 2 fires at 500ms for tighter transition overlap
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:54:14 -07:00
Vance IngallsandClaude Opus 4.6 74dfc1bc02 fix(skills): scale and fade run simultaneously in card zoom
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:53:13 -07:00
Vance IngallsandClaude Opus 4.6 d95291b7df fix(skills): single continuous zoom animation, no two-stage freeze
Replace two-class transition with one keyframe animation.
scale(1)→scale(4) over 0.9s, opacity fades after 60%.
cubic-bezier(0.4,0,0,1) for smooth acceleration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:51:25 -07:00
Vance IngallsandClaude Opus 4.6 30ee4d2711 feat(skills): dramatic zoom transition on template selection
Card scales to 3.5x (well beyond viewport) over 0.8s with
cubic-bezier easing. Background fades to black over 0.5s.
Card fades out at 0.4s delay. Phase 2 slides in over 0.6s.
Total transition ~900ms for cinematic feel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:48:51 -07:00
Vance IngallsandClaude Opus 4.6 a0655286f9 feat(skills): add transition animation between template and fine-tune
Click a template card: background fades to black, card scales up
and fades out over 450ms, then Phase 2 fades in with subtle slide-up.
Smooth handoff between browsing and configuring.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:34:34 -07:00
Vance IngallsandClaude Opus 4.6 ea9208261f perf(skills): remove 300ms delay on template selection
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:31:09 -07:00
Vance IngallsandClaude Opus 4.6 356096c417 fix(skills): back button switches to Phase 1 instead of navigating away
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:28:42 -07:00
Vance IngallsandClaude Opus 4.6 48a34f45f2 feat(skills): embed template picker as Phase 1 in design-picker.html
Replace moodboard HTML with iframe to template-picker.html. Tab says
'1. Template'. Clicking a template sends postMessage to parent which
triggers goToTune() — no page navigation, no flash. Template picker
and fine-tune live on the same page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:24:16 -07:00
Vance IngallsandClaude Opus 4.6 41edf7d85e fix(skills): rewire Phase 1 tab to link back to template picker
When pick-design.html is opened from the template picker bridge,
rewrite the Direction tab to show '← Template' and navigate back
to template-picker.html instead of showing the empty moodboard view.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:21:17 -07:00
Vance IngallsandClaude Opus 4.6 f24812ff0d feat(skills): inject selected template iframe into fine-tune scene grid
When bridging from template picker, replace the static preview_frames
with a live iframe of the selected template. Includes slide cycling,
deck-stage fallback CSS, opacity reset for animation start states,
and scroll-mode detection for flex-scroll templates.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:19:41 -07:00
Vance IngallsandClaude Opus 4.6 d5e3d6565d fix(skills): add element guards and template-picker bridge to design-picker.html
Guard mood-title, mood-grid, pal-bar, mood-next-btn references so
pick-design.html works when Phase 1 is replaced by template picker.
Add handleTemplatePick bridge that reads sessionStorage/postMessage
and auto-advances to Phase 2 with selected template metadata.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 13:15:09 -07:00
Vance IngallsandClaude Opus 4.6 4e97f172cd fix(skills): support deck-stage web component templates in picker
Inject fallback CSS for <deck-stage> since its JS gets stripped.
Makes it a 1920x1080 block container with absolute slides toggled
by .active class. Use visibility instead of display:none for slide
switching to work with both div and section slides.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 11:02:59 -07:00
Vance IngallsandClaude Opus 4.6 dd29b623d1 fix(skills): reset animation start states after removing template scripts
Templates set opacity:0 and transform offsets for entrance animations.
Since we strip all scripts, those animations never fire and content
stays invisible. Reset opacity:0 → 1 and stuck transforms after load.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 11:00:17 -07:00
Vance IngallsandClaude Opus 4.6 adba427851 fix(skills): handle all three slide systems in template picker
Templates use three different slide architectures:
- .slide.active toggle (16 templates)
- horizontal flex-scroll (8 templates: signal, studio, etc.)
- <deck-stage> web component (10 templates)

Auto-detect system via getSlides(), scroll-based navigation for
flex layouts, component-aware queries for deck-stage.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 10:56:48 -07:00
Vance IngallsandClaude Sonnet 4.6 bdfd5d977e docs(skills): add template-based picker flow to design-picker.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 10:45:17 -07:00
Vance Ingalls 5fb345019c feat(skills): add build-template-picker.py generation script 2026-05-15 10:42:56 -07:00
Vance IngallsandClaude Opus 4.6 9a8f2f2930 feat(skills): add template-picker.html with data placeholders
All text pools (headlines, body, stats, labels, smalls) now read from
PROMPT_TEXT instead of hardcoded arrays. Four placeholders:
__PALETTES_JSON__, __PROMPT_TEXT_JSON__, __TEMPLATES_JSON__, __PROMPT_DESC__

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-15 10:41:45 -07:00
Vance IngallsandClaude Sonnet 4.6 63f7f1e2ea feat(skills): add template-picker.html with data placeholders
Copy prototype from rawblock and replace the four hardcoded data values
(PALETTES, PROMPT_TEXT, ALL_TEMPLATES, header subtitle) with placeholder
tokens (__PALETTES_JSON__, __PROMPT_TEXT_JSON__, __TEMPLATES_JSON__,
__PROMPT_DESC__) so build-template-picker.py can inject prompt-specific
data at skill-invocation time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 10:40:45 -07:00
Vance Ingalls 451d3ce987 docs: add template picker skill integration plan 2026-05-15 10:37:04 -07:00
Vance IngallsandClaude Opus 4.6 04abaf6d79 fix(skills): use hf-seek adapter contract in design picker Three.js output
The exported design.html used performance.now() in a rAF loop, which is
not seekable by the HyperFrames three adapter. Replace with the
event-driven renderAt pattern that listens for hf-seek and reads
window.__hfThreeTime for deterministic frame capture.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-14 18:21:48 -07:00
Vance IngallsandClaude Opus 4.6 647a677068 fix(skills): escape backslashes and dollar signs in exported GLSL template literals
Addresses CodeQL finding: incomplete string escaping when embedding
fragment/vertex shader GLSL into design.html template literal output.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-14 16:44:04 -07:00
Vance IngallsandClaude Opus 4.6 661c845b19 feat(skills): three.js shader gradient backgrounds, custom ease editor, design.html output
Design picker overhaul:
- Three.js animated 3D gradient backgrounds (sphere/waterPlane/plane) with
  ShaderGradient-inspired presets (Halo, Mint, Cosmic, Nighty Night, Sunset,
  Cotton Candy, Glass, Blob) plus prompt-contextual custom shaders
- Per-preset controls (speed, wave height, wobble, camera angle/tilt/zoom)
- Custom ease bezier editor with multi-waypoint SVG path support (GSAP CustomEase)
- design.html output replaces design.md — self-contained HTML with CSS variables,
  structured JSON spec, and working Three.js shader module script
- Verbalized sampling with probability scoring for mood board generation
- Strict data schemas for picker template (palette, type pair, architecture fields)
- Bug fixes: checkReady semicolon, density section HTML, scaleScenes resize
  listener leak, WebGL context cleanup, _sgUpdateBg debounce

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-14 16:34:21 -07:00
Vance IngallsandClaude Opus 4.6 1f2a81a9de feat(skills): showcase polish — section order, motion reverse, radius cards
- Reorder showcase sections to match left panel: Overview → Composition →
  Palette → Typography → Corners → Depth → Motion
- Motion dot animates with selected ease in BOTH directions (no snap-back),
  bigger dot (24px), taller track
- Kill existing GSAP tweens before restarting on option change
- Elevation shows shapes with selected shadow/radius (no labels)
- Radius shows content cards ($1,299, 28°C, Oia) + buttons with selected
  radius applied — real content, not abstract chips
- Fix easing onclick missing renderPreview() call

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 20:05:03 -07:00
Vance IngallsandClaude Opus 4.6 e9612dda84 feat(skills): hard-gate creative process before data generation
Restructure design-picker.md to force creative thinking BEFORE code:
1. "What is unique about THIS prompt?" — visual vocabulary, emotion as
   layout, surface context, anti-competition
2. Verbalized sampling with reasoning paths — from subject, emotion,
   audience, anti-pattern, unusual format
3. Rate concepts HIGH/MID/LOW, keep 3+ LOW boards
4. Anti-mode-collapse check
5. THEN generate data

The creative process is now a HARD-GATE before the data format section.
Previously agents skipped straight to architecture HTML and produced
identical layouts across different projects.

Also: mandatory token usage rule strengthened — never hardcode colors,
fonts, spacing, or radii in preview frames.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 19:31:40 -07:00
Vance IngallsandClaude Opus 4.6 88e7673731 feat(skills): mandatory token usage, composition skill guidance for frames
- design-picker.md: tokens are mandatory in ALL preview frame HTML — never
  hardcode colors, fonts, spacing, or radii. The preview must update live
  when Phase 2 options change.
- Explicit guidance to follow video-composition.md, house-style.md, and
  motion-principles.md when generating preview frames
- Fix easing option not calling renderPreview()
- Fix max-width:100% clamping scene frames in showcase

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 18:42:44 -07:00
Vance IngallsandClaude Opus 4.6 feab9dc5e4 feat(skills): showcase preview, composition skill guidance for frames
Phase 2 right panel is now a scrollable design system showcase:
- Overview, Palette swatches, Typography specimens, Scene grid,
  Motion easing preview, Elevation cards, Radius chips
- All sections themed via CSS custom properties from selected palette
- Fix max-width: 100% clamping scene frames (was preventing scale)

Architecture preview frames guidance:
- Agents must follow video-composition.md, house-style.md, and
  motion-principles.md when generating preview frame HTML
- 4 frames map to beat structure: hook, proof, action, close
- Use real content from prompt, not placeholders
- Frames are static but should look paused mid-animation
- Strip old 15-element checklist and "every token must be used"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 18:29:12 -07:00
Vance IngallsandClaude Opus 4.6 c67aed9a7f feat(skills): video design.md output, lettered brief, strip canvas backgrounds
- Picker outputs video-specific design.md lookbook: palette with accent
  discipline, typography table at video scale, surface & depth, motion
  personality with easing signature, transition mood, composition rules,
  pacing guidance (1 word/sec), do's and don'ts
- Brief questions use lettered multiple choice (A, B, C, D) for faster
  interaction
- Strip procedural canvas backgrounds and SVG illustrations from template
  (quality insufficient, will revisit with showcase rewrite)
- Fix template syntax errors from background removal (trailing ||, dangling
  comma, orphaned bgDescs object)
- design-picker.md describes new output format (director's lookbook)
- Strip remaining prescriptive density from prompt-expansion and
  video-composition (motion, focal hierarchy, frame composition)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 18:05:28 -07:00
Vance IngallsandClaude Opus 4.6 6c00cbd5be feat(skills): strip prescriptive density rules, allow restraint
Remove hard element counts and "never/always/every" mandates that forced
visual clutter and prevented minimal compositions:

- video-composition.md: replace "8-10 elements per scene" with density-as-
  creative-choice; soften "fill the frame" to "use the frame"; replace
  "two focal points minimum" with focal hierarchy; allow solid backgrounds
  and deliberate stillness
- house-style.md: remove "2-5 decoratives per scene" count and "1 decorative
  is under-dressed"; decoratives are a tool, not a requirement
- prompt-expansion.md: remove "required 2-5 from house-style" and element
  padding; density matches the emotional beat

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 15:00:45 -07:00
Vance IngallsandClaude Opus 4.6 53bf8e7665 feat(skills): structural diversity, contextual canvas backgrounds, strip homogeneity
- Replace single vertical-column example with 3 structurally different
  examples (split horizontal, single dominant, equal grid)
- Add structural diversity check: no two architectures share same wireframe
- List 8 layout shapes to draw from (centered, split, bottom-anchored,
  grid, single-dominant, list, diagonal, timeline)
- Strip "every token must be used" — tokens only where concept needs them
- Canvas backgrounds now config-driven objects (type + params) instead of
  hardcoded string types — same primitives, contextual parameters
- Added text renderer primitive for falling characters

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 09:22:19 -07:00
Vance IngallsandClaude Opus 4.6 3154dd66c1 feat(skills): brief-first picker flow, verbalized sampling, procedural backgrounds
Brief step: 6 questions (audience, emotion, brand assets, light/dark, surface,
key takeaway) asked one at a time, each answer informing the next. Skip what
the prompt already answers.

Verbalized sampling: generate 8-10 mood boards, label each as high/mid/low
mode, keep 2+ rare boards. Different creative modes (formal, emotional,
unconventional, speculative). Anti-mode-collapse check ensures no two boards
share the same template. Unlikely-but-valid board generation.

Design picker template:
- 3x3 grid layout (9 boards)
- 3-frame carousel per card (title, data, CTA scenes)
- Procedural canvas backgrounds (particles, voronoi, perlin heatmap,
  ring-pulse, scanline, digits, sine-mesh, ripple, blobs)
- Backgrounds as selectable option in Phase 2
- Sticky canvas in Phase 2 preview
- No labels on Phase 1 cards — design speaks for itself
- Density matches concept, not a 15-element checklist
- Full implementation descriptions in design.md output

Prompt expansion: verbalized sampling for choreography — 3 approaches per
scene (content-first, emotion-first, unconventional), pick the best.

Video composition: added proximity/grouping rule.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 01:16:03 -07:00
Miguel Ángel 9fe356be14 chore: bump version to 0.6.4 v0.6.4 2026-05-13 00:49:09 -07:00
Phuong Le 2bea226ea5 fix(studio): only seek layers on selection (#790) 2026-05-13 09:48:21 +02:00
Miguel Ángel 636db23197 chore: bump version to 0.6.3 v0.6.3 2026-05-13 00:46:36 -07:00
Miguel Ángel 2e6022972b fix(studio): add preview zoom controls (#761)
* fix(studio): add smooth preview zoom with pinch/Ctrl+scroll

- Scale iframe content from inside (contentDocument.documentElement) instead
  of scaling the parent div, avoiding compositor re-rasterization on every
  zoom frame — critical for smooth zoom on high-refresh displays (240Hz)
- Document-level capture-phase wheel handler bypasses the DomEditOverlay
- Center-based zoom (no pan drift from pointer-anchored formulas)
- Transient HUD shows zoom % briefly, no persistent UI controls
- Double-click preview area to reset zoom to fit
- Drag-to-pan when zoomed past 100%
- Momentum scroll suppression after pinch gesture (400ms cooldown)
- Delta clamping (MAX_DELTA=10) prevents overshooting on fast gestures
- toDomPrecision rounds transform values to 4 decimals (matches tldraw)
- Zoom state persisted to localStorage with 200ms debounce
- Exposes --preview-zoom CSS custom property for overlay coordinate mapping
- Fix infinite render loop in NLELayout (onIframeRef → refreshPreviewDocumentVersion)

* fix(studio): use CSS zoom instead of transform scale for preview zoom

CSS transform: scale() on a div containing an iframe causes compositor
cross-layer sync issues that produce visible frame tearing on high-refresh
displays (240Hz ProMotion). CSS zoom property changes the actual rendered
size without compositor layer synchronization, eliminating the jumping.

- Replace transform: scale(Z) with zoom: Z on the stage div
- Keep transform: translate() for panning (compositor-friendly, no iframe)
- Overlays work correctly since getBoundingClientRect() includes zoom
- Remove will-change, transition hacks, pointer-events toggles

* fix(ci): use apt-get for ffmpeg in preview-regression workflow

The FedericoCarboni/setup-ffmpeg action downloads from an external URL
that has been persistently unreachable, causing CI failures. Switch to
apt-get install which uses Ubuntu's package repos (same as ci.yml and
player-perf.yml).

* fix(studio): clear zoom timers on NLEPreview unmount

settleTimerRef, hudTimerRef, and retiringTimerRef could fire after
component unmount. Add cleanup effect to prevent stale callbacks.

* feat(studio): persist sidebar, timeline, and playback speed across reloads

Wire up studioUiPreferences for the three remaining UI states requested
in #752: left sidebar collapsed, timeline visibility, and playback rate.
All three now survive page reloads using the same localStorage key as
preview zoom.
2026-05-13 09:29:01 +02:00
Phuong Le 10fb968583 fix(studio): show inspector selection bounds after click (#789) 2026-05-13 09:08:59 +02:00
James Russo 9058ee39c8 Merge pull request #766 from heygen-com/feat/engine-lockgop-for-chunk-concat
feat(engine): add lockGopForChunkConcat option to buildEncoderArgs
2026-05-13 02:54:29 -04:00
236eabe248 fix: prevent SourceEditor recreation on every content change (#624)
The mountEditor callback had content in its dependency array and was
used as a React ref callback. Every content change (keystroke) gave
mountEditor a new identity, causing React to destroy and recreate
the entire CodeMirror editor — losing cursor position, undo history,
and focus.

Remove content from the dependency array and use a separate useEffect
to push external content updates to the existing editor via
dispatch(). The editor is now only recreated when filePath, language,
or readOnly change.

Co-authored-by: Test User <test@example.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-13 08:25:42 +02:00
Miguel ÁngelandClaude Opus 4.6 6fe970651d feat(studio): add Layers panel as new inspector tab (#784)
* feat(studio): add Layers panel as new inspector tab

Adds a dedicated Layers tab alongside Design and Renders in the right
panel inspector. The panel shows the full composition element tree with
collapsible hierarchy — clicking a layer selects it without navigating
away from the tree view.

Closes #783

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

* feat(studio): add visual element previews to Layers panel

Each layer row now shows a small color/content preview thumbnail:
- Text elements show a snippet of their content in the actual font color
- Container elements show their background color as a colored swatch
- Image elements show a tiny thumbnail of the image
- Media elements show an icon indicator

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

* feat(studio): add hover-to-highlight and auto-seek to Layers panel

Replace tiny preview thumbnails with hover highlighting — hovering a
layer row highlights the element in the preview canvas. Clicking a layer
auto-seeks the playhead to that element's start time in the timeline.

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

* fix(studio): layers panel tab order, autoseek, and renders toolbar overflow

- Reorder inspector tabs to Design → Layers → Renders
- Fix autoseek: walk DOM ancestors when selected element has no direct
  timeline match, so clicking a child like S2 Heading correctly seeks
  to the start of its parent scene
- Fix Renders toolbar overflow: add flex-wrap to the export controls
  header so selects and the Export button wrap instead of clipping

* fix(studio): seek to midpoint of element duration in layers panel autoseek

* fix(studio): layers panel seek now drives adapter.seek via requestSeek signal

setCurrentTime() only updated the store — adapter.seek() and liveTime.notify()
were never called so the iframe never moved. Add requestedSeekTime to the player
store; useTimelinePlayer subscribes and calls the real seek() path when it fires.

* feat(studio): hover over a layer auto-seeks to element midpoint (300ms debounce)

* feat(studio): add collapsible sections to Design panel

Section component now supports collapse/expand with a chevron toggle.
Text, Layout, and Fill sections stay expanded by default. Less-used
sections (Flex, Radius, Stroke, Effects, Clip, Transparency) start
collapsed to reduce scrolling.

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

* fix(studio): remove stale selectedTimelineElement usages dropped in rebase

* fix(studio): stabilize resetErrors in useConsoleErrorCapture to break render loop

resetErrors was a new function object on every render. handlePreviewIframeRef
had it as a dep, so it also changed every render. NLELayout's useEffect watching
onIframeRef would re-fire, calling setPreviewIframe again, which re-ran
useConsoleErrorCapture with the new iframe — infinite loop.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 08:22:26 +02:00
Phuong Le 51f968ec87 fix(studio): keep preview selection overlay visible for selected elements (#777) 2026-05-13 07:25:40 +02:00
JamesandClaude Opus 4.7 2d6372ac2a feat(engine): add lockGopForChunkConcat option to buildEncoderArgs
Part of Phase 2 of the distributed rendering plan (determinism hardening).
See DISTRIBUTED-RENDERING-PLAN.md §7.1 and §17.2 (gating table).

Adds two optional fields to EncoderOptions:

  lockGopForChunkConcat?: boolean  // default false
  gopSize?: number                 // required when lockGopForChunkConcat=true

When the flag is true on the SW libx264 / libx265 paths, buildEncoderArgs
emits closed-GOP / forced-keyframe args so the resulting chunk file can be
losslessly concatenated (`ffmpeg -f concat -c copy`) with sibling chunks:

  -g <gopSize>
  -keyint_min <gopSize>
  -sc_threshold 0
  -force_key_frames "expr:eq(mod(n,<gopSize>),0)"
  -x264-params "...:scenecut=0:open-gop=0:repeat-headers=1"
  -x265-params "keyint=<gopSize>:min-keyint=<gopSize>:scenecut=0:open-gop=0:repeat-headers=1"
  -bf 0   (added for h265 too when locked)

GPU encoders, vp9, and prores ignore the flag (their concat-copy story is
separate — see plan §7.2 / §8).

In-process behavior is unchanged: the default (false) path emits no new
args. New unit tests pin both branches in packages/engine/src/services/
chunkEncoder.test.ts.

This is part of a stack of 10 PRs; this is PR 1 of 10.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 04:36:11 +00:00
James Russo c2648bc863 Merge pull request #778 from heygen-com/fix/ci-format-and-windows-esbuild
fix(ci): unbreak format check on main + skip cli build:fonts when present
2026-05-13 00:34:31 -04:00
James de946492e6 test(producer): add missing typegpu-adapter golden baseline
PR #755 added the typegpu-adapter regression test scaffolding (meta.json,
src/index.html, output/compiled.html) but left the output.mp4 golden
baseline ungenerated:

> Note: output.mp4 baseline needs to be generated in CI — the local …

Every \`regression-shards (fast)\` run since #755 merged has failed with
\`Snapshot not found: /app/packages/producer/tests/typegpu-adapter/output/output.mp4.
Run with --update to create it.\`

Generated via the canonical Docker path per CLAUDE.md:

    bun run --cwd packages/producer docker:test \\
      --update --suite typegpu-adapter

Stored via Git LFS (already configured for
\`packages/producer/tests/*/output/output.mp4\` in \`.gitattributes\`).
2026-05-13 04:05:18 +00:00
James 067bc722e3 fix(deps): align @types/node + esbuild + tsx across workspace
The Windows install failures (`ENOENT: failed copying files from cache to
destination for package @types/node` / `esbuild`) are caused by bun creating
workspace-scoped nested installs under
`node_modules/@hyperframes/<pkg>/node_modules/...`. Those nested paths only
exist because each workspace package pinned a different `@types/node` /
`esbuild` major:

- root: `@types/node ^25.0.10`, core: `^24.10.13`, cli/engine/producer: `^22`
- core/cli: `esbuild ^0.25.x`, producer: `^0.27.2`

Each major-version gap forces bun to install a workspace-scoped copy in a
deep `node_modules/@hyperframes/<pkg>/node_modules/<dep>/node_modules/...`
tree that bun can't reliably materialize on Windows GHA runners. Aligning
versions lets bun dedup to a single root-hoisted install per dep, and the
nested workspace block disappears from `bun.lock` entirely.

## Alignment

- `@types/node` → `^25.0.10` across root, core, cli, engine, producer
- `esbuild` → `^0.25.12` across cli, core, producer
- `tsx` → `^4.21.0` across producer (matches root + core)

## Source-level v25 compat (already in this PR)

@types/node v25 declares `File` as an interface (not a class) and exposes a
conditional global where `FormData.entries()` narrows to `[string, string]`
when an `onmessage` global is in scope. `packages/core/src/studio-api/routes/files.ts`'s
`value instanceof File` check was relying on the v24 class declaration —
already cast the iterator to `Iterable<[string, FileLike | string]>` in the
prior commit.

Two more v25 source fixes here:
- `packages/cli/src/commands/init.ts`
- `packages/cli/src/whisper/normalize.ts`

`Dirent.path` was removed in @types/node v25 (deprecated alias for
`parentPath` since Node 20.12). Drop the `?? e.path` fallback.

## Verification

Both install layouts now build clean end-to-end:

- `bun install` (isolated, default): full build green, 853 core tests pass,
  typecheck green across all 7 packages
- `bun install --linker=hoisted` (Windows CI): same result
- `bun.lock` no longer contains any `@hyperframes/<pkg>/<dep>` nested
  workspace entries — 70+ lines of nested install blocks gone
2026-05-13 03:35:47 +00:00
James 8348e19fd9 fix(ci): switch Windows install to hoisted linker; narrow FormData iter
Pushing further to actually get Windows render verification green, not just
work around it.

## What's wrong on Windows

Bun 1.3's default `isolated` linker creates nested workspace junctions under
`packages/*/node_modules/` on Windows GHA runners. Those junctions don't
materialize reliably — Node's `realpathSync` returns `EPERM` on stat, and
ESM resolution returns `ERR_MODULE_NOT_FOUND`. Every Windows build since
PR #748 has tripped this in one of three places:

- `packages/producer/build.mjs` importing `esbuild`
- `packages/producer/scripts/generate-font-data.ts` reading `@fontsource/*`
- `packages/producer` running `tsc` to emit `.d.ts`s

Long-running bun bugs: oven-sh/bun#23615, #18354, #10146.

## Fix

**1. `--linker=hoisted` for the Windows install step** (workflow change,
Windows only). Hoisted layout puts deps as real directories at the workspace
root + workspace package node_modules. No junctions, no Windows-specific
path quirks. Linux CI keeps the default isolated linker; the lockfile is
linker-agnostic so `--frozen-lockfile` is still valid.

**2. Source-level FormData narrowing in `packages/core/src/studio-api/routes/files.ts`**
(needed because the hoisted layout exposes a `@types/node@25` typecheck
issue that the isolated layout hides). With v25 + an `onmessage` global in
scope, the ambient `FormData.entries()` infers `[string, string]` instead of
`[string, File | string]`, so the `value instanceof File` check breaks at
`TS2358`. Cast the iterator to a `[string, FileLike | string]` shape and
narrow via `typeof value === "string"`. Identical runtime behavior; works
under both v24 (isolated layout, what Linux CI sees) and v25 (hoisted, what
Windows CI sees with this change).

## Verification

- `bun install --frozen-lockfile` (isolated, default): full build green
- `bun install --frozen-lockfile --linker=hoisted`: full build green, core
  typecheck passes, `@hyperframes/core` 853 tests pass
- Format/lint clean on both layouts
2026-05-13 03:27:58 +00:00