Skip to content

feat(web): Studio IDE rebuild — three-pane layout, toolbar, paywall at export - #2330

Merged
groupthinking merged 7 commits into
mainfrom
edison/studio-ide-rebuild
Oct 2, 2026
Merged

groupthinking merged 7 commits into
mainfrom
edison/studio-ide-rebuild

Conversation

@groupthinking

Copy link
Copy Markdown
Owner

Closes #2329

Blocked on me

Nothing. All pieces built, verified, committed, and pushed.

Changed

  • apps/web/src/components/studio/StudioIdeShell.tsx (new) — Three-pane IDE shell: top toolbar, left video / center chat / right output, resizable + collapsible panes. Check: tsc clean, eslint clean, three-panel tests.
  • apps/web/src/components/studio/StudioIdeChat.tsx (new) — Center chat wired to real POST /api/chat with pack grounding, conversation history, 402 free-quota -> upgrade prompt. Check: tsc clean, eslint clean.
  • apps/web/src/components/studio/StudioIdeOutput.tsx (new) — Right output pane, 7 tabs around action extraction: Events, Lingo, Tools, Intent, Signals, Spec, Transcript. Check: tsc clean, eslint clean.
  • apps/web/src/components/OneLoopStudio.tsx (restructured) — Renders the IDE; toolbar consolidates URL + Run/Cancel + stored packs + Export + Build live + Check preflight. Check: tsc clean, eslint clean, 20 component tests pass.
  • apps/web/src/store/dashboard-store.ts — processVideo accepts AbortSignal; abort marks run cancelled. Check: tsc clean.
  • apps/web/src/app/studio/StudioShell.tsx — Dead Pack/Embed toggle + iframe removed. apps/web/public/studio-pane/ deleted. StudioThreePanelShell.tsx + CSS deleted (orphaned, 686 lines). Check: tsc clean.
  • Landing re-tokenized teal->amber (2 commits). Check: tsc clean, eslint clean, 17/17 landing tests.
  • Tests updated. Check: full suite 163 files, 1472 passed, 28 skipped (at baseline).

