From 78b7039e7c00c6754c1b9cb3fa84516debf0ca88 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Tue, 14 Apr 2026 02:21:24 +0000 Subject: [PATCH 1/4] Initial plan From de3e1ad6e5fd1a0279585dc252eeda2ab268cca0 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Tue, 14 Apr 2026 02:26:42 +0000 Subject: [PATCH 2/4] Fix Vercel deploy error - mark @libsql/client as external - @libsql/client has platform-specific native binaries (@libsql/linux-x64-gnu) - Cannot be bundled - must be kept external and copied from pnpm virtual store - Update build-vercel.sh to copy @libsql scope from node_modules/.pnpm/node_modules - Update vercel.json includeFiles to include @libsql scope - Also fix @ai-sdk copy to use pnpm virtual store path Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/05489ac4-2d01-43c2-b9b3-e50ff9b92b03 Co-authored-by: xuyushun441-sys <255036401+xuyushun441-sys@users.noreply.github.com> --- apps/studio/scripts/build-vercel.sh | 20 +++++++++++++++++--- apps/studio/scripts/bundle-api.mjs | 6 +++--- apps/studio/vercel.json | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/apps/studio/scripts/build-vercel.sh b/apps/studio/scripts/build-vercel.sh index 10a5507f4..0b089be45 100755 --- a/apps/studio/scripts/build-vercel.sh +++ b/apps/studio/scripts/build-vercel.sh @@ -39,7 +39,6 @@ node scripts/bundle-api.mjs # apps/studio/, so we must copy the actual module files here for Vercel to # include them in the serverless function's deployment package. # -# Note: @libsql/client is now bundled by esbuild, so we no longer copy it. echo "[build-vercel] Copying external native modules to local node_modules..." for mod in better-sqlite3; do src="../../node_modules/$mod" @@ -52,11 +51,26 @@ for mod in better-sqlite3; do echo "[build-vercel] ⚠ $mod not found at $src (skipped)" fi done +# Copy the @libsql scope (includes @libsql/client and platform-specific binaries) +# In pnpm monorepos, @libsql packages exist in the virtual store at node_modules/.pnpm/node_modules/@libsql +if [ -d "../../node_modules/.pnpm/node_modules/@libsql" ]; then + mkdir -p "node_modules/@libsql" + for pkg in ../../node_modules/.pnpm/node_modules/@libsql/*/; do + pkgname="$(basename "$pkg")" + # Use cp -rL to dereference symlinks and copy actual files + cp -rL "$pkg" "node_modules/@libsql/$pkgname" + done + echo "[build-vercel] ✓ Copied @libsql/*" +else + echo "[build-vercel] ⚠ @libsql not found (skipped)" +fi # Copy the @ai-sdk scope (dynamically loaded provider packages) -if [ -d "../../node_modules/@ai-sdk" ]; then +# In pnpm monorepos, @ai-sdk packages exist in the virtual store at node_modules/.pnpm/node_modules/@ai-sdk +if [ -d "../../node_modules/.pnpm/node_modules/@ai-sdk" ]; then mkdir -p "node_modules/@ai-sdk" - for pkg in ../../node_modules/@ai-sdk/*/; do + for pkg in ../../node_modules/.pnpm/node_modules/@ai-sdk/*/; do pkgname="$(basename "$pkg")" + # Use cp -rL to dereference symlinks and copy actual files cp -rL "$pkg" "node_modules/@ai-sdk/$pkgname" done echo "[build-vercel] ✓ Copied @ai-sdk/*" diff --git a/apps/studio/scripts/bundle-api.mjs b/apps/studio/scripts/bundle-api.mjs index 9f1d8fc81..4f19101fa 100644 --- a/apps/studio/scripts/bundle-api.mjs +++ b/apps/studio/scripts/bundle-api.mjs @@ -16,9 +16,9 @@ import { build } from 'esbuild'; // Packages that cannot be bundled (native bindings / optional drivers) const EXTERNAL = [ - // @libsql/client is now bundled (pure JS, no native bindings) - // Bundling it solves Vercel deployment issues where external packages - // aren't properly included in the serverless function despite includeFiles config + // @libsql/client has platform-specific native bindings (@libsql/linux-x64-gnu, etc.) + // and must be kept external, then copied to node_modules and included via vercel.json + '@libsql/client', 'better-sqlite3', // AI SDK provider packages — dynamically imported based on env vars '@ai-sdk/anthropic', diff --git a/apps/studio/vercel.json b/apps/studio/vercel.json index 96e8daf72..3365216d1 100644 --- a/apps/studio/vercel.json +++ b/apps/studio/vercel.json @@ -13,7 +13,7 @@ "api/**/*.js": { "memory": 1024, "maxDuration": 300, - "includeFiles": "node_modules/{better-sqlite3,@ai-sdk}/**" + "includeFiles": "node_modules/{better-sqlite3,@libsql,@ai-sdk}/**" } }, "headers": [ From 00abb3c1f97707dd3a399204e68fca5e77d96c22 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Tue, 14 Apr 2026 03:25:32 +0000 Subject: [PATCH 3/4] Fix cp -rL infinite recursion - add external deps as direct dependencies - Add @libsql/client and better-sqlite3 as direct dependencies in apps/studio/package.json - Remove package copying logic from build-vercel.sh that caused infinite recursion - Vercel will install these packages automatically via pnpm install - Fixes build error: cp: cannot stat '../../node_modules/.pnpm/node_modules/@ai-sdk/react/react/react/...' - Update pnpm-lock.yaml Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/c8a7ff61-0ed4-46cc-ba58-56c1c0b9de42 Co-authored-by: xuyushun441-sys <255036401+xuyushun441-sys@users.noreply.github.com> --- apps/studio/package.json | 2 ++ apps/studio/scripts/build-vercel.sh | 54 ++++------------------------- pnpm-lock.yaml | 6 ++++ 3 files changed, 15 insertions(+), 47 deletions(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index 10dca6815..b0a7244f6 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -23,6 +23,7 @@ "@ai-sdk/openai": "^3.0.52", "@ai-sdk/react": "^3.0.160", "@hono/node-server": "^1.19.14", + "@libsql/client": "^0.17.2", "@objectstack/client": "workspace:*", "@objectstack/client-react": "workspace:*", "@objectstack/driver-memory": "workspace:*", @@ -57,6 +58,7 @@ "@radix-ui/react-toast": "^1.2.15", "@radix-ui/react-tooltip": "^1.2.8", "ai": "^6.0.158", + "better-sqlite3": "^12.9.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "hono": "^4.12.12", diff --git a/apps/studio/scripts/build-vercel.sh b/apps/studio/scripts/build-vercel.sh index 0b089be45..2418c8b68 100755 --- a/apps/studio/scripts/build-vercel.sh +++ b/apps/studio/scripts/build-vercel.sh @@ -28,55 +28,15 @@ cd apps/studio # 2. Bundle API serverless function node scripts/bundle-api.mjs -# 3. Copy native/external modules into local node_modules for Vercel packaging. +# 3. External dependencies are now handled by adding them as direct dependencies +# in apps/studio/package.json. Vercel installs them automatically during deployment. # -# Unlike hotcrm (which uses shamefully-hoist=true), this monorepo uses pnpm's -# default strict node_modules structure. Transitive native dependencies like -# better-sqlite3 only exist in the monorepo root's node_modules/.pnpm/ virtual -# store — they're NOT symlinked into apps/studio/node_modules/. +# Packages marked as external in bundle-api.mjs (@libsql/client, better-sqlite3, +# @ai-sdk/*) are listed as direct dependencies in package.json, so Vercel includes +# them in the serverless function's deployment package via normal pnpm install. # -# The vercel.json includeFiles pattern references node_modules/ relative to -# apps/studio/, so we must copy the actual module files here for Vercel to -# include them in the serverless function's deployment package. -# -echo "[build-vercel] Copying external native modules to local node_modules..." -for mod in better-sqlite3; do - src="../../node_modules/$mod" - if [ -e "$src" ]; then - dest="node_modules/$mod" - mkdir -p "$(dirname "$dest")" - cp -rL "$src" "$dest" - echo "[build-vercel] ✓ Copied $mod" - else - echo "[build-vercel] ⚠ $mod not found at $src (skipped)" - fi -done -# Copy the @libsql scope (includes @libsql/client and platform-specific binaries) -# In pnpm monorepos, @libsql packages exist in the virtual store at node_modules/.pnpm/node_modules/@libsql -if [ -d "../../node_modules/.pnpm/node_modules/@libsql" ]; then - mkdir -p "node_modules/@libsql" - for pkg in ../../node_modules/.pnpm/node_modules/@libsql/*/; do - pkgname="$(basename "$pkg")" - # Use cp -rL to dereference symlinks and copy actual files - cp -rL "$pkg" "node_modules/@libsql/$pkgname" - done - echo "[build-vercel] ✓ Copied @libsql/*" -else - echo "[build-vercel] ⚠ @libsql not found (skipped)" -fi -# Copy the @ai-sdk scope (dynamically loaded provider packages) -# In pnpm monorepos, @ai-sdk packages exist in the virtual store at node_modules/.pnpm/node_modules/@ai-sdk -if [ -d "../../node_modules/.pnpm/node_modules/@ai-sdk" ]; then - mkdir -p "node_modules/@ai-sdk" - for pkg in ../../node_modules/.pnpm/node_modules/@ai-sdk/*/; do - pkgname="$(basename "$pkg")" - # Use cp -rL to dereference symlinks and copy actual files - cp -rL "$pkg" "node_modules/@ai-sdk/$pkgname" - done - echo "[build-vercel] ✓ Copied @ai-sdk/*" -else - echo "[build-vercel] ⚠ @ai-sdk not found (skipped)" -fi +# This avoids the cp -rL infinite recursion issue that occurs when copying packages +# that are already direct dependencies with circular symlinks. # 4. Copy Vite build output to public/ for static file serving rm -rf public diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfaf88ce9..ac97b5c4b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -145,6 +145,9 @@ importers: '@hono/node-server': specifier: ^1.19.14 version: 1.19.14(hono@4.12.12) + '@libsql/client': + specifier: ^0.17.2 + version: 0.17.2 '@objectstack/client': specifier: workspace:* version: link:../../packages/client @@ -247,6 +250,9 @@ importers: ai: specifier: ^6.0.158 version: 6.0.158(zod@4.3.6) + better-sqlite3: + specifier: ^12.9.0 + version: 12.9.0 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 From 884848d0806802656f3126a53ff8f2d17935c339 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Tue, 14 Apr 2026 03:47:56 +0000 Subject: [PATCH 4/4] Add .npmrc with node-linker=hoisted for Vercel deployment - Create apps/studio/.npmrc with node-linker=hoisted - Fixes "invalid deployment package for a Serverless Function" error - Prevents pnpm from creating symlinks that break Vercel packaging - Uses flat node_modules structure that Vercel can package correctly Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/415f5fd4-83fb-4626-ba67-7da11840f685 Co-authored-by: xuyushun441-sys <255036401+xuyushun441-sys@users.noreply.github.com> --- apps/studio/.npmrc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 apps/studio/.npmrc diff --git a/apps/studio/.npmrc b/apps/studio/.npmrc new file mode 100644 index 000000000..769c142af --- /dev/null +++ b/apps/studio/.npmrc @@ -0,0 +1,3 @@ +# Vercel deployment configuration +# Use hoisted node-linker to avoid symlinks that break Vercel serverless functions +node-linker=hoisted