From 43c9d30c2d920d3591959d702a5394fd51726a8d Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 17 Aug 2026 11:42:53 -0700 Subject: [PATCH 01/39] chore(arcade): add rebuild and GitHub Release pack scripts Keep an explicit patch list and disposable arcade integration rebuild so upstream bumps stay mechanical; Release tarballs avoid npm/GH Packages. --- scripts/arcade/README.md | 38 +++++++ scripts/arcade/patches.json | 13 +++ scripts/arcade/publish-release.mjs | 159 +++++++++++++++++++++++++++++ scripts/arcade/rebuild.mjs | 158 ++++++++++++++++++++++++++++ 4 files changed, 368 insertions(+) create mode 100644 scripts/arcade/README.md create mode 100644 scripts/arcade/patches.json create mode 100755 scripts/arcade/publish-release.mjs create mode 100755 scripts/arcade/rebuild.mjs diff --git a/scripts/arcade/README.md b/scripts/arcade/README.md new file mode 100644 index 00000000000..c8ef795d4df --- /dev/null +++ b/scripts/arcade/README.md @@ -0,0 +1,38 @@ +# Arcade fork maintenance + +Public fork of Heygen Hyperframes with Arcade keep-local / pending-contrib patches. + +## Branches + +| Branch | Role | +| ---------------------- | -------------------------------------------------------------------------- | +| `main` | Upstream mirror only — no Arcade commits | +| `patch/` | One patch; open upstream PRs from these | +| `arcade` | Disposable integration: `upstream/main` + cherry-picks from `patches.json` | +| `patch/arcade-tooling` | This tooling (first entry in the manifest; never upstreamed) | + +## Rebuild `arcade` + +```bash +git fetch origin upstream +git checkout patch/arcade-tooling +node scripts/arcade/rebuild.mjs --yes # local only +node scripts/arcade/rebuild.mjs --yes --push # force-with-lease origin/arcade +``` + +Conflict → abort names the patch. Rebase that `patch/*` onto `upstream/main`, then re-run. + +When an upstream PR merges, delete its row from `patches.json` (and optionally the branch). + +## Publish GitHub Release tarballs + +Does **not** `npm publish`. Packs `packPackages` from `patches.json` and attaches `.tgz` to a prerelease. + +```bash +git checkout arcade # after rebuild +node scripts/arcade/publish-release.mjs --yes +node scripts/arcade/publish-release.mjs --tag v0.7.107-arcade.1 --yes +node scripts/arcade/publish-release.mjs --dry-run +``` + +Pin every `@hyperframes/*` Arcade resolves to the printed Release asset URLs (packed manifests rewrite `workspace:*` → semver, which would otherwise hit public npm). diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json new file mode 100644 index 00000000000..786e333a015 --- /dev/null +++ b/scripts/arcade/patches.json @@ -0,0 +1,13 @@ +{ + "upstream": "upstream/main", + "integrationBranch": "arcade", + "patches": [ + "patch/arcade-tooling", + "patch/visibility-scrub", + "patch/video-source", + "patch/playback-start-nested", + "patch/data-start-idref", + "patch/player-xss" + ], + "packPackages": ["parsers", "lint", "studio-server", "core", "player"] +} diff --git a/scripts/arcade/publish-release.mjs b/scripts/arcade/publish-release.mjs new file mode 100755 index 00000000000..2947b703176 --- /dev/null +++ b/scripts/arcade/publish-release.mjs @@ -0,0 +1,159 @@ +#!/usr/bin/env node +/** + * Pack @hyperframes packages and attach .tgz assets to a GitHub Release. + * Does NOT npm publish (public npm or GitHub Packages). + * + * Usage: + * node scripts/arcade/publish-release.mjs --yes + * node scripts/arcade/publish-release.mjs --tag v0.7.107-arcade.1 --yes + * node scripts/arcade/publish-release.mjs --dry-run + * + * Run on `arcade` (or pass --ref). Requires: bun, gh, clean tree. + */ + +import { execFileSync } from "node:child_process"; +import { mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), "../.."); +const MANIFEST_PATH = join(dirname(fileURLToPath(import.meta.url)), "patches.json"); + +function parseArgs(argv) { + const out = { yes: false, dryRun: false, tag: null, ref: "arcade", repo: null }; + for (let i = 0; i < argv.length; i++) { + const a = argv[i]; + if (a === "--yes") out.yes = true; + else if (a === "--dry-run") out.dryRun = true; + else if (a === "--tag") out.tag = argv[++i]; + else if (a === "--ref") out.ref = argv[++i]; + else if (a === "--repo") out.repo = argv[++i]; + else throw new Error(`Unknown arg: ${a}`); + } + return out; +} + +function run(cmd, cmdArgs, opts = {}) { + const result = execFileSync(cmd, cmdArgs, { + cwd: ROOT, + encoding: "utf8", + stdio: opts.stdio ?? ["ignore", "pipe", "pipe"], + ...opts, + }); + return (result ?? "").toString().trim(); +} + +function die(message, code = 1) { + console.error(message); + process.exit(code); +} + +const args = parseArgs(process.argv.slice(2)); +const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8")); +const packPackages = manifest.packPackages; +if (!Array.isArray(packPackages) || packPackages.length === 0) { + die("patches.json: packPackages must be a non-empty array"); +} + +if (!args.yes && !args.dryRun) { + die("Refusing to publish without --yes (or pass --dry-run)."); +} + +const status = run("git", ["status", "--porcelain"]); +if (status) die(`Working tree dirty:\n${status}`); + +const headBranch = run("git", ["branch", "--show-current"]); +if (headBranch !== args.ref && !args.dryRun) { + die(`Check out ${args.ref} first (on ${headBranch || "detached"}). Or pass --ref.`); +} + +const version = JSON.parse(readFileSync(join(ROOT, "packages/core/package.json"), "utf8")).version; +if (!version) die("packages/core/package.json missing version"); + +let tag = args.tag; +if (!tag) { + let n = 1; + while (true) { + const candidate = `v${version}-arcade.${n}`; + try { + run("gh", ["release", "view", candidate], { stdio: ["ignore", "ignore", "ignore"] }); + n += 1; + } catch { + tag = candidate; + break; + } + } +} + +if (!/^v\d+\.\d+\.\d+.*-arcade\.\d+$/.test(tag)) { + die(`Tag must look like v${version}-arcade.N (got ${tag})`); +} + +const repo = + args.repo || + run("gh", ["repo", "view", "--json", "nameWithOwner", "-q", ".nameWithOwner"]); + +console.log(`ref: ${args.ref}`); +console.log(`version: ${version}`); +console.log(`tag: ${tag}`); +console.log(`repo: ${repo}`); +console.log(`packages: ${packPackages.join(", ")}`); + +if (args.dryRun) { + console.log("dry-run: would build, pack, and gh release create"); + process.exit(0); +} + +console.log("\ninstall + build…"); +run("bun", ["install", "--frozen-lockfile"], { stdio: "inherit" }); +run("bun", ["run", "build"], { stdio: "inherit" }); +run("bun", ["run", "verify:packed-manifests"], { stdio: "inherit" }); + +const packDir = mkdtempSync(join(tmpdir(), "hf-arcade-pack-")); +mkdirSync(packDir, { recursive: true }); + +try { + for (const name of packPackages) { + const pkgDir = join(ROOT, "packages", name); + console.log(`npm pack @hyperframes/${name}`); + run("npm", ["pack", "--pack-destination", packDir], { cwd: pkgDir, stdio: "inherit" }); + } + + const tarballs = readdirSync(packDir) + .filter((f) => f.endsWith(".tgz")) + .map((f) => join(packDir, f)) + .sort(); + if (tarballs.length === 0) die("No .tgz produced"); + + console.log(`\ngh release create ${tag} (${tarballs.length} assets)`); + run( + "gh", + [ + "release", + "create", + tag, + "--repo", + repo, + "--title", + tag, + "--prerelease", + "--generate-notes", + "--target", + run("git", ["rev-parse", "HEAD"]), + ...tarballs, + ], + { stdio: "inherit" }, + ); + + const base = `https://github.com/${repo}/releases/download/${tag}`; + console.log("\nArcade package.json pins:"); + for (const file of tarballs.map((p) => p.split(/[/\\]/).pop())) { + const npmName = file + .replace(/-\d+\.\d+\.\d+.*\.tgz$/, "") + .replace(/^hyperframes-/, "@hyperframes/"); + console.log(` "${npmName}": "${base}/${file}",`); + } +} finally { + rmSync(packDir, { recursive: true, force: true }); +} diff --git a/scripts/arcade/rebuild.mjs b/scripts/arcade/rebuild.mjs new file mode 100755 index 00000000000..417f972c212 --- /dev/null +++ b/scripts/arcade/rebuild.mjs @@ -0,0 +1,158 @@ +#!/usr/bin/env node +/** + * Rebuild the disposable `arcade` integration branch: + * reset to upstream/main, then cherry-pick each patch tip in patches.json order. + * + * Bootstrap (scripts may not be on current checkout): + * git fetch origin upstream + * git checkout patch/arcade-tooling + * node scripts/arcade/rebuild.mjs --yes + * + * On conflict: script aborts and names the failing patch — rebase that + * patch/* onto upstream/main, then re-run. + * + * Usage: + * node scripts/arcade/rebuild.mjs --yes + * node scripts/arcade/rebuild.mjs --yes --push + * node scripts/arcade/rebuild.mjs --dry-run + */ + +import { execFileSync } from "node:child_process"; +import { readFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), "../.."); +const MANIFEST_PATH = join(dirname(fileURLToPath(import.meta.url)), "patches.json"); + +const args = new Set(process.argv.slice(2)); +const dryRun = args.has("--dry-run"); +const push = args.has("--push"); +const yes = args.has("--yes"); + +function git(gitArgs, opts = {}) { + return execFileSync("git", gitArgs, { + cwd: ROOT, + encoding: "utf8", + stdio: opts.stdio ?? ["ignore", "pipe", "pipe"], + ...opts, + }).trim(); +} + +function gitOk(gitArgs) { + try { + git(gitArgs); + return true; + } catch { + return false; + } +} + +function die(message, code = 1) { + console.error(message); + process.exit(code); +} + +const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8")); +const upstream = manifest.upstream; +const branch = manifest.integrationBranch; +const patches = manifest.patches; + +if (!Array.isArray(patches) || patches.length === 0) { + die("patches.json: patches must be a non-empty array"); +} + +if (!yes && !dryRun) { + die("Refusing to reset arcade without --yes (or pass --dry-run)."); +} + +const status = git(["status", "--porcelain"]); +if (status) { + die(`Working tree dirty:\n${status}`); +} + +if (!gitOk(["rev-parse", "--verify", upstream])) { + die(`Missing ${upstream}. Run: git fetch upstream`); +} + +for (const patch of patches) { + if (!gitOk(["rev-parse", "--verify", patch])) { + die(`Missing patch ref ${patch}. Fetch or create it before rebuilding.`); + } +} + +const upstreamSha = git(["rev-parse", upstream]); +console.log(`upstream: ${upstream} @ ${upstreamSha.slice(0, 12)}`); +console.log(`branch: ${branch}`); +console.log(`patches: ${patches.length}`); +for (const patch of patches) { + const tip = git(["rev-parse", patch]); + const commits = git(["rev-list", "--reverse", `${upstream}..${patch}`]) + .split("\n") + .filter(Boolean); + console.log( + ` - ${patch} (${commits.length} commit${commits.length === 1 ? "" : "s"} @ ${tip.slice(0, 12)})`, + ); + if (commits.length === 0) { + console.warn( + ` warn: no commits in ${upstream}..${patch} — already in upstream or empty; will skip`, + ); + } +} + +if (dryRun) { + console.log("dry-run: no refs updated"); + process.exit(0); +} + +git(["checkout", "-B", branch, upstream]); +console.log(`reset ${branch} → ${upstream}`); + +for (const patch of patches) { + const commits = git(["rev-list", "--reverse", `${upstream}..${patch}`]) + .split("\n") + .filter(Boolean); + if (commits.length === 0) { + console.log(`skip ${patch} (empty range)`); + continue; + } + + console.log(`cherry-pick ${patch} (${commits.length})`); + try { + execFileSync("git", ["cherry-pick", ...commits], { + cwd: ROOT, + encoding: "utf8", + stdio: "inherit", + }); + } catch { + console.error(`\nConflict while cherry-picking ${patch}.`); + console.error(`Fix that patch branch onto ${upstream}, then re-run:`); + console.error(` git checkout ${patch}`); + console.error(` git rebase ${upstream}`); + console.error(` # resolve, then:`); + console.error(` git checkout patch/arcade-tooling`); + console.error(` node scripts/arcade/rebuild.mjs --yes`); + console.error(`\nAborting cherry-pick and leaving ${branch} mid-rebuild.`); + try { + execFileSync("git", ["cherry-pick", "--abort"], { cwd: ROOT, stdio: "inherit" }); + } catch { + // already aborted or nothing to abort + } + process.exit(1); + } +} + +const tip = git(["rev-parse", "HEAD"]); +console.log(`\n${branch} tip: ${tip}`); +console.log(`commits on ${branch} not in ${upstream}:`); +console.log(git(["log", "--oneline", `${upstream}..HEAD`]) || "(none)"); + +if (push) { + execFileSync("git", ["push", "--force-with-lease", "origin", branch], { + cwd: ROOT, + stdio: "inherit", + }); + console.log(`pushed origin/${branch}`); +} else { + console.log(`\nPush when ready:\n git push --force-with-lease origin ${branch}`); +} From 4bbef995dfcf0bb802198b31a75254cb845a7a0d Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 17 Aug 2026 11:48:59 -0700 Subject: [PATCH 02/39] fix(arcade): pin Release publish to origin repo and enable pnpm gh repo view followed upstream; verify:packed-manifests needs pnpm via corepack. --- scripts/arcade/publish-release.mjs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/scripts/arcade/publish-release.mjs b/scripts/arcade/publish-release.mjs index 2947b703176..c712ad660eb 100755 --- a/scripts/arcade/publish-release.mjs +++ b/scripts/arcade/publish-release.mjs @@ -49,6 +49,14 @@ function die(message, code = 1) { process.exit(code); } +/** Prefer origin (ArcadeHQ/hyperframes-next), never gh's upstream-linked default. */ +function resolveOriginRepo() { + const url = run("git", ["remote", "get-url", "origin"]); + const m = url.match(/github\.com[:/]([^/]+\/[^/.]+)(?:\.git)?$/); + if (!m) throw new Error(`Cannot parse GitHub repo from origin: ${url}`); + return m[1]; +} + const args = parseArgs(process.argv.slice(2)); const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8")); const packPackages = manifest.packPackages; @@ -71,13 +79,17 @@ if (headBranch !== args.ref && !args.dryRun) { const version = JSON.parse(readFileSync(join(ROOT, "packages/core/package.json"), "utf8")).version; if (!version) die("packages/core/package.json missing version"); +const repo = args.repo || resolveOriginRepo(); + let tag = args.tag; if (!tag) { let n = 1; while (true) { const candidate = `v${version}-arcade.${n}`; try { - run("gh", ["release", "view", candidate], { stdio: ["ignore", "ignore", "ignore"] }); + run("gh", ["release", "view", candidate, "--repo", repo], { + stdio: ["ignore", "ignore", "ignore"], + }); n += 1; } catch { tag = candidate; @@ -90,10 +102,6 @@ if (!/^v\d+\.\d+\.\d+.*-arcade\.\d+$/.test(tag)) { die(`Tag must look like v${version}-arcade.N (got ${tag})`); } -const repo = - args.repo || - run("gh", ["repo", "view", "--json", "nameWithOwner", "-q", ".nameWithOwner"]); - console.log(`ref: ${args.ref}`); console.log(`version: ${version}`); console.log(`tag: ${tag}`); @@ -108,6 +116,9 @@ if (args.dryRun) { console.log("\ninstall + build…"); run("bun", ["install", "--frozen-lockfile"], { stdio: "inherit" }); run("bun", ["run", "build"], { stdio: "inherit" }); +// verify-packed-manifests shells out to pnpm pack (same as upstream publish.yml). +run("corepack", ["enable"], { stdio: "inherit" }); +run("corepack", ["prepare", "pnpm@10.17.1", "--activate"], { stdio: "inherit" }); run("bun", ["run", "verify:packed-manifests"], { stdio: "inherit" }); const packDir = mkdtempSync(join(tmpdir(), "hf-arcade-pack-")); From 69f414189ff966a3132bd3fa40f8613c1d61b6e5 Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 18 Aug 2026 13:19:34 -0700 Subject: [PATCH 03/39] chore(arcade): include clamp-embedded-media in rebuild manifest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Port of a private-fork fix — probeStage must not extend scene media windows to full source duration. --- scripts/arcade/patches.json | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 786e333a015..d25a1208fff 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -5,6 +5,7 @@ "patch/arcade-tooling", "patch/visibility-scrub", "patch/video-source", + "patch/clamp-embedded-media", "patch/playback-start-nested", "patch/data-start-idref", "patch/player-xss" From acb88d151e7ee67832e07bb9d128176d3ec59482 Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 18 Aug 2026 13:27:48 -0700 Subject: [PATCH 04/39] chore(arcade): track upstream issue/PR links in patches.json Document keepLocal / issue / pr / upstreamPr per patch; rebuild still only uses branch. --- scripts/arcade/README.md | 9 +++++++++ scripts/arcade/patches.json | 35 ++++++++++++++++++++++++++++------- scripts/arcade/rebuild.mjs | 9 ++++++--- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/scripts/arcade/README.md b/scripts/arcade/README.md index c8ef795d4df..8f8127d7d10 100644 --- a/scripts/arcade/README.md +++ b/scripts/arcade/README.md @@ -24,6 +24,15 @@ Conflict → abort names the patch. Rebase that `patch/*` onto `upstream/main`, When an upstream PR merges, delete its row from `patches.json` (and optionally the branch). +Each `patches` entry is `{ branch, issue?, pr?, upstreamPr?, keepLocal? }`: + +| Field | Meaning | +| ------------ | ------------------------------------------------- | +| `issue` | Upstream issue we filed | +| `pr` | Our PR (usually from this `patch/*` branch) | +| `upstreamPr` | Their PR fixing our issue (when not `pr`) | +| `keepLocal` | `true` — intentional Arcade-only; do not upstream | + ## Publish GitHub Release tarballs Does **not** `npm publish`. Packs `packPackages` from `patches.json` and attaches `.tgz` to a prerelease. diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index d25a1208fff..08d6af487f2 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -2,13 +2,34 @@ "upstream": "upstream/main", "integrationBranch": "arcade", "patches": [ - "patch/arcade-tooling", - "patch/visibility-scrub", - "patch/video-source", - "patch/clamp-embedded-media", - "patch/playback-start-nested", - "patch/data-start-idref", - "patch/player-xss" + { + "branch": "patch/arcade-tooling", + "keepLocal": true + }, + { + "branch": "patch/visibility-scrub", + "pr": "https://github.com/heygen-com/hyperframes/pull/3233" + }, + { + "branch": "patch/video-source", + "pr": "https://github.com/heygen-com/hyperframes/pull/3238" + }, + { + "branch": "patch/clamp-embedded-media" + }, + { + "branch": "patch/playback-start-nested", + "issue": "https://github.com/heygen-com/hyperframes/issues/3245", + "upstreamPr": "https://github.com/heygen-com/hyperframes/pull/3246" + }, + { + "branch": "patch/data-start-idref", + "pr": "https://github.com/heygen-com/hyperframes/pull/3252" + }, + { + "branch": "patch/player-xss", + "keepLocal": true + } ], "packPackages": ["parsers", "lint", "studio-server", "core", "player"] } diff --git a/scripts/arcade/rebuild.mjs b/scripts/arcade/rebuild.mjs index 417f972c212..fa0b7553401 100755 --- a/scripts/arcade/rebuild.mjs +++ b/scripts/arcade/rebuild.mjs @@ -56,11 +56,14 @@ function die(message, code = 1) { const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8")); const upstream = manifest.upstream; const branch = manifest.integrationBranch; -const patches = manifest.patches; - -if (!Array.isArray(patches) || patches.length === 0) { +if (!Array.isArray(manifest.patches) || manifest.patches.length === 0) { die("patches.json: patches must be a non-empty array"); } +const patches = manifest.patches.map((p) => { + if (typeof p === "string") return p; + if (p && typeof p.branch === "string") return p.branch; + die("patches.json: each patch must be a string or { branch }"); +}); if (!yes && !dryRun) { die("Refusing to reset arcade without --yes (or pass --dry-run)."); From f3db36b4cc693840e4d68ea5dd0c0f4753d63465 Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 18 Aug 2026 14:08:24 -0700 Subject: [PATCH 05/39] chore(arcade): link clamp-embedded-media to upstream #3331 / #3332 --- scripts/arcade/patches.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 08d6af487f2..d3a8229379f 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -15,7 +15,9 @@ "pr": "https://github.com/heygen-com/hyperframes/pull/3238" }, { - "branch": "patch/clamp-embedded-media" + "branch": "patch/clamp-embedded-media", + "issue": "https://github.com/heygen-com/hyperframes/issues/3331", + "pr": "https://github.com/heygen-com/hyperframes/pull/3332" }, { "branch": "patch/playback-start-nested", From 06a5f47ece3d5808b596f2ad60755628861adf58 Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 18 Aug 2026 14:35:20 -0700 Subject: [PATCH 06/39] chore(arcade): include host-window-bare-video in rebuild manifest --- scripts/arcade/patches.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index d3a8229379f..821fa432faf 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -19,6 +19,9 @@ "issue": "https://github.com/heygen-com/hyperframes/issues/3331", "pr": "https://github.com/heygen-com/hyperframes/pull/3332" }, + { + "branch": "patch/host-window-bare-video" + }, { "branch": "patch/playback-start-nested", "issue": "https://github.com/heygen-com/hyperframes/issues/3245", From cdc7eeaa420baf0bcb59668e9508113f9a026271 Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 18 Aug 2026 14:37:06 -0700 Subject: [PATCH 07/39] chore(arcade): drop clamp-embedded-media from rebuild (superseded) host-window-bare-video's probe reconcile never-extends and also preserves source-derived host bounds, so the clamp-only cherry-pick conflicts and is redundant on arcade until upstream #3332 merges. --- scripts/arcade/patches.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 821fa432faf..58016944708 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -14,11 +14,6 @@ "branch": "patch/video-source", "pr": "https://github.com/heygen-com/hyperframes/pull/3238" }, - { - "branch": "patch/clamp-embedded-media", - "issue": "https://github.com/heygen-com/hyperframes/issues/3331", - "pr": "https://github.com/heygen-com/hyperframes/pull/3332" - }, { "branch": "patch/host-window-bare-video" }, From 5e858005528af569c8e4864453e3e7d7046a77de Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 18 Aug 2026 16:46:46 -0700 Subject: [PATCH 08/39] chore(arcade): link host-window-bare-video to upstream #3335 --- scripts/arcade/patches.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 58016944708..3e94cb236e7 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -15,7 +15,8 @@ "pr": "https://github.com/heygen-com/hyperframes/pull/3238" }, { - "branch": "patch/host-window-bare-video" + "branch": "patch/host-window-bare-video", + "issue": "https://github.com/heygen-com/hyperframes/issues/3335" }, { "branch": "patch/playback-start-nested", From 4493d2bf191d7ab18074130663412a03011346db Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 19 Aug 2026 10:23:04 -0700 Subject: [PATCH 09/39] chore(arcade): include probe-seek-swallow in rebuild manifest Keep-local: old published comps with GSAP className-on-SVG. --- scripts/arcade/patches.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 3e94cb236e7..eafb984506b 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -30,6 +30,10 @@ { "branch": "patch/player-xss", "keepLocal": true + }, + { + "branch": "patch/probe-seek-swallow", + "keepLocal": true } ], "packPackages": ["parsers", "lint", "studio-server", "core", "player"] From ca8a0ab0a4668559a26b55abc110fad3671559c8 Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 19 Aug 2026 11:42:08 -0700 Subject: [PATCH 10/39] chore(arcade): include jump-seek-css-settle in rebuild manifest Keep-local. Lands on arcade at next rebuild. --- scripts/arcade/patches.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index eafb984506b..2ca32eaa3c5 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -34,6 +34,10 @@ { "branch": "patch/probe-seek-swallow", "keepLocal": true + }, + { + "branch": "patch/jump-seek-css-settle", + "keepLocal": true } ], "packPackages": ["parsers", "lint", "studio-server", "core", "player"] From ee9c6f1566df4a0292080822a4884f9c28f6d4c9 Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 19 Aug 2026 15:12:22 -0700 Subject: [PATCH 11/39] chore(arcade): drop host-window-bare-video from rebuild (already on tip) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arcade wizard HTML omits data-start on in-scene video. Upstream ≥0.7.9 holdLastFrame already holds that shape in preview and render. --- scripts/arcade/patches.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 2ca32eaa3c5..627944e7e40 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -14,10 +14,6 @@ "branch": "patch/video-source", "pr": "https://github.com/heygen-com/hyperframes/pull/3238" }, - { - "branch": "patch/host-window-bare-video", - "issue": "https://github.com/heygen-com/hyperframes/issues/3335" - }, { "branch": "patch/playback-start-nested", "issue": "https://github.com/heygen-com/hyperframes/issues/3245", From 21546b7e4ad03d71cffa5852e6a619638151b8d8 Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 19 Aug 2026 20:25:12 -0700 Subject: [PATCH 12/39] chore(arcade): link visibility-scrub to upstream #3360 --- scripts/arcade/patches.json | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 627944e7e40..38c6a117030 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -8,6 +8,7 @@ }, { "branch": "patch/visibility-scrub", + "issue": "https://github.com/heygen-com/hyperframes/issues/3360", "pr": "https://github.com/heygen-com/hyperframes/pull/3233" }, { From 05e56431a03dc426292d8407311377e8ef7c9bb9 Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 19 Aug 2026 20:27:35 -0700 Subject: [PATCH 13/39] chore(arcade): link data-start-idref to upstream #3361 --- scripts/arcade/patches.json | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 38c6a117030..12e42c6d514 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -22,6 +22,7 @@ }, { "branch": "patch/data-start-idref", + "issue": "https://github.com/heygen-com/hyperframes/issues/3361", "pr": "https://github.com/heygen-com/hyperframes/pull/3252" }, { From 3ab11853995d58b45519e58b602f60df048ac9ed Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 24 Aug 2026 11:47:07 -0700 Subject: [PATCH 14/39] chore(arcade): drop visibility-scrub from rebuild (merged upstream #3233) --- scripts/arcade/patches.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 12e42c6d514..06dbf0f390b 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -6,11 +6,6 @@ "branch": "patch/arcade-tooling", "keepLocal": true }, - { - "branch": "patch/visibility-scrub", - "issue": "https://github.com/heygen-com/hyperframes/issues/3360", - "pr": "https://github.com/heygen-com/hyperframes/pull/3233" - }, { "branch": "patch/video-source", "pr": "https://github.com/heygen-com/hyperframes/pull/3238" From e292031f1cce72e1c822c29374ae94d9f8ec837a Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 26 Aug 2026 10:54:41 -0700 Subject: [PATCH 15/39] chore(arcade): drop data-start-idref from rebuild (merged upstream #3252) --- scripts/arcade/patches.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 06dbf0f390b..c5d63f6698c 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -15,11 +15,6 @@ "issue": "https://github.com/heygen-com/hyperframes/issues/3245", "upstreamPr": "https://github.com/heygen-com/hyperframes/pull/3246" }, - { - "branch": "patch/data-start-idref", - "issue": "https://github.com/heygen-com/hyperframes/issues/3361", - "pr": "https://github.com/heygen-com/hyperframes/pull/3252" - }, { "branch": "patch/player-xss", "keepLocal": true From f9339134ba40107d2b784348a27edc6523ed6630 Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 26 Aug 2026 13:43:57 -0700 Subject: [PATCH 16/39] chore(arcade): drop video-source from rebuild (merged upstream #3238) --- scripts/arcade/patches.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index c5d63f6698c..b9552ff3142 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -6,10 +6,6 @@ "branch": "patch/arcade-tooling", "keepLocal": true }, - { - "branch": "patch/video-source", - "pr": "https://github.com/heygen-com/hyperframes/pull/3238" - }, { "branch": "patch/playback-start-nested", "issue": "https://github.com/heygen-com/hyperframes/issues/3245", From f32b960dfcf1c8f0ffbeecfc24298b793582471e Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 26 Aug 2026 15:48:14 -0700 Subject: [PATCH 17/39] chore(arcade): include runtime-src-duplicate-ids in rebuild manifest --- scripts/arcade/patches.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index b9552ff3142..7f258a75d9b 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -22,6 +22,9 @@ { "branch": "patch/jump-seek-css-settle", "keepLocal": true + }, + { + "branch": "patch/runtime-src-duplicate-ids" } ], "packPackages": ["parsers", "lint", "studio-server", "core", "player"] From 39641cb9cfbc3f7b31c6be3ac1633dcc043f8be6 Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 31 Aug 2026 10:37:59 -0700 Subject: [PATCH 18/39] chore(arcade): drop runtime-src-duplicate-ids from rebuild (merged upstream #3513) --- scripts/arcade/patches.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 7f258a75d9b..b9552ff3142 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -22,9 +22,6 @@ { "branch": "patch/jump-seek-css-settle", "keepLocal": true - }, - { - "branch": "patch/runtime-src-duplicate-ids" } ], "packPackages": ["parsers", "lint", "studio-server", "core", "player"] From 8c3a45f9fd7f6b8b8dd7cbbd627a418987eb4ca7 Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 31 Aug 2026 10:57:55 -0700 Subject: [PATCH 19/39] chore(arcade): drop player-xss from rebuild (preexisting upstream #3472) --- scripts/arcade/patches.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index b9552ff3142..d1339312708 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -11,10 +11,6 @@ "issue": "https://github.com/heygen-com/hyperframes/issues/3245", "upstreamPr": "https://github.com/heygen-com/hyperframes/pull/3246" }, - { - "branch": "patch/player-xss", - "keepLocal": true - }, { "branch": "patch/probe-seek-swallow", "keepLocal": true From 5ae79d4688fd9bfcb431045c42267a1fc491b617 Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 31 Aug 2026 13:52:55 -0700 Subject: [PATCH 20/39] fix(arcade): pack GitHub Release tarballs with pnpm, not npm npm pack leaves workspace:* and skips publishConfig.exports, so Arcade was pinning the workspace manifests the verify gate never ships. --- scripts/arcade/README.md | 2 +- scripts/arcade/publish-release.mjs | 85 ++++++++++++++++++------------ 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/scripts/arcade/README.md b/scripts/arcade/README.md index 8f8127d7d10..04c004d477d 100644 --- a/scripts/arcade/README.md +++ b/scripts/arcade/README.md @@ -44,4 +44,4 @@ node scripts/arcade/publish-release.mjs --tag v0.7.107-arcade.1 --yes node scripts/arcade/publish-release.mjs --dry-run ``` -Pin every `@hyperframes/*` Arcade resolves to the printed Release asset URLs (packed manifests rewrite `workspace:*` → semver, which would otherwise hit public npm). +Pin every `@hyperframes/*` Arcade resolves to the printed Release asset URLs. Packs with `pnpm pack` (same as `verify:packed-manifests`): rewrites `workspace:*` → semver and applies `publishConfig` so exports/types point at `dist/`. Re-run with `--tag vX.Y.Z-arcade.N` to replace assets on an existing release. diff --git a/scripts/arcade/publish-release.mjs b/scripts/arcade/publish-release.mjs index c712ad660eb..a9629cf4a19 100755 --- a/scripts/arcade/publish-release.mjs +++ b/scripts/arcade/publish-release.mjs @@ -57,6 +57,17 @@ function resolveOriginRepo() { return m[1]; } +function releaseExists(tag, repo) { + try { + run("gh", ["release", "view", tag, "--repo", repo], { + stdio: ["ignore", "ignore", "ignore"], + }); + return true; + } catch { + return false; + } +} + const args = parseArgs(process.argv.slice(2)); const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8")); const packPackages = manifest.packPackages; @@ -84,18 +95,8 @@ const repo = args.repo || resolveOriginRepo(); let tag = args.tag; if (!tag) { let n = 1; - while (true) { - const candidate = `v${version}-arcade.${n}`; - try { - run("gh", ["release", "view", candidate, "--repo", repo], { - stdio: ["ignore", "ignore", "ignore"], - }); - n += 1; - } catch { - tag = candidate; - break; - } - } + while (releaseExists(`v${version}-arcade.${n}`, repo)) n += 1; + tag = `v${version}-arcade.${n}`; } if (!/^v\d+\.\d+\.\d+.*-arcade\.\d+$/.test(tag)) { @@ -109,14 +110,16 @@ console.log(`repo: ${repo}`); console.log(`packages: ${packPackages.join(", ")}`); if (args.dryRun) { - console.log("dry-run: would build, pack, and gh release create"); + console.log("dry-run: would build, pnpm pack, and gh release create/upload"); process.exit(0); } console.log("\ninstall + build…"); run("bun", ["install", "--frozen-lockfile"], { stdio: "inherit" }); run("bun", ["run", "build"], { stdio: "inherit" }); -// verify-packed-manifests shells out to pnpm pack (same as upstream publish.yml). +// Same packer as verify-packed-manifests / upstream publish.yml: pnpm rewrites +// workspace:* → the package version and applies publishConfig (exports/types → dist/). +// npm pack does neither, so shipping those tarballs would pin workspace package.json. run("corepack", ["enable"], { stdio: "inherit" }); run("corepack", ["prepare", "pnpm@10.17.1", "--activate"], { stdio: "inherit" }); run("bun", ["run", "verify:packed-manifests"], { stdio: "inherit" }); @@ -127,8 +130,8 @@ mkdirSync(packDir, { recursive: true }); try { for (const name of packPackages) { const pkgDir = join(ROOT, "packages", name); - console.log(`npm pack @hyperframes/${name}`); - run("npm", ["pack", "--pack-destination", packDir], { cwd: pkgDir, stdio: "inherit" }); + console.log(`pnpm pack @hyperframes/${name}`); + run("pnpm", ["pack", "--pack-destination", packDir], { cwd: pkgDir, stdio: "inherit" }); } const tarballs = readdirSync(packDir) @@ -137,25 +140,37 @@ try { .sort(); if (tarballs.length === 0) die("No .tgz produced"); - console.log(`\ngh release create ${tag} (${tarballs.length} assets)`); - run( - "gh", - [ - "release", - "create", - tag, - "--repo", - repo, - "--title", - tag, - "--prerelease", - "--generate-notes", - "--target", - run("git", ["rev-parse", "HEAD"]), - ...tarballs, - ], - { stdio: "inherit" }, - ); + const head = run("git", ["rev-parse", "HEAD"]); + if (releaseExists(tag, repo)) { + if (!args.tag) die(`Release ${tag} already exists (auto-increment failed)`); + console.log(`\ngh release upload --clobber ${tag} (${tarballs.length} assets)`); + run("gh", ["release", "edit", tag, "--repo", repo, "--target", head], { + stdio: "inherit", + }); + run("gh", ["release", "upload", tag, "--repo", repo, "--clobber", ...tarballs], { + stdio: "inherit", + }); + } else { + console.log(`\ngh release create ${tag} (${tarballs.length} assets)`); + run( + "gh", + [ + "release", + "create", + tag, + "--repo", + repo, + "--title", + tag, + "--prerelease", + "--generate-notes", + "--target", + head, + ...tarballs, + ], + { stdio: "inherit" }, + ); + } const base = `https://github.com/${repo}/releases/download/${tag}`; console.log("\nArcade package.json pins:"); From 52da1d8f188a3e665a148404d1c0e3e44e3f2664 Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 31 Aug 2026 14:06:27 -0700 Subject: [PATCH 21/39] fix(arcade): keep arcade tracking origin/arcade after rebuild git checkout -B arcade upstream/main inherits that remote as upstream. --- scripts/arcade/rebuild.mjs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/arcade/rebuild.mjs b/scripts/arcade/rebuild.mjs index fa0b7553401..862313c1c65 100755 --- a/scripts/arcade/rebuild.mjs +++ b/scripts/arcade/rebuild.mjs @@ -109,6 +109,11 @@ if (dryRun) { } git(["checkout", "-B", branch, upstream]); +// -B from a remote-tracking start-point inherits that upstream (upstream/main). +// arcade is a fork integration branch — it should track origin/arcade. +if (gitOk(["rev-parse", "--verify", `origin/${branch}`])) { + git(["branch", "--set-upstream-to", `origin/${branch}`]); +} console.log(`reset ${branch} → ${upstream}`); for (const patch of patches) { @@ -155,6 +160,7 @@ if (push) { cwd: ROOT, stdio: "inherit", }); + git(["branch", "--set-upstream-to", `origin/${branch}`]); console.log(`pushed origin/${branch}`); } else { console.log(`\nPush when ready:\n git push --force-with-lease origin ${branch}`); From bb6b14afd2ca6ba1ac2c76976e89ce0be672c2dc Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 31 Aug 2026 16:54:28 -0700 Subject: [PATCH 22/39] chore(arcade): drop GitHub Release tarball publish Lint/player come from npm; IIFE and the Cloud Run image come from arcade. --- scripts/arcade/README.md | 13 -- scripts/arcade/patches.json | 3 +- scripts/arcade/publish-release.mjs | 185 ----------------------------- 3 files changed, 1 insertion(+), 200 deletions(-) delete mode 100755 scripts/arcade/publish-release.mjs diff --git a/scripts/arcade/README.md b/scripts/arcade/README.md index 04c004d477d..2477c2f5bfb 100644 --- a/scripts/arcade/README.md +++ b/scripts/arcade/README.md @@ -32,16 +32,3 @@ Each `patches` entry is `{ branch, issue?, pr?, upstreamPr?, keepLocal? }`: | `pr` | Our PR (usually from this `patch/*` branch) | | `upstreamPr` | Their PR fixing our issue (when not `pr`) | | `keepLocal` | `true` — intentional Arcade-only; do not upstream | - -## Publish GitHub Release tarballs - -Does **not** `npm publish`. Packs `packPackages` from `patches.json` and attaches `.tgz` to a prerelease. - -```bash -git checkout arcade # after rebuild -node scripts/arcade/publish-release.mjs --yes -node scripts/arcade/publish-release.mjs --tag v0.7.107-arcade.1 --yes -node scripts/arcade/publish-release.mjs --dry-run -``` - -Pin every `@hyperframes/*` Arcade resolves to the printed Release asset URLs. Packs with `pnpm pack` (same as `verify:packed-manifests`): rewrites `workspace:*` → semver and applies `publishConfig` so exports/types point at `dist/`. Re-run with `--tag vX.Y.Z-arcade.N` to replace assets on an existing release. diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index d1339312708..b4ace3f5712 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -19,6 +19,5 @@ "branch": "patch/jump-seek-css-settle", "keepLocal": true } - ], - "packPackages": ["parsers", "lint", "studio-server", "core", "player"] + ] } diff --git a/scripts/arcade/publish-release.mjs b/scripts/arcade/publish-release.mjs deleted file mode 100755 index a9629cf4a19..00000000000 --- a/scripts/arcade/publish-release.mjs +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env node -/** - * Pack @hyperframes packages and attach .tgz assets to a GitHub Release. - * Does NOT npm publish (public npm or GitHub Packages). - * - * Usage: - * node scripts/arcade/publish-release.mjs --yes - * node scripts/arcade/publish-release.mjs --tag v0.7.107-arcade.1 --yes - * node scripts/arcade/publish-release.mjs --dry-run - * - * Run on `arcade` (or pass --ref). Requires: bun, gh, clean tree. - */ - -import { execFileSync } from "node:child_process"; -import { mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync } from "node:fs"; -import { tmpdir } from "node:os"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; - -const ROOT = join(dirname(fileURLToPath(import.meta.url)), "../.."); -const MANIFEST_PATH = join(dirname(fileURLToPath(import.meta.url)), "patches.json"); - -function parseArgs(argv) { - const out = { yes: false, dryRun: false, tag: null, ref: "arcade", repo: null }; - for (let i = 0; i < argv.length; i++) { - const a = argv[i]; - if (a === "--yes") out.yes = true; - else if (a === "--dry-run") out.dryRun = true; - else if (a === "--tag") out.tag = argv[++i]; - else if (a === "--ref") out.ref = argv[++i]; - else if (a === "--repo") out.repo = argv[++i]; - else throw new Error(`Unknown arg: ${a}`); - } - return out; -} - -function run(cmd, cmdArgs, opts = {}) { - const result = execFileSync(cmd, cmdArgs, { - cwd: ROOT, - encoding: "utf8", - stdio: opts.stdio ?? ["ignore", "pipe", "pipe"], - ...opts, - }); - return (result ?? "").toString().trim(); -} - -function die(message, code = 1) { - console.error(message); - process.exit(code); -} - -/** Prefer origin (ArcadeHQ/hyperframes-next), never gh's upstream-linked default. */ -function resolveOriginRepo() { - const url = run("git", ["remote", "get-url", "origin"]); - const m = url.match(/github\.com[:/]([^/]+\/[^/.]+)(?:\.git)?$/); - if (!m) throw new Error(`Cannot parse GitHub repo from origin: ${url}`); - return m[1]; -} - -function releaseExists(tag, repo) { - try { - run("gh", ["release", "view", tag, "--repo", repo], { - stdio: ["ignore", "ignore", "ignore"], - }); - return true; - } catch { - return false; - } -} - -const args = parseArgs(process.argv.slice(2)); -const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8")); -const packPackages = manifest.packPackages; -if (!Array.isArray(packPackages) || packPackages.length === 0) { - die("patches.json: packPackages must be a non-empty array"); -} - -if (!args.yes && !args.dryRun) { - die("Refusing to publish without --yes (or pass --dry-run)."); -} - -const status = run("git", ["status", "--porcelain"]); -if (status) die(`Working tree dirty:\n${status}`); - -const headBranch = run("git", ["branch", "--show-current"]); -if (headBranch !== args.ref && !args.dryRun) { - die(`Check out ${args.ref} first (on ${headBranch || "detached"}). Or pass --ref.`); -} - -const version = JSON.parse(readFileSync(join(ROOT, "packages/core/package.json"), "utf8")).version; -if (!version) die("packages/core/package.json missing version"); - -const repo = args.repo || resolveOriginRepo(); - -let tag = args.tag; -if (!tag) { - let n = 1; - while (releaseExists(`v${version}-arcade.${n}`, repo)) n += 1; - tag = `v${version}-arcade.${n}`; -} - -if (!/^v\d+\.\d+\.\d+.*-arcade\.\d+$/.test(tag)) { - die(`Tag must look like v${version}-arcade.N (got ${tag})`); -} - -console.log(`ref: ${args.ref}`); -console.log(`version: ${version}`); -console.log(`tag: ${tag}`); -console.log(`repo: ${repo}`); -console.log(`packages: ${packPackages.join(", ")}`); - -if (args.dryRun) { - console.log("dry-run: would build, pnpm pack, and gh release create/upload"); - process.exit(0); -} - -console.log("\ninstall + build…"); -run("bun", ["install", "--frozen-lockfile"], { stdio: "inherit" }); -run("bun", ["run", "build"], { stdio: "inherit" }); -// Same packer as verify-packed-manifests / upstream publish.yml: pnpm rewrites -// workspace:* → the package version and applies publishConfig (exports/types → dist/). -// npm pack does neither, so shipping those tarballs would pin workspace package.json. -run("corepack", ["enable"], { stdio: "inherit" }); -run("corepack", ["prepare", "pnpm@10.17.1", "--activate"], { stdio: "inherit" }); -run("bun", ["run", "verify:packed-manifests"], { stdio: "inherit" }); - -const packDir = mkdtempSync(join(tmpdir(), "hf-arcade-pack-")); -mkdirSync(packDir, { recursive: true }); - -try { - for (const name of packPackages) { - const pkgDir = join(ROOT, "packages", name); - console.log(`pnpm pack @hyperframes/${name}`); - run("pnpm", ["pack", "--pack-destination", packDir], { cwd: pkgDir, stdio: "inherit" }); - } - - const tarballs = readdirSync(packDir) - .filter((f) => f.endsWith(".tgz")) - .map((f) => join(packDir, f)) - .sort(); - if (tarballs.length === 0) die("No .tgz produced"); - - const head = run("git", ["rev-parse", "HEAD"]); - if (releaseExists(tag, repo)) { - if (!args.tag) die(`Release ${tag} already exists (auto-increment failed)`); - console.log(`\ngh release upload --clobber ${tag} (${tarballs.length} assets)`); - run("gh", ["release", "edit", tag, "--repo", repo, "--target", head], { - stdio: "inherit", - }); - run("gh", ["release", "upload", tag, "--repo", repo, "--clobber", ...tarballs], { - stdio: "inherit", - }); - } else { - console.log(`\ngh release create ${tag} (${tarballs.length} assets)`); - run( - "gh", - [ - "release", - "create", - tag, - "--repo", - repo, - "--title", - tag, - "--prerelease", - "--generate-notes", - "--target", - head, - ...tarballs, - ], - { stdio: "inherit" }, - ); - } - - const base = `https://github.com/${repo}/releases/download/${tag}`; - console.log("\nArcade package.json pins:"); - for (const file of tarballs.map((p) => p.split(/[/\\]/).pop())) { - const npmName = file - .replace(/-\d+\.\d+\.\d+.*\.tgz$/, "") - .replace(/^hyperframes-/, "@hyperframes/"); - console.log(` "${npmName}": "${base}/${file}",`); - } -} finally { - rmSync(packDir, { recursive: true, force: true }); -} From 9639121a0bd4757cee08affc3e3175569821002a Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 1 Sep 2026 18:20:00 -0700 Subject: [PATCH 23/39] chore(arcade): include discover-host-window in rebuild manifest Keep-local mapper for JS-src nested videos. Do not upstream. --- scripts/arcade/patches.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index b4ace3f5712..242033d62bc 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -18,6 +18,10 @@ { "branch": "patch/jump-seek-css-settle", "keepLocal": true + }, + { + "branch": "patch/discover-host-window", + "keepLocal": true } ] } From 63a03a95f7b3578b9f4dc154e3179221bc88cb0a Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 2 Sep 2026 14:15:45 -0700 Subject: [PATCH 24/39] chore(arcade): include discover-video-opacity in rebuild manifest --- scripts/arcade/patches.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 242033d62bc..c2a58cc2ea8 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -22,6 +22,10 @@ { "branch": "patch/discover-host-window", "keepLocal": true + }, + { + "branch": "patch/discover-video-opacity", + "keepLocal": true } ] } From be2ef226f450805182acf125bd859d7ad326143e Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 2 Sep 2026 15:10:59 -0700 Subject: [PATCH 25/39] feat(arcade): let rebuild pin the integration base Default arcade to local main (v0.8.21). Override with --base upstream/main. --- scripts/arcade/README.md | 19 ++++++------- scripts/arcade/patches.json | 1 + scripts/arcade/rebuild.mjs | 53 ++++++++++++++++++++++++------------- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/scripts/arcade/README.md b/scripts/arcade/README.md index 2477c2f5bfb..e2be2458871 100644 --- a/scripts/arcade/README.md +++ b/scripts/arcade/README.md @@ -4,23 +4,24 @@ Public fork of Heygen Hyperframes with Arcade keep-local / pending-contrib patch ## Branches -| Branch | Role | -| ---------------------- | -------------------------------------------------------------------------- | -| `main` | Upstream mirror only — no Arcade commits | -| `patch/` | One patch; open upstream PRs from these | -| `arcade` | Disposable integration: `upstream/main` + cherry-picks from `patches.json` | -| `patch/arcade-tooling` | This tooling (first entry in the manifest; never upstreamed) | +| Branch | Role | +| ---------------------- | ------------------------------------------------------------------------------------ | +| `main` | Upstream mirror only — no Arcade commits | +| `patch/` | One patch; open upstream PRs from these | +| `arcade` | Disposable integration: `base` (`main` / v0.8.21) + cherry-picks from `patches.json` | +| `patch/arcade-tooling` | This tooling (first entry in the manifest; never upstreamed) | ## Rebuild `arcade` ```bash git fetch origin upstream git checkout patch/arcade-tooling -node scripts/arcade/rebuild.mjs --yes # local only -node scripts/arcade/rebuild.mjs --yes --push # force-with-lease origin/arcade +node scripts/arcade/rebuild.mjs --yes # onto patches.json `base` (main) +node scripts/arcade/rebuild.mjs --yes --base upstream/main # onto latest upstream +node scripts/arcade/rebuild.mjs --yes --push # force-with-lease origin/arcade ``` -Conflict → abort names the patch. Rebase that `patch/*` onto `upstream/main`, then re-run. +Conflict → abort names the patch. Rebase that `patch/*` onto the same `base`, then re-run. When an upstream PR merges, delete its row from `patches.json` (and optionally the branch). diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index c2a58cc2ea8..970287001b9 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -1,5 +1,6 @@ { "upstream": "upstream/main", + "base": "main", "integrationBranch": "arcade", "patches": [ { diff --git a/scripts/arcade/rebuild.mjs b/scripts/arcade/rebuild.mjs index 862313c1c65..be03917f273 100755 --- a/scripts/arcade/rebuild.mjs +++ b/scripts/arcade/rebuild.mjs @@ -1,7 +1,8 @@ #!/usr/bin/env node /** * Rebuild the disposable `arcade` integration branch: - * reset to upstream/main, then cherry-pick each patch tip in patches.json order. + * reset to `base` (--base, else patches.json `base`, else `upstream`), then cherry-pick + * each patch tip in patches.json order. * * Bootstrap (scripts may not be on current checkout): * git fetch origin upstream @@ -9,10 +10,12 @@ * node scripts/arcade/rebuild.mjs --yes * * On conflict: script aborts and names the failing patch — rebase that - * patch/* onto upstream/main, then re-run. + * patch/* onto the same base, then re-run. * * Usage: * node scripts/arcade/rebuild.mjs --yes + * node scripts/arcade/rebuild.mjs --yes --base main + * node scripts/arcade/rebuild.mjs --yes --base upstream/main * node scripts/arcade/rebuild.mjs --yes --push * node scripts/arcade/rebuild.mjs --dry-run */ @@ -25,11 +28,20 @@ import { fileURLToPath } from "node:url"; const ROOT = join(dirname(fileURLToPath(import.meta.url)), "../.."); const MANIFEST_PATH = join(dirname(fileURLToPath(import.meta.url)), "patches.json"); -const args = new Set(process.argv.slice(2)); +const argv = process.argv.slice(2); +const args = new Set(argv); const dryRun = args.has("--dry-run"); const push = args.has("--push"); const yes = args.has("--yes"); +function takeArg(name) { + const i = argv.indexOf(name); + if (i === -1) return null; + const value = argv[i + 1]; + if (!value || value.startsWith("-")) die(`${name} requires a git ref`); + return value; +} + function git(gitArgs, opts = {}) { return execFileSync("git", gitArgs, { cwd: ROOT, @@ -54,8 +66,10 @@ function die(message, code = 1) { } const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8")); -const upstream = manifest.upstream; +const upstream = typeof manifest.upstream === "string" ? manifest.upstream : null; +const base = takeArg("--base") || (typeof manifest.base === "string" ? manifest.base : null) || upstream; const branch = manifest.integrationBranch; +if (!base) die("patches.json: set base or upstream, or pass --base "); if (!Array.isArray(manifest.patches) || manifest.patches.length === 0) { die("patches.json: patches must be a non-empty array"); } @@ -74,8 +88,8 @@ if (status) { die(`Working tree dirty:\n${status}`); } -if (!gitOk(["rev-parse", "--verify", upstream])) { - die(`Missing ${upstream}. Run: git fetch upstream`); +if (!gitOk(["rev-parse", "--verify", base])) { + die(`Missing ${base}. Run: git fetch origin upstream`); } for (const patch of patches) { @@ -84,13 +98,16 @@ for (const patch of patches) { } } -const upstreamSha = git(["rev-parse", upstream]); -console.log(`upstream: ${upstream} @ ${upstreamSha.slice(0, 12)}`); +const baseSha = git(["rev-parse", base]); +console.log(`base: ${base} @ ${baseSha.slice(0, 12)}`); +if (upstream && upstream !== base && gitOk(["rev-parse", "--verify", upstream])) { + console.log(`upstream: ${upstream} @ ${git(["rev-parse", upstream]).slice(0, 12)}`); +} console.log(`branch: ${branch}`); console.log(`patches: ${patches.length}`); for (const patch of patches) { const tip = git(["rev-parse", patch]); - const commits = git(["rev-list", "--reverse", `${upstream}..${patch}`]) + const commits = git(["rev-list", "--reverse", `${base}..${patch}`]) .split("\n") .filter(Boolean); console.log( @@ -98,7 +115,7 @@ for (const patch of patches) { ); if (commits.length === 0) { console.warn( - ` warn: no commits in ${upstream}..${patch} — already in upstream or empty; will skip`, + ` warn: no commits in ${base}..${patch} — already in base or empty; will skip`, ); } } @@ -108,16 +125,16 @@ if (dryRun) { process.exit(0); } -git(["checkout", "-B", branch, upstream]); -// -B from a remote-tracking start-point inherits that upstream (upstream/main). +git(["checkout", "-B", branch, base]); +// -B from a remote-tracking start-point inherits that upstream. // arcade is a fork integration branch — it should track origin/arcade. if (gitOk(["rev-parse", "--verify", `origin/${branch}`])) { git(["branch", "--set-upstream-to", `origin/${branch}`]); } -console.log(`reset ${branch} → ${upstream}`); +console.log(`reset ${branch} → ${base}`); for (const patch of patches) { - const commits = git(["rev-list", "--reverse", `${upstream}..${patch}`]) + const commits = git(["rev-list", "--reverse", `${base}..${patch}`]) .split("\n") .filter(Boolean); if (commits.length === 0) { @@ -134,9 +151,9 @@ for (const patch of patches) { }); } catch { console.error(`\nConflict while cherry-picking ${patch}.`); - console.error(`Fix that patch branch onto ${upstream}, then re-run:`); + console.error(`Fix that patch branch onto ${base}, then re-run:`); console.error(` git checkout ${patch}`); - console.error(` git rebase ${upstream}`); + console.error(` git rebase ${base}`); console.error(` # resolve, then:`); console.error(` git checkout patch/arcade-tooling`); console.error(` node scripts/arcade/rebuild.mjs --yes`); @@ -152,8 +169,8 @@ for (const patch of patches) { const tip = git(["rev-parse", "HEAD"]); console.log(`\n${branch} tip: ${tip}`); -console.log(`commits on ${branch} not in ${upstream}:`); -console.log(git(["log", "--oneline", `${upstream}..HEAD`]) || "(none)"); +console.log(`commits on ${branch} not in ${base}:`); +console.log(git(["log", "--oneline", `${base}..HEAD`]) || "(none)"); if (push) { execFileSync("git", ["push", "--force-with-lease", "origin", branch], { From 93155d2aaf347ce480725a7b52b610ca42059c3b Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 2 Sep 2026 18:43:23 -0700 Subject: [PATCH 26/39] chore(arcade): include render-settle-pass in rebuild manifest Pending contrib: settle GSAP timelines before the first render seek. Upstream issue + PR to follow; no keepLocal. --- scripts/arcade/patches.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 970287001b9..9c456612ed2 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -27,6 +27,9 @@ { "branch": "patch/discover-video-opacity", "keepLocal": true + }, + { + "branch": "patch/render-settle-pass" } ] } From 588b8023ad7a0148164ecf629aa4c92b9ccaa2d6 Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 14 Sep 2026 13:54:28 -0700 Subject: [PATCH 27/39] docs(arcade): record sync tag layout after each rebuild --- scripts/arcade/README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/scripts/arcade/README.md b/scripts/arcade/README.md index e2be2458871..33bb4f325cc 100644 --- a/scripts/arcade/README.md +++ b/scripts/arcade/README.md @@ -8,7 +8,7 @@ Public fork of Heygen Hyperframes with Arcade keep-local / pending-contrib patch | ---------------------- | ------------------------------------------------------------------------------------ | | `main` | Upstream mirror only — no Arcade commits | | `patch/` | One patch; open upstream PRs from these | -| `arcade` | Disposable integration: `base` (`main` / v0.8.21) + cherry-picks from `patches.json` | +| `arcade` | Disposable integration: `base` (`main`) + cherry-picks from `patches.json` | | `patch/arcade-tooling` | This tooling (first entry in the manifest; never upstreamed) | ## Rebuild `arcade` @@ -23,6 +23,21 @@ node scripts/arcade/rebuild.mjs --yes --push # force-with-lease o Conflict → abort names the patch. Rebase that `patch/*` onto the same `base`, then re-run. +## Tags + +Version the delta against `main`, not a merge of `main` into the patch. After a rebuild, tag this date (`YYYY-MM-DD`): + +- `sync//base` → `main` +- `sync//` → each `patch/*` tip (`playback-start-nested`, not `patch/playback-start-nested`) +- `sync//arcade` → `arcade` + +``` +git range-diff sync/2026-09-09/base..sync/2026-09-09/playback-start-nested \ + sync//base..sync//playback-start-nested +``` + +Push `refs/tags/sync//*`. If `.tmp` is mid-rebase, tag last week's tips from a clean sibling checkout (`../hyperframes-next`), not from a dirty worktree. + When an upstream PR merges, delete its row from `patches.json` (and optionally the branch). Each `patches` entry is `{ branch, issue?, pr?, upstreamPr?, keepLocal? }`: From 83f04fd5e3eed17743c48f141c3a512603c1e21e Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 14 Sep 2026 14:09:59 -0700 Subject: [PATCH 28/39] docs(arcade): split shared hunks; do not resolve on arcade --- scripts/arcade/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/arcade/README.md b/scripts/arcade/README.md index 33bb4f325cc..d09b0c24bea 100644 --- a/scripts/arcade/README.md +++ b/scripts/arcade/README.md @@ -21,7 +21,9 @@ node scripts/arcade/rebuild.mjs --yes --base upstream/main # onto latest upstre node scripts/arcade/rebuild.mjs --yes --push # force-with-lease origin/arcade ``` -Conflict → abort names the patch. Rebase that `patch/*` onto the same `base`, then re-run. +Conflict → abort names the patch. Do not resolve on `arcade`. If the patch itself is clean on `main`, two patches share a hunk: keep them both on `main` and split the file (one owner, the other a new module). `createHostWindowMapper` is `packages/producer/src/services/hostWindowMapper.ts` so it does not rewrite `renderMediaCollector.ts`. If both must edit the same function, add a keep-local join patch. + +Rebase that `patch/*` onto the same `base` only when *that* patch failed on `main`, then re-run. ## Tags @@ -36,7 +38,7 @@ git range-diff sync/2026-09-09/base..sync/2026-09-09/playback-start-nested \ sync//base..sync//playback-start-nested ``` -Push `refs/tags/sync//*`. If `.tmp` is mid-rebase, tag last week's tips from a clean sibling checkout (`../hyperframes-next`), not from a dirty worktree. +Push `refs/tags/sync//*`. Do not move a tag already on origin. If `.tmp` is mid-rebase, tag last week's tips from a clean sibling checkout (`../hyperframes-next`), not from a dirty worktree. When an upstream PR merges, delete its row from `patches.json` (and optionally the branch). From 1631bda56019f9cb5c048bfb1dd7c40641b1377b Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 14 Sep 2026 19:14:31 -0700 Subject: [PATCH 29/39] chore(arcade): register patch/extract-hold-past-eof --- scripts/arcade/patches.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 9c456612ed2..e555584fefd 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -30,6 +30,9 @@ }, { "branch": "patch/render-settle-pass" + }, + { + "branch": "patch/extract-hold-past-eof" } ] } From aad3d116bc1523c169ca39a13f1e2c1cc31ee02e Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 15 Sep 2026 10:15:34 -0700 Subject: [PATCH 30/39] chore(arcade): keep patch/render-settle-pass local Upstream addressed the repeated-fromTo state leak with a lint (gsap_repeated_fromto_without_baseline, 0.8.32) and closed the render-side proposals, so this settle pass will not be upstreamed. It stays only until compositions authored before that lint have aged out. --- scripts/arcade/patches.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index e555584fefd..eaadcd59481 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -29,7 +29,8 @@ "keepLocal": true }, { - "branch": "patch/render-settle-pass" + "branch": "patch/render-settle-pass", + "keepLocal": true }, { "branch": "patch/extract-hold-past-eof" From 19d37895aa7768f18bd5e1e8fb5cb4e9d9141aec Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 15 Sep 2026 10:48:12 -0700 Subject: [PATCH 31/39] chore(arcade): link patch/extract-hold-past-eof to upstream #3958 / #3959 --- scripts/arcade/patches.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index eaadcd59481..b7db721c45d 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -33,7 +33,9 @@ "keepLocal": true }, { - "branch": "patch/extract-hold-past-eof" + "branch": "patch/extract-hold-past-eof", + "issue": "https://github.com/heygen-com/hyperframes/issues/3958", + "pr": "https://github.com/heygen-com/hyperframes/pull/3959" } ] } From f1bdfd1af0415d693e34f4710ed6e39ec4153769 Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 15 Sep 2026 11:01:38 -0700 Subject: [PATCH 32/39] chore(arcade): include host-duration-bound in rebuild manifest --- scripts/arcade/patches.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index b7db721c45d..0be53e129e8 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -7,6 +7,9 @@ "branch": "patch/arcade-tooling", "keepLocal": true }, + { + "branch": "patch/host-duration-bound" + }, { "branch": "patch/playback-start-nested", "issue": "https://github.com/heygen-com/hyperframes/issues/3245", From c667903077b18b43290d0b7f48d70a9b8f821490 Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 15 Sep 2026 12:54:31 -0700 Subject: [PATCH 33/39] chore(arcade): link host-duration-bound to upstream #3964 / #3965 --- scripts/arcade/patches.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 0be53e129e8..62d30a1863a 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -8,7 +8,9 @@ "keepLocal": true }, { - "branch": "patch/host-duration-bound" + "branch": "patch/host-duration-bound", + "issue": "https://github.com/heygen-com/hyperframes/issues/3964", + "pr": "https://github.com/heygen-com/hyperframes/pull/3965" }, { "branch": "patch/playback-start-nested", From b79e57ddcec2754ad68e13ba56d67995e767741d Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 15 Sep 2026 12:56:04 -0700 Subject: [PATCH 34/39] chore(arcade): drop extract-hold-past-eof from rebuild (upstream #3962) --- scripts/arcade/patches.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 62d30a1863a..bd3eb92af32 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -36,11 +36,6 @@ { "branch": "patch/render-settle-pass", "keepLocal": true - }, - { - "branch": "patch/extract-hold-past-eof", - "issue": "https://github.com/heygen-com/hyperframes/issues/3958", - "pr": "https://github.com/heygen-com/hyperframes/pull/3959" } ] } From c69c737ebb1a2307948f9d444716391693e448ad Mon Sep 17 00:00:00 2001 From: Val Date: Wed, 23 Sep 2026 11:55:01 -0400 Subject: [PATCH 35/39] chore(arcade): drop host-duration-bound from rebuild (upstream #3975) --- scripts/arcade/patches.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index bd3eb92af32..0f380f80f38 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -7,11 +7,6 @@ "branch": "patch/arcade-tooling", "keepLocal": true }, - { - "branch": "patch/host-duration-bound", - "issue": "https://github.com/heygen-com/hyperframes/issues/3964", - "pr": "https://github.com/heygen-com/hyperframes/pull/3965" - }, { "branch": "patch/playback-start-nested", "issue": "https://github.com/heygen-com/hyperframes/issues/3245", From 87d8c2aa45e74ac48a3ee20a728a041fff27b40d Mon Sep 17 00:00:00 2001 From: Val Date: Tue, 29 Sep 2026 08:52:35 -0400 Subject: [PATCH 36/39] chore(arcade): add patch/vp9-alpha-probe to the patch list --- scripts/arcade/patches.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 0f380f80f38..10c96c11584 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -31,6 +31,10 @@ { "branch": "patch/render-settle-pass", "keepLocal": true + }, + { + "branch": "patch/vp9-alpha-probe", + "keepLocal": true } ] } From 7d22454cd4c64ea394bef93ba2cc149c702250ee Mon Sep 17 00:00:00 2001 From: Val Date: Mon, 5 Oct 2026 19:37:19 -0400 Subject: [PATCH 37/39] chore(arcade): carry patch/cloud-run-chrome-152 --- scripts/arcade/patches.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 10c96c11584..4fa6163fb94 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -35,6 +35,9 @@ { "branch": "patch/vp9-alpha-probe", "keepLocal": true + }, + { + "branch": "patch/cloud-run-chrome-152" } ] } From 3d969290ee3e405cf244f3a333d24513c4b78e18 Mon Sep 17 00:00:00 2001 From: Val Date: Sat, 24 Oct 2026 16:23:07 -0700 Subject: [PATCH 38/39] chore(arcade): drop playback-start-nested from rebuild (upstream #5413, #5454) --- scripts/arcade/patches.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 4fa6163fb94..3d7540340da 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -7,11 +7,6 @@ "branch": "patch/arcade-tooling", "keepLocal": true }, - { - "branch": "patch/playback-start-nested", - "issue": "https://github.com/heygen-com/hyperframes/issues/3245", - "upstreamPr": "https://github.com/heygen-com/hyperframes/pull/3246" - }, { "branch": "patch/probe-seek-swallow", "keepLocal": true From 81a6e730dd42da858001669c38e4e4ba316e106b Mon Sep 17 00:00:00 2001 From: Val Date: Sat, 24 Oct 2026 19:37:28 -0700 Subject: [PATCH 39/39] chore(arcade): drop patch/cloud-run-chrome-152, upstream #5338 shipped in 0.8.194 --- scripts/arcade/patches.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/arcade/patches.json b/scripts/arcade/patches.json index 3d7540340da..401d580cc56 100644 --- a/scripts/arcade/patches.json +++ b/scripts/arcade/patches.json @@ -30,9 +30,6 @@ { "branch": "patch/vp9-alpha-probe", "keepLocal": true - }, - { - "branch": "patch/cloud-run-chrome-152" } ] }