Found

  • /api/chat is real and public (session-optional) — center chat is live, not a stub. Free tier 5/day.
  • /docs/api is NOT dead — linked from Nav and Footer. Kept per policy (only delete what's proven unneeded).
  • Export paywall already existed (402 -> Stripe checkout) — preserved on toolbar Export button.
  • G.A.T.E. untouched — gate-transition.ts diff is empty; PASS|HOLD|REJECT|ESCALATE non-bypassable.
  • Bugs fixed: (1) Cancel aborts hung runs via AbortController; (2) delete stored packs incl. zombies; (3) dead embed removed; (4) concatenation fixed.

Copilot AI balanced review requested due to automatic review settings October 2, 2026 21:29
@vercel

vercel Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated
v0-uvai Ready Ready Preview, v0 Oct 2, 2026 9:29pm UTC

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

🔍 PR Validation

⚠️ Large PR detected (3200 lines changed)

@coderabbitai

coderabbitai Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Repository: groupthinking/EventRelay/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: a41a338c-481a-4abd-8d97-3e26a8d80ad8

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added documentation Improvements or additions to documentation javascript Pull requests that update javascript code styling tests labels Oct 2, 2026
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 16
Failed
Deployment https://v0-uvai-1s0kb5emr-garv1.vercel.app
Test Output
ass on every request without persisting it�[32m 1�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mhomepage returns 200 with HTML�[32m 68�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page contains template/workflow markup�[32m 124�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page surfaces at least 5 workflow/template indicators�[32m 97�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mPOST /api/video/pack accepts a YouTube URL without hanging�[33m 2061�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mGET /api/video/pack resolves to a ready pack with evidence lineage�[33m 591�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 103�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns 400 quickly, not a hang�[32m 79�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mPOST /api/video/pack with no body returns 400�[32m 64�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 131�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[32m 73�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[32m 256�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mretired /api/pipeline routes are gone (no pipeline served)�[32m 35�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 83�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 90�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m16 passed�[39m�[22m�[90m (16)�[39m
�[2m   Start at �[22m 21:29:51
�[2m   Duration �[22m 5.35s�[2m (transform 62ms, setup 0ms, import 77ms, tests 5.15s, environment 0ms)�[22m


Retry player
</button>
<a
href={`https://www.youtube.com/watch?v=${videoId}`}

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot review overview

🟡 Changes recommended

Cancellation and chat have correctness issues, while the agent workflow flag no longer exposes its promised controls.

Review effort: Balanced
Findings: 2 High severity · 5 Medium severity · 1 Low severity

Open (8)
What changed in this PR

Rebuilds the canonical Studio as a three-pane IDE and standardizes UVAI’s amber visual theme.

Changes:

  • Adds resizable video, live chat, and structured output panes.
  • Consolidates Studio actions and adds cancellation/deletion controls.
  • Removes the legacy embed workspace and retokens public surfaces.
File Description
apps/​web/​src/​store/​dashboard-store.ts Adds cancellation signal support.
apps/​web/​src/​lib/​__tests__/​uvai-surface-unification.test.ts Updates Tools surface assertion.
apps/​web/​src/​lib/​__tests__/​studio-pipeline-status.test.ts Updates IDE surface assertions.
apps/​web/​src/​components/​studio/​StudioThreePanelShell.tsx Removes legacy shell.
apps/​web/​src/​components/​studio/​StudioIdeShell.tsx Adds three-pane IDE layout.
apps/​web/​src/​components/​studio/​StudioIdeOutput.tsx Adds seven output tabs.
apps/​web/​src/​components/​studio/​StudioIdeChat.tsx Adds pack-grounded chat.
apps/​web/​src/​components/​studio/​studio-three-panel-shell.css Removes legacy shell CSS.
apps/​web/​src/​components/​OneLoopStudio.tsx Integrates IDE and toolbar.
apps/​web/​src/​components/​landing/​WorkflowSection.tsx Applies amber theme.
apps/​web/​src/​components/​landing/​TemplatesSection.tsx Applies amber theme.
apps/​web/​src/​components/​landing/​LandingNav.tsx Retokens navigation.
apps/​web/​src/​components/​landing/​LandingFooter.tsx Retokens footer branding.
apps/​web/​src/​components/​landing/​HeroSection.tsx Retokens hero and animation.
apps/​web/​src/​components/​landing/​DeveloperSection.tsx Retokens developer section.
apps/​web/​src/​components/​landing/​ContactSection.tsx Retokens contact CTA.
apps/​web/​src/​components/​landing/​BentoFeatures.tsx Retokens feature cards.
apps/​web/​src/​components/​home/​HomeProCheckout.tsx Retokens checkout card.
apps/​web/​src/​components/​home/​HomePasteForm.tsx Retokens URL form.
apps/​web/​src/​components/​billing/​ProCheckoutButton.tsx Updates checkout focus styling.
apps/​web/​src/​components/​__tests__/​OneLoopStudio.three-panel.test.tsx Tests new IDE shell presence.
apps/​web/​src/​components/​__tests__/​OneLoopStudio.job-strip.test.tsx Updates status/transcript tests.
apps/​web/​src/​components/​__tests__/​OneLoopStudio.gate.test.tsx Targets new Spec tab.
apps/​web/​src/​components/​__tests__/​OneLoopStudio.build-live.test.tsx Updates empty IDE assertions.
apps/​web/​src/​app/​terms/​page.tsx Retokens legal links.
apps/​web/​src/​app/​studio/​StudioShell.tsx Removes embed toggle and iframe.
apps/​web/​src/​app/​privacy/​page.tsx Retokens legal links.
apps/​web/​src/​app/​pricing/​page.tsx Retokens pricing surfaces.
apps/​web/​src/​app/​page.tsx Retokens homepage offer.
apps/​web/​src/​app/​login/​page.tsx Retokens login branding.
apps/​web/​src/​app/​globals.css Replaces global teal tokens with amber.
apps/​web/​src/​app/​docs/​api/​page.tsx Retokens API documentation.
apps/​web/​src/​app/​ContactForm.tsx Retokens form status and CTA.
apps/​web/​public/​studio-pane/​styles.css Deletes embed styles.
apps/​web/​public/​studio-pane/​README.md Deletes embed documentation.
apps/​web/​public/​studio-pane/​logic.js Deletes embed utilities.
apps/​web/​public/​studio-pane/​index.html Deletes embed entry page.
apps/​web/​public/​studio-pane/​fx-adapter.js Deletes terminal adapter.
apps/​web/​public/​studio-pane/​app.js Deletes embed application.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +62 to +64
const history = [...messages, userMsg]
.slice(-10)
.map((m) => ({ role: m.role, content: m.content }));
Comment on lines +71 to +75
const res = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
Comment on lines +1300 to +1321
outputPane={
<StudioIdeOutput
video={selected}
specReview={
selected?.videoPack?.pack ? (
<GroundedSpecReview
key={selected.id}
videoId={selected.id}
pack={selected.videoPack.pack}
acknowledgment={selected.specReviewAcknowledgment}
persistenceAvailable={dashboardPersistenceSucceeded()}
onSeek={videoId === selected.videoPack.pack.video_id ? seekTo : undefined}
onAcknowledge={(value) => {
if (useDashboardStore.getState().selectedVideoId !== selected.id) return false;
updateVideo(selected.id, { specReviewAcknowledgment: value });
return dashboardPersistenceSucceeded();
}}
/>
) : undefined
}
/>
}
Comment on lines +20 to +22
* Center-pane chat for the Studio IDE. Wired to the real POST /api/chat
* endpoint with pack grounding (video_id), not a stub. Free tier gets
* 5 messages/day; the API returns 402 with upgradeRequired when exceeded.
Comment on lines +69 to +75
<div className="flex min-h-0 flex-1">
{/* LEFT: video */}
{!leftCollapsed ? (
<aside
data-testid="studio-ide-video-pane"
aria-label="Video"
className="flex min-h-0 w-[var(--ide-left-w)] shrink-0 flex-col border-r border-white/10"
Comment on lines +94 to +103
<div
role="separator"
aria-orientation="vertical"
aria-label="Resize video pane"
data-testid="studio-ide-splitter-left"
className="w-1 shrink-0 cursor-col-resize bg-white/5 hover:bg-amber-500/40"
onPointerDown={(e) => {
e.preventDefault();
startResize('left', e.currentTarget);
}}
processVideo: async (url) => {
processVideo: async (url, opts) => {
const { addVideo, updateVideo, addActivity } = get();
const signal = opts?.signal;
Comment on lines +102 to +104
// Run is async; the cancel button appears once busy flips true.
fireEvent.click(screen.getByTestId('studio-ide-run'));
expect(await screen.findByTestId('studio-ide-cancel')).toBeTruthy();
setSending(true);
setError(null);

const history = [...messages, userMsg]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
const history = [...messages, userMsg]
// History is the PRIOR conversation only. The current query is sent
// separately via the `query` field and appended server-side, so including
// userMsg here would duplicate the current message in the LLM conversation.
const history = messages

The current user message is sent twice to the LLM because history includes the just-added userMsg while query carries the same message separately.

Fix on Vercel

@groupthinking
groupthinking merged commit c569fdd into main Oct 2, 2026
42 checks passed
@groupthinking
groupthinking deleted the edison/studio-ide-rebuild branch October 2, 2026 21:42
@linear-code

linear-code Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

GRV-773

This branch was successfully deployed

1 active deployment
Preview — 37af76e5 Deployed Oct 2, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation javascript Pull requests that update javascript code styling tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Studio IDE rebuild: three-pane layout, toolbar, paywall at export

3 participants