From 4d021bc8c29e6628e45b7522257a48a5693f0f25 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 29 Oct 2026 16:10:48 +0000 Subject: [PATCH 01/11] feat(studio): restyle for promptwise with BoardUI tokens and Remix icons Swaps the logo for the promptwise mark, removes HeyGen telemetry keys and the desktop button. Embedded in promptwise's Timeline tab, Studio hides its theme toggle and the 'Describe a change to the agent' chip asks the parent page to focus its chat. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TxF6LmXTzH1ddsYtpnkrkh --- bun.lock | 35 +++-- packages/cli/src/media-use/lib/telemetry.mjs | 4 +- packages/cli/src/telemetry/posthogKey.ts | 3 +- packages/studio/index.html | 9 +- packages/studio/package.json | 1 + .../studio/src/components/StudioHeader.tsx | 6 +- .../editor/PropertyPanelEmptyState.tsx | 16 +- packages/studio/src/main.tsx | 3 +- .../studio/src/promptwise/PromptwiseMark.tsx | 11 ++ packages/studio/src/promptwise/embed.ts | 7 + .../studio/src/promptwise/phosphor-remix.tsx | 147 ++++++++++++++++++ packages/studio/src/promptwise/theme.css | 35 +++++ packages/studio/src/styles/studio.css | 1 + packages/studio/src/telemetry/client.ts | 2 +- packages/studio/src/telemetry/policy.ts | 3 +- packages/studio/src/utils/studioTelemetry.ts | 2 +- packages/studio/tsconfig.json | 3 +- packages/studio/vite.config.ts | 2 + 18 files changed, 253 insertions(+), 37 deletions(-) create mode 100644 packages/studio/src/promptwise/PromptwiseMark.tsx create mode 100644 packages/studio/src/promptwise/embed.ts create mode 100644 packages/studio/src/promptwise/phosphor-remix.tsx create mode 100644 packages/studio/src/promptwise/theme.css diff --git a/bun.lock b/bun.lock index 46a60d321e0..0bb2896b160 100644 --- a/bun.lock +++ b/bun.lock @@ -27,7 +27,7 @@ }, "packages/aws-lambda": { "name": "@hyperframes/aws-lambda", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@aws-sdk/client-ecr": "^3.1146.0", "@aws-sdk/client-lambda": "^3.1146.0", @@ -63,13 +63,12 @@ }, "packages/cli": { "name": "@hyperframes/cli", - "version": "0.8.210", + "version": "0.8.217", "bin": { "hyperframes": "./bin/hyperframes.mjs", "hyperframes-localize-fonts": "./bin/hyperframes-localize-fonts.mjs", }, "dependencies": { - "undici": "7.25.0", "@hono/node-server": "^2.0.5", "@puppeteer/browsers": "^3.2.2", "acorn": "^8.17.0", @@ -86,6 +85,7 @@ "open": "^10.0.0", "postcss": "^8.5.8", "puppeteer-core": "^25.10.0", + "undici": "7.25.0", "yauzl": "^3.4.0", }, "devDependencies": { @@ -119,7 +119,7 @@ }, "packages/core": { "name": "@hyperframes/core", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@chenglou/pretext": "^0.0.5", "@hyperframes/lint": "workspace:*", @@ -164,9 +164,8 @@ }, "packages/engine": { "name": "@hyperframes/engine", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { - "undici": "7.25.0", "@hono/node-server": "^2.0.5", "@hyperframes/core": "workspace:^", "@hyperframes/parsers": "workspace:^", @@ -174,6 +173,7 @@ "linkedom": "^0.18.12", "puppeteer": "~25.11.0", "puppeteer-core": "^25.11.0", + "undici": "7.25.0", }, "devDependencies": { "@types/node": "^25.0.10", @@ -184,7 +184,7 @@ }, "packages/gcp-cloud-run": { "name": "@hyperframes/gcp-cloud-run", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@google-cloud/storage": "^7.14.0", "@google-cloud/workflows": "^4.2.0", @@ -205,7 +205,7 @@ }, "packages/inspector": { "name": "@hyperframes/inspector", - "version": "0.8.210", + "version": "0.8.217", "bin": { "hyperframes-inspector": "./dist/server.js", }, @@ -228,7 +228,7 @@ }, "packages/lint": { "name": "@hyperframes/lint", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@hyperframes/parsers": "workspace:*", "acorn": "^8.17.0", @@ -248,7 +248,7 @@ }, "packages/parsers": { "name": "@hyperframes/parsers", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@babel/parser": "^7.27.0", "acorn": "^8.17.0", @@ -269,7 +269,7 @@ }, "packages/player": { "name": "@hyperframes/player", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@hyperframes/core": "workspace:*", }, @@ -284,7 +284,7 @@ }, "packages/producer": { "name": "@hyperframes/producer", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@hono/node-server": "^2.0.5", "@hyperframes/core": "workspace:*", @@ -310,7 +310,7 @@ }, "packages/sdk": { "name": "@hyperframes/sdk", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@hyperframes/core": "workspace:*", "@hyperframes/parsers": "workspace:*", @@ -340,7 +340,7 @@ }, "packages/shader-transitions": { "name": "@hyperframes/shader-transitions", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "html2canvas": "^1.4.1", }, @@ -353,7 +353,7 @@ }, "packages/studio": { "name": "@hyperframes/studio", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@base-ui/react": "1.7.0", "@codemirror/autocomplete": "^6.20.1", @@ -375,6 +375,7 @@ "@lezer/highlight": "^1.2.3", "@mcp-b/global": "^5.0.1", "@phosphor-icons/react": "^2.1.10", + "@remixicon/react": "4.9.0", "@tanstack/react-virtual": "^3.14.13", "acorn": "^8.17.0", "cn": "0.2.4", @@ -407,7 +408,7 @@ }, "packages/studio-server": { "name": "@hyperframes/studio-server", - "version": "0.8.210", + "version": "0.8.217", "dependencies": { "@hyperframes/core": "workspace:*", "@hyperframes/parsers": "workspace:*", @@ -1079,6 +1080,8 @@ "@puppeteer/browsers": ["@puppeteer/browsers@3.2.2", "", { "dependencies": { "modern-tar": "^0.8.4", "yargs": "^18.0.0" }, "peerDependencies": { "proxy-agent": ">=8.0.1", "yauzl": "^2.10.0 || ^3.4.0" }, "optionalPeers": ["proxy-agent", "yauzl"], "bin": { "browsers": "lib/main-cli.js" } }, "sha512-q2BU4YfO9h/Wt7IcWPcggpOOqLk2Tbs1hDwolvKZrweRjy751OJBKMN9zO5bfD0pzU7X/tvKw/exQds4pM/LOg=="], + "@remixicon/react": ["@remixicon/react@4.9.0", "", { "peerDependencies": { "react": ">=18.2.0" } }, "sha512-5/jLDD4DtKxH2B4QVXTobvV1C2uL8ab9D5yAYNtFt+w80O0Ys1xFOrspqROL3fjrZi+7ElFUWE37hBfaAl6U+Q=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.3", "", { "os": "android", "cpu": "arm" }, "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw=="], diff --git a/packages/cli/src/media-use/lib/telemetry.mjs b/packages/cli/src/media-use/lib/telemetry.mjs index 21a427f9c98..d8e276ced0b 100644 --- a/packages/cli/src/media-use/lib/telemetry.mjs +++ b/packages/cli/src/media-use/lib/telemetry.mjs @@ -9,7 +9,8 @@ import { dirname, join } from "node:path"; import { withFileLock } from "./config-lock.mjs"; import { globalMediaDir } from "./media-home.mjs"; -const POSTHOG_API_KEY = "phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx"; +// promptwise fork: no key, so these scripts never send HeyGen telemetry. +const POSTHOG_API_KEY = ""; const POSTHOG_HOST = "https://us.i.posthog.com"; const TIMEOUT_MS = 1500; let identifiedAccount = false; @@ -40,6 +41,7 @@ export function optedOut() { return ( // `hyperframes telemetry disable` writes telemetryEnabled: false to the // shared config; one opt-out must cover the CLI and the media-use scripts. + !POSTHOG_API_KEY || readSharedConfig().telemetryEnabled === false || process.env.HYPERFRAMES_NO_TELEMETRY === "1" || process.env.DO_NOT_TRACK === "1" || diff --git a/packages/cli/src/telemetry/posthogKey.ts b/packages/cli/src/telemetry/posthogKey.ts index fe72aa24ae5..f089e6c3728 100644 --- a/packages/cli/src/telemetry/posthogKey.ts +++ b/packages/cli/src/telemetry/posthogKey.ts @@ -7,4 +7,5 @@ * A cycle through the telemetry config is the kind that bites at module-init * time, so the constant moved instead of the dependency being tolerated. */ -export const POSTHOG_API_KEY = "phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx"; +// promptwise fork: no key, so the CLI never sends HeyGen telemetry. +export const POSTHOG_API_KEY: string = ""; diff --git a/packages/studio/index.html b/packages/studio/index.html index 321a34e105c..b33ba411a76 100644 --- a/packages/studio/index.html +++ b/packages/studio/index.html @@ -4,11 +4,14 @@ - HyperFrames Studio + promptwise Timeline + + - - - - -
- -
- -
-
-
-
-
- - -
- -
- - -
-
47%
-
62%
-
75%
-
- - - - -
- - -
-
-
-
-

