Skip to content

Pause Eve hero rendering when out of view via phase lifecycle#580

Open
matiasngf wants to merge 7 commits into
mainfrom
feat/eve-hero-phase
Open

Pause Eve hero rendering when out of view via phase lifecycle#580
matiasngf wants to merge 7 commits into
mainfrom
feat/eve-hero-phase

Conversation

@matiasngf

@matiasngf matiasngf commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Integrates the new phase animation library (vercel-labs) into the Eve hero shader to manage the animation loop lifecycle. vgpu keeps owning all WebGPU rendering; phase owns lifecycle/visibility signals. The hero's rAF loop now fully stops when the hero is out of the viewport or the tab is hidden, and resumes cleanly when it becomes visible again.

What changed

  • index.tsx — wires createLifecycle (framework-free) inside the existing client effect: composes IntersectionObserver on the stable hero container + document visibility + reduced-motion. onPhaseChange: active → drawLoop.start(), otherwise drawLoop.stop(). Migrates reduced-motion handling to usePrefersReducedMotion from phase/react.
  • runtime/frame-loop.tscreateDrawLoop now returns { start, stop, dispose } with idempotent rAF gating. Frame delta is clamped to 50 ms and the clock resets on start(), so resuming after a long pause cannot decay-wipe the persisted GPU paint texture. Adds dev-only QA probes: window.__eveHeroFrameLoop and data-hero-* attributes on the canvas (throttled, stripped from production by the NODE_ENV gate).
  • hooks.ts — removes the bespoke reduced-motion hook (now provided by phase/react).
  • scripts/guard-invariants.mjs — new rule 34: no phase imports allowed inside the GPU/shader boundary (render/, shaders/, scripts/eve-render/). Validated with a synthetic violation.
  • Dependencyphase@0.0.1 pinned via pnpm catalog, with minimumReleaseAgeExclude entry and allowBuilds.phase: false (its lefthook postinstall is disallowed).

StrictMode / GPUDevice.lost fix

React StrictMode double-mounts the component in dev. Our own teardown calls device.destroy(), which resolves the GPUDevice.lost promise with reason: "destroyed". The lost handler treated that as a fatal device loss, re-entered the dispose path, and stopped the lifecycle after ~2 frames. The handler now ignores lost events caused by intentional destroys/cancellation, and the lifecycle/runtime cleanup is reachable from the effect cleanup so no orphaned listeners survive fast unmounts.

Validation

  • pnpm typecheck, pnpm lint, pnpm guard:invariants — all green
  • Offline Docker render baselines byte-identical (rendering path untouched):
    • dark imprint-1: 0e96449327f59e9f1124cd3ee2d4de2448c8c531da088e305e0e96b2311fde13
    • dark glass imprint-0: 6eb5f6e59943cd4a19e37ed22e759610909d5d9d825372531710e20cc8a02bb9
  • Browser QA with WebGPU (Chromium + swiftshader): activation verified (heroPhase="active", frames increasing, canvas revealed). Scroll pause/resume automated validation was limited by headless IntersectionObserver callbacks after WebGPU warmup; verified manually.

- integrate phase@0.0.1 createLifecycle (viewport IntersectionObserver + tab visibility + reduced-motion) to start/stop the hero rAF loop

- loop start/stop idempotent + 50ms dt clamp so resume can't decay-wipe the persisted paint texture

- migrate reduced-motion to phase/react usePrefersReducedMotion

- ignore GPUDevice.lost reason "destroyed" from intentional teardown (fixes StrictMode double-mount stopping the loop)

- dev-only QA probes (window.__eveHeroFrameLoop + canvas data-hero-* attrs)

- guard rule 34 forbids phase imports inside the GPU/shader boundary (render/, shaders/, scripts/eve-render)

Signed-off-by: matiasngf <matiasngf@hotmail.com>
@vercel

vercel Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
eve-docs Ready Ready Preview, Comment, Open in v0 Jul 7, 2026 8:16pm
eve-docs-1644 Ready Ready Preview, Comment, Open in v0 Jul 7, 2026 8:16pm
eve-docs-4759 Ready Ready Preview, Comment, Open in v0 Jul 7, 2026 8:16pm

@socket-security

socket-security Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​phase@​0.0.1711009987100

View full report

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Bundle + Package Summary: apps/fixtures/weather-agent

Key takeaways

  • No notable deltas vs main (b7d1089).

Delta vs main (b7d1089)

