Commit Graph

206 Commits

Author SHA1 Message Date
1146d8d129 fix: correct Theia ForwardAuth redirect loop
Two issues:
1. ForwardAuth redirect used x-forwarded-host which Traefik sets to
   vibnai.com (the auth service host), not theia.vibnai.com. Now
   hardcodes THEIA_URL as the callbackUrl destination.
2. /auth page ignored callbackUrl and always sent users to
   /marks-account/projects. Now follows callbackUrl when it points
   to theia.vibnai.com, so users land in the IDE after login.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 18:17:16 -08:00
8e0d9090be fix: replace Firebase signOut with NextAuth signOut in left rail
Firebase is not configured - auth was undefined causing the error
'Cannot read properties of undefined (reading signOut)'.
Use next-auth/react signOut with callbackUrl to redirect to /auth.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 18:07:27 -08:00
e18db985b6 fix: set session cookie on .vibnai.com for subdomain ForwardAuth
Without domain: .vibnai.com the cookie is scoped to vibnai.com only.
Browsers don't send it to theia.vibnai.com, so ForwardAuth sees no
token and redirects to login even when the user is already logged in.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 18:02:06 -08:00
d00979f89e fix: use rows array returned by query(), not result.rows
db-postgres.ts query() returns T[] directly, not a QueryResult object.
result.rows was undefined, causing the session lookup to always
return null and redirect to login even with a valid session token.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 17:39:41 -08:00
c410c1759a debug: add logging to theia-auth session lookup
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 17:35:56 -08:00
008b04d2dd debug: add ?debug=1 endpoint to theia-auth for cookie inspection
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 16:57:49 -08:00
28cd9dd776 fix: correct snake_case column names in session lookup SQL
Prisma maps sessionToken → session_token and userId → user_id
in the PostgreSQL sessions table. The forwardAuth query was using
the wrong camelCase column names.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 16:53:32 -08:00
a8aefc0099 fix: exclude .env files from Docker build context
Coolify writes a .env file into the build context directory which
gets COPY'd into the builder container. Next.js then loads these
env vars (including DATABASE_URL, GITEA_API_TOKEN etc.) during
the build, causing some routes that reference those vars to fail
static analysis and be silently dropped from the build output.