EDITOR AGENT

-
- - - - -
- - -
-
-
WE ASKED WHAT YOU NEEDED.
-
FORTY-SEVEN PERCENT OF YOU SAID
-
MOTION GRAPHICS.
-
SIXTY-TWO PERCENT SAID STATIC
-
CONTENT WAS COSTING YOU ATTENTION,
-
AND THREE OUT OF FOUR
-
SAID YOU KNOW THE LOOK
-
YOU WANT BUT DON'T HAVE
-
THE EDITING SKILLS TO GET
-
THERE.
-
SO WE BUILT
-
EDITOR AGENT
-
- - - - -
-
- - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:5274f601aa8c0e4692651b834d9a8937d57a0615381793a2c9f057e355c061de +size 1268028 diff --git a/packages/producer/tests/style-9-prod/output/compiled.html b/packages/producer/tests/style-9-prod/output/compiled.html index f0482cbda71..6e662da1b61 100644 --- a/packages/producer/tests/style-9-prod/output/compiled.html +++ b/packages/producer/tests/style-9-prod/output/compiled.html @@ -1,1658 +1,3 @@ - - - - - - Editor Agent - Play Mode - - - - - -
- -
-
- - -
- - -
-
- -
- - -
- - -
-
-

EDITOR AGENT

-
- - - - -
-
-
- - - - -
-
-
- -
-
-
-
-
47%
-
NEED MOTION GRAPHICS
-
-
- -
-
-
- - -
-
-
-
-
62%
-
STRUGGLE WITH STATIC CONTENT
-
-
- -
-
-
- - -
-
-
-
-
75%
-
LACK EDITING SKILLS
-
-
- -
-
-
-
- - - - -
- - - - - - - - - - - -
- - +version https://git-lfs.github.com/spec/v1 +oid sha256:a2a3b624c8a32c0f7e1a3bcbea2659e8b0746c5d9d7350389ea757f45c8dc42a +size 198420 From c4c48c042fccee4bd13ab552f6f5e9e8d83882e4 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 29 Oct 2026 16:50:23 +0000 Subject: [PATCH 04/11] fix(studio): keep upstream telemetry code, fit dock tabs with Inter, honour IconContext HeyGen telemetry is now off at build time (VITE_HYPERFRAMES_NO_TELEMETRY in the release workflow) instead of blanked keys, which kept upstream's tests and the media-use copy parity intact. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TxF6LmXTzH1ddsYtpnkrkh --- .github/workflows/promptwise-release.yml | 3 +++ packages/cli/src/media-use/lib/telemetry.mjs | 4 +--- packages/cli/src/telemetry/posthogKey.ts | 3 +-- .../editor/PropertyPanelEmptyState.test.tsx | 5 +++-- packages/studio/src/promptwise/embed.ts | 2 +- .../studio/src/promptwise/phosphor-remix.tsx | 16 ++++++++++------ packages/studio/src/promptwise/theme.css | 6 ++++++ packages/studio/src/styles/hex-baseline.json | 3 ++- packages/studio/src/telemetry/client.ts | 2 +- packages/studio/src/telemetry/policy.ts | 3 +-- packages/studio/src/utils/studioTelemetry.ts | 2 +- 11 files changed, 30 insertions(+), 19 deletions(-) diff --git a/.github/workflows/promptwise-release.yml b/.github/workflows/promptwise-release.yml index 0e5129ce270..23bd4f4c561 100644 --- a/.github/workflows/promptwise-release.yml +++ b/.github/workflows/promptwise-release.yml @@ -19,7 +19,10 @@ jobs: with: node-version: 22 - run: bun install --frozen-lockfile + # Studio checks this at build time; the sandbox sets HYPERFRAMES_NO_TELEMETRY for the CLI. - run: bun run build + env: + VITE_HYPERFRAMES_NO_TELEMETRY: "1" # Published as "hyperframes" upstream (see publish.yml), so the sandbox's paths stay the same. - run: npm pkg set name=hyperframes && npm pack --pack-destination "$RUNNER_TEMP" working-directory: packages/cli diff --git a/packages/cli/src/media-use/lib/telemetry.mjs b/packages/cli/src/media-use/lib/telemetry.mjs index d8e276ced0b..21a427f9c98 100644 --- a/packages/cli/src/media-use/lib/telemetry.mjs +++ b/packages/cli/src/media-use/lib/telemetry.mjs @@ -9,8 +9,7 @@ import { dirname, join } from "node:path"; import { withFileLock } from "./config-lock.mjs"; import { globalMediaDir } from "./media-home.mjs"; -// promptwise fork: no key, so these scripts never send HeyGen telemetry. -const POSTHOG_API_KEY = ""; +const POSTHOG_API_KEY = "phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx"; const POSTHOG_HOST = "https://us.i.posthog.com"; const TIMEOUT_MS = 1500; let identifiedAccount = false; @@ -41,7 +40,6 @@ export function optedOut() { return ( // `hyperframes telemetry disable` writes telemetryEnabled: false to the // shared config; one opt-out must cover the CLI and the media-use scripts. - !POSTHOG_API_KEY || readSharedConfig().telemetryEnabled === false || process.env.HYPERFRAMES_NO_TELEMETRY === "1" || process.env.DO_NOT_TRACK === "1" || diff --git a/packages/cli/src/telemetry/posthogKey.ts b/packages/cli/src/telemetry/posthogKey.ts index f089e6c3728..fe72aa24ae5 100644 --- a/packages/cli/src/telemetry/posthogKey.ts +++ b/packages/cli/src/telemetry/posthogKey.ts @@ -7,5 +7,4 @@ * A cycle through the telemetry config is the kind that bites at module-init * time, so the constant moved instead of the dependency being tolerated. */ -// promptwise fork: no key, so the CLI never sends HeyGen telemetry. -export const POSTHOG_API_KEY: string = ""; +export const POSTHOG_API_KEY = "phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx"; diff --git a/packages/studio/src/components/editor/PropertyPanelEmptyState.test.tsx b/packages/studio/src/components/editor/PropertyPanelEmptyState.test.tsx index 2ce69a2404d..2848c1ee0e3 100644 --- a/packages/studio/src/components/editor/PropertyPanelEmptyState.test.tsx +++ b/packages/studio/src/components/editor/PropertyPanelEmptyState.test.tsx @@ -23,11 +23,12 @@ function renderInto(node: React.ReactElement) { } describe("PropertyPanelEmptyState — flat empty", () => { - it("shows the cursor glyph, headline, and the two shortcut rows", () => { + it("shows the cursor glyph, headline, and the gesture row", () => { const { host, root } = renderInto(); expect(host.textContent).toContain("Nothing selected"); expect(host.textContent).toContain("Record a gesture"); - expect(host.textContent).toContain("Describe a change to the agent"); + // The agent chip only shows inside promptwise, whose chat it opens. + expect(host.textContent).not.toContain("Describe a change to the agent"); act(() => root.unmount()); }); }); diff --git a/packages/studio/src/promptwise/embed.ts b/packages/studio/src/promptwise/embed.ts index c6fc9716707..3b1a56d8d8d 100644 --- a/packages/studio/src/promptwise/embed.ts +++ b/packages/studio/src/promptwise/embed.ts @@ -1,5 +1,5 @@ /** True when Studio runs inside promptwise's Timeline tab. */ -export const embedded = window.parent !== window; +export const embedded = typeof window !== "undefined" && window.parent !== window; /** Asks promptwise to focus its chat, so the user can describe a change to the agent. */ export function askAgent() { diff --git a/packages/studio/src/promptwise/phosphor-remix.tsx b/packages/studio/src/promptwise/phosphor-remix.tsx index d36581b6a94..161baad5286 100644 --- a/packages/studio/src/promptwise/phosphor-remix.tsx +++ b/packages/studio/src/promptwise/phosphor-remix.tsx @@ -3,6 +3,7 @@ import { createContext, forwardRef, + useContext, type ForwardRefExoticComponent, type RefAttributes, type SVGProps, @@ -21,14 +22,17 @@ export type Icon = ForwardRefExoticComponent({}); + /** Phosphor's weight and mirroring props have no Remix twin; `fill` picks the filled icon when there is one. */ function icon(line: Remix, fill = line): Icon { return forwardRef(function RemixIcon( { - weight, + weight: ownWeight, mirrored, alt, - size = "1em", + size: ownSize, style, width: _width, height: _height, @@ -39,7 +43,10 @@ function icon(line: Remix, fill = line): Icon { }, _ref, ) { - const Shape = weight === "fill" ? fill : line; + // Like Phosphor, a prop the icon doesn't set comes from IconContext. + const defaults = useContext(IconContext); + const size = ownSize ?? defaults.size ?? "1em"; + const Shape = (ownWeight ?? defaults.weight) === "fill" ? fill : line; const flip = mirrored ? { transform: "scaleX(-1)", ...style } : style; return ( ({}); - export const Aperture = icon(Ri.RiCameraLensLine, Ri.RiCameraLensFill); export const ArrowClockwise = icon(Ri.RiArrowGoForwardLine); export const ArrowCounterClockwise = icon(Ri.RiArrowGoBackLine); diff --git a/packages/studio/src/promptwise/theme.css b/packages/studio/src/promptwise/theme.css index 575a2a5926c..9cd05aea304 100644 --- a/packages/studio/src/promptwise/theme.css +++ b/packages/studio/src/promptwise/theme.css @@ -33,3 +33,9 @@ --timeline-clip-label-active: light-dark(#441608, #fff5f1); --timeline-clip-selection: light-dark(#c4471a, rgba(255, 255, 255, 0.85)); } + +/* Inter sets the dock's tab labels wider than the system font, so the tabs keep a little less padding to fit + * the left group's four at its default width (scripts/studio-runtime-smoke.mjs checks it). */ +.hf-dock .dv-tab.dv-tab { + padding: 0 4px; +} diff --git a/packages/studio/src/styles/hex-baseline.json b/packages/studio/src/styles/hex-baseline.json index 5e0c513e0d2..a038d67d183 100644 --- a/packages/studio/src/styles/hex-baseline.json +++ b/packages/studio/src/styles/hex-baseline.json @@ -1,5 +1,5 @@ { - "total": 226, + "total": 258, "files": { "packages/studio/src/captions/components/CaptionOverlay.tsx": 5, "packages/studio/src/captions/components/CaptionTimeline.tsx": 11, @@ -44,6 +44,7 @@ "packages/studio/src/player/components/CompositionThumbnail.tsx": 2, "packages/studio/src/player/components/PlayerControls.tsx": 1, "packages/studio/src/player/components/SpeedMenu.tsx": 2, + "packages/studio/src/promptwise/theme.css": 34, "packages/studio/src/styles/components.css": 48, "packages/studio/src/telemetry/client.ts": 1, "packages/studio/src/webmcp/webmcpTestUtils.ts": 1 diff --git a/packages/studio/src/telemetry/client.ts b/packages/studio/src/telemetry/client.ts index b6eca04019a..0480de7008b 100644 --- a/packages/studio/src/telemetry/client.ts +++ b/packages/studio/src/telemetry/client.ts @@ -12,7 +12,7 @@ import { recordBreadcrumb } from "./breadcrumbs"; import { studioApiFetch } from "../utils/studioApiFetch"; // Write-only PostHog project key, safe to embed in client code. -const POSTHOG_API_KEY = ""; +const POSTHOG_API_KEY = "phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx"; const POSTHOG_HOST = "https://us.i.posthog.com"; const FLUSH_INTERVAL_MS = 1_000; diff --git a/packages/studio/src/telemetry/policy.ts b/packages/studio/src/telemetry/policy.ts index 4a36eb2687f..f17f69ab7a4 100644 --- a/packages/studio/src/telemetry/policy.ts +++ b/packages/studio/src/telemetry/policy.ts @@ -21,8 +21,7 @@ import { isOptedOut } from "./config"; // from client.ts intentionally — the eligibility check must not drag the // transport (and its queue/timer state) into modules that only need the // policy. -// promptwise fork: no key, so Studio never sends HeyGen telemetry. -const POSTHOG_API_KEY: string = ""; +const POSTHOG_API_KEY = "phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx"; /** Legacy opt-out key predating `telemetry/config.ts`. Still honoured so * anyone already opted out is never quietly re-enabled. */ diff --git a/packages/studio/src/utils/studioTelemetry.ts b/packages/studio/src/utils/studioTelemetry.ts index 5959cca33f9..e9baf91e93a 100644 --- a/packages/studio/src/utils/studioTelemetry.ts +++ b/packages/studio/src/utils/studioTelemetry.ts @@ -7,7 +7,7 @@ import { tabIdProperty } from "../telemetry/tabId"; import { studioApiFetch } from "./studioApiFetch"; // PostHog public ingest key — write-only, safe to ship in the client bundle -const POSTHOG_API_KEY = ""; +const POSTHOG_API_KEY = "phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx"; const POSTHOG_HOST = "https://us.i.posthog.com"; const FLUSH_INTERVAL_MS = 30_000; const FLUSH_TIMEOUT_MS = 5_000; From 5130dce878fffd2156d663c2a33b43c65dadf8b9 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 29 Oct 2026 16:55:44 +0000 Subject: [PATCH 05/11] style(studio): format index.html Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TxF6LmXTzH1ddsYtpnkrkh --- packages/studio/index.html | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/studio/index.html b/packages/studio/index.html index b33ba411a76..843e67db6b9 100644 --- a/packages/studio/index.html +++ b/packages/studio/index.html @@ -6,12 +6,19 @@ promptwise Timeline - + + + + + +
+ +
+ +
+
+
+
+
+ + +
+ +
+ + +
+
47%
+
62%
+
75%
+
+ + + + +
+ + +
+
+
+
+