Area Metric Baseline Current Delta
Package Packed tarball 3.55 MB 3.55 MB +119 B ⚠️
Package Unpacked publish size 12.88 MB 12.88 MB 0 B ➖
Package Installed footprint 51.97 MB 51.97 MB 0 B ➖
Package Published files 2459 2459 0
Package Installed files 5686 5686 0
Runtime Unique function payloads 2 2 0
Runtime Total function bytes 9.29 MB 9.29 MB -176 B ✅
Runtime Public routes 9 9 0
Changed function payloads vs main (b7d1089) (2)
Function Status Baseline Current Delta Route changes
functions/__server.func changed 3.48 MB 3.48 MB -144 B ✅ none
functions/.well-known/workflow/v1/flow.func changed 5.80 MB 5.80 MB -32 B ✅ none

eve init install

Metric Baseline Current Delta
Installed footprint 91.76 MB 91.76 MB 0 B ➖
Installed packages 120 120 0
dependencies 4 4 0
devDependencies 2 2 0
Dependency package bytes 27.04 MB 27.04 MB 0 B ➖
devDependency package bytes 4.81 MB 4.81 MB 0 B ➖
Build Metadata
  • Preset: vercel
  • Nitro: nitro@3.0.260610-beta
  • Output directory: apps/fixtures/weather-agent/.vercel/output
  • Build metadata timestamp: 2026-07-07T20:16:48.505Z
  • Route aliases: 9 public, 1 internal (10 total aliases)
  • Vercel routes in config: 10
  • Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down

Package Details

  • Package: eve@0.21.1
  • Package directory: packages/eve
  • Tarball: 3.55 MB (eve-0.21.1.tgz)
  • Unpacked payload: 12.88 MB across 2459 published files
  • Installed footprint: 51.97 MB across 5686 installed files
  • Installed root package: 11.61 MB
  • Installed dependencies: 40.37 MB
  • Runtime dependencies: 1
  • Peer dependencies: 5 (4 optional)

Installed footprint is measured from an isolated temporary npm install of the packed tarball.

Heavy installed dependencies

  • @rolldown/binding-linux-x64-gnu: 19.18 MB (36.9%)
  • eve: 11.61 MB (22.3%)
  • ai: 6.34 MB (12.2%)
  • zod: 5.04 MB (9.7%)
  • nitro: 2.41 MB (4.6%)