Exclude all .env* files from the Docker build context so the
Next.js build runs with only the vars explicitly passed as build
args or set in the Dockerfile.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 16:41:11 -08:00
efcf20b8f6 fix: validate Theia auth via direct Postgres session lookup
Avoid importing authOptions/PrismaClient in the forwardAuth endpoint.
Under --network host (Coolify's build flag), routes that import Prisma
at module evaluation time are silently dropped from the build output.

Instead, read the NextAuth session-token cookie directly and verify
it with a raw SQL query against the sessions table - the same pattern
used by other working API routes via @/lib/db-postgres.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 16:33:47 -08:00
b9baefed0b fix: use getServerSession instead of getToken in theia-auth
next-auth/jwt subpath import causes Next.js to silently drop the
route from the standalone build output. Switch to getServerSession
which is used by all other working API routes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 15:28:22 -08:00
4e6fcbc566 fix: move forwardAuth endpoint to /api/theia-auth
NextAuth catches all /api/auth/* routes via [...nextauth] catch-all.
Move the Traefik forwardAuth endpoint to /api/theia-auth to avoid
the conflict. Traefik dynamic config updated to match.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 15:13:29 -08:00
22bf34c4e0 feat: add Traefik forwardAuth endpoint for Theia IDE
POST /api/auth/theia-check validates the NextAuth session cookie
forwarded by Traefik. Returns 200 for authenticated users with
X-Auth-User/Email/Name headers, or 302 redirect to /auth for
unauthenticated requests — preserving the original Theia URL as
callbackUrl so users land back in the IDE after login.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 15:10:56 -08:00
8bf69e1ae2 feat: update project dashboard UI for Vibn architecture
- project layout.tsx: replace Firebase Admin SDK with direct Postgres
  query to resolve project name; removes firebase/admin dependency
- overview page: full rewrite — fetches from /api/projects/:id, shows
  Gitea repo + last commit, branch, clone URLs; deployment status badge;
  open PRs and issues from contextSnapshot; recent commits list;
  resources section; Open IDE button; context freshness timestamp
- projects list page: cards now show Gitea repo + last commit inline,
  deploy status dot, IDE quick-link; updated empty state copy to reflect
  auto-provisioning; removed Firebase imports

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 14:57:16 -08:00
373bcee8c1 feat: Gitea auto-provisioning and webhook context sync
- Add lib/gitea.ts: Gitea API client (createRepo, createWebhook,
  deleteRepo, verifyWebhookSignature)
- Add lib/coolify.ts: Coolify API client (projects, databases,
  applications, deployments)
- Update api/projects/create: auto-creates a private Gitea repo and
  registers a webhook on every new project; stores giteaRepo,
  giteaRepoUrl, giteaCloneUrl, giteaSshUrl, giteaWebhookId in project
  data; Gitea errors are non-fatal so project creation still succeeds
- Add api/webhooks/gitea: handles push, pull_request, issues events;
  verifies HMAC signature; updates contextSnapshot on project record
- Add api/webhooks/coolify: handles deployment status events; updates
  contextSnapshot.lastDeployment on project record

Requires env vars: GITEA_API_URL, GITEA_API_TOKEN, GITEA_ADMIN_USER,
GITEA_WEBHOOK_SECRET, COOLIFY_URL, COOLIFY_API_TOKEN

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 14:48:46 -08:00
1f13d4ef74 fix: remove prisma db push from entrypoint (was dropping fs_* tables!) 2026-02-18 01:39:47 +00:00
7c3ff5e280 fix: install prisma@5 globally in runner stage for entrypoint db push 2026-02-18 01:35:41 +00:00
bc17ee661f fix: use global prisma cli in entrypoint 2026-02-18 01:35:25 +00:00
5986dfd50c fix: use local prisma binary in entrypoint (avoid npx downloading wrong version) 2026-02-18 01:34:50 +00:00
89cc366175 fix: remove --skip-generate from prisma db push (not a valid flag) 2026-02-18 01:31:09 +00:00
25f963d201 feat: rewrite project creation modal to remove Firebase auth 2026-02-18 01:26:26 +00:00
5831d19207 feat: rewrite projects page to use NextAuth session + Postgres API (remove Firebase) 2026-02-18 01:26:25 +00:00
065f0f6b33 feat: rewrite lib/server/projects.ts to use Postgres instead of Firestore 2026-02-18 01:24:50 +00:00
f7bbf2ea5e feat: rewrite project delete to use NextAuth session + Postgres 2026-02-18 01:24:49 +00:00
59415bb0d9 feat: rewrite project GET/PATCH to use NextAuth session + Postgres 2026-02-18 01:24:48 +00:00
710a24a2fb feat: rewrite project create to use NextAuth session + Postgres 2026-02-18 01:24:47 +00:00
3fa242076b feat: add GET /api/projects using NextAuth + Postgres 2026-02-18 01:24:46 +00:00
e6b4332d7e Use entrypoint.sh to run prisma db push before starting server 2026-02-18 00:56:42 +00:00
1f62ab09a5 Add entrypoint script to run prisma db push on startup 2026-02-18 00:56:33 +00:00
c1e2761259 Fix Prisma schema: use only linux-musl-openssl-3.0.x binary target 2026-02-18 00:30:36 +00:00
3191823592 Fix Prisma: force linux-musl-openssl-3.0.x binary + install openssl in runner 2026-02-18 00:30:24 +00:00
1eb718cea6 Fix: add linux-musl-openssl-3.0.x binaryTarget for Alpine 3.21 (node:22-alpine) 2026-02-18 00:25:02 +00:00
580aa014ca Fix: add CMD node server.js for Next.js standalone build 2026-02-18 00:21:04 +00:00
934ac1cadf Fix: use client Providers wrapper instead of SessionProvider directly in root layout 2026-02-18 00:07:33 +00:00
b2e7c70d17 Add client-side Providers wrapper for SessionProvider 2026-02-18 00:07:23 +00:00
fd70fc76a0 Fix: move prisma generate out of postinstall to fix Docker build 2026-02-17 23:57:29 +00:00
54811b8247 Fix: skip postinstall in deps stage, run prisma generate in builder 2026-02-17 23:51:28 +00:00
50cbcb1634 Fix Dockerfile: copy prisma schema before npm ci to fix postinstall 2026-02-17 23:45:36 +00:00
65ea7ac180 Fix Dockerfile for NextAuth + Prisma deployment
Add Prisma support to Docker build:
- Run 'prisma generate' during Docker build
- Copy Prisma client and schema to production image
- Remove 'prisma db push' from build script (runs at startup)
- Enable Next.js standalone output mode
- Add db-setup.sh script for runtime migrations

This fixes the deployment failure where Prisma wasn't available.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 15:36:44 -08:00
bbb22f1c37 Switch from SuperTokens to NextAuth.js
BREAKING CHANGE: Replace SuperTokens with NextAuth.js

Why:
- SuperTokens had persistent Traefik routing issues
- SSL certificate not issuing correctly
- Complex infrastructure (separate container)
- NextAuth runs in Next.js app (simpler, no separate service)

Changes:
- Install next-auth, @auth/prisma-adapter, prisma
- Create NextAuth API route: app/api/auth/[...nextauth]/route.ts
- Add Prisma schema for NextAuth tables (users, sessions, accounts)
- Update auth page to use NextAuth signIn()
- Remove all SuperTokens code and dependencies
- Keep same Google OAuth (just simpler integration)

Benefits:
- No separate auth service needed
- No Traefik routing issues
- Sessions stored in Montreal PostgreSQL
- Simpler configuration
- Battle-tested, widely used

All authentication data stays in Montreal!

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 15:12:21 -08:00
8cd95607a4 Fix Google OAuth: add redirectURIOnProviderDashboard parameter
- SuperTokens requires redirectURIOnProviderDashboard param
- Construct it from NEXT_PUBLIC_APP_URL or window.location.origin
- Properly encode the redirect URI in the query string
- Fixes 400 error: 'Please provide the redirectURIOnProviderDashboard'

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 12:47:00 -08:00
3d9a8498fc Remove simple landing page to use full marketing page
- Delete app/page.tsx to let app/(marketing)/page.tsx be the root
- Full marketing page has Hero, Features, Pricing, etc.
- Much better for vibnai.com root domain

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 11:34:45 -08:00
44895f9c31 Fix SuperTokens build error with lazy initialization
- Move SuperTokens.init() to runtime (not build time)
- Add dynamic route config to prevent build-time evaluation
- Move appInfo inside backendConfig function
- Update default URLs to vibnai.com

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 17:22:41 -08:00
c3bbc7818d Fix SuperTokens initialization timing issues
- Remove session check from home page (landing page doesn't need it)
- Add delayed session check in auth page to redirect logged-in users
- Handle SuperTokens not being initialized yet with proper error handling

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 16:15:03 -08:00
17dbcd36b9 Update home page with proper landing page and auth redirect
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 16:11:56 -08:00
0f8dbf8888 Fix SuperTokens to use separate ThirdParty and EmailPassword recipes
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 16:07:27 -08:00
abddadce94 Fix SuperTokens auth component for Google OAuth
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 16:02:18 -08:00
1ca3a68148 Update auth page to use SuperTokens
Replace Firebase auth with SuperTokens PreBuilt UI for seamless integration.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 15:58:52 -08:00
6764c1feb0 Add SuperTokens authentication integration
- Install supertokens-auth-react, supertokens-node, supertokens-web-js
- Create frontend and backend SuperTokens configuration
- Add API route handler for auth endpoints
- Add SuperTokensProvider wrapper in root layout
- Create new auth component with SuperTokens UI
- Configure Google and GitHub OAuth providers
- Ready for SuperTokens core deployment

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 15:27:40 -08:00
8612fe7d5b Fix Firebase config to handle missing credentials gracefully
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 15:18:33 -08:00
478869a098 Use --legacy-peer-deps in Dockerfile for compatibility
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 15:02:46 -08:00