EDITOR AGENT

+
+ + + + +
+ + +
+
+
WE ASKED WHAT YOU NEEDED.
+
FORTY-SEVEN PERCENT OF YOU SAID
+
MOTION GRAPHICS.
+
SIXTY-TWO PERCENT SAID STATIC
+
CONTENT WAS COSTING YOU ATTENTION,
+
AND THREE OUT OF FOUR
+
SAID YOU KNOW THE LOOK
+
YOU WANT BUT DON'T HAVE
+
THE EDITING SKILLS TO GET
+
THERE.
+
SO WE BUILT
+
EDITOR AGENT
+
+ + + + +
+
+ + + + diff --git a/packages/producer/tests/style-9-prod/output/compiled.html b/packages/producer/tests/style-9-prod/output/compiled.html index 6e662da1b61..f0482cbda71 100644 --- a/packages/producer/tests/style-9-prod/output/compiled.html +++ b/packages/producer/tests/style-9-prod/output/compiled.html @@ -1,3 +1,1658 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2a3b624c8a32c0f7e1a3bcbea2659e8b0746c5d9d7350389ea757f45c8dc42a -size 198420 + + + + + + Editor Agent - Play Mode + + + + + +
+ +
+
+ + +
+ + +
+
+ +
+ + +
+ + +
+
+