Publish payload breakdown
Published file size
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [####....................] 1.51 MB 11.7%
🟡 dist/src/compiled/@workflow/core/runtime.js      [##......................] 794.4 kB 6.2%
🟡 dist/src/compiled/@vercel/sandbox/index.js       [##......................] 632.2 kB 4.9%
🟡 dist/src/compiled/@chat-adapter/slack/index.js   [#.......................] 433.8 kB 3.4%
🟡 dist/src/compiled/_chunks/workflow/attribute-... [#.......................] 371.6 kB 2.9%
🔴 Other published files                            [########################] 9.14 MB 71.0%
Installed footprint breakdown
Installed package size
🔴 @rolldown/binding-linux-x64-gnu [########################] 19.18 MB 36.9%
🔴 eve                             [###############.........] 11.61 MB 22.3%
🔴 ai                              [########................] 6.34 MB 12.2%
🔴 zod                             [######..................] 5.04 MB 9.7%
🟠 nitro                           [###.....................] 2.41 MB 4.6%
🟡 rolldown                        [#.......................] 771.7 kB 1.5%
🔴 Other installed packages        [########................] 6.64 MB 12.8%
Runtime dependencies (1)
Package Range Notes
nitro 3.0.260610-beta
Peer dependencies (5)
Package Range Notes
@opentelemetry/api ^1.0.0 optional peer
ai catalog:
braintrust ^3.0.0 optional peer
just-bash ^3.0.0 optional peer
microsandbox ^0.5.0 optional peer
eve init install drill-down

eve init install details

  • Command: eve init my-agent
  • Package manager: npm
  • Installed footprint: 91.76 MB across 7438 installed files
  • Installed packages: 120 total (114 transitive-only)
  • dependencies: 4 direct packages totaling 27.04 MB
  • devDependencies: 2 direct packages totaling 4.81 MB
  • Other transitive package files: 59.91 MB

Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.

Heavy installed dependencies

  • @typescript/typescript-linux-x64: 29.69 MB (32.4%)
  • @rolldown/binding-linux-x64-gnu: 19.18 MB (20.9%)
  • eve: 11.61 MB (12.6%)
  • zod: 9.00 MB (9.8%)
  • ai: 6.34 MB (6.9%)
Installed footprint breakdown
Installed package size
🔴 @typescript/typescript-linux-x64 [########################] 29.69 MB 32.4%
🔴 @rolldown/binding-linux-x64-gnu  [###############.........] 19.18 MB 20.9%
🔴 eve                              [#########...............] 11.61 MB 12.6%
🔴 zod                              [#######.................] 9.00 MB 9.8%
🔴 ai                               [#####...................] 6.34 MB 6.9%
🟠 @types/node                      [##......................] 2.54 MB 2.8%
🔴 Other installed packages         [###########.............] 13.41 MB 14.6%
dependencies (4)
Package Range Installed size Share
@vercel/connect 0.2.2 98.6 kB 0.1%
ai ^7.0.0 6.34 MB 6.9%
eve file:eve-0.21.1.tgz 11.61 MB 12.6%
zod 4.4.3 9.00 MB 9.8%
devDependencies (2)
Package Range Installed size Share
@types/node 24.x 2.54 MB 2.8%
typescript 7.0.1-rc 2.27 MB 2.5%
Function Drill-Down

Payload Size Graph

Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func     [########################] 5.80 MB 62.5%
🟠 functions/__server.func                         [##############..........] 3.48 MB 37.5%

Top Function Payloads

🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 5.80 MB
Metric Value
Public routes /.well-known/workflow/v1/flow
Runtime nodejs24.x
Handler index.mjs
Payload 5.80 MB
Function files 5.80 MB across 26 files
Traced dependencies 0 B
Signal 🟠 Bundled file __eve_nitro_handler__.mjs is 2.03 MB (35.0%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 __eve_nitro_handler__.mjs              [########################] 2.03 MB 35.0%
🟠 _chunks/runtime.mjs                    [############............] 983.9 kB 17.0%
🟡 _chunks/sandbox.mjs                    [#########...............] 766.3 kB 13.2%
🟡 _chunks/attribute-changes-zAifvEhb.mjs [######..................] 473.4 kB 8.2%
🟡 _libs/@ai-sdk/gateway+[...].mjs        [#####...................] 413.5 kB 7.1%
🟠 Other bundled files                    [#############...........] 1.14 MB 19.6%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x",
  "environment": {
    "NODE_OPTIONS": "--experimental-require-module"
  },
  "maxDuration": "max",
  "experimentalTriggers": [
    {
      "type": "queue/v2beta",
      "topic": "__eve776561746865722d6167656e74_wkf_workflow_*",
      "consumer": "default",
      "retryAfterSeconds": 5,
      "initialDelaySeconds": 0
    }
  ]
}

🟠 functions/__server.func • 8 public routes, 1 internal alias • 3.48 MB
Metric Value
Public routes /
/eve/v1/callback/[token]
/eve/v1/connections/[name]/callback/[token]
/eve/v1/health
/eve/v1/info
/eve/v1/session
/eve/v1/session/[sessionId]
/eve/v1/session/[sessionId]/stream
Internal aliases /__server
Runtime nodejs24.x
Handler index.mjs
Payload 3.48 MB
Function files 3.48 MB across 21 files
Traced dependencies 0 B
Signal 🟠 Bundled file _chunks/dev-runtime-artifacts.mjs is 917.1 kB (26.3%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 _chunks/dev-runtime-artifacts.mjs      [########################] 917.1 kB 26.3%
🟠 _chunks/runtime.mjs                    [#######################.] 891.6 kB 25.6%
🟠 _chunks/sandbox.mjs                    [####################....] 766.3 kB 22.0%
🟡 _chunks/attribute-changes-zAifvEhb.mjs [############............] 449.0 kB 12.9%
⚪ _libs/zod.mjs                          [###.....................] 114.2 kB 3.3%
🟡 Other bundled files                    [#########...............] 343.9 kB 9.9%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x"
}

Comment thread apps/docs/app/[lang]/(home)/components/eve-logo-shader/index.tsx Outdated
Signed-off-by: matiasngf <matiasngf@hotmail.com>
matiasngf added 2 commits July 7, 2026 19:40
Signed-off-by: matiasngf <matiasngf@hotmail.com>
Signed-off-by: matiasngf <matiasngf@hotmail.com>
Signed-off-by: matiasngf <matiasngf@hotmail.com>

export function EveLogoShader({ audience = "humans" }: { audience?: InstallAudience }) {
const theme = useResolvedTheme();
preload(MODEL_URL, { as: "fetch", crossOrigin: "anonymous" });

@vercel vercel Bot Jul 7, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The preload for the hero mesh uses crossOrigin: "anonymous" (credentials mode omit), which does not match the same-origin fetch in loadMesh (credentials mode same-origin), preventing preload reuse.

Fix on Vercel

Signed-off-by: matiasngf <matiasngf@hotmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants