From 13a5cbfd161dab8bbd63eeabd6e2249fa600ae6b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 07:57:02 +0000 Subject: [PATCH 1/8] Initial plan From 6f78818de5019a8a41c6845bce1a3aaa982a9c87 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 08:04:23 +0000 Subject: [PATCH 2/8] feat(apps/demo): switch from InMemoryDriver to @objectql/driver-turso When TURSO_DATABASE_URL is set, both local dev (objectstack.config.ts) and Vercel serverless (api/[[...route]].ts) use the Turso driver for persistent data. Falls back to MemoryDriver/InMemoryDriver when no Turso env vars are configured. - objectstack.config.ts: environment-aware createDefaultDriver() - api/[[...route]].ts: conditional TursoDriver with connect() lifecycle - package.json: add @objectql/driver-turso workspace dependency - build-vercel.sh: include driver-turso in Vercel build - README.md: document TURSO_* env vars - CHANGELOG.md: add entry for driver switch Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> Agent-Logs-Url: https://github.com/objectstack-ai/objectql/sessions/2e9116aa-8592-4683-80d3-7ded73f135c5 --- CHANGELOG.md | 8 +++++ apps/demo/README.md | 11 +++++-- apps/demo/api/[[...route]].ts | 51 +++++++++++++++++++++++++------ apps/demo/objectstack.config.ts | 42 +++++++++++++++++++++---- apps/demo/package.json | 1 + apps/demo/scripts/build-vercel.sh | 1 + pnpm-lock.yaml | 3 ++ 7 files changed, 99 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1721edd..aeb5ea3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **`apps/demo`** — added explicit `@objectstack/spec` and `zod` devDependencies as defense-in-depth for Vercel deployment. - **`@objectql/types`** — moved `@objectstack/spec` and `zod` from `devDependencies` to `dependencies`. The compiled JS output contains runtime imports of `@objectstack/spec` (via `z.infer` patterns), so they must be declared as production dependencies. +### Changed + +- **`apps/demo`** — switched default data driver from `@objectstack/driver-memory` (InMemoryDriver) to `@objectql/driver-turso` (TursoDriver). When `TURSO_DATABASE_URL` is set, the demo uses a persistent Turso/libSQL database; otherwise falls back to InMemoryDriver for zero-config local development. + - `objectstack.config.ts` — environment-aware `createDefaultDriver()` selects Turso or MemoryDriver. + - `api/[[...route]].ts` — Vercel serverless handler uses TursoDriver with `TURSO_DATABASE_URL`, `TURSO_AUTH_TOKEN`, `TURSO_SYNC_URL`, and `TURSO_SYNC_INTERVAL` env vars. + - `scripts/build-vercel.sh` — now builds `@objectql/driver-turso` alongside other drivers. + - `README.md` — documents new Turso environment variables and architecture. + ### Added - **`apps/demo`** — standalone Vercel-deployable demo application ([#issue](https://github.com/objectstack-ai/objectql/issues)): diff --git a/apps/demo/README.md b/apps/demo/README.md index c7afec0b..040057e4 100644 --- a/apps/demo/README.md +++ b/apps/demo/README.md @@ -5,7 +5,8 @@ Runs locally with `@objectstack/cli` and deploys to **Vercel** as a serverless f ## Features -- **In-memory driver** — zero external database required; data persists across warm Vercel invocations. +- **Turso/libSQL driver** — persistent, edge-first SQLite via `@objectql/driver-turso` when `TURSO_DATABASE_URL` is set. +- **In-memory fallback** — zero external database required for quick local development. - **Console UI** — full ObjectStack Console available at `/console/`. - **Studio UI** — ObjectStack Studio available at `/_studio/`. - **Project-Tracker showcase** — ships with the `examples/showcase/project-tracker` metadata (objects, views, permissions) so the demo has real data structures out of the box. @@ -44,6 +45,10 @@ The development server starts on `http://localhost:3000`. |---|---|---| | `AUTH_SECRET` | **Yes** (production) | Secret key for signing auth tokens. Generate with `openssl rand -base64 32`. | | `AUTH_TRUSTED_ORIGINS` | No | Comma-separated list of additional trusted origins (e.g. `https://myapp.example.com`). | +| `TURSO_DATABASE_URL` | No | Turso/libSQL database URL (e.g. `libsql://my-db-org.turso.io`). When set, uses Turso instead of in-memory driver. | +| `TURSO_AUTH_TOKEN` | When using Turso | JWT auth token for the Turso database. | +| `TURSO_SYNC_URL` | No | Remote sync URL for embedded replica mode. | +| `TURSO_SYNC_INTERVAL` | No | Periodic sync interval in seconds (default: 60). | 4. Deploy: @@ -58,7 +63,7 @@ vercel --cwd apps/demo --prod ### How It Works - **`vercel.json`** — Configures Vercel to use a custom build command, allocate 1 GiB memory to the serverless function, and rewrite all requests to the catch-all `api/[[...route]].ts` handler. -- **`api/[[...route]].ts`** — Bootstraps the full ObjectStack kernel with ObjectQL plugins, the in-memory driver, auth, Console, and Studio. Uses `@hono/node-server`'s `getRequestListener()` to bridge the Vercel serverless runtime with the Hono HTTP framework. +- **`api/[[...route]].ts`** — Bootstraps the full ObjectStack kernel with ObjectQL plugins, the Turso driver (or in-memory fallback), auth, Console, and Studio. Uses `@hono/node-server`'s `getRequestListener()` to bridge the Vercel serverless runtime with the Hono HTTP framework. - **`scripts/build-vercel.sh`** — Builds all required workspace packages (foundation, drivers, plugins, protocols, examples) in the correct dependency order. - **`scripts/patch-symlinks.cjs`** — Replaces pnpm workspace symlinks with real copies so Vercel can bundle the function without symlink errors. @@ -110,5 +115,5 @@ apps/demo/ │ ObjectStack Kernel (ObjectQL + Auth + - InMemoryDriver) + TursoDriver) ``` diff --git a/apps/demo/api/[[...route]].ts b/apps/demo/api/[[...route]].ts index 35f1bbb3..a0d356c6 100644 --- a/apps/demo/api/[[...route]].ts +++ b/apps/demo/api/[[...route]].ts @@ -2,8 +2,9 @@ * Vercel Serverless Function — ObjectQL Demo Handler * * Bootstraps the ObjectStack kernel with ObjectQL plugins and the - * project-tracker demo metadata, using @objectstack/driver-memory - * for zero-config in-memory data. + * project-tracker demo metadata, using @objectql/driver-turso when + * TURSO_DATABASE_URL is set, or @objectstack/driver-memory as a + * zero-config fallback. * * Uses `getRequestListener()` from `@hono/node-server` together with * an `extractBody()` helper to handle Vercel's pre-buffered request @@ -14,8 +15,10 @@ * a fresh `Request` object prevents POST/PUT/PATCH requests (e.g. * login) from hanging indefinitely. * - * Data lives in the function instance's memory and persists across - * warm invocations (Vercel Fluid Compute) but resets on cold start. + * When using Turso, data is persisted in the Turso cloud database. + * When using InMemoryDriver, data lives in the function instance's + * memory and persists across warm invocations (Vercel Fluid Compute) + * but resets on cold start. * * Both Console (/) and Studio (/_studio/) UIs are served as static SPAs. * @@ -30,6 +33,7 @@ import { ObjectKernel, DriverPlugin, AppPlugin, createDispatcherPlugin, createRe import { HonoHttpServer } from '@objectstack/plugin-hono-server'; import { AuthPlugin } from '@objectstack/plugin-auth'; import { InMemoryDriver } from '@objectstack/driver-memory'; +import { createTursoDriver, type TursoDriver } from '@objectql/driver-turso'; import { ObjectQLPlugin } from '@objectstack/objectql'; import { getRequestListener } from '@hono/node-server'; import type { Hono } from 'hono'; @@ -278,10 +282,32 @@ async function bootstrap(): Promise { await withTimeout(kernel.use(new ObjectQLPlugin()), PLUGIN_TIMEOUT_MS, 'ObjectQLPlugin'); log('ObjectQLPlugin registered.'); - // 2. In-memory data driver (no external DB required) - log('Registering DriverPlugin (InMemoryDriver)…'); - await withTimeout(kernel.use(new DriverPlugin(new InMemoryDriver(), 'memory')), PLUGIN_TIMEOUT_MS, 'DriverPlugin'); - log('DriverPlugin registered.'); + // 2. Data driver — Turso when TURSO_DATABASE_URL is set, InMemoryDriver otherwise + const tursoUrl = process.env.TURSO_DATABASE_URL; + let tursoDriver: TursoDriver | null = null; + if (tursoUrl) { + log(`Registering TursoDriver (${tursoUrl})…`); + const syncUrl = process.env.TURSO_SYNC_URL; + tursoDriver = createTursoDriver({ + url: tursoUrl, + authToken: process.env.TURSO_AUTH_TOKEN, + syncUrl, + sync: syncUrl + ? { + intervalSeconds: Number(process.env.TURSO_SYNC_INTERVAL) || 60, + onConnect: true, + } + : undefined, + }); + // DriverPlugin from @objectstack/runtime expects the upstream Driver interface; + // TursoDriver implements @objectql/types Driver which is structurally compatible. + await withTimeout(kernel.use(new DriverPlugin(tursoDriver as any, 'turso')), PLUGIN_TIMEOUT_MS, 'DriverPlugin-turso'); + log('TursoDriver registered.'); + } else { + log('Registering DriverPlugin (InMemoryDriver)…'); + await withTimeout(kernel.use(new DriverPlugin(new InMemoryDriver(), 'memory')), PLUGIN_TIMEOUT_MS, 'DriverPlugin-memory'); + log('InMemoryDriver registered.'); + } // 3. HTTP server adapter — register the Hono app without TCP listener const httpServer = new HonoHttpServer(); @@ -445,7 +471,14 @@ async function bootstrap(): Promise { log('Studio SPA registered.'); } - // 12. Bootstrap kernel (init + start all plugins, fire kernel:ready) + // 12. Connect Turso driver (if applicable) before kernel bootstrap + if (tursoDriver) { + log('Connecting TursoDriver…'); + await withTimeout(tursoDriver.connect(), PLUGIN_TIMEOUT_MS, 'TursoDriver.connect()'); + log('TursoDriver connected.'); + } + + // 13. Bootstrap kernel (init + start all plugins, fire kernel:ready) log('Running kernel.bootstrap()…'); await withTimeout(kernel.bootstrap(), KERNEL_BOOTSTRAP_TIMEOUT_MS, 'kernel.bootstrap()'); log(`Bootstrap complete in ${elapsed()}.`); diff --git a/apps/demo/objectstack.config.ts b/apps/demo/objectstack.config.ts index 608411ad..7d91ef1d 100644 --- a/apps/demo/objectstack.config.ts +++ b/apps/demo/objectstack.config.ts @@ -1,8 +1,9 @@ /** * ObjectQL Demo — Application Configuration * - * Minimal ObjectStack configuration for the demo application. - * Uses in-memory driver with the project-tracker showcase example. + * ObjectStack configuration for the demo application. + * Uses @objectql/driver-turso when TURSO_DATABASE_URL is set, + * falls back to MemoryDriver for zero-config local development. * * For local development: `pnpm dev` (uses @objectstack/cli) * For Vercel deployment: configured via api/[[...route]].ts @@ -29,10 +30,33 @@ import { FormulaPlugin } from '@objectql/plugin-formula'; import { ObjectQLSecurityPlugin } from '@objectql/plugin-security'; import { createApiRegistryPlugin } from '@objectstack/core'; import { MemoryDriver } from '@objectql/driver-memory'; +import { createTursoDriver } from '@objectql/driver-turso'; import { createAppPlugin } from '@objectql/platform-node'; -// In-memory driver — zero-config, no external DB required. -const defaultDriver = new MemoryDriver(); +// Choose driver based on environment — Turso when TURSO_DATABASE_URL is set, +// MemoryDriver otherwise (zero-config fallback for quick starts). +function createDefaultDriver() { + const tursoUrl = process.env.TURSO_DATABASE_URL; + if (tursoUrl) { + console.log(`🗄️ Driver: Turso (${tursoUrl})`); + const syncUrl = process.env.TURSO_SYNC_URL; + return createTursoDriver({ + url: tursoUrl, + authToken: process.env.TURSO_AUTH_TOKEN, + syncUrl, + sync: syncUrl + ? { + intervalSeconds: Number(process.env.TURSO_SYNC_INTERVAL) || 60, + onConnect: true, + } + : undefined, + }); + } + console.log('🗄️ Driver: Memory (in-memory, non-persistent)'); + return new MemoryDriver(); +} + +const defaultDriver = createDefaultDriver(); // Load the project-tracker showcase metadata. const projectTrackerPlugin = createAppPlugin({ @@ -51,13 +75,19 @@ export default { createApiRegistryPlugin(), new HonoServerPlugin({}), new ConsolePlugin(), - // Register the driver as 'driver.default' service. + // Register the active driver as 'driver.default' service so upstream + // ObjectQLPlugin can discover it during start() phase. { name: 'driver-default', init: async (ctx: any) => { ctx.registerService('driver.default', defaultDriver); }, - start: async () => {}, + start: async () => { + // Connect Turso driver if applicable (MemoryDriver.connect() is a no-op) + if (typeof (defaultDriver as any).connect === 'function') { + await (defaultDriver as { connect: () => Promise }).connect(); + } + }, }, projectTrackerPlugin, new ObjectQLPlugin(), diff --git a/apps/demo/package.json b/apps/demo/package.json index fd9ef345..5edf06fa 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -15,6 +15,7 @@ "@object-ui/console": "^3.1.3", "@objectql/core": "workspace:*", "@objectql/driver-memory": "workspace:*", + "@objectql/driver-turso": "workspace:*", "@objectql/example-project-tracker": "workspace:*", "@objectql/platform-node": "workspace:*", "@objectql/plugin-formula": "workspace:*", diff --git a/apps/demo/scripts/build-vercel.sh b/apps/demo/scripts/build-vercel.sh index 05cdbc43..3cd915c4 100755 --- a/apps/demo/scripts/build-vercel.sh +++ b/apps/demo/scripts/build-vercel.sh @@ -35,6 +35,7 @@ pnpm --filter @objectql/platform-node build echo "▸ Building drivers…" pnpm --filter @objectql/driver-memory \ + --filter @objectql/driver-turso \ --filter @objectql/driver-sql \ build diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a09523a..e902f2f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,6 +153,9 @@ importers: '@objectql/driver-memory': specifier: workspace:* version: link:../../packages/drivers/memory + '@objectql/driver-turso': + specifier: workspace:* + version: link:../../packages/drivers/turso '@objectql/example-project-tracker': specifier: workspace:* version: link:../../examples/showcase/project-tracker From d2c37c59d630a6de15302e1b586f4d4bc970e41e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 08:43:45 +0000 Subject: [PATCH 3/8] fix(apps/demo): add @libsql/client and nanoid as explicit devDependencies for Vercel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit workspace:* packages bypass pnpm's .pnpm virtual store, so their transitive deps are not discovered by patch-symlinks.cjs Phase 1. Add @libsql/client (^0.17.2) and nanoid (^3.3.11) — runtime deps of @objectql/driver-turso — as explicit devDependencies so they are available in node_modules for Vercel bundling. Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> Agent-Logs-Url: https://github.com/objectstack-ai/objectql/sessions/dcba56f0-451b-4fad-b516-8e636c58947e --- apps/demo/package.json | 2 ++ pnpm-lock.yaml | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/apps/demo/package.json b/apps/demo/package.json index 5edf06fa..5854a8ce 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -12,6 +12,7 @@ }, "devDependencies": { "@hono/node-server": "^1.19.11", + "@libsql/client": "^0.17.2", "@object-ui/console": "^3.1.3", "@objectql/core": "workspace:*", "@objectql/driver-memory": "workspace:*", @@ -37,6 +38,7 @@ "@objectstack/studio": "^3.2.8", "@types/node": "^20.19.37", "hono": "^4.12.8", + "nanoid": "^3.3.11", "typescript": "^5.9.3", "zod": "^4.3.6" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e902f2f0..96594899 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,6 +144,9 @@ importers: '@hono/node-server': specifier: ^1.19.11 version: 1.19.11(hono@4.12.8) + '@libsql/client': + specifier: ^0.17.2 + version: 0.17.2(encoding@0.1.13) '@object-ui/console': specifier: ^3.1.3 version: 3.1.3 @@ -219,6 +222,9 @@ importers: hono: specifier: ^4.12.8 version: 4.12.8 + nanoid: + specifier: ^3.3.11 + version: 3.3.11 typescript: specifier: ^5.9.3 version: 5.9.3 From 37016befceb42e2daa388aec5b1f59c0255d8a31 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 10:43:10 +0000 Subject: [PATCH 4/8] fix(apps/demo): add @libsql/client transitive deps to vercel.json includeFiles and package.json; fix TURSO_SYNC_INTERVAL parsing, remove as any casts, fix README diagram Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> Agent-Logs-Url: https://github.com/objectstack-ai/objectql/sessions/b2684b8f-f82b-4586-af12-a917a8f44471 --- apps/demo/README.md | 2 +- apps/demo/api/[[...route]].ts | 14 ++++++++++---- apps/demo/objectstack.config.ts | 14 +++++++++----- apps/demo/package.json | 8 ++++++++ apps/demo/vercel.json | 2 +- pnpm-lock.yaml | 24 ++++++++++++++++++++++++ 6 files changed, 53 insertions(+), 11 deletions(-) diff --git a/apps/demo/README.md b/apps/demo/README.md index 040057e4..3fd6cd42 100644 --- a/apps/demo/README.md +++ b/apps/demo/README.md @@ -115,5 +115,5 @@ apps/demo/ │ ObjectStack Kernel (ObjectQL + Auth + - TursoDriver) + TursoDriver / InMemoryDriver) ``` diff --git a/apps/demo/api/[[...route]].ts b/apps/demo/api/[[...route]].ts index a0d356c6..0c222ca7 100644 --- a/apps/demo/api/[[...route]].ts +++ b/apps/demo/api/[[...route]].ts @@ -288,20 +288,26 @@ async function bootstrap(): Promise { if (tursoUrl) { log(`Registering TursoDriver (${tursoUrl})…`); const syncUrl = process.env.TURSO_SYNC_URL; + const rawSyncInterval = process.env.TURSO_SYNC_INTERVAL; + const parsedSyncInterval = + rawSyncInterval !== undefined ? Number(rawSyncInterval) : NaN; + const syncIntervalSeconds = Number.isFinite(parsedSyncInterval) + ? parsedSyncInterval + : 60; tursoDriver = createTursoDriver({ url: tursoUrl, authToken: process.env.TURSO_AUTH_TOKEN, syncUrl, sync: syncUrl ? { - intervalSeconds: Number(process.env.TURSO_SYNC_INTERVAL) || 60, + intervalSeconds: syncIntervalSeconds, onConnect: true, } : undefined, }); - // DriverPlugin from @objectstack/runtime expects the upstream Driver interface; - // TursoDriver implements @objectql/types Driver which is structurally compatible. - await withTimeout(kernel.use(new DriverPlugin(tursoDriver as any, 'turso')), PLUGIN_TIMEOUT_MS, 'DriverPlugin-turso'); + // DriverPlugin from @objectstack/runtime accepts any driver; TursoDriver + // implements @objectql/types Driver which is structurally compatible. + await withTimeout(kernel.use(new DriverPlugin(tursoDriver, 'turso')), PLUGIN_TIMEOUT_MS, 'DriverPlugin-turso'); log('TursoDriver registered.'); } else { log('Registering DriverPlugin (InMemoryDriver)…'); diff --git a/apps/demo/objectstack.config.ts b/apps/demo/objectstack.config.ts index 7d91ef1d..1c0f0e12 100644 --- a/apps/demo/objectstack.config.ts +++ b/apps/demo/objectstack.config.ts @@ -40,13 +40,19 @@ function createDefaultDriver() { if (tursoUrl) { console.log(`🗄️ Driver: Turso (${tursoUrl})`); const syncUrl = process.env.TURSO_SYNC_URL; + const rawSyncInterval = process.env.TURSO_SYNC_INTERVAL; + const parsedSyncInterval = + rawSyncInterval !== undefined ? Number(rawSyncInterval) : NaN; + const syncIntervalSeconds = Number.isFinite(parsedSyncInterval) + ? parsedSyncInterval + : 60; return createTursoDriver({ url: tursoUrl, authToken: process.env.TURSO_AUTH_TOKEN, syncUrl, sync: syncUrl ? { - intervalSeconds: Number(process.env.TURSO_SYNC_INTERVAL) || 60, + intervalSeconds: syncIntervalSeconds, onConnect: true, } : undefined, @@ -83,10 +89,8 @@ export default { ctx.registerService('driver.default', defaultDriver); }, start: async () => { - // Connect Turso driver if applicable (MemoryDriver.connect() is a no-op) - if (typeof (defaultDriver as any).connect === 'function') { - await (defaultDriver as { connect: () => Promise }).connect(); - } + // Both MemoryDriver and TursoDriver implement connect() + await defaultDriver.connect?.(); }, }, projectTrackerPlugin, diff --git a/apps/demo/package.json b/apps/demo/package.json index 5854a8ce..5b822b6e 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -13,6 +13,10 @@ "devDependencies": { "@hono/node-server": "^1.19.11", "@libsql/client": "^0.17.2", + "@libsql/core": "^0.17.2", + "@libsql/hrana-client": "^0.9.0", + "@libsql/isomorphic-ws": "^0.1.5", + "@neon-rs/load": "^0.0.4", "@object-ui/console": "^3.1.3", "@objectql/core": "workspace:*", "@objectql/driver-memory": "workspace:*", @@ -37,8 +41,12 @@ "@objectstack/runtime": "^3.2.8", "@objectstack/studio": "^3.2.8", "@types/node": "^20.19.37", + "detect-libc": "^2.0.2", "hono": "^4.12.8", + "js-base64": "^3.7.8", + "libsql": "^0.5.28", "nanoid": "^3.3.11", + "promise-limit": "^2.7.0", "typescript": "^5.9.3", "zod": "^4.3.6" }, diff --git a/apps/demo/vercel.json b/apps/demo/vercel.json index e81dd1e6..6d417447 100644 --- a/apps/demo/vercel.json +++ b/apps/demo/vercel.json @@ -7,7 +7,7 @@ "api/**/*.ts": { "memory": 1024, "maxDuration": 60, - "includeFiles": "{node_modules/@object-ui/console/dist,node_modules/@objectstack/plugin-auth/dist,node_modules/@objectstack/studio/dist,node_modules/@objectql/example-project-tracker/dist}/**" + "includeFiles": "{node_modules/@object-ui/console/dist,node_modules/@objectstack/plugin-auth/dist,node_modules/@objectstack/studio/dist,node_modules/@objectql/example-project-tracker/dist,node_modules/@objectql/driver-turso/dist,node_modules/@libsql,node_modules/libsql,node_modules/@neon-rs,node_modules/detect-libc,node_modules/js-base64,node_modules/promise-limit,node_modules/nanoid}/**" } }, "rewrites": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96594899..8bd5de5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,6 +147,18 @@ importers: '@libsql/client': specifier: ^0.17.2 version: 0.17.2(encoding@0.1.13) + '@libsql/core': + specifier: ^0.17.2 + version: 0.17.2 + '@libsql/hrana-client': + specifier: ^0.9.0 + version: 0.9.0(encoding@0.1.13) + '@libsql/isomorphic-ws': + specifier: ^0.1.5 + version: 0.1.5 + '@neon-rs/load': + specifier: ^0.0.4 + version: 0.0.4 '@object-ui/console': specifier: ^3.1.3 version: 3.1.3 @@ -219,12 +231,24 @@ importers: '@types/node': specifier: ^20.19.37 version: 20.19.37 + detect-libc: + specifier: ^2.0.2 + version: 2.1.2 hono: specifier: ^4.12.8 version: 4.12.8 + js-base64: + specifier: ^3.7.8 + version: 3.7.8 + libsql: + specifier: ^0.5.28 + version: 0.5.28 nanoid: specifier: ^3.3.11 version: 3.3.11 + promise-limit: + specifier: ^2.7.0 + version: 2.7.0 typescript: specifier: ^5.9.3 version: 5.9.3 From f8360c3c9f631b95642fceefb5541770b690d797 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 10:44:44 +0000 Subject: [PATCH 5/8] =?UTF-8?q?fix(apps/demo):=20clarify=20connect=3F.()?= =?UTF-8?q?=20comment=20=E2=80=94=20Driver.connect()=20is=20optional=20in?= =?UTF-8?q?=20interface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> Agent-Logs-Url: https://github.com/objectstack-ai/objectql/sessions/b2684b8f-f82b-4586-af12-a917a8f44471 --- apps/demo/objectstack.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/demo/objectstack.config.ts b/apps/demo/objectstack.config.ts index 1c0f0e12..85d46827 100644 --- a/apps/demo/objectstack.config.ts +++ b/apps/demo/objectstack.config.ts @@ -89,7 +89,7 @@ export default { ctx.registerService('driver.default', defaultDriver); }, start: async () => { - // Both MemoryDriver and TursoDriver implement connect() + // Driver.connect() is optional in the interface; call if present await defaultDriver.connect?.(); }, }, From 138eccda9d98c5dc0ff5d7e671c3c9e1d8a47836 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 10:48:54 +0000 Subject: [PATCH 6/8] =?UTF-8?q?fix(apps/demo):=20convert=20vercel.json=20i?= =?UTF-8?q?ncludeFiles=20to=20array=20=E2=80=94=20single=20glob=20exceeded?= =?UTF-8?q?=20256-char=20limit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> Agent-Logs-Url: https://github.com/objectstack-ai/objectql/sessions/259b362b-c318-427b-a31b-02f0f6a8467a --- apps/demo/vercel.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/demo/vercel.json b/apps/demo/vercel.json index 6d417447..5eecb0de 100644 --- a/apps/demo/vercel.json +++ b/apps/demo/vercel.json @@ -7,7 +7,20 @@ "api/**/*.ts": { "memory": 1024, "maxDuration": 60, - "includeFiles": "{node_modules/@object-ui/console/dist,node_modules/@objectstack/plugin-auth/dist,node_modules/@objectstack/studio/dist,node_modules/@objectql/example-project-tracker/dist,node_modules/@objectql/driver-turso/dist,node_modules/@libsql,node_modules/libsql,node_modules/@neon-rs,node_modules/detect-libc,node_modules/js-base64,node_modules/promise-limit,node_modules/nanoid}/**" + "includeFiles": [ + "node_modules/@object-ui/console/dist/**", + "node_modules/@objectstack/plugin-auth/dist/**", + "node_modules/@objectstack/studio/dist/**", + "node_modules/@objectql/example-project-tracker/dist/**", + "node_modules/@objectql/driver-turso/dist/**", + "node_modules/@libsql/**", + "node_modules/libsql/**", + "node_modules/@neon-rs/**", + "node_modules/detect-libc/**", + "node_modules/js-base64/**", + "node_modules/promise-limit/**", + "node_modules/nanoid/**" + ] } }, "rewrites": [ From 477a1b2af581b1e9242cf1a230202ebb78be0ce8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 10:56:29 +0000 Subject: [PATCH 7/8] =?UTF-8?q?fix(apps/demo):=20vercel.json=20includeFile?= =?UTF-8?q?s=20must=20be=20string=20=E2=80=94=20use=20scope-level=20wildca?= =?UTF-8?q?rds=20to=20stay=20under=20256=20chars?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> Agent-Logs-Url: https://github.com/objectstack-ai/objectql/sessions/bc5f02b5-94c7-461d-88ad-1b1426c7d9a8 --- apps/demo/vercel.json | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/apps/demo/vercel.json b/apps/demo/vercel.json index 5eecb0de..8111f115 100644 --- a/apps/demo/vercel.json +++ b/apps/demo/vercel.json @@ -7,20 +7,7 @@ "api/**/*.ts": { "memory": 1024, "maxDuration": 60, - "includeFiles": [ - "node_modules/@object-ui/console/dist/**", - "node_modules/@objectstack/plugin-auth/dist/**", - "node_modules/@objectstack/studio/dist/**", - "node_modules/@objectql/example-project-tracker/dist/**", - "node_modules/@objectql/driver-turso/dist/**", - "node_modules/@libsql/**", - "node_modules/libsql/**", - "node_modules/@neon-rs/**", - "node_modules/detect-libc/**", - "node_modules/js-base64/**", - "node_modules/promise-limit/**", - "node_modules/nanoid/**" - ] + "includeFiles": "node_modules/{@object-ui/*/dist,@objectstack/*/dist,@objectql/*/dist,@libsql,@neon-rs,libsql,detect-libc,js-base64,promise-limit,nanoid}/**" } }, "rewrites": [ From cd08385126eedf89c4d6d0060403fb5cd6eb3978 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 11:55:12 +0000 Subject: [PATCH 8/8] fix(apps/demo): add ws, cross-fetch, node-fetch as explicit devDeps and to vercel.json includeFiles Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> Agent-Logs-Url: https://github.com/objectstack-ai/objectql/sessions/b6031531-e25c-4d91-b5d7-330a54f53d0c --- apps/demo/package.json | 3 +++ apps/demo/vercel.json | 2 +- pnpm-lock.yaml | 9 +++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/demo/package.json b/apps/demo/package.json index 5b822b6e..71bf7efd 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -48,6 +48,9 @@ "nanoid": "^3.3.11", "promise-limit": "^2.7.0", "typescript": "^5.9.3", + "ws": "^8.19.0", + "cross-fetch": "^4.1.0", + "node-fetch": "^2.7.0", "zod": "^4.3.6" }, "engines": { diff --git a/apps/demo/vercel.json b/apps/demo/vercel.json index 8111f115..60e6dbf4 100644 --- a/apps/demo/vercel.json +++ b/apps/demo/vercel.json @@ -7,7 +7,7 @@ "api/**/*.ts": { "memory": 1024, "maxDuration": 60, - "includeFiles": "node_modules/{@object-ui/*/dist,@objectstack/*/dist,@objectql/*/dist,@libsql,@neon-rs,libsql,detect-libc,js-base64,promise-limit,nanoid}/**" + "includeFiles": "node_modules/{@object-ui/*/dist,@objectstack/*/dist,@objectql/*/dist,@libsql,@neon-rs,libsql,detect-libc,js-base64,promise-limit,nanoid,ws,cross-fetch,node-fetch}/**" } }, "rewrites": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bd5de5d..5be4698b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -231,6 +231,9 @@ importers: '@types/node': specifier: ^20.19.37 version: 20.19.37 + cross-fetch: + specifier: ^4.1.0 + version: 4.1.0(encoding@0.1.13) detect-libc: specifier: ^2.0.2 version: 2.1.2 @@ -246,12 +249,18 @@ importers: nanoid: specifier: ^3.3.11 version: 3.3.11 + node-fetch: + specifier: ^2.7.0 + version: 2.7.0(encoding@0.1.13) promise-limit: specifier: ^2.7.0 version: 2.7.0 typescript: specifier: ^5.9.3 version: 5.9.3 + ws: + specifier: ^8.19.0 + version: 8.19.0 zod: specifier: ^4.3.6 version: 4.3.6