Commit graph

376 commits

Author SHA1 Message Date
Nathan Flurry
252fbdc93b foundry: parallelize app snapshot org reads 2026-03-13 01:04:50 -07:00
Nathan Flurry
6e216a9f86 foundry: async app repo import on org select 2026-03-13 00:57:23 -07:00
Nathan Flurry
fa4ed388d2 Defer slow GitHub org sync to workflow queue for fast OAuth callback
Split syncGithubSessionFromToken into a fast path (initGithubSession:
exchange code, get viewer, store token+identity) and a slow path
(syncGithubOrganizations: list orgs/installations, sync workspaces).

completeAppGithubAuth now returns the 302 redirect in ~2s instead of
~18s by enqueuing the org sync to the workspace workflow queue
(fire-and-forget). This eliminates the proxy timeout window that was
causing duplicate callback requests.

bootstrapAppGithubSession (dev-only) still calls the full synchronous
sync since proxy timeouts are not a concern and it needs the session
fully populated before returning.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 00:09:22 -07:00
Nathan Flurry
a36431903e Add temporary header dump on GitHub OAuth callback
Log all request headers on the callback endpoint to diagnose
the source of duplicate requests (Railway proxy, Cloudflare, browser).
Remove once root cause is identified.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 23:59:06 -07:00
Nathan Flurry
27cf00985d Make GitHub OAuth callback idempotent against duplicate requests
Clear oauthState before exchangeCode so duplicate callback requests
fail the state check instead of hitting GitHub with a consumed code.
Marked as HACK — root cause of duplicate HTTP requests is unknown.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 23:49:50 -07:00
Nathan Flurry
a3cf0ce08f Log callback request headers 2026-03-12 23:43:01 -07:00
Nathan Flurry
d0ed0a4402 Add backend request and workspace logging 2026-03-12 23:25:14 -07:00
Nathan Flurry
cfa0c9cfe2 Add runner versioning to RivetKit registry
Uses Date.now() so each process start gets a unique version.
This ensures Rivet Cloud migrates actors to the new runner on
deploy instead of routing requests to stale runners.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 23:00:37 -07:00
Nathan Flurry
6f8dc26111 Fix GitHub OAuth callback by removing retry wrapper
OAuth authorization codes are single-use. The appWorkspaceAction wrapper
retries failed calls up to 20 times, but if the code exchange succeeds
and a later step fails, every retry sends the already-consumed code,
producing "bad_verification_code" from GitHub.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:54:44 -07:00
Nathan Flurry
63df393004 Revert "Make squashed baseline migrations idempotent"
This reverts commit 356c146035.
2026-03-12 22:34:00 -07:00
Nathan Flurry
356c146035 Make squashed baseline migrations idempotent
Use CREATE TABLE IF NOT EXISTS and CREATE UNIQUE INDEX IF NOT
EXISTS so the squashed baseline can run against actors that
already have tables from the pre-squash migration sequence.
This fixes the "table already exists" error when org workspace
actors wake up with stale migration journals.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:28:55 -07:00
Nathan Flurry
c410e24057 Add temporary debug logging to GitHub OAuth exchange
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:26:22 -07:00
Nathan Flurry
32a48131b5 Cache app workspace actor handle across requests
Every request was calling getOrCreate on the Rivet engine API
to resolve the workspace actor, even though it's always the same
actor. Cache the handle and invalidate on error so retries
re-resolve. This eliminates redundant cross-region round-trips
to api.rivet.dev on every request.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:16:48 -07:00
Nathan Flurry
1ac2dec220 Remove temporary actor key version prefix
Railway has no persistent volumes so stale actors are wiped on
each deploy. The v2 key rotation is no longer needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:07:51 -07:00
Nathan Flurry
58c695e8b4 Reset actor persistence baseline 2026-03-12 21:31:12 -07:00
Nathan Flurry
6bb5ca528e Tighten actor schema constraints 2026-03-12 21:22:39 -07:00
Nathan Flurry
90839685a7 Add actor display metadata 2026-03-12 21:08:43 -07:00
Nathan Flurry
3031fa1309 Log Foundry RivetKit deployment friction 2026-03-12 20:56:20 -07:00
Nathan Flurry
b90f7fc599 Serve Foundry Rivet routes directly from Bun 2026-03-12 20:50:20 -07:00
Nathan Flurry
422364e68e Remove Foundry Rivet runner override 2026-03-12 20:46:20 -07:00
Nathan Flurry
bc782879c2 Configure Foundry Rivet runner pool for /v1 2026-03-12 20:39:33 -07:00
Nathan Flurry
a8bcfa36bb Fix Foundry Rivet base path and frontend endpoint fallback 2026-03-12 20:31:49 -07:00
Nathan Flurry
9a2c60bf30 Move Foundry HTTP APIs onto /v1 2026-03-12 19:53:52 -07:00
Nathan Flurry
58b19c2253 Move Foundry HTTP APIs out of /api/rivet 2026-03-12 19:46:25 -07:00
Nathan Flurry
436eb4a3a3 Add legacy Foundry GitHub callback route 2026-03-12 19:20:34 -07:00
Nathan Flurry
cdac0aa937 Ship RivetKit runtime peers in Foundry backend 2026-03-12 19:08:56 -07:00
Nathan Flurry
31de559fbb Fix Foundry Railway backend Docker context 2026-03-12 19:02:15 -07:00
Nathan Flurry
70d2cc35d7 Split Railway config per Foundry service 2026-03-12 18:59:04 -07:00
Nathan Flurry
e79a3d9389 Add Railway Caddy frontend images 2026-03-12 18:58:57 -07:00
Nathan Flurry
940e49fcfa Use vanilla Rivet routing in Foundry backend 2026-03-12 18:48:11 -07:00
Nathan Flurry
4bccd5fc8d
Fix desktop build artifact ignore (#244) 2026-03-12 11:10:29 -07:00
Nicholas Kissel
fde8b481bd
Foundry UI polish: terminal empty state, history minimap redesign, styling tweaks (#242)
- Hide terminal pane body when no terminal tabs exist
- Redesign history minimap from orange bar to single icon with popover dropdown
- Simplify popover items to single-line user messages with ellipsis
- Adjust min-used badge hover padding
- Add right padding to message list for history icon clearance

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 11:03:04 -07:00
Nicholas Kissel
f09b9090bb
Standardize Foundry frontend colors with semantic design tokens (#241)
Extract hardcoded colors from 15+ component files into a centralized
token system (tokens.ts + shared-styles.ts) so all UI colors flow
through FoundryTokens. This eliminates 160+ scattered color values
and makes light mode a single-file change in the future.

- Add FoundryTokens interface with dark/light variants
- Add shared style helpers (buttons, cards, inputs, badges)
- Bridge CSS custom properties for styles.css theme support
- Add useFoundryTokens() hook and ColorMode context
- Migrate all mock-layout/* and mock-onboarding components

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:52:06 -07:00
Nicholas Kissel
ed6e6f6fa5 Polish Foundry desktop UI: billing redesign, sidebar hover menu, org switching fix
- Redesign billing page with task-hours pricing model (Free: 8h, Pro: 200h/seat)
- Add bulk hour purchase packages and Stripe payment management
- Remove Usage nav section, add upgrade CTA in Members for free plan
- Fix gear icon to open menu on hover with debounced timers
- Fix org switching in workspace flyout (portal outside-click detection)
- Fix tab strip padding when sidebar is collapsed
- Update website components and Tauri config

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 19:34:25 -07:00
Nicholas Kissel
f6656a90af Add Foundry Tauri v2 desktop app with UI polish
- Scaffold Tauri v2 desktop package (foundry/packages/desktop)
- Sidecar build script compiles backend into standalone Bun binary
- Frontend build script packages Vite output for Tauri webview
- macOS glass-effect app icon following Big Sur design standards
- Collapsible sidebars with smooth width transitions
- Inset content framing with borders and nested border-radius (Outer R = Inner R + Padding)
- iMessage-style chat bubble styling with proper corner radii
- Styled composer input with matching border-radius
- Vertical separator between chat and right sidebar
- Website download button component
- Cargo workspace exclude for standalone Tauri build

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 19:27:35 -07:00
Nathan Flurry
dbc2ff0682
Improve Foundry auth and task flows (#240) 2026-03-11 18:13:31 -07:00
Nathan Flurry
d75e8c31d1
Rename Foundry handoffs to tasks (#239)
* Restore foundry onboarding stack

* Consolidate foundry rename

* Create foundry tasks without prompts

* Rename Foundry handoffs to tasks
2026-03-11 13:23:54 -07:00
Nathan Flurry
d30cc0bcc8
Merge pull request #238 from rivet-dev/test-dev-webhooks-flow
Fix Foundry handoff creation flow
2026-03-11 11:17:00 -07:00
Nathan Flurry
c8a095b69f Merge remote-tracking branch 'origin/main' into test-dev-webhooks-flow
# Conflicts:
#	factory/packages/backend/src/actors/project/actions.ts
#	factory/packages/backend/src/actors/workspace/actions.ts
#	factory/packages/frontend/src/components/mock-layout.tsx
2026-03-11 11:14:04 -07:00
Nathan Flurry
5e733e8b37 Fix Foundry handoff creation flow 2026-03-11 11:06:51 -07:00
Nicholas Kissel
302bc7b674
Replace all:unset with explicit button/input resets across Foundry UI (#237)
Styletron's generated stylesheet ordering makes all:unset unreliable —
it can override font-size, border-radius, and background unpredictably.
Replace with appearance:none + targeted resets and clean up duplicate
CSS properties introduced during iterative fixes.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 11:04:20 -07:00
Nicholas Kissel
e03484848e
Foundry UI polish: favicon, icon alignment, and border refinements (#236)
Add Foundry favicon, fix icon centering across sidebar/composer/header
buttons, restore center panel top-left border curve, and position right
sidebar border between header actions and tab strip.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 02:59:58 -07:00
Nicholas Kissel
e792a720a0
Refine Foundry UI layout and styling (#235)
* feat: modernize chat UI and rename handoff to task

- Remove agent message bubbles, keep user bubbles (right-aligned)
- Rename "Handoffs" to "Tasks" with ListChecks icon in sidebar
- Move model picker inside composer, add renderFooter to ChatComposer SDK
- Make project sections collapsible with hover-only chevrons
- Remove divider between chat and composer
- Update model picker chevron to flip on open/close
- Replace all user-visible "handoff" strings with "task" across frontend

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: real org mock data, model picker styling, project icons, task minutes indicator

- Replace fake acme/* mock data with real rivet-dev GitHub org repos and PRs
- Fix model picker popover: dark gray surface with backdrop blur instead of pure black
- Add colored letter icons to project section headers (swap to chevron on hover)
- Add "847 min used" indicator in transcript header
- Rename browser tab title from OpenHandoff to Foundry
- Reduce transcript header title font weight to 500

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: refine Foundry UI — single-line task cards, dark user bubbles, curved panel corners, send icon

- Collapse task sidebar cards to single-line layout (title, number, diffs, timestamp)
- Dark-themed user message bubbles matching site theme
- Curved top-left corner on center chat panel with border line
- Subtle focus border on composer input
- Replace ArrowUpFromLine with SendHorizonal icon
- Tab strip gaps, padding, and divider alignment fixes
- Plus button with visible background
- Right sidebar header color matching

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 01:50:36 -07:00
Nathan Flurry
20082512a3
Merge pull request #234 from rivet-dev/foundry-terminal-pane
Add Foundry terminal and process pane
2026-03-11 00:00:24 -07:00
Nathan Flurry
b00c0109d0 Merge remote-tracking branch 'origin/main' into foundry-terminal-pane
# Conflicts:
#	factory/packages/backend/src/driver.ts
#	factory/packages/backend/src/integrations/sandbox-agent/client.ts
#	factory/packages/backend/test/helpers/test-driver.ts
#	factory/packages/frontend/src/components/mock-layout.tsx
#	pnpm-lock.yaml
#	sdks/react/src/ProcessTerminal.tsx
2026-03-10 23:59:58 -07:00
Nathan Flurry
28c4ac22ff Add foundry terminal and process pane 2026-03-10 23:55:43 -07:00
Nicholas Kissel
32008797da
Foundry UI polish: real org data, project icons, model picker (#233)
* feat: modernize chat UI and rename handoff to task

- Remove agent message bubbles, keep user bubbles (right-aligned)
- Rename "Handoffs" to "Tasks" with ListChecks icon in sidebar
- Move model picker inside composer, add renderFooter to ChatComposer SDK
- Make project sections collapsible with hover-only chevrons
- Remove divider between chat and composer
- Update model picker chevron to flip on open/close
- Replace all user-visible "handoff" strings with "task" across frontend

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: real org mock data, model picker styling, project icons, task minutes indicator

- Replace fake acme/* mock data with real rivet-dev GitHub org repos and PRs
- Fix model picker popover: dark gray surface with backdrop blur instead of pure black
- Add colored letter icons to project section headers (swap to chevron on hover)
- Add "847 min used" indicator in transcript header
- Rename browser tab title from OpenHandoff to Foundry
- Reduce transcript header title font weight to 500

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:49:48 -07:00
Nathan Flurry
34a0587cbc
Add star repo onboarding flow (#232) 2026-03-10 23:47:33 -07:00
Nathan Flurry
d2346bafb3
Configure lefthook formatter checks (#231)
* Add lefthook formatter checks

* Fix SDK mode hydration

* Stabilize SDK mode integration test
2026-03-10 23:03:11 -07:00
Nathan Flurry
0471214d65
Share chat UI components in @sandbox-agent/react (#228)
* Extract shared chat UI components

* chore(release): update version to 0.3.1

* Use shared chat UI in Foundry
2026-03-10 22:31:36 -07:00