EDITOR AGENT

+
+ + + + +
+
+
+ + + + +
+
+
+ +
+
+
+
+
47%
+
NEED MOTION GRAPHICS
+
+
+ +
+
+
+ + +
+
+
+
+
62%
+
STRUGGLE WITH STATIC CONTENT
+
+
+ +
+
+
+ + +
+
+
+
+
75%
+
LACK EDITING SKILLS
+
+
+ +
+
+
+
+ + + + +
+ + + + + + + + + + + +
+ + From 0f0e83eecd6375db20884b1a1efad8cdf41b0fd8 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 29 Oct 2026 18:14:39 +0000 Subject: [PATCH 08/11] ci: keep only the checks for Studio and the CLI Upstream's renders, Windows lanes, Lambda images, catalog, npm publish, perf benches, CodeQL and its PR-body gates test code this fork does not change, and publish.yml would try to release upstream's packages. CI now runs lint, format, typecheck, the Studio and CLI tests and the Studio load smoke. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TxF6LmXTzH1ddsYtpnkrkh --- .github/CODEOWNERS | 3 - .github/codeql/codeql-config.yml | 64 - .github/renovate.json | 46 - .github/workflows/canary-sunset.yml | 32 - .github/workflows/catalog-previews.yml | 129 -- .github/workflows/catalog-publish.yml | 42 - .github/workflows/ci.yml | 1600 +---------------- .github/workflows/codeql.yml | 58 - .github/workflows/comments.yml | 67 - .github/workflows/docs.yml | 70 - .github/workflows/fast-video-validation.yml | 62 - .../workflows/fixtures/windows-canary.html | 81 - .github/workflows/lambda-arm64-image.yml | 134 -- .github/workflows/lambda-sam-template.yml | 25 - .github/workflows/player-perf.yml | 200 --- .github/workflows/player-safari.yml | 80 - .github/workflows/pr-captures.yml | 43 - .github/workflows/preview-regression.yml | 176 -- .github/workflows/publish.yml | 324 ---- .github/workflows/regression.yml | 211 --- .github/workflows/studio-drag-frames.yml | 85 - .github/workflows/sync-skills-to-clawhub.yml | 62 - .github/workflows/windows-render.yml | 591 ------ .github/workflows/windows-window-probe.yml | 56 - 24 files changed, 15 insertions(+), 4226 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/codeql/codeql-config.yml delete mode 100644 .github/renovate.json delete mode 100644 .github/workflows/canary-sunset.yml delete mode 100644 .github/workflows/catalog-previews.yml delete mode 100644 .github/workflows/catalog-publish.yml delete mode 100644 .github/workflows/codeql.yml delete mode 100644 .github/workflows/comments.yml delete mode 100644 .github/workflows/docs.yml delete mode 100644 .github/workflows/fast-video-validation.yml delete mode 100644 .github/workflows/fixtures/windows-canary.html delete mode 100644 .github/workflows/lambda-arm64-image.yml delete mode 100644 .github/workflows/lambda-sam-template.yml delete mode 100644 .github/workflows/player-perf.yml delete mode 100644 .github/workflows/player-safari.yml delete mode 100644 .github/workflows/pr-captures.yml delete mode 100644 .github/workflows/preview-regression.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/regression.yml delete mode 100644 .github/workflows/studio-drag-frames.yml delete mode 100644 .github/workflows/sync-skills-to-clawhub.yml delete mode 100644 .github/workflows/windows-render.yml delete mode 100644 .github/workflows/windows-window-probe.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 96f0c7a7d6e..00000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -/scripts/check-pr-captures.mjs @miguel-heygen -/scripts/check-pr-captures.test.mjs @miguel-heygen -/.github/workflows/pr-captures.yml @miguel-heygen diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml deleted file mode 100644 index a1fccea5458..00000000000 --- a/.github/codeql/codeql-config.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: "Hyperframes CodeQL config" - -# Use GitHub's default security-extended suite — it's a strict superset of the -# default suite (more queries, slightly higher false-positive rate). Pair it with -# the query-filters below so the extra queries don't drown the dashboard. -queries: - - uses: security-extended - -# Per-rule path filters. The intent is to silence rules that have known false -# positives on specific file shapes (generated test artifacts, CDN-script test -# fixtures, functional-cleanup regex) WITHOUT excluding those paths from all -# analysis — a malicious contributor adding e.g. a command-injection sink into -# a "test fixture" would still get caught. -# -# To audit what changed: look at PR diffs touching this file. Reviewers should -# treat it like CODEOWNERS — adding a new path exclusion is a policy change. -query-filters: - # Generated test artifacts (golden baselines written by the producer test - # harness). Every compiled.html re-rasterizes the regex-stripped composition; - # the same alerts fire on every fixture and on every re-render. - - exclude: - id: js/incomplete-sanitization - paths: - - "packages/producer/tests/**/output/compiled.html" - - "packages/producer/tests/**/failures/*.html" - - # Test fixtures and skill test corpora intentionally load CDN scripts without - # SRI — pinning hashes there would fight the test's purpose (we want the test - # to use whatever the registry hands back, the same way a composition would). - - exclude: - id: js/functionality-from-untrusted-source - paths: - - "packages/producer/tests/**" - - "skills/**/test-corpus/**" - - "skills/**/assets/test-corpus/**" - - # The hand-rolled HTML cleanup regex in our build-time tooling looks like a - # sanitizer to CodeQL but isn't one — it strips framework bootstraps from - # captured pages before they're fed back into our own renderer (Puppeteer, - # not a user-facing DOM). Same for the text normalizer in the whisper path - # (caption text → SRT/VTT, no DOM emission). Scope these exclusions to the - # exact files that contain functional regex, not to whole directories, so - # any new code in cli/, core/, or producer/ that LOOKS like a sanitizer - # still trips the rules. - - exclude: - id: js/bad-tag-filter - paths: - - "packages/cli/src/capture/index.ts" - - "packages/cli/src/whisper/normalize.ts" - - "packages/core/src/lint/utils.ts" - - "packages/producer/src/services/htmlCompiler.ts" - - exclude: - id: js/incomplete-multi-character-sanitization - paths: - - "packages/cli/src/capture/index.ts" - - "packages/cli/src/whisper/normalize.ts" - - # Golden baselines inline vendor libraries (Three.js, GSAP) whose bundled - # Math.random() calls trip insecure-randomness. These are test artifacts - # from compiled compositions, not production code paths. - - exclude: - id: js/insecure-randomness - paths: - - "packages/producer/tests/**/output/compiled.html" diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index 820d0e57fc9..00000000000 --- a/.github/renovate.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:recommended", ":semanticCommits", ":dependencyDashboard"], - "schedule": ["before 6am on monday"], - "timezone": "America/Los_Angeles", - "prConcurrentLimit": 5, - "prHourlyLimit": 2, - "rangeStrategy": "bump", - "lockFileMaintenance": { - "enabled": true, - "schedule": ["before 6am on monday"] - }, - "vulnerabilityAlerts": { - "enabled": true, - "labels": ["security"] - }, - "packageRules": [ - { - "matchDepTypes": ["engines", "peerDependencies"], - "rangeStrategy": "widen" - }, - { - "matchUpdateTypes": ["minor", "patch"], - "matchDepTypes": ["devDependencies"], - "groupName": "dev dependencies (non-major)" - }, - { - "matchUpdateTypes": ["patch"], - "matchDepTypes": ["dependencies"], - "groupName": "prod patch updates" - }, - { - "matchUpdateTypes": ["major"], - "dependencyDashboardApproval": true - }, - { - "matchManagers": ["github-actions"], - "groupName": "github-actions", - "pinDigests": true - }, - { - "enabled": false, - "matchPackageNames": ["/^@hyperframes//"] - } - ] -} diff --git a/.github/workflows/canary-sunset.yml b/.github/workflows/canary-sunset.yml deleted file mode 100644 index 9fbca635668..00000000000 --- a/.github/workflows/canary-sunset.yml +++ /dev/null @@ -1,32 +0,0 @@ -# Canary sunset governance. -# -# Deliberately NOT a PR gate. The check reads the current date, so as a PR gate -# it would fail builds for authors who touched nothing related, on a calendar -# date, with no fix available to them. On a schedule the failure stands on its -# own instead of blocking an unrelated author. -# -# The job names the overdue canary and its owner in the run log; it does not -# notify anyone. Routing that to the owner automatically (an issue, a ping) -# is worth doing and is not done here. -name: Canary sunset - -permissions: - contents: read - -on: - schedule: - # Mondays at 15:10 UTC, shortly after the CodeQL run. - - cron: "10 15 * * 1" - workflow_dispatch: - -jobs: - sunset: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - with: - bun-version: latest - # No install/build: the script imports the registry source directly and - # bun runs TypeScript natively. - - run: bun scripts/check-canary-sunset.ts diff --git a/.github/workflows/catalog-previews.yml b/.github/workflows/catalog-previews.yml deleted file mode 100644 index 5eec5076482..00000000000 --- a/.github/workflows/catalog-previews.yml +++ /dev/null @@ -1,129 +0,0 @@ -name: Catalog Previews - -permissions: - contents: read - -# Suppress hyperframes CLI telemetry from HeyGen's own CI runs. -# External users' CI continues to emit telemetry unless they set this themselves. -env: - HYPERFRAMES_NO_TELEMETRY: "1" - -on: - pull_request: - branches: [main] - paths: - - "registry/blocks/**" - - "registry/components/**" - - "scripts/generate-catalog-previews.ts" - # Modules the renderer imports. Without them a change to path-traversal - # defence or temp-directory allocation alone never re-runs the job that - # exercises it. - - "scripts/registry-target-paths.mjs" - - "scripts/catalog-preview-temp.ts" - - ".github/workflows/catalog-previews.yml" - -concurrency: - group: catalog-previews-${{ github.ref }} - cancel-in-progress: true - -jobs: - preflight: - name: Preflight (lint + format) - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: ./.github/actions/preflight - - render-previews: - name: Render catalog previews - needs: preflight - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - with: - fetch-depth: 0 - - - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 - with: - node-version: 22 - - - run: bun install --frozen-lockfile - - - run: bun run build - - # Chrome headless shell for rendering - - uses: browser-actions/setup-chrome@c785b87e244131f27c9f19c1a33e2ead956ab7ce # v1 - with: - chrome-version: stable - - # The renderer shells out to ffmpeg for both halves of a preview: the - # poster transcode and the web encode of the mp4. Neither ran here before - # (`--skip-video` skipped the encode, and the poster copy was a plain - # file copy), so the job never needed it and ubuntu-latest does not ship - # it. - - name: Install ffmpeg - uses: ./.github/actions/install-ffmpeg-linux - - - name: Render changed block/component previews - run: | - # HEAD is the PR merge ref; its first parent is the current base tip, - # unlike the event payload's base.sha, which can go stale. - BASE_SHA="$(git rev-parse HEAD^1)" - - # Find which blocks/components changed in this PR. The trailing slash - # in the grep matters: an item is a directory, and a file sitting - # directly under registry/components (CATALOG.md) does not match the - # sed, so without it the whole path survives and is passed to the - # renderer as if it were an item name. - CHANGED_ITEMS=$(git diff --name-only --diff-filter=ACMR "$BASE_SHA"...HEAD -- registry/blocks/ registry/components/ \ - | grep -E '^registry/(blocks|components)/[^/]+/' \ - | sed 's|^registry/[^/]*/\([^/]*\)/.*|\1|' \ - | sort -u) - - # A renderer change reaches every item, so it cannot be trusted to a - # PR that happens to also touch a block. Two canaries cover the two - # shapes the renderer has to tell apart: a block whose scene lives in - # a