Skip to content

[comp] Production Deploy#3260

Merged
tofikwest merged 8 commits into
releasefrom
main
Jun 23, 2026
Merged

[comp] Production Deploy#3260
tofikwest merged 8 commits into
releasefrom
main

Conversation

@github-actions

@github-actions github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

This is an automated pull request to release the candidate branch into production, which will trigger a deployment.
It was created by the [Production PR] action.


Summary by cubic

Capture and surface OAuth connect failures so users see the real error and we persist it for debugging. Also adds resizable columns to framework tables with widths saved between visits.

  • New Features

    • Frontend: PlatformIntegrations and ProviderDetailView read error/error_description, show a toast, POST a record, then clean the URL.
    • API: POST /v1/integrations/oauth-errors stores organizationId, userId, providerSlug, errorCode, errorDescription; never stores auth codes or tokens.
    • Debug API: GET /v1/internal/integration-debug/oauth-errors with organizationId/providerSlug filters and a limit; returns newest first.
    • DB: new IntegrationOAuthError table with indexes on (organizationId, providerSlug) and createdAt.
    • Framework Editor (FRAME-17): drag-to-resize columns in Requirements and Frameworks tables; widths persisted to a cookie and restored on load (Description column can be widened).
  • Bug Fixes

    • Framework Editor: clean up resize listeners on unmount and on mouseup to prevent leaks and restore text selection.

Written for commit c0706af. Summary will update on new commits.

Review in cubic

tofikwest and others added 6 commits June 23, 2026 13:44
…E-17)

Drag the divider on a column's right edge to resize it; widths are saved to a
cookie (per the ticket) and restored on the next visit. Applied to both tables
Joe asked for:

- Requirements view (when viewing a framework): tanstack-native column resizing
  with handles on every column (except the actions column), table-layout: fixed
  so widths hold, and the Description column's max width raised so long text can
  be read inline once widened.
- Frameworks list: the unified tree table gets a colgroup + fixed layout, drag
  handles, and per-column widths.

Shared helpers: a cookie load/save util (column-widths-cookie) and a
useResizableColumns hook + ColumnResizeHandle for plain tables. Tests cover the
width sanitisation and cookie round-trip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MGwXoPb6qHxuHy8miVmyxT
… review)

cubic review: startResize attached document mousemove/mouseup listeners and set
body.userSelect = 'none', but had no fallback if the component unmounted before
mouseup — leaking the listeners and leaving text selection disabled. Store the
drag teardown in a ref and run it from an unmount effect as well as from
mouseup. Adds tests for both teardown paths.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MGwXoPb6qHxuHy8miVmyxT
Today an OAuth connect failure is invisible after the moment it happens: the
shared callback logs the error to ephemeral server logs and redirects to the app
with `?error=...&error_description=...`, but the frontend only handled
`?success=` and ignored the error — and nothing was persisted. So "the
integration won't connect" had no error to look up (the QuickBooks /
CalendarBridge case).

This captures the error WITHOUT touching the shared OAuth callback flow:
- Frontend: the redirect handlers on the integrations grid (PlatformIntegrations)
  and the provider-detail page (ProviderDetailView) now also read
  `?error=`/`?error_description=`, show the user the real reason (toast), record
  it best-effort, and clean the URL. Additive `error` branch alongside the
  existing `success` branch — the success path is unchanged.
- New table `IntegrationOAuthError` (CREATE TABLE only; no FK relations because a
  connect failure has no IntegrationConnection yet). Never stores the auth `code`
  or tokens — only provider, error code, description, org/user, timestamp.
- New session-authed write endpoint `POST /v1/integrations/oauth-errors` that the
  frontend posts to. This is a brand-new controller — the shared `oauthCallback`
  is not touched.
- New internal read endpoint `GET /v1/internal/integration-debug/oauth-errors`
  so a failed connect is diagnosable by org/provider via the internal API.

Tests: oauth-errors.controller.spec (2) + a listOAuthErrors service test (1);
11/11 integration-platform debug/oauth tests pass. Touched API + frontend files
typecheck clean (remaining app typecheck errors are pre-existing on main).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AU5798EG3PQdRuYSPJgXmy
feat(integration-platform): capture + surface OAuth connect failures
@vercel

vercel Bot commented Jun 23, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
comp-framework-editor (staging) Ready Ready Preview, Comment Jun 23, 2026 8:24pm
portal (staging) Ready Ready Preview, Comment Jun 23, 2026 8:24pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
app (staging) Skipped Skipped Jun 23, 2026 8:24pm

Request Review

feat(framework-editor): resizable columns persisted to a cookie (FRAME-17)
@vercel vercel Bot temporarily deployed to staging – portal June 23, 2026 20:22 Inactive
@vercel vercel Bot temporarily deployed to staging – app June 23, 2026 20:22 Inactive
@tofikwest tofikwest merged commit a816369 into release Jun 23, 2026
12 checks passed
@claudfuen

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.90.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants