SIGN IN SIGN UP

SaaS fixes v1: checkout preselect/CTA, canvas loop fix, cloud delete fix, settings copy (#1336)

* feat(checkout): support preselecting a plan to skip the picker

- Add optional preselectedPlan to CheckoutModal; when set it seeds the selection and auto-advances straight to the payment step
- Extend the shell:subscribe event with an optional plan and thread it through CheckoutFlow so callers can request a preselected tier
- Mirror the optional field in the app-sdk event map and document it

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(checkout): add per-plan CTA and GitHub link to PlanPicker

- Add opt-in onPlanCta/ctaLabel so billable plan cards render a primary CTA button (used by the public pricing page)
- Render a GitHub icon on action links pointing at github.com
- Make a card interactive (pointer, radio role, keyboard) only when a selection handler is wired, so display-only pages render static cards

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(canvas): stop the Maximum update depth loop in the pipeline canvas

- Memoize ProjectView's viewport handler so ReactFlow's onMoveEnd keeps a stable identity (an inline handler made StoreUpdater re-sync every render)
- Add a circuit breaker to FlowGraphContext's reload effect as a backstop against non-converging content reloads

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(store): allow deleting cloud-backed files without an expected version

- S3 and Azure delete_file enforce the version match only when an expected_version is supplied, matching the filesystem/memory backends
- Fixes deletes failing in prod (cloud backends) while working locally

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(settings): change subscribe CTA copy to Subscribe to RocketRide

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(checkout): use a concrete plan type for the app-sdk subscribe event

Address review (CodeRabbit): type the shell:subscribe event's optional plan as a concrete CheckoutPlan (mirroring the AppPrice row shape) instead of unknown, so invalid plan payloads fail at compile time rather than later in checkout logic that expects stripePriceId/appId.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
R
Ryan committed
a9531dbebb4d750dc1ef7fa78d987bc04cef06b2
Parent: e1b4da7
Committed by GitHub <noreply@github.com> on 6/23/2026, 4:38:44 PM