From 8d32e8d56ef45eb40364bebbb5f4515d25ef6494 Mon Sep 17 00:00:00 2001
From: RedStar
Date: Fri, 21 Aug 2026 15:38:18 +0200
Subject: [PATCH 01/10] feat(build-env): resolve build metadata with a
non-Vercel runtime fallback
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Adds packages/build-env, resolving version/commit/branch/deploy-channel
from the hosting provider first and the checkout second (matching the
npmx.dev and wolfstar.rocks pattern), and registers it as a Nuxt module
in the dashboard and marketing apps.
Vercel resolves everything at build time. Every other target — a
container image built in CI, a self-hosted `node .output/server/index.mjs`
— resolves what it can from the checkout and completes the rest from
AGENT_ZERO_BUILD_* at server start, so a non-Vercel deployment still
reports the commit it is actually serving.
---
AGENTS.md | 2 +
apps/dashboard/.env.example | 17 ++
apps/dashboard/nuxt.config.ts | 5 +
apps/dashboard/package.json | 1 +
apps/dashboard/test/nuxt/build-env.spec.ts | 31 ++
.../1.guide/4.environment-variables.md | 44 +++
apps/marketing/.env.example | 16 +
apps/marketing/nuxt.config.ts | 5 +
apps/marketing/package.json | 1 +
packages/build-env/package.json | 44 +++
packages/build-env/src/build-info.test.ts | 135 +++++++++
packages/build-env/src/build-info.ts | 111 +++++++
packages/build-env/src/environment.test.ts | 202 +++++++++++++
packages/build-env/src/environment.ts | 246 +++++++++++++++
packages/build-env/src/git.ts | 53 ++++
packages/build-env/src/index.ts | 18 ++
packages/build-env/src/nuxt.ts | 128 ++++++++
packages/build-env/src/resolve.test.ts | 84 ++++++
packages/build-env/src/resolve.ts | 96 ++++++
packages/build-env/src/types.ts | 49 +++
packages/build-env/tsconfig.json | 5 +
packages/build-env/tsdown.config.ts | 20 ++
pnpm-lock.yaml | 279 +++++++-----------
tsconfig.json | 1 +
turbo.jsonc | 58 +++-
25 files changed, 1482 insertions(+), 169 deletions(-)
create mode 100644 apps/dashboard/test/nuxt/build-env.spec.ts
create mode 100644 packages/build-env/package.json
create mode 100644 packages/build-env/src/build-info.test.ts
create mode 100644 packages/build-env/src/build-info.ts
create mode 100644 packages/build-env/src/environment.test.ts
create mode 100644 packages/build-env/src/environment.ts
create mode 100644 packages/build-env/src/git.ts
create mode 100644 packages/build-env/src/index.ts
create mode 100644 packages/build-env/src/nuxt.ts
create mode 100644 packages/build-env/src/resolve.test.ts
create mode 100644 packages/build-env/src/resolve.ts
create mode 100644 packages/build-env/src/types.ts
create mode 100644 packages/build-env/tsconfig.json
create mode 100644 packages/build-env/tsdown.config.ts
diff --git a/AGENTS.md b/AGENTS.md
index b5a3398..0d4c024 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -41,6 +41,7 @@ Agent Zero is an open-source autonomous engineer that finds, fixes, and verifies
| `packages/source-control` | `@agent-zero/source-control` | Provider-neutral contracts plus GitHub, GitLab, Bitbucket, Gitea |
| `packages/config` | `@agent-zero/config` | Configuration parsing and policy |
| `packages/shared` | `@agent-zero/shared` | Stable cross-package contracts |
+| `packages/build-env` | `@agent-zero/build-env` | Build metadata resolution and the Nuxt module that publishes it |
| `packages/cli` | `@agent-zero/cli` | Argument parsing and terminal presentation |
| `packages/database` | `@agent-zero/database` | Schema, Drizzle client, and checked-in migrations |
| `packages/auth` | `@agent-zero/auth` | Authentication policy and the Better Auth options factory |
@@ -130,6 +131,7 @@ Use the smallest relevant check while iterating, then run the complete set befor
- `packages/source-control`: provider-neutral source-control contracts, with GitHub, GitLab, Bitbucket, and Gitea adapters underneath.
- `packages/config`: configuration parsing and policy.
- `packages/shared`: stable cross-package contracts.
+- `packages/build-env`: build metadata (version, commit, branch, deploy channel) and the Nuxt module that publishes it under `runtimeConfig.public.buildInfo`. Build-time resolution reads the hosting provider's variables first and the checkout second; the deployed server completes only what the build could not resolve. Not a runtime package: nothing in `packages/agent`, `packages/runner`, or their adapters may import it.
- `packages/cli`: argument parsing and terminal presentation.
- `packages/database`: the schema, the Drizzle client, and the checked-in migrations. The only package that talks to Postgres. No policy, no HTTP, no runtime imports.
- `packages/auth`: authentication policy and the Better Auth options factory. Reads the store through `packages/database`. No HTTP server, no runtime imports.
diff --git a/apps/dashboard/.env.example b/apps/dashboard/.env.example
index 8bde3ec..4c56739 100644
--- a/apps/dashboard/.env.example
+++ b/apps/dashboard/.env.example
@@ -148,3 +148,20 @@ VITEHUB_HOSTING=
# has no writable filesystem to keep task history on. Unused by the self-hosted `node` preset.
KV_REST_API_URL=
KV_REST_API_TOKEN=
+
+# Build metadata (packages/build-env), published under runtimeConfig.public.buildInfo and read
+# with useBuildInfo(). On Vercel every field is resolved from the platform's own VERCEL_GIT_*
+# variables while the build runs, and none of these need to be set. Everywhere else — a container
+# image built in CI, a self-hosted `node .output/server/index.mjs` — the build resolves what it
+# can from the checkout and the server completes the rest from these at run time.
+#
+# Setting any of them takes precedence over every auto-detected provider, so a deployment can
+# always state what it is rather than have it inferred.
+AGENT_ZERO_BUILD_COMMIT=
+AGENT_ZERO_BUILD_BRANCH=
+AGENT_ZERO_BUILD_PR_NUMBER=
+AGENT_ZERO_BUILD_URL=
+AGENT_ZERO_BUILD_PRODUCTION_URL=
+# One of dev, preview, canary, release. The one field no detection can work out for a self-hosted
+# staging deployment, which is a preview in every way that matters to the people looking at it.
+AGENT_ZERO_BUILD_ENV=
diff --git a/apps/dashboard/nuxt.config.ts b/apps/dashboard/nuxt.config.ts
index 0fc5f44..4c297e3 100644
--- a/apps/dashboard/nuxt.config.ts
+++ b/apps/dashboard/nuxt.config.ts
@@ -69,6 +69,11 @@ export default defineNuxtConfig({
// Upstash on Vercel — otherwise): ViteHub picks the driver from the deployment preset, and a
// serverless function has no writable filesystem to keep task history on.
['vite-hub/nuxt', { preset: viteHubPreset, kv: true }],
+ // Publishes what this build is (version, commit, branch, deploy channel) under
+ // `runtimeConfig.public.buildInfo`. On Vercel the values are resolved while the build runs;
+ // every other target resolves what it can and the server completes the rest at boot, so a
+ // self-hosted bundle still reports the commit it was built from. See packages/build-env.
+ '@agent-zero/build-env/nuxt',
'@unocss/nuxt',
'@nuxt/icon',
'@nuxtjs/i18n',
diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json
index ac59702..a015819 100644
--- a/apps/dashboard/package.json
+++ b/apps/dashboard/package.json
@@ -24,6 +24,7 @@
"dependencies": {
"@agent-zero/api": "workspace:*",
"@agent-zero/auth": "workspace:*",
+ "@agent-zero/build-env": "workspace:*",
"@agent-zero/i18n": "workspace:*",
"@agent-zero/mail": "workspace:*",
"@agent-zero/shared": "workspace:*",
diff --git a/apps/dashboard/test/nuxt/build-env.spec.ts b/apps/dashboard/test/nuxt/build-env.spec.ts
new file mode 100644
index 0000000..538e829
--- /dev/null
+++ b/apps/dashboard/test/nuxt/build-env.spec.ts
@@ -0,0 +1,31 @@
+import { describe, expect, it } from 'vitest';
+
+import { useBuildInfo } from '#imports';
+
+/**
+ * The dashboard's half of `packages/build-env`: that the module is registered, that it publishes
+ * its metadata where `useBuildInfo()` reads it, and that a test run gets the fixed values rather
+ * than whatever branch and commit the checkout happens to be on.
+ *
+ * The resolution itself is covered by the package's own suites; what cannot be covered there is
+ * the wiring — the auto-import, and the runtime-config key it reads.
+ */
+describe('useBuildInfo', () => {
+ it('publishes deterministic metadata under test, so no assertion depends on the checkout', () => {
+ expect(useBuildInfo()).toStrictEqual({
+ version: '0.0.0',
+ commit: '0000000000000000000000000000000000000000',
+ shortCommit: '0000000',
+ branch: 'test',
+ env: 'dev',
+ time: 0,
+ prNumber: null,
+ previewUrl: null,
+ productionUrl: null,
+ });
+ });
+
+ it('reads the same values the build published to the public runtime config', () => {
+ expect(useBuildInfo()).toStrictEqual(useRuntimeConfig().public.buildInfo);
+ });
+});
diff --git a/apps/docs/content/1.guide/4.environment-variables.md b/apps/docs/content/1.guide/4.environment-variables.md
index 9b79cb0..c951eb6 100644
--- a/apps/docs/content/1.guide/4.environment-variables.md
+++ b/apps/docs/content/1.guide/4.environment-variables.md
@@ -156,6 +156,50 @@ rather than resolved to the neighbouring target.
See [Deployment](/guide/deployment).
+## Build metadata
+
+Every Nuxt app resolves what build it is — version, commit, branch, deploy channel, deploy URL —
+and publishes it under `runtimeConfig.public.buildInfo`, read with `useBuildInfo()`. The resolution
+lives in `packages/build-env` and runs in two passes.
+
+The first pass runs during the build. It asks the hosting provider first and the checkout second:
+a provider knows the branch a detached CI checkout cannot name, and knows whether the deploy is
+production. `VERCEL_GIT_COMMIT_SHA` and friends on Vercel, `COMMIT_REF` and `CONTEXT` on Netlify,
+`CF_PAGES_COMMIT_SHA` on Cloudflare Pages, `GITHUB_SHA` on a GitHub Actions runner. None of these
+are set by you; they are set by the platform, and are listed in `turbo.jsonc` so a build never
+restores a cached bundle that reports a different commit.
+
+The second pass runs in the deployed server, and is what every target that is not Vercel needs. A
+container image built in CI has none of the platform variables in scope while it is being built, so
+its first pass resolves what git can tell it and leaves the rest as `unknown`. Those fields — and
+only those — are completed when the server starts, from the environment the host actually runs it
+in. A field the build resolved is never overwritten: the commit a bundle was compiled from is a
+property of the bundle, not of the machine serving the request.
+
+For a deployment on no recognised platform, or one that wants to state outright what it is:
+
+| Variable | Purpose |
+| --------------------------------- | -------------------------------------------------------- |
+| `AGENT_ZERO_BUILD_COMMIT` | Full commit SHA the bundle was built from |
+| `AGENT_ZERO_BUILD_BRANCH` | Git branch |
+| `AGENT_ZERO_BUILD_PR_NUMBER` | Pull request number, for a pull-request deploy |
+| `AGENT_ZERO_BUILD_URL` | URL of this deploy |
+| `AGENT_ZERO_BUILD_PRODUCTION_URL` | URL of the production domain |
+| `AGENT_ZERO_BUILD_ENV` | Deploy channel: `dev`, `preview`, `canary`, or `release` |
+
+Setting any of them takes precedence over every auto-detected platform, so an operator's answer
+always wins over an inferred one. `AGENT_ZERO_BUILD_ENV` is the field detection can never work out
+on its own: a self-hosted staging deployment is a `preview` in every way that matters to the people
+looking at it, and nothing about a plain `node .output/server/index.mjs` says so.
+
+Individual fields can also be overridden through Nuxt's own public runtime config channel —
+`NUXT_PUBLIC_BUILD_INFO_COMMIT`, `NUXT_PUBLIC_BUILD_INFO_SHORT_COMMIT`, and so on — which applies
+before the server's own pass and needs no rebuild.
+
+A prerendered route has no server left to ask, so on `apps/marketing` the second pass runs while
+the page is prerendered rather than while it is served. On Vercel that changes nothing: the build
+already resolved every field.
+
## Documentation
| Variable | Purpose |
diff --git a/apps/marketing/.env.example b/apps/marketing/.env.example
index 8213a83..bf28c21 100644
--- a/apps/marketing/.env.example
+++ b/apps/marketing/.env.example
@@ -15,3 +15,19 @@
MARKETING_SITE_URL=http://localhost:3001
# Where the marketing site's "Sign in" link and primary calls to action point.
MARKETING_DASHBOARD_URL=http://localhost:3000
+
+# Build metadata (packages/build-env), published under runtimeConfig.public.buildInfo and read
+# with useBuildInfo(). On Vercel every field is resolved from the platform's own VERCEL_GIT_*
+# variables while the build runs, and none of these need to be set. Everywhere else the build
+# resolves what it can from the checkout and the server completes the rest from these at run time
+# — for the routes this site prerenders, that means at build time, since a prerendered page has no
+# server left to ask.
+#
+# Setting any of them takes precedence over every auto-detected provider.
+AGENT_ZERO_BUILD_COMMIT=
+AGENT_ZERO_BUILD_BRANCH=
+AGENT_ZERO_BUILD_PR_NUMBER=
+AGENT_ZERO_BUILD_URL=
+AGENT_ZERO_BUILD_PRODUCTION_URL=
+# One of dev, preview, canary, release.
+AGENT_ZERO_BUILD_ENV=
diff --git a/apps/marketing/nuxt.config.ts b/apps/marketing/nuxt.config.ts
index ebd6df1..4083759 100644
--- a/apps/marketing/nuxt.config.ts
+++ b/apps/marketing/nuxt.config.ts
@@ -35,6 +35,11 @@ export default defineNuxtConfig({
// `modules/` is scanned by Nuxt itself, so the local feature modules (shared, home, contact,
// blog, i18n-strip-empty) register themselves without being listed here.
modules: [
+ // Publishes what this build is (version, commit, branch, deploy channel) under
+ // `runtimeConfig.public.buildInfo`. On Vercel the values are resolved while the build runs;
+ // every other target resolves what it can and the server completes the rest at boot, so a
+ // self-hosted bundle still reports the commit it was built from. See packages/build-env.
+ '@agent-zero/build-env/nuxt',
'@unocss/nuxt',
'@nuxt/icon',
'@nuxt/content',
diff --git a/apps/marketing/package.json b/apps/marketing/package.json
index fb68513..02bcf4a 100644
--- a/apps/marketing/package.json
+++ b/apps/marketing/package.json
@@ -19,6 +19,7 @@
"typecheck": "nuxt typecheck"
},
"dependencies": {
+ "@agent-zero/build-env": "workspace:*",
"@agent-zero/i18n": "workspace:*",
"nuxt": "^4.5.2",
"vue": "^3.5.40",
diff --git a/packages/build-env/package.json b/packages/build-env/package.json
new file mode 100644
index 0000000..814fd85
--- /dev/null
+++ b/packages/build-env/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "@agent-zero/build-env",
+ "version": "0.4.0",
+ "type": "module",
+ "main": "./dist/index.mjs",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.mts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.mts",
+ "default": "./dist/index.mjs"
+ },
+ "./nuxt": {
+ "types": "./dist/nuxt.d.mts",
+ "default": "./dist/nuxt.mjs"
+ },
+ "./package.json": "./package.json"
+ },
+ "scripts": {
+ "build": "tsdown",
+ "clean": "tsc -b --clean",
+ "lint": "oxlint --config ../../tooling/oxc/packages.oxlintrc.json --type-aware --type-check src",
+ "lint:fix": "oxlint --fix --config ../../tooling/oxc/packages.oxlintrc.json --type-aware --type-check src",
+ "test": "vitest run src --passWithNoTests",
+ "typecheck": "tsc --project tsconfig.json --pretty false --noEmit"
+ },
+ "devDependencies": {
+ "@nuxt/kit": "^4.5.2",
+ "@nuxt/schema": "^4.5.2",
+ "oxlint": "^1.44.0",
+ "oxlint-tsgolint": "^7.0.2001",
+ "tsdown": "^0.22.14",
+ "typescript": "^5.9.2",
+ "vitest": "^4.1.10"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": "^4.5.2"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ }
+ }
+}
diff --git a/packages/build-env/src/build-info.test.ts b/packages/build-env/src/build-info.test.ts
new file mode 100644
index 0000000..fb0ff91
--- /dev/null
+++ b/packages/build-env/src/build-info.test.ts
@@ -0,0 +1,135 @@
+import { describe, expect, it } from 'vitest';
+
+import { runtimeBuildInfo, shortenCommit } from './build-info.js';
+import { type BuildInfo, unknownRevision } from './types.js';
+
+/** What a build that resolved nothing publishes: every revision field carries the sentinel. */
+const unresolvedBuild: BuildInfo = {
+ version: '0.4.0',
+ commit: unknownRevision,
+ shortCommit: unknownRevision,
+ branch: unknownRevision,
+ env: 'release',
+ time: 1_700_000_000_000,
+ prNumber: null,
+ previewUrl: null,
+ productionUrl: null,
+};
+
+/** What a Vercel build publishes: everything resolved while the build ran. */
+const resolvedBuild: BuildInfo = {
+ ...unresolvedBuild,
+ commit: '1234567890abcdef',
+ shortCommit: '1234567',
+ branch: 'main',
+};
+
+describe('shortenCommit', () => {
+ it('abbreviates to the seven characters every provider UI shows', () => {
+ expect(shortenCommit('1234567890abcdef')).toBe('1234567');
+ });
+
+ it('passes the unresolved sentinel through rather than slicing it', () => {
+ expect(shortenCommit(unknownRevision)).toBe(unknownRevision);
+ });
+});
+
+describe('runtimeBuildInfo', () => {
+ it('completes a container image from the environment its host starts it with', () => {
+ expect(
+ runtimeBuildInfo(unresolvedBuild, {
+ AGENT_ZERO_BUILD_COMMIT: 'fedcba0987654321',
+ AGENT_ZERO_BUILD_BRANCH: 'main',
+ }),
+ ).toMatchObject({
+ commit: 'fedcba0987654321',
+ shortCommit: 'fedcba0',
+ branch: 'main',
+ });
+ });
+
+ it('never rewrites a field the build resolved, since the commit is a property of the bundle', () => {
+ expect(
+ runtimeBuildInfo(resolvedBuild, {
+ AGENT_ZERO_BUILD_COMMIT: 'fedcba0987654321',
+ AGENT_ZERO_BUILD_BRANCH: 'somewhere-else',
+ }),
+ ).toMatchObject({ commit: '1234567890abcdef', shortCommit: '1234567', branch: 'main' });
+ });
+
+ it('is a no-op on Vercel, where the build already read the same variables', () => {
+ const vercelEnvironment = {
+ VERCEL: '1',
+ VERCEL_ENV: 'production',
+ VERCEL_GIT_COMMIT_REF: 'main',
+ VERCEL_GIT_COMMIT_SHA: '1234567890abcdef',
+ };
+ expect(runtimeBuildInfo(resolvedBuild, vercelEnvironment)).toStrictEqual(resolvedBuild);
+ });
+
+ it('lets a host that knows it is serving a preview reclassify a bundle built elsewhere', () => {
+ expect(
+ runtimeBuildInfo(
+ { ...resolvedBuild, branch: 'feat/env' },
+ {
+ VERCEL_ENV: 'preview',
+ VERCEL_GIT_COMMIT_REF: 'feat/env',
+ VERCEL_URL: 'agent-zero-abc123.vercel.app',
+ },
+ ).env,
+ ).toBe('preview');
+ });
+
+ it('classifies the default branch on a preview channel as the canary', () => {
+ expect(
+ runtimeBuildInfo(resolvedBuild, {
+ VERCEL_ENV: 'preview',
+ VERCEL_GIT_COMMIT_REF: 'main',
+ }).env,
+ ).toBe('canary');
+ });
+
+ it('leaves the classification alone when the host reports no context at all', () => {
+ expect(runtimeBuildInfo(resolvedBuild, {}).env).toBe('release');
+ });
+
+ it('never revises a development build, whatever variables are in the shell', () => {
+ expect(
+ runtimeBuildInfo({ ...resolvedBuild, env: 'dev' }, { VERCEL_ENV: 'production' }).env,
+ ).toBe('dev');
+ });
+
+ it('honours an operator that states outright what the deployment is', () => {
+ expect(runtimeBuildInfo(resolvedBuild, { AGENT_ZERO_BUILD_ENV: 'preview' }).env).toBe(
+ 'preview',
+ );
+ });
+
+ it('treats the empty strings Nuxt rewrites null runtime-config values to as unresolved', () => {
+ expect(
+ runtimeBuildInfo(
+ { ...resolvedBuild, prNumber: '', previewUrl: '', productionUrl: '' },
+ {
+ VERCEL_ENV: 'preview',
+ VERCEL_GIT_COMMIT_REF: 'feat/env',
+ VERCEL_GIT_PULL_REQUEST_ID: '7',
+ VERCEL_URL: 'agent-zero-abc123.vercel.app',
+ },
+ ),
+ ).toMatchObject({
+ prNumber: '7',
+ previewUrl: 'https://agent-zero-abc123.vercel.app',
+ productionUrl: null,
+ });
+ });
+
+ it('fills the deploy URLs a build off the host could not know', () => {
+ expect(
+ runtimeBuildInfo(resolvedBuild, {
+ VERCEL_ENV: 'preview',
+ VERCEL_GIT_COMMIT_REF: 'feat/env',
+ VERCEL_URL: 'agent-zero-abc123.vercel.app',
+ }),
+ ).toMatchObject({ previewUrl: 'https://agent-zero-abc123.vercel.app', productionUrl: null });
+ });
+});
diff --git a/packages/build-env/src/build-info.ts b/packages/build-env/src/build-info.ts
new file mode 100644
index 0000000..d729e31
--- /dev/null
+++ b/packages/build-env/src/build-info.ts
@@ -0,0 +1,111 @@
+import {
+ type DeploymentMetadata,
+ deploymentMetadataFromEnvironment,
+ envTypeFromMetadata,
+ envTypeOverrideFromEnvironment,
+ previewUrlFromMetadata,
+ productionUrlFromMetadata,
+} from './environment.js';
+import { type BuildInfo, type EnvironmentRecord, unknownRevision } from './types.js';
+
+/** Seven characters is what `git rev-parse --short` and every provider's UI abbreviate to. */
+const shortCommitLength = 7;
+
+/** Abbreviates a commit SHA, passing the unresolved sentinel through unchanged. */
+export function shortenCommit(commit: string): string {
+ return commit === unknownRevision ? unknownRevision : commit.slice(0, shortCommitLength);
+}
+
+/** Whether a revision field is still carrying the sentinel rather than a resolved value. */
+function isUnresolved(value: string): boolean {
+ return value === unknownRevision;
+}
+
+/**
+ * Normalises a nullable field back to `null` when it is empty.
+ *
+ * Nuxt rewrites every `null` in `runtimeConfig` to `''` so each key stays overridable through its
+ * `NUXT_PUBLIC_*` variable, which means the three nullable fields arrive here as empty strings
+ * rather than as the `null` the build published. Without this they would read as resolved, and the
+ * run-time pass would decline to fill exactly the fields it exists to fill.
+ */
+function nullable(value: string | null): string | null {
+ return value?.trim() ? value : null;
+}
+
+/**
+ * Completes build metadata from the environment the bundle is *running* in.
+ *
+ * This is the fallback for every deployment that is not Vercel. On Vercel the build itself runs
+ * with `VERCEL_GIT_COMMIT_SHA` and the rest in scope, so the values are already baked in and this
+ * pass is a no-op that resolves to the same answers. A container image built in CI and started
+ * somewhere else has none of them at build time: the fields arrive at boot instead, from whatever
+ * the host exposes, or from the `AGENT_ZERO_BUILD_*` variables an operator sets on the process.
+ *
+ * A field the build resolved is never overwritten. The commit a bundle was compiled from is a
+ * property of the bundle, not of the machine it happens to be running on, and letting a run-time
+ * variable rewrite it would make the metadata describe a different build than the one serving the
+ * request.
+ */
+export function runtimeBuildInfo(
+ buildInfo: BuildInfo,
+ environment: EnvironmentRecord,
+ options: { readonly defaultBranch?: string } = {},
+): BuildInfo {
+ const metadata = deploymentMetadataFromEnvironment(environment);
+
+ const commit = isUnresolved(buildInfo.commit)
+ ? (metadata.commit ?? unknownRevision)
+ : buildInfo.commit;
+ const branch = isUnresolved(buildInfo.branch)
+ ? (metadata.branch ?? unknownRevision)
+ : buildInfo.branch;
+ const prNumber = nullable(buildInfo.prNumber) ?? metadata.prNumber;
+
+ const env = runtimeEnvType(
+ buildInfo,
+ environment,
+ { ...metadata, branch: isUnresolved(branch) ? null : branch, prNumber },
+ options.defaultBranch,
+ );
+
+ return {
+ ...buildInfo,
+ commit,
+ // Re-derived rather than carried over: a build that resolved neither field publishes both
+ // sentinels, and the run-time commit is what the short form has to abbreviate.
+ shortCommit: isUnresolved(buildInfo.shortCommit)
+ ? shortenCommit(commit)
+ : buildInfo.shortCommit,
+ branch,
+ env,
+ prNumber,
+ previewUrl: nullable(buildInfo.previewUrl) ?? previewUrlFromMetadata(metadata, env),
+ productionUrl: nullable(buildInfo.productionUrl) ?? productionUrlFromMetadata(metadata, env),
+ };
+}
+
+/**
+ * Which deployment the running bundle is, given what the build decided and what the host says.
+ *
+ * `dev` is never revised: a bundle built by `nuxt dev` is a developer's own machine whatever
+ * variables happen to be in its shell. Otherwise a host that reports a production-versus-preview
+ * context is authoritative, because it is the only party that knows which domain is answering —
+ * and on Vercel it reports at run time exactly what it reported at build time, so the pass is
+ * idempotent rather than a second, divergent opinion.
+ */
+function runtimeEnvType(
+ buildInfo: BuildInfo,
+ environment: EnvironmentRecord,
+ metadata: DeploymentMetadata,
+ defaultBranch: string | undefined,
+): BuildInfo['env'] {
+ const override = envTypeOverrideFromEnvironment(environment);
+ if (override) return override;
+ if (buildInfo.env === 'dev') return 'dev';
+ if (metadata.context === null) return buildInfo.env;
+ return envTypeFromMetadata(metadata, {
+ isDevelopment: false,
+ ...(defaultBranch === undefined ? {} : { defaultBranch }),
+ });
+}
diff --git a/packages/build-env/src/environment.test.ts b/packages/build-env/src/environment.test.ts
new file mode 100644
index 0000000..8c2f3c1
--- /dev/null
+++ b/packages/build-env/src/environment.test.ts
@@ -0,0 +1,202 @@
+import { describe, expect, it } from 'vitest';
+
+import {
+ deploymentMetadataFromEnvironment,
+ envTypeFromMetadata,
+ envTypeOverrideFromEnvironment,
+ previewUrlFromMetadata,
+ productionUrlFromMetadata,
+} from './environment.js';
+
+describe('deploymentMetadataFromEnvironment', () => {
+ it('reads a Vercel production deploy, adding the scheme its host variables omit', () => {
+ expect(
+ deploymentMetadataFromEnvironment({
+ VERCEL: '1',
+ VERCEL_ENV: 'production',
+ VERCEL_GIT_COMMIT_REF: 'main',
+ VERCEL_GIT_COMMIT_SHA: '1234567890abcdef',
+ VERCEL_PROJECT_PRODUCTION_URL: 'agent-zero.dev',
+ VERCEL_URL: 'agent-zero-abc123.vercel.app',
+ }),
+ ).toStrictEqual({
+ provider: 'vercel',
+ branch: 'main',
+ commit: '1234567890abcdef',
+ prNumber: null,
+ deployUrl: 'https://agent-zero-abc123.vercel.app',
+ productionUrl: 'https://agent-zero.dev',
+ context: 'production',
+ });
+ });
+
+ it('reads a Netlify pull-request deploy', () => {
+ expect(
+ deploymentMetadataFromEnvironment({
+ NETLIFY: 'true',
+ CONTEXT: 'deploy-preview',
+ BRANCH: 'feat/env',
+ COMMIT_REF: 'abcdef1234567890',
+ REVIEW_ID: '42',
+ DEPLOY_PRIME_URL: 'https://deploy-preview-42--agent-zero.netlify.app',
+ URL: 'https://agent-zero.netlify.app',
+ }),
+ ).toMatchObject({
+ provider: 'netlify',
+ branch: 'feat/env',
+ prNumber: '42',
+ deployUrl: 'https://deploy-preview-42--agent-zero.netlify.app',
+ context: 'preview',
+ });
+ });
+
+ it('reads a Cloudflare Pages branch deploy', () => {
+ expect(
+ deploymentMetadataFromEnvironment({
+ CF_PAGES: '1',
+ CF_PAGES_BRANCH: 'feat/env',
+ CF_PAGES_COMMIT_SHA: 'fedcba0987654321',
+ CF_PAGES_URL: 'https://abc123.agent-zero.pages.dev',
+ }),
+ ).toMatchObject({
+ provider: 'cloudflare-pages',
+ branch: 'feat/env',
+ commit: 'fedcba0987654321',
+ context: 'preview',
+ });
+ });
+
+ it('recovers the pull-request number a GitHub Actions run only carries in its ref', () => {
+ expect(
+ deploymentMetadataFromEnvironment({
+ GITHUB_ACTIONS: 'true',
+ GITHUB_REF: 'refs/pull/17/merge',
+ GITHUB_REF_NAME: '17/merge',
+ GITHUB_SHA: '0f0f0f0f0f0f0f0f',
+ }),
+ ).toMatchObject({ provider: 'github-actions', prNumber: '17', commit: '0f0f0f0f0f0f0f0f' });
+ });
+
+ it('lets an explicit self-hosted deployment override a provider that would be auto-detected', () => {
+ expect(
+ deploymentMetadataFromEnvironment({
+ VERCEL: '1',
+ VERCEL_GIT_COMMIT_SHA: 'from-vercel',
+ AGENT_ZERO_BUILD_COMMIT: 'from-operator',
+ }),
+ ).toMatchObject({ provider: 'self-hosted', commit: 'from-operator' });
+ });
+
+ it('treats a variable that is set but blank as absent, so it never wins precedence', () => {
+ expect(deploymentMetadataFromEnvironment({ AGENT_ZERO_BUILD_COMMIT: ' ' })).toMatchObject({
+ provider: 'none',
+ });
+ });
+
+ it('reports nothing when no provider recognises the environment', () => {
+ expect(deploymentMetadataFromEnvironment({})).toMatchObject({
+ provider: 'none',
+ branch: null,
+ commit: null,
+ context: null,
+ });
+ });
+});
+
+describe('envTypeFromMetadata', () => {
+ const metadata = deploymentMetadataFromEnvironment({});
+
+ it('classifies a developer machine as dev whatever the environment says', () => {
+ expect(
+ envTypeFromMetadata(deploymentMetadataFromEnvironment({ VERCEL_ENV: 'production' }), {
+ isDevelopment: true,
+ }),
+ ).toBe('dev');
+ });
+
+ it('classifies a pull-request deploy as preview whatever branch it is on', () => {
+ expect(
+ envTypeFromMetadata(
+ deploymentMetadataFromEnvironment({
+ VERCEL_ENV: 'production',
+ VERCEL_GIT_COMMIT_REF: 'main',
+ VERCEL_GIT_PULL_REQUEST_ID: '9',
+ }),
+ { isDevelopment: false },
+ ),
+ ).toBe('preview');
+ });
+
+ it('classifies the default branch outside a pull request as the canary', () => {
+ expect(
+ envTypeFromMetadata(
+ deploymentMetadataFromEnvironment({
+ VERCEL_ENV: 'preview',
+ VERCEL_GIT_COMMIT_REF: 'main',
+ }),
+ { isDevelopment: false },
+ ),
+ ).toBe('canary');
+ });
+
+ it('honours a project whose default branch is not main', () => {
+ expect(
+ envTypeFromMetadata(
+ deploymentMetadataFromEnvironment({
+ VERCEL_ENV: 'preview',
+ VERCEL_GIT_COMMIT_REF: 'trunk',
+ }),
+ { isDevelopment: false, defaultBranch: 'trunk' },
+ ),
+ ).toBe('canary');
+ });
+
+ it('classifies any other preview branch as a preview', () => {
+ expect(
+ envTypeFromMetadata(
+ deploymentMetadataFromEnvironment({
+ VERCEL_ENV: 'preview',
+ VERCEL_GIT_COMMIT_REF: 'feat/env',
+ }),
+ { isDevelopment: false },
+ ),
+ ).toBe('preview');
+ });
+
+ it('classifies a build no provider recognises as a release rather than inventing a channel', () => {
+ expect(envTypeFromMetadata(metadata, { isDevelopment: false })).toBe('release');
+ });
+});
+
+describe('envTypeOverrideFromEnvironment', () => {
+ it('accepts the four names a deployment may declare itself as', () => {
+ expect(envTypeOverrideFromEnvironment({ AGENT_ZERO_BUILD_ENV: 'preview' })).toBe('preview');
+ });
+
+ it('ignores an unrecognised value rather than publishing it', () => {
+ expect(envTypeOverrideFromEnvironment({ AGENT_ZERO_BUILD_ENV: 'staging' })).toBeNull();
+ expect(envTypeOverrideFromEnvironment({})).toBeNull();
+ });
+});
+
+describe('previewUrlFromMetadata and productionUrlFromMetadata', () => {
+ const preview = deploymentMetadataFromEnvironment({
+ VERCEL_ENV: 'preview',
+ VERCEL_URL: 'agent-zero-abc123.vercel.app',
+ });
+ const production = deploymentMetadataFromEnvironment({
+ VERCEL_ENV: 'production',
+ VERCEL_URL: 'agent-zero-abc123.vercel.app',
+ VERCEL_PROJECT_PRODUCTION_URL: 'agent-zero.dev',
+ });
+
+ it('reports the deploy URL as a preview URL only outside a release', () => {
+ expect(previewUrlFromMetadata(preview, 'preview')).toBe('https://agent-zero-abc123.vercel.app');
+ expect(previewUrlFromMetadata(production, 'release')).toBeNull();
+ });
+
+ it('reports the production domain only for the deploy that serves it', () => {
+ expect(productionUrlFromMetadata(production, 'release')).toBe('https://agent-zero.dev');
+ expect(productionUrlFromMetadata(preview, 'preview')).toBeNull();
+ });
+});
diff --git a/packages/build-env/src/environment.ts b/packages/build-env/src/environment.ts
new file mode 100644
index 0000000..9b9275b
--- /dev/null
+++ b/packages/build-env/src/environment.ts
@@ -0,0 +1,246 @@
+import type { EnvironmentRecord, EnvType } from './types.js';
+
+/**
+ * What one hosting provider can tell a bundle about the deploy it belongs to.
+ *
+ * Everything is nullable: a provider that exposes a branch but no pull-request number reports the
+ * branch and leaves the rest for git, or for the run-time pass, to fill in.
+ */
+export interface DeploymentMetadata {
+ /** Which reader produced these values, so the resolution can be explained in a log or a test. */
+ readonly provider: string;
+ readonly branch: string | null;
+ readonly commit: string | null;
+ readonly prNumber: string | null;
+ /** URL of this specific deploy, whichever kind of deploy it is. */
+ readonly deployUrl: string | null;
+ /** URL of the production domain, when the provider names it separately from the deploy URL. */
+ readonly productionUrl: string | null;
+ /** `null` when the provider exposes no notion of production versus preview. */
+ readonly context: 'production' | 'preview' | null;
+}
+
+/** Matches a URL that already carries a scheme, so only bare host names get one added. */
+const absoluteUrlPattern = /^https?:\/\//;
+
+/**
+ * Matches the ref a workflow triggered by `pull_request` runs on, capturing the number.
+ *
+ * @see https://docs.github.com/actions/reference/variables-reference
+ */
+const pullRequestRefPattern = /^refs\/pull\/(\d+)\//;
+
+/** The branch a deploy has to be on to count as `canary` rather than `preview`. */
+export const defaultBranchName = 'main';
+
+/** Reads a variable, treating one that is set but blank as absent. */
+function read(environment: EnvironmentRecord, name: string): string | null {
+ return environment[name]?.trim() || null;
+}
+
+/** Reads the first of `names` that is set, so a provider can be given more than one spelling. */
+function readFirst(environment: EnvironmentRecord, ...names: readonly string[]): string | null {
+ for (const name of names) {
+ const value = read(environment, name);
+ if (value) return value;
+ }
+ return null;
+}
+
+/**
+ * Turns a bare host name into a URL.
+ *
+ * Vercel's `VERCEL_URL` and `VERCEL_PROJECT_PRODUCTION_URL` omit the scheme, unlike Netlify's
+ * `URL`, so every reader normalises through here rather than each one remembering which is which.
+ */
+function toUrl(value: string | null): string | null {
+ if (!value) return null;
+ return absoluteUrlPattern.test(value) ? value : `https://${value}`;
+}
+
+interface DeploymentProvider {
+ readonly name: string;
+ /** Whether this provider is the one that built or is running the bundle. */
+ detects(environment: EnvironmentRecord): boolean;
+ read(environment: EnvironmentRecord): Omit;
+}
+
+/**
+ * The providers this project resolves build metadata from, in precedence order.
+ *
+ * `self-hosted` comes first on purpose. It is the escape hatch — a deployment that sets
+ * `AGENT_ZERO_BUILD_*` has said what it is, and nothing auto-detected should be able to contradict
+ * it. Everything after it is auto-detection, most specific first: a Vercel build also has
+ * `GITHUB_*` variables when it was triggered from a GitHub Actions run, and only the Vercel ones
+ * describe the deploy.
+ */
+const deploymentProviders: readonly DeploymentProvider[] = [
+ {
+ // The self-hosted contract, and the only vocabulary a deployment that is not on any of the
+ // providers below can use. Documented in each app's `.env.example`.
+ name: 'self-hosted',
+ detects: (environment) =>
+ Boolean(
+ readFirst(
+ environment,
+ 'AGENT_ZERO_BUILD_COMMIT',
+ 'AGENT_ZERO_BUILD_BRANCH',
+ 'AGENT_ZERO_BUILD_URL',
+ 'AGENT_ZERO_BUILD_PR_NUMBER',
+ ),
+ ),
+ read: (environment) => ({
+ branch: read(environment, 'AGENT_ZERO_BUILD_BRANCH'),
+ commit: read(environment, 'AGENT_ZERO_BUILD_COMMIT'),
+ prNumber: read(environment, 'AGENT_ZERO_BUILD_PR_NUMBER'),
+ deployUrl: toUrl(read(environment, 'AGENT_ZERO_BUILD_URL')),
+ productionUrl: toUrl(read(environment, 'AGENT_ZERO_BUILD_PRODUCTION_URL')),
+ context: null,
+ }),
+ },
+ {
+ // @see https://vercel.com/docs/environment-variables/system-environment-variables
+ name: 'vercel',
+ detects: (environment) => Boolean(readFirst(environment, 'VERCEL', 'VERCEL_ENV')),
+ read: (environment) => ({
+ branch: read(environment, 'VERCEL_GIT_COMMIT_REF'),
+ commit: read(environment, 'VERCEL_GIT_COMMIT_SHA'),
+ prNumber: read(environment, 'VERCEL_GIT_PULL_REQUEST_ID'),
+ // `NUXT_ENV_VERCEL_URL` is the same value re-exposed under the prefix Vercel's framework
+ // integration adds; either can be the one that survives into the build.
+ deployUrl: toUrl(readFirst(environment, 'VERCEL_URL', 'NUXT_ENV_VERCEL_URL')),
+ productionUrl: toUrl(
+ readFirst(
+ environment,
+ 'VERCEL_PROJECT_PRODUCTION_URL',
+ 'NUXT_ENV_VERCEL_PROJECT_PRODUCTION_URL',
+ ),
+ ),
+ context: read(environment, 'VERCEL_ENV') === 'production' ? 'production' : 'preview',
+ }),
+ },
+ {
+ // @see https://docs.netlify.com/build/configure-builds/environment-variables/#git-metadata
+ name: 'netlify',
+ detects: (environment) => Boolean(readFirst(environment, 'NETLIFY', 'CONTEXT')),
+ read: (environment) => ({
+ branch: readFirst(environment, 'BRANCH', 'HEAD'),
+ commit: read(environment, 'COMMIT_REF'),
+ prNumber: read(environment, 'REVIEW_ID'),
+ deployUrl: toUrl(readFirst(environment, 'DEPLOY_PRIME_URL', 'DEPLOY_URL', 'URL')),
+ productionUrl: toUrl(read(environment, 'URL')),
+ context: read(environment, 'CONTEXT') === 'production' ? 'production' : 'preview',
+ }),
+ },
+ {
+ // @see https://developers.cloudflare.com/pages/configuration/build-configuration/
+ name: 'cloudflare-pages',
+ detects: (environment) => Boolean(read(environment, 'CF_PAGES')),
+ read: (environment) => ({
+ branch: read(environment, 'CF_PAGES_BRANCH'),
+ commit: read(environment, 'CF_PAGES_COMMIT_SHA'),
+ // Cloudflare Pages exposes no pull-request number; a PR deploy is recognised by its branch
+ // not being the default one, which the context below already covers.
+ prNumber: null,
+ deployUrl: toUrl(read(environment, 'CF_PAGES_URL')),
+ productionUrl: null,
+ context:
+ read(environment, 'CF_PAGES_BRANCH') === defaultBranchName ? 'production' : 'preview',
+ }),
+ },
+ {
+ // The last auto-detected source, and the only one that is a CI runner rather than a host: it
+ // describes the commit a container image was built from when nothing else does.
+ // @see https://docs.github.com/actions/reference/variables-reference
+ name: 'github-actions',
+ detects: (environment) => read(environment, 'GITHUB_ACTIONS') === 'true',
+ read: (environment) => ({
+ branch: read(environment, 'GITHUB_REF_NAME'),
+ commit: read(environment, 'GITHUB_SHA'),
+ // `refs/pull//merge` is the only place a workflow triggered by `pull_request` carries
+ // the number without reading the event payload off disk.
+ prNumber: pullRequestRefPattern.exec(read(environment, 'GITHUB_REF') ?? '')?.[1] ?? null,
+ deployUrl: null,
+ productionUrl: null,
+ context: null,
+ }),
+ },
+];
+
+/** The metadata a provider that recognises nothing reports. */
+const noMetadata: DeploymentMetadata = {
+ provider: 'none',
+ branch: null,
+ commit: null,
+ prNumber: null,
+ deployUrl: null,
+ productionUrl: null,
+ context: null,
+};
+
+/**
+ * Resolves what the environment says about the deploy, from the first provider that recognises it.
+ *
+ * Only the first match is read. Merging providers would let a stale variable from one host survive
+ * into a deploy on another — the exact failure a deployment moved between hosts would hit — so a
+ * provider either describes the deploy or has nothing to say about it.
+ */
+export function deploymentMetadataFromEnvironment(
+ environment: EnvironmentRecord,
+): DeploymentMetadata {
+ const provider = deploymentProviders.find((candidate) => candidate.detects(environment));
+ if (!provider) return noMetadata;
+ return { provider: provider.name, ...provider.read(environment) };
+}
+
+/**
+ * Classifies the deploy the metadata describes.
+ *
+ * `dev` wins over everything: a developer running `nuxt dev` with a `.env` copied off a deploy is
+ * still on their own machine. Past that, a pull-request deploy is always a preview whatever branch
+ * it is on, the default branch outside a pull request is the canary, and only a provider that says
+ * `production` earns `release`.
+ */
+export function envTypeFromMetadata(
+ metadata: DeploymentMetadata,
+ options: { readonly isDevelopment: boolean; readonly defaultBranch?: string },
+): EnvType {
+ if (options.isDevelopment) return 'dev';
+ if (metadata.prNumber !== null) return 'preview';
+
+ // No provider recognised the deploy, so there is no preview channel to be on: a self-hosted
+ // bundle is whatever it was built to be, and `AGENT_ZERO_BUILD_ENV` is how it says otherwise.
+ if (metadata.context === null) return 'release';
+ if (metadata.context === 'production') return 'release';
+
+ return metadata.branch === (options.defaultBranch ?? defaultBranchName) ? 'canary' : 'preview';
+}
+
+/**
+ * An explicit override of the classification, honoured at build time and again at run time.
+ *
+ * The one field a deployment can always state outright: a self-hosted staging environment is a
+ * `preview` in every way that matters to the people looking at it, and no amount of provider
+ * detection can work that out from a plain `node .output/server/index.mjs`.
+ */
+export function envTypeOverrideFromEnvironment(environment: EnvironmentRecord): EnvType | null {
+ const value = read(environment, 'AGENT_ZERO_BUILD_ENV');
+ if (!value) return null;
+ return value === 'dev' || value === 'preview' || value === 'canary' || value === 'release'
+ ? value
+ : null;
+}
+
+/** The deploy's own URL, reported only when this deploy is not the production one. */
+export function previewUrlFromMetadata(metadata: DeploymentMetadata, env: EnvType): string | null {
+ return env === 'release' ? null : metadata.deployUrl;
+}
+
+/** The production domain, reported only when this deploy serves it. */
+export function productionUrlFromMetadata(
+ metadata: DeploymentMetadata,
+ env: EnvType,
+): string | null {
+ if (env !== 'release') return null;
+ return metadata.productionUrl ?? metadata.deployUrl;
+}
diff --git a/packages/build-env/src/git.ts b/packages/build-env/src/git.ts
new file mode 100644
index 0000000..6286141
--- /dev/null
+++ b/packages/build-env/src/git.ts
@@ -0,0 +1,53 @@
+import { execFile } from 'node:child_process';
+import { promisify } from 'node:util';
+
+const run = promisify(execFile);
+
+/**
+ * The checkout's own answer for a field no hosting provider supplied.
+ *
+ * This is a contributor build command, not a runtime one: it is read once while a bundle is being
+ * produced, from the directory the build was started in, and never from a target repository. The
+ * runner boundary that owns runtime command execution is not involved, and must not be — nothing
+ * here may run inside a deployed bundle.
+ *
+ * `execFile` rather than `exec`: the arguments are a fixed array passed to `git` directly, with no
+ * shell to reinterpret a branch or path that contains shell metacharacters.
+ */
+async function git(argv: readonly string[], cwd: string): Promise {
+ try {
+ const { stdout } = await run('git', [...argv], { cwd, windowsHide: true });
+ return stdout.trim() || null;
+ } catch {
+ // Every caller has a fallback, and a build has no business failing because it ran outside a
+ // checkout: a shallow clone, a source tarball, and a container build context all land here.
+ return null;
+ }
+}
+
+/** What the checkout can say about the commit being built. */
+export interface GitMetadata {
+ readonly branch: string | null;
+ readonly commit: string | null;
+}
+
+/**
+ * Reads the branch and commit from the checkout at `directory`.
+ *
+ * Only called for fields the environment left unresolved, so a hosted build never pays for two
+ * subprocesses to rediscover what its provider already told it — and a detached checkout, which is
+ * what most CI providers hand a build, never overrides the branch name the provider knows.
+ */
+export async function gitMetadata(directory: string): Promise {
+ const [branch, commit] = await Promise.all([
+ git(['rev-parse', '--abbrev-ref', 'HEAD'], directory),
+ git(['rev-parse', 'HEAD'], directory),
+ ]);
+
+ return {
+ // `git rev-parse --abbrev-ref HEAD` answers `HEAD` on a detached checkout, which is not a
+ // branch name and would be published as one.
+ branch: branch === 'HEAD' ? null : branch,
+ commit,
+ };
+}
diff --git a/packages/build-env/src/index.ts b/packages/build-env/src/index.ts
new file mode 100644
index 0000000..7c864c7
--- /dev/null
+++ b/packages/build-env/src/index.ts
@@ -0,0 +1,18 @@
+/**
+ * Build metadata resolution, in the two halves a deployment needs it.
+ *
+ * This entry point is the run-time half, and stays importable from inside a serverless bundle: it
+ * reads an environment record and nothing else — no filesystem, no subprocess, no `@nuxt/kit`. The
+ * build-time half, which reads the checkout and the app manifest, lives behind `./nuxt`.
+ */
+export { runtimeBuildInfo, shortenCommit } from './build-info.js';
+export {
+ type DeploymentMetadata,
+ defaultBranchName,
+ deploymentMetadataFromEnvironment,
+ envTypeFromMetadata,
+ envTypeOverrideFromEnvironment,
+ previewUrlFromMetadata,
+ productionUrlFromMetadata,
+} from './environment.js';
+export { type BuildInfo, type EnvironmentRecord, type EnvType, unknownRevision } from './types.js';
diff --git a/packages/build-env/src/nuxt.ts b/packages/build-env/src/nuxt.ts
new file mode 100644
index 0000000..f6bcdec
--- /dev/null
+++ b/packages/build-env/src/nuxt.ts
@@ -0,0 +1,128 @@
+import { addImports, addTemplate, defineNuxtModule } from '@nuxt/kit';
+
+import { resolveBuildInfo } from './resolve.js';
+import type { BuildInfo } from './types.js';
+
+export interface BuildEnvModuleOptions {
+ /** The branch a non-pull-request deploy has to be on to be the canary. Defaults to `main`. */
+ defaultBranch?: string;
+ /**
+ * Whether `useBuildInfo()` completes unresolved fields from the server's own environment.
+ *
+ * On by default, and the reason this module exists rather than a few lines in `nuxt.config.ts`:
+ * a Vercel build resolves everything while it runs, and every other deployment — a container
+ * image built in CI, a self-hosted `node .output/server/index.mjs` — has nothing to resolve
+ * from until it is started. Turn it off only for a bundle that must publish exactly what it was
+ * built with.
+ */
+ runtimeFallback?: boolean;
+}
+
+/**
+ * Deterministic metadata for test and prerender-snapshot runs.
+ *
+ * Tests must not depend on the checkout they run in: reading the real branch and commit would make
+ * every assertion that renders build metadata fail on someone else's machine, and every snapshot
+ * churn on each commit.
+ */
+const testBuildInfo: BuildInfo = {
+ version: '0.0.0',
+ commit: '0000000000000000000000000000000000000000',
+ shortCommit: '0000000',
+ branch: 'test',
+ env: 'dev',
+ time: 0,
+ prNumber: null,
+ previewUrl: null,
+ productionUrl: null,
+};
+
+/**
+ * Publishes what this build is, under `runtimeConfig.public.buildInfo`.
+ *
+ * `runtimeConfig.public` rather than `appConfig`, which is the opposite of the choice the dashboard
+ * makes for its auth policy — and for the opposite reason. Auth policy must not be overridable at
+ * run time, because a public runtime key would let a deployment advertise a sign-in method its
+ * server rejects. Build metadata is the one thing a non-Vercel build *cannot* discover about
+ * itself, so it has to stay overridable: the same `NUXT_PUBLIC_BUILD_INFO_*` channel that would be
+ * a hazard for policy is the delivery mechanism here, alongside the server-side pass below.
+ */
+export default defineNuxtModule({
+ meta: {
+ name: 'agent-zero:build-env',
+ configKey: 'buildEnv',
+ },
+ defaults: {
+ runtimeFallback: true,
+ },
+ async setup(options, nuxt) {
+ const buildInfo =
+ nuxt.options.test || process.env.NODE_ENV === 'test'
+ ? testBuildInfo
+ : await resolveBuildInfo({
+ rootDirectory: nuxt.options.rootDir,
+ isDevelopment: nuxt.options.dev,
+ ...(options.defaultBranch === undefined
+ ? {}
+ : { defaultBranch: options.defaultBranch }),
+ });
+
+ // Every key is declared, including the ones that resolved to a sentinel: Nuxt only applies a
+ // `NUXT_PUBLIC_*` override to a key the build declared, so an omitted field could not be
+ // supplied by the deployment that needs to supply it.
+ nuxt.options.runtimeConfig.public.buildInfo = buildInfo;
+
+ // The composable, not a Nitro plugin: Nitro deep-freezes its runtime config before the first
+ // request, so nothing may write the completed metadata back into it. Resolving inside
+ // `useState` instead keeps the answer server-side, serialises it into the SSR payload, and
+ // leaves the client hydrating the same values the server rendered.
+ const composable = addTemplate({
+ filename: 'agent-zero-build-env.mjs',
+ write: true,
+ getContents: () => buildInfoComposable(options),
+ });
+ addImports({ name: 'useBuildInfo', as: 'useBuildInfo', from: composable.dst });
+ },
+});
+
+/**
+ * `useBuildInfo()`: what this build is, completed from the running server's environment.
+ *
+ * Generated rather than shipped as a file in this package so the app's own build compiles it, and
+ * so `import.meta.server` is the constant the bundler eliminates the run-time branch by — the
+ * client bundle never carries the fallback, or the `process.env` read behind it.
+ */
+function buildInfoComposable(options: BuildEnvModuleOptions): string {
+ const resolveOptions =
+ options.defaultBranch === undefined
+ ? '{}'
+ : JSON.stringify({ defaultBranch: options.defaultBranch });
+ // Both branches go through `runtimeBuildInfo`, and the client's is handed an empty environment
+ // rather than skipped: Nuxt rewrites the `null` fields of `runtimeConfig` to empty strings, and
+ // that pass is also what normalises them back, so a client-only render reports the same shape a
+ // server-rendered one does.
+ const resolve = options.runtimeFallback
+ ? `import.meta.server ? runtimeBuildInfo(buildInfo, process.env, ${resolveOptions}) : runtimeBuildInfo(buildInfo, {}, ${resolveOptions})`
+ : `runtimeBuildInfo(buildInfo, {}, ${resolveOptions})`;
+
+ return `${options.runtimeFallback ? "import process from 'node:process';\n\n" : ''}import { runtimeBuildInfo } from '@agent-zero/build-env';
+import { useRuntimeConfig, useState } from '#imports';
+
+export function useBuildInfo() {
+ // Keyed state rather than a plain call: the value is resolved once on the server and travels to
+ // the browser in the payload, so a component that renders it cannot hydrate to a different one.
+ return useState('agent-zero:build-info', () => {
+ const buildInfo = useRuntimeConfig().public.buildInfo;
+ return ${resolve};
+ }).value;
+}
+`;
+}
+
+declare module '@nuxt/schema' {
+ interface PublicRuntimeConfig {
+ buildInfo: BuildInfo;
+ }
+}
+
+export type { BuildInfo, EnvType } from './types.js';
diff --git a/packages/build-env/src/resolve.test.ts b/packages/build-env/src/resolve.test.ts
new file mode 100644
index 0000000..1606114
--- /dev/null
+++ b/packages/build-env/src/resolve.test.ts
@@ -0,0 +1,84 @@
+import { mkdtemp, writeFile } from 'node:fs/promises';
+import { tmpdir } from 'node:os';
+import { join } from 'node:path';
+
+import { beforeAll, describe, expect, it } from 'vitest';
+
+import { packageVersion, resolveBuildInfo } from './resolve.js';
+import { unknownRevision } from './types.js';
+
+/** A directory that is not a checkout, so nothing here can read the repository it runs in. */
+let rootDirectory: string;
+
+beforeAll(async () => {
+ rootDirectory = await mkdtemp(join(tmpdir(), 'agent-zero-build-env-'));
+ await writeFile(join(rootDirectory, 'package.json'), JSON.stringify({ version: '1.2.3' }));
+});
+
+describe('packageVersion', () => {
+ it('reads the version of the package being built', async () => {
+ await expect(packageVersion(rootDirectory)).resolves.toBe('1.2.3');
+ });
+
+ it('falls back rather than failing a build that has no readable manifest', async () => {
+ await expect(packageVersion(join(rootDirectory, 'missing'))).resolves.toBe('0.0.0');
+ });
+});
+
+describe('resolveBuildInfo', () => {
+ it('resolves a Vercel production build entirely from the environment', async () => {
+ await expect(
+ resolveBuildInfo({
+ rootDirectory,
+ isDevelopment: false,
+ now: 1_700_000_000_000,
+ environment: {
+ VERCEL: '1',
+ VERCEL_ENV: 'production',
+ VERCEL_GIT_COMMIT_REF: 'main',
+ VERCEL_GIT_COMMIT_SHA: '1234567890abcdef',
+ VERCEL_PROJECT_PRODUCTION_URL: 'agent-zero.dev',
+ },
+ }),
+ ).resolves.toStrictEqual({
+ version: '1.2.3',
+ commit: '1234567890abcdef',
+ shortCommit: '1234567',
+ branch: 'main',
+ env: 'release',
+ time: 1_700_000_000_000,
+ prNumber: null,
+ previewUrl: null,
+ productionUrl: 'https://agent-zero.dev',
+ });
+ });
+
+ it('publishes sentinels for what it could not resolve, rather than guessing', async () => {
+ await expect(
+ resolveBuildInfo({
+ rootDirectory,
+ isDevelopment: false,
+ now: 1_700_000_000_000,
+ // Names the branch but not the commit, so only the commit is left for the run-time pass.
+ environment: { AGENT_ZERO_BUILD_BRANCH: 'main' },
+ readGitMetadata: () => Promise.resolve({ branch: null, commit: null }),
+ }),
+ ).resolves.toMatchObject({
+ branch: 'main',
+ commit: unknownRevision,
+ shortCommit: unknownRevision,
+ env: 'release',
+ });
+ });
+
+ it('classifies a development build as dev even with a production environment in scope', async () => {
+ await expect(
+ resolveBuildInfo({
+ rootDirectory,
+ isDevelopment: true,
+ now: 0,
+ environment: { VERCEL_ENV: 'production', VERCEL_GIT_COMMIT_SHA: '1234567890abcdef' },
+ }),
+ ).resolves.toMatchObject({ env: 'dev' });
+ });
+});
diff --git a/packages/build-env/src/resolve.ts b/packages/build-env/src/resolve.ts
new file mode 100644
index 0000000..d97ac80
--- /dev/null
+++ b/packages/build-env/src/resolve.ts
@@ -0,0 +1,96 @@
+import { readFile } from 'node:fs/promises';
+import { join } from 'node:path';
+
+import { shortenCommit } from './build-info.js';
+import {
+ deploymentMetadataFromEnvironment,
+ envTypeFromMetadata,
+ envTypeOverrideFromEnvironment,
+ previewUrlFromMetadata,
+ productionUrlFromMetadata,
+} from './environment.js';
+import { type GitMetadata, gitMetadata } from './git.js';
+import { type BuildInfo, type EnvironmentRecord, unknownRevision } from './types.js';
+
+export interface ResolveBuildInfoOptions {
+ /** Where the build is running: the checkout git is read from, and the `package.json` version. */
+ readonly rootDirectory: string;
+ /** Whether this is `nuxt dev` rather than a build; the one input no variable can be trusted for. */
+ readonly isDevelopment: boolean;
+ /** Defaults to `process.env`; passed explicitly by tests so none of them mutate it. */
+ readonly environment?: EnvironmentRecord;
+ /** The branch a non-pull-request deploy has to be on to be the canary. Defaults to `main`. */
+ readonly defaultBranch?: string;
+ /** Build timestamp; passed explicitly by tests, which may not read the wall clock. */
+ readonly now?: number;
+ /**
+ * How the checkout is read. Defaults to running git in {@link ResolveBuildInfoOptions.rootDirectory}.
+ *
+ * Injected by tests so no suite spawns a subprocess or depends on the checkout it runs in.
+ */
+ readonly readGitMetadata?: (directory: string) => Promise;
+}
+
+/**
+ * Resolves everything about a build that can be known while it runs.
+ *
+ * The environment is asked first and the checkout second, never the other way round: a hosting
+ * provider knows the branch a detached CI checkout cannot name, and knows whether the deploy is
+ * production. git is only consulted for what is still missing, which on Vercel is nothing.
+ *
+ * Whatever is still unresolved is published as a sentinel rather than guessed at, so the run-time
+ * pass (`runtimeBuildInfo`) can tell a field the build genuinely resolved from one it did not.
+ */
+export async function resolveBuildInfo(options: ResolveBuildInfoOptions): Promise {
+ const environment = options.environment ?? process.env;
+ const metadata = deploymentMetadataFromEnvironment(environment);
+
+ const readGit = options.readGitMetadata ?? gitMetadata;
+ const needsGit = metadata.branch === null || metadata.commit === null;
+ const [git, version] = await Promise.all([
+ needsGit ? readGit(options.rootDirectory) : Promise.resolve({ branch: null, commit: null }),
+ packageVersion(options.rootDirectory),
+ ]);
+
+ const branch = metadata.branch ?? git.branch ?? unknownRevision;
+ const commit = metadata.commit ?? git.commit ?? unknownRevision;
+ const env =
+ envTypeOverrideFromEnvironment(environment) ??
+ envTypeFromMetadata(metadata, {
+ isDevelopment: options.isDevelopment,
+ ...(options.defaultBranch === undefined ? {} : { defaultBranch: options.defaultBranch }),
+ });
+
+ return {
+ version,
+ commit,
+ shortCommit: shortenCommit(commit),
+ branch,
+ env,
+ time: options.now ?? Date.now(),
+ prNumber: metadata.prNumber,
+ previewUrl: previewUrlFromMetadata(metadata, env),
+ productionUrl: productionUrlFromMetadata(metadata, env),
+ };
+}
+
+/**
+ * The version of the package being built, read from its own manifest.
+ *
+ * Read rather than imported so the value comes from the app's `package.json` at the path the build
+ * is running in, not from this package's own manifest bundled at compile time.
+ */
+export async function packageVersion(rootDirectory: string): Promise {
+ try {
+ const manifest: unknown = JSON.parse(
+ await readFile(join(rootDirectory, 'package.json'), 'utf8'),
+ );
+ const version =
+ typeof manifest === 'object' && manifest !== null && 'version' in manifest
+ ? manifest.version
+ : undefined;
+ return typeof version === 'string' && version ? version : '0.0.0';
+ } catch {
+ return '0.0.0';
+ }
+}
diff --git a/packages/build-env/src/types.ts b/packages/build-env/src/types.ts
new file mode 100644
index 0000000..d5e9a0c
--- /dev/null
+++ b/packages/build-env/src/types.ts
@@ -0,0 +1,49 @@
+/**
+ * Which deployment of the project a running bundle is: the four names every surface that shows
+ * build metadata switches on.
+ *
+ * `canary` is the default branch deployed outside a pull request but not yet promoted to the
+ * production domain; `preview` is any other non-production deploy (a pull request, a branch
+ * deploy); `release` is production; `dev` is a developer's own machine.
+ */
+export type EnvType = 'dev' | 'preview' | 'canary' | 'release';
+
+/**
+ * The build metadata a deployment publishes about itself.
+ *
+ * Every field is always present, and an unresolved one carries a sentinel rather than being
+ * omitted: the values travel through `runtimeConfig.public.buildInfo`, whose per-key environment
+ * overrides (`NUXT_PUBLIC_BUILD_INFO_*`) only apply to keys the build actually declared.
+ */
+export interface BuildInfo {
+ /** The deployed package's own version, read from its `package.json` at build time. */
+ version: string;
+ /** Full commit SHA, or {@link unknownRevision} when neither the host nor git could name one. */
+ commit: string;
+ /** First seven characters of {@link BuildInfo.commit}, or {@link unknownRevision}. */
+ shortCommit: string;
+ /** Git branch, or {@link unknownRevision}. */
+ branch: string;
+ /** Which deployment this is. */
+ env: EnvType;
+ /** Build timestamp in milliseconds since the epoch. */
+ time: number;
+ /** Pull request number when this is a pull-request deploy, `null` otherwise. */
+ prNumber: string | null;
+ /** URL of this specific deploy, only when it is not the production one. */
+ previewUrl: string | null;
+ /** URL of the production domain, only when this deploy serves it. */
+ productionUrl: string | null;
+}
+
+/**
+ * What an unresolved revision field carries.
+ *
+ * A sentinel rather than `null` because these three are rendered as text wherever build metadata
+ * is shown, and because it is what {@link runtimeBuildInfo} tests to decide which fields a
+ * non-Vercel deployment is still allowed to fill in at run time.
+ */
+export const unknownRevision = 'unknown';
+
+/** A read-only view of an environment, so resolvers never reach for `process.env` themselves. */
+export type EnvironmentRecord = Readonly>;
diff --git a/packages/build-env/tsconfig.json b/packages/build-env/tsconfig.json
new file mode 100644
index 0000000..5ee9c86
--- /dev/null
+++ b/packages/build-env/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": { "rootDir": "src", "outDir": "dist" },
+ "include": ["src/**/*.ts"]
+}
diff --git a/packages/build-env/tsdown.config.ts b/packages/build-env/tsdown.config.ts
new file mode 100644
index 0000000..920e859
--- /dev/null
+++ b/packages/build-env/tsdown.config.ts
@@ -0,0 +1,20 @@
+import { definePackageConfig } from '../../scripts/tsdown.config.ts';
+
+// ESM only, unlike the runtime packages that dual-publish. Both consumers are Nuxt builds — the
+// module is loaded by `@nuxt/kit` and the run-time half is compiled into a Nitro server bundle,
+// neither of which is ever `require`d, and a CJS build of a `export default` Nuxt module is
+// exactly the interop hazard `attw` reports as a false default export.
+//
+// `src/nuxt.ts` is a second entry rather than a re-export from `src/index.ts`: it pulls in
+// `@nuxt/kit`, which only exists inside a Nuxt build. Keeping it behind its own subpath means the
+// run-time half (`.`) stays importable from a plain serverless bundle.
+export default definePackageConfig({
+ entry: ['src/index.ts', 'src/nuxt.ts'],
+ format: ['esm'],
+ attw: {
+ entrypoints: ['.', './nuxt'],
+ enabled: true,
+ level: 'error',
+ profile: 'esm-only',
+ },
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9818dde..e123bb0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -59,7 +59,7 @@ importers:
version: 0.3.23
skilld:
specifier: ^2.1.0
- version: 2.3.0(@ai-sdk/google@4.0.44(zod@4.4.3))(@ai-sdk/openai@4.0.42(zod@4.4.3))(@cloudflare/sandbox@0.8.14)(@libsql/client@0.17.4)(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@vercel/queue@0.4.0(@opentelemetry/api@1.9.1))(@vercel/sandbox@1.10.2)(ai@7.0.66(zod@4.4.3))(pg@8.23.0)(playwright@1.62.1)(supports-color@8.1.1)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))(ws@8.21.3)(zod@4.4.3)
+ version: 2.3.0(a1173244e7c44b145ae837824c120d5c)
tsdown:
specifier: ^0.22.14
version: 0.22.14(@arethetypeswrong/core@0.18.5)(@vitejs/devtools@0.4.12(vite@8.2.1))(publint@0.3.23)(tsx@4.23.12)
@@ -87,6 +87,9 @@ importers:
'@agent-zero/auth':
specifier: workspace:*
version: 0.4.0
+ '@agent-zero/build-env':
+ specifier: workspace:*
+ version: 0.4.0
'@agent-zero/i18n':
specifier: workspace:*
version: 0.3.0
@@ -101,13 +104,13 @@ importers:
version: 1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)
'@better-auth/infra':
specifier: ^0.4.0
- version: 0.4.0(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)
+ version: 0.4.0(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)
'@octopi-ai/better-enrollment':
specifier: ^0.4.0
- version: 0.4.0(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)
+ version: 0.4.0(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)
'@onmax/nuxt-better-auth':
specifier: ^0.1.2
- version: 0.1.2(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))
+ version: 0.1.2(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))
'@orpc/client':
specifier: 2.0.0-beta.26
version: 2.0.0-beta.26(@opentelemetry/api@1.9.1)
@@ -134,7 +137,7 @@ importers:
version: 5.101.4(vue@3.5.41)
better-auth:
specifier: ^1.6.26
- version: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ version: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
evlog:
specifier: ^2.26.0
version: 2.26.0(@nestjs/common@11.2.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nuxt/kit@4.5.2)(ai@6.0.228(zod@4.4.3))(express@5.2.1)(h3@1.15.11)(hono@4.13.2)(nitropack@2.13.4)(ofetch@1.5.1)(react@19.2.8)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
@@ -177,7 +180,7 @@ importers:
version: 4.0.1(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
'@nuxtjs/i18n':
specifier: ^10.6.0
- version: 10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
+ version: 10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
'@playwright/test':
specifier: ^1.62.0
version: 1.62.1
@@ -257,6 +260,9 @@ importers:
apps/marketing:
dependencies:
+ '@agent-zero/build-env':
+ specifier: workspace:*
+ version: 0.4.0
'@agent-zero/i18n':
specifier: workspace:*
version: 0.3.0
@@ -281,7 +287,7 @@ importers:
version: 1.2.123
'@nuxt/content':
specifier: ^3.15.2
- version: 3.15.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2))(valibot@1.4.2)
+ version: 3.15.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2))(better-sqlite3@12.11.1)(valibot@1.4.2)
'@nuxt/icon':
specifier: ^2.5.0
version: 2.5.0(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)
@@ -293,7 +299,7 @@ importers:
version: 4.0.1(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
'@nuxtjs/i18n':
specifier: ^10.6.0
- version: 10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
+ version: 10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
'@nuxtjs/seo':
specifier: ^5.3.12
version: 5.3.12(nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.4))
@@ -408,7 +414,7 @@ importers:
version: 2.0.0-beta.26(crossws@0.4.10(srvx@0.11.22))
better-auth:
specifier: ^1.6.26
- version: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ version: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
evlog:
specifier: ^2.26.0
version: 2.26.0(@nestjs/common@11.2.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nuxt/kit@4.5.2)(ai@6.0.228(zod@4.4.3))(express@5.2.1)(h3@1.15.11)(hono@4.13.2)(nitropack@2.13.4)(ofetch@1.5.1)(react@19.2.8)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
@@ -445,13 +451,13 @@ importers:
version: 1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)
'@better-auth/infra':
specifier: ^0.4.0
- version: 0.4.0(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)
+ version: 0.4.0(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)
'@octopi-ai/better-enrollment':
specifier: ^0.4.0
- version: 0.4.0(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)
+ version: 0.4.0(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)
better-auth:
specifier: ^1.6.26
- version: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ version: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
zod:
specifier: ^4.4.3
version: 4.4.3
@@ -475,6 +481,33 @@ importers:
specifier: ^4.1.10
version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
+ packages/build-env:
+ devDependencies:
+ '@nuxt/kit':
+ specifier: ^4.5.2
+ version: 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
+ '@nuxt/schema':
+ specifier: ^4.5.2
+ version: 4.5.2
+ oxlint:
+ specifier: ^1.44.0
+ version: 1.78.0(oxlint-tsgolint@7.0.2001)
+ oxlint-tsgolint:
+ specifier: ^7.0.2001
+ version: 7.0.2001
+ tsdown:
+ specifier: ^0.22.14
+ version: 0.22.14(@arethetypeswrong/core@0.18.5)(@vitejs/devtools@0.4.12(vite@8.2.1))(publint@0.3.23)(tsx@4.23.12)
+ typescript:
+ specifier: ^5.9.2
+ version: typescript-native-bridge@6.0.3-bridge.12.tsgo.7.0.2
+ vite:
+ specifier: ^6.0.0 || ^7.0.0 || ^8.0.0
+ version: 8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)
+ vitest:
+ specifier: ^4.1.10
+ version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
+
packages/cli:
dependencies:
'@agent-zero/agent':
@@ -556,7 +589,7 @@ importers:
dependencies:
drizzle-orm:
specifier: ^0.45.2
- version: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ version: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
postgres:
specifier: ^3.4.9
version: 3.4.9
@@ -597,7 +630,7 @@ importers:
version: 11.4.8
'@nuxtjs/i18n':
specifier: ^10.6.0
- version: 10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
+ version: 10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
oxlint:
specifier: ^1.44.0
version: 1.78.0(oxlint-tsgolint@7.0.2001)
@@ -18064,25 +18097,25 @@ snapshots:
nanostores: 1.5.1
zod: 4.4.3
- '@better-auth/drizzle-adapter@1.6.26(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))':
+ '@better-auth/drizzle-adapter@1.6.26(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))':
dependencies:
'@better-auth/core': 1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)
'@better-auth/utils': 0.4.2
optionalDependencies:
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
- '@better-auth/drizzle-adapter@1.7.0-rc.5(@better-auth/core@1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))':
+ '@better-auth/drizzle-adapter@1.7.0-rc.5(@better-auth/core@1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))':
dependencies:
'@better-auth/core': 1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)
'@better-auth/utils': 0.4.2
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
- '@better-auth/infra@0.4.0(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)':
+ '@better-auth/infra@0.4.0(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)':
dependencies:
'@better-auth/core': 1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
- better-auth: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ better-auth: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
better-call: 1.3.7(zod@4.4.3)
jose: 6.2.9
libphonenumber-js: 1.13.11
@@ -20115,71 +20148,6 @@ snapshots:
- unloader
- utf-8-validate
- '@nuxt/content@3.15.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2))(valibot@1.4.2)':
- dependencies:
- '@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
- '@nuxtjs/mdc': 0.22.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)(supports-color@8.1.1)
- '@shikijs/langs': 4.4.3
- '@sqlite.org/sqlite-wasm': 3.53.0-build1
- '@standard-schema/spec': 1.1.0
- '@webcontainer/env': 1.1.1
- c12: 3.3.4(magicast@0.5.4)
- chokidar: 5.0.0
- consola: 3.4.2
- db0: 0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3)
- defu: 6.1.7
- destr: 2.0.5
- git-url-parse: 16.1.0
- h3: 1.15.11
- hookable: 5.5.3
- isomorphic-git: 1.41.4
- jiti: 2.7.0
- json-schema-to-typescript-lite: 15.0.0
- mdast-util-to-hast: 13.2.1
- mdast-util-to-string: 4.0.0
- micromark: 4.0.2(supports-color@8.1.1)
- micromark-util-character: 2.1.1
- micromark-util-chunked: 2.0.1
- micromark-util-resolve-all: 2.0.1
- micromark-util-sanitize-uri: 2.0.1
- micromatch: 4.0.8
- minimark: 0.2.0
- minimatch: 10.2.6
- nuxt-component-meta: 0.18.0(@oxc-project/types@0.144.0)(magicast@0.5.4)(rolldown@1.2.4)
- nypm: 0.6.9
- ohash: 2.0.12
- pathe: 2.0.3
- pkg-types: 2.3.1
- remark-mdc: 3.11.1(supports-color@8.1.1)
- scule: 1.3.0
- shiki: 4.4.3
- slugify: 1.6.9
- socket.io-client: 4.8.3(supports-color@8.1.1)
- std-env: 4.2.0
- tinyglobby: 0.2.17
- ufo: 1.6.4
- unctx: 2.5.0
- unified: 11.0.5
- unist-util-stringify-position: 4.0.0
- unist-util-visit: 5.1.0
- unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.4)(rollup@4.62.4)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)
- zod: 3.25.76
- zod-to-json-schema: 3.25.2(zod@3.25.76)
- optionalDependencies:
- '@electric-sql/pglite': 0.4.3
- '@libsql/client': 0.17.4
- '@valibot/to-json-schema': 1.7.1(valibot@1.4.2)
- valibot: 1.4.2
- transitivePeerDependencies:
- - '@farmfe/core'
- - '@rspack/core'
- - better-sqlite3
- - bufferutil
- - bun-types-no-globals
- - sqlite3
- - unloader
- - utf-8-validate
-
'@nuxt/devalue@2.0.2': {}
'@nuxt/devtools-kit@2.7.0(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))':
@@ -20241,7 +20209,7 @@ snapshots:
sirv: 3.0.2
structured-clone-es: 2.0.1
tinyglobby: 0.2.17
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
vite: 8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)
vite-plugin-inspect: 11.4.1(@nuxt/kit@4.5.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
vite-plugin-vue-tracer: 1.4.0(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)
@@ -20263,7 +20231,7 @@ snapshots:
- idb-keyval
- utf-8-validate
- '@nuxt/fonts@0.14.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)':
+ '@nuxt/fonts@0.14.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)':
dependencies:
'@nuxt/devtools-kit': 3.4.1(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
@@ -20279,7 +20247,7 @@ snapshots:
ufo: 1.6.4
unifont: 0.7.5
unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.4)(rollup@4.62.4)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -20428,7 +20396,7 @@ snapshots:
std-env: 4.2.0
ufo: 1.6.4
unctx: 3.0.0(magic-string@1.2.0)(rolldown@1.2.4)(unplugin@3.3.0(esbuild@0.28.2)(rolldown@1.2.4)(rollup@4.62.4)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2))
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
vue: 3.5.41
vue-bundle-renderer: 2.3.2
vue-devtools-stub: 0.1.0
@@ -20451,7 +20419,6 @@ snapshots:
- '@vercel/kv'
- bare-abort-controller
- bare-buffer
- - better-sqlite3
- bun-types-no-globals
- encoding
- idb-keyval
@@ -20527,7 +20494,7 @@ snapshots:
'@internationalized/date': 3.12.3
'@internationalized/number': 3.6.7
'@nuxt/content': 3.15.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2))(better-sqlite3@12.11.1)(valibot@1.4.2)
- '@nuxt/fonts': 0.14.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)
+ '@nuxt/fonts': 0.14.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)
'@nuxt/icon': 2.5.0(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)
'@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
'@nuxt/schema': 4.5.2
@@ -20675,7 +20642,7 @@ snapshots:
pkg-types: 2.3.1
semver: 7.8.5
- '@nuxtjs/i18n@10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)':
+ '@nuxtjs/i18n@10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)':
dependencies:
'@intlify/core': 11.4.8
'@intlify/h3': 0.7.4
@@ -20703,7 +20670,7 @@ snapshots:
unhead: 3.3.1(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.4)(rollup@4.62.4)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)
unrouting: 0.2.3
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
vue-i18n: 11.4.8(vue@3.5.41)
vue-router: 5.2.0(@vue/compiler-sfc@3.5.41)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)
transitivePeerDependencies:
@@ -20823,7 +20790,7 @@ snapshots:
'@nuxtjs/sitemap': 8.3.4(zod@3.25.76)
nuxt: 4.5.2(@types/node@24.13.3)(rolldown@1.2.4)
nuxt-link-checker: 5.1.3(nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.4))
- nuxt-og-image: 6.7.8(c2c7467499ca19cdb9a2795eafb16a7e)
+ nuxt-og-image: 6.7.8(e2e4a66c28873932e348a41fdf2c2189)
nuxt-schema-org: 6.2.9(@unhead/vue@3.3.2(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2))(unhead@3.3.2(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(zod@3.25.76)
nuxt-seo-utils: 8.4.2(@unhead/vue@3.3.2(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2))(esbuild@0.28.2)(lightningcss@1.33.0)(nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.4))(rolldown@1.2.4)(unhead@3.3.2(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))
nuxt-site-config: 4.2.3(vue@3.5.41)
@@ -20893,18 +20860,18 @@ snapshots:
dependencies:
'@oclif/core': 4.11.4
- '@octopi-ai/better-enrollment@0.4.0(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)':
+ '@octopi-ai/better-enrollment@0.4.0(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))(zod@4.4.3)':
dependencies:
- better-auth: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ better-auth: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
zod: 4.4.3
'@one-ini/wasm@0.1.1': {}
- '@onmax/nuxt-better-auth@0.1.2(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))':
+ '@onmax/nuxt-better-auth@0.1.2(better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41))':
dependencies:
'@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
- auth: 1.7.0-rc.5(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(better-call@1.4.0(zod@4.4.3))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(jose@6.2.9)(kysely@0.29.5)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(nanostores@1.5.1)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(supports-color@8.1.1)(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
- better-auth: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ auth: 1.7.0-rc.5(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(better-call@1.4.0(zod@4.4.3))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(jose@6.2.9)(kysely@0.29.5)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(nanostores@1.5.1)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(supports-color@8.1.1)(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ better-auth: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
defu: 6.1.7
h3: 1.15.11
jiti: 2.7.0
@@ -23529,7 +23496,7 @@ snapshots:
d3-time-format: 4.1.0
internmap: 2.0.3
- '@vite-hub/agent@0.0.3(fb90d311c8a27a2970f8785749842d62)':
+ '@vite-hub/agent@0.0.3(f98c108717be27ec3f990b4c033b1a17)':
dependencies:
'@ai-sdk/gateway': 4.0.26(zod@4.4.3)
'@ai-sdk/harness': 1.0.39(ws@8.21.3)(zod@4.4.3)
@@ -23554,7 +23521,7 @@ snapshots:
'@vite-hub/blob': 0.0.3(eac20ec5ccbbc7801d448298aa79187c)
'@vite-hub/email': 0.0.3(nodemailer@9.0.5)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@vite-hub/schedule': 0.0.3(@vite-hub/kv@0.0.3(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
- '@vite-hub/workflow': 0.0.3(@vite-hub/database@0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(@workflow/builders@5.0.0-beta.35)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(workflow@5.0.0-beta.35(@opentelemetry/api@1.9.1))
+ '@vite-hub/workflow': 0.0.3(@vite-hub/database@0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(@workflow/builders@5.0.0-beta.35)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(workflow@5.0.0-beta.35(@opentelemetry/api@1.9.1))
vite: 8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)
vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
transitivePeerDependencies:
@@ -23567,12 +23534,12 @@ snapshots:
- ssh2
- utf-8-validate
- '@vite-hub/auth@0.0.3(@vite-hub/agent@0.0.3(fb90d311c8a27a2970f8785749842d62))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))':
+ '@vite-hub/auth@0.0.3(@vite-hub/agent@0.0.3(f98c108717be27ec3f990b4c033b1a17))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))':
dependencies:
'@vite-hub/runtime': 0.0.3
- better-auth: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ better-auth: 1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
optionalDependencies:
- '@vite-hub/agent': 0.0.3(fb90d311c8a27a2970f8785749842d62)
+ '@vite-hub/agent': 0.0.3(f98c108717be27ec3f990b4c033b1a17)
vite: 8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)
transitivePeerDependencies:
- '@cloudflare/workers-types'
@@ -23623,11 +23590,11 @@ snapshots:
pathe: 2.0.3
vite: 8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)
- '@vite-hub/database@0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))':
+ '@vite-hub/database@0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))':
dependencies:
'@libsql/client': 0.17.4
drizzle-kit: 0.31.10
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
esbuild: 0.28.2
h3: 2.0.1-rc.25(crossws@0.4.10(srvx@0.11.22))
pathe: 2.0.3
@@ -23660,7 +23627,7 @@ snapshots:
dependencies:
'@vite-hub/runtime': 0.0.3
defu: 6.1.7
- unstorage: 2.0.0-alpha.7(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(lru-cache@11.5.2)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(ofetch@1.5.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 2.0.0-alpha.7(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(lru-cache@11.5.2)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(ofetch@1.5.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
optionalDependencies:
vite: 8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)
transitivePeerDependencies:
@@ -23758,7 +23725,7 @@ snapshots:
transitivePeerDependencies:
- '@cfworker/json-schema'
- '@vite-hub/workflow@0.0.3(@vite-hub/database@0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(@workflow/builders@5.0.0-beta.35)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(workflow@5.0.0-beta.35(@opentelemetry/api@1.9.1))':
+ '@vite-hub/workflow@0.0.3(@vite-hub/database@0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(@workflow/builders@5.0.0-beta.35)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(workflow@5.0.0-beta.35(@opentelemetry/api@1.9.1))':
dependencies:
'@vercel/functions': 3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3)
'@vite-hub/runtime': 0.0.3
@@ -23767,7 +23734,7 @@ snapshots:
h3: 2.0.1-rc.25(crossws@0.4.10(srvx@0.11.22))
pathe: 2.0.3
optionalDependencies:
- '@vite-hub/database': 0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
+ '@vite-hub/database': 0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@workflow/builders': 5.0.0-beta.35(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)
vite: 8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)
workflow: 5.0.0-beta.35(@opentelemetry/api@1.9.1)
@@ -23786,7 +23753,7 @@ snapshots:
isomorphic-git: 1.41.4
jiti: 2.7.0
minimatch: 10.2.6
- mountx: 0.0.2(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))
+ mountx: 0.0.2(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))
mrmime: 2.0.1
ofetch: 1.5.1
optionalDependencies:
@@ -23816,7 +23783,7 @@ snapshots:
isomorphic-git: 1.41.4
jiti: 2.7.0
minimatch: 10.2.6
- mountx: 0.0.2(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))
+ mountx: 0.0.2(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))
mrmime: 2.0.1
ofetch: 1.5.1
optionalDependencies:
@@ -24864,7 +24831,7 @@ snapshots:
stubborn-fs: 2.0.0
when-exit: 2.1.5
- auth@1.7.0-rc.5(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(better-call@1.4.0(zod@4.4.3))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(jose@6.2.9)(kysely@0.29.5)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(nanostores@1.5.1)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(supports-color@8.1.1)(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41):
+ auth@1.7.0-rc.5(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(better-call@1.4.0(zod@4.4.3))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(jose@6.2.9)(kysely@0.29.5)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(nanostores@1.5.1)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(supports-color@8.1.1)(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41):
dependencies:
'@babel/core': 7.29.7(supports-color@8.1.1)
'@babel/preset-react': 7.29.7(@babel/core@7.29.7)
@@ -24874,7 +24841,7 @@ snapshots:
'@better-auth/utils': 0.4.2
'@clack/prompts': 1.7.0
'@mrleebo/prisma-ast': 0.16.0
- better-auth: 1.7.0-rc.5(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
+ better-auth: 1.7.0-rc.5(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41)
c12: 4.0.0-beta.5(dotenv@17.4.2)(jiti@2.7.0)
chalk: 5.6.2
commander: 15.0.0
@@ -24981,10 +24948,10 @@ snapshots:
basic-ftp@5.3.1: {}
- better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41):
+ better-auth@1.6.26(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41):
dependencies:
'@better-auth/core': 1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)
- '@better-auth/drizzle-adapter': 1.6.26(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))
+ '@better-auth/drizzle-adapter': 1.6.26(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))
'@better-auth/kysely-adapter': 1.6.26(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(kysely@0.29.5)
'@better-auth/memory-adapter': 1.6.26(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)
'@better-auth/mongo-adapter': 1.6.26(@better-auth/core@1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))
@@ -25003,7 +24970,7 @@ snapshots:
optionalDependencies:
'@prisma/client': 5.22.0(prisma@7.9.1)
drizzle-kit: 0.31.10
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
mongodb: 7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9)
mysql2: 3.15.3
pg: 8.23.0
@@ -25015,10 +24982,10 @@ snapshots:
transitivePeerDependencies:
- '@cloudflare/workers-types'
- better-auth@1.7.0-rc.5(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41):
+ better-auth@1.7.0-rc.5(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(mysql2@3.15.3)(pg@8.23.0)(prisma@7.9.1)(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vue@3.5.41):
dependencies:
'@better-auth/core': 1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)
- '@better-auth/drizzle-adapter': 1.7.0-rc.5(@better-auth/core@1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))
+ '@better-auth/drizzle-adapter': 1.7.0-rc.5(@better-auth/core@1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))
'@better-auth/kysely-adapter': 1.7.0-rc.5(@better-auth/core@1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(kysely@0.29.5)
'@better-auth/memory-adapter': 1.7.0-rc.5(@better-auth/core@1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)
'@better-auth/mongo-adapter': 1.7.0-rc.5(@better-auth/core@1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))
@@ -25032,7 +24999,7 @@ snapshots:
better-call: 1.4.0(zod@4.4.3)
defu: 6.1.7
drizzle-kit: 0.31.10
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
jose: 6.2.9
kysely: 0.29.5
mongodb: 7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9)
@@ -25802,13 +25769,6 @@ snapshots:
drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
mysql2: 3.15.3
- db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3):
- optionalDependencies:
- '@electric-sql/pglite': 0.4.3
- '@libsql/client': 0.17.4
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
- mysql2: 3.15.3
-
debug@4.4.3(supports-color@8.1.1):
dependencies:
ms: 2.1.3
@@ -25954,7 +25914,7 @@ snapshots:
'@nuxt/image': 2.1.0(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
'@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
'@nuxt/ui': 4.10.0(c66c547a40351b7e798d089e5b7f5d6a)
- '@nuxtjs/i18n': 10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
+ '@nuxtjs/i18n': 10.6.0(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(esbuild@0.28.2)(ioredis@5.11.1)(magicast@0.5.4)(rolldown@1.2.4)(rollup@4.62.4)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
'@nuxtjs/mcp-toolkit': 0.17.2(h3@1.15.11)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(zod@4.4.3)
'@nuxtjs/mdc': 0.22.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)(supports-color@8.1.1)
'@nuxtjs/robots': 6.1.4(zod@4.4.3)
@@ -25973,7 +25933,7 @@ snapshots:
motion-v: 2.4.0(@vueuse/core@14.4.0(vue@3.5.41))(vue@3.5.41)
nuxt: 4.5.2(@types/node@24.13.3)(rolldown@1.2.4)
nuxt-llms: 0.2.0(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
- nuxt-og-image: 6.6.0(@takumi-rs/core@1.8.7)(@unhead/vue@3.3.1(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2))(tailwindcss@4.3.3)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))(zod@4.4.3)
+ nuxt-og-image: 6.6.0(@takumi-rs/core@1.8.7)(@unhead/vue@3.3.1(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2))(tailwindcss@4.3.3)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))(zod@4.4.3)
pathe: 2.0.3
pkg-types: 2.3.1
scule: 1.3.0
@@ -26117,21 +26077,6 @@ snapshots:
postgres: 3.4.9
prisma: 7.9.1(better-sqlite3@12.11.1)
sql.js: 1.14.2
- optional: true
-
- drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2):
- optionalDependencies:
- '@electric-sql/pglite': 0.4.3
- '@libsql/client': 0.17.4
- '@opentelemetry/api': 1.9.1
- '@prisma/client': 5.22.0(prisma@7.9.1)
- '@types/pg': 8.23.0
- kysely: 0.29.5
- mysql2: 3.15.3
- pg: 8.23.0
- postgres: 3.4.9
- prisma: 7.9.1
- sql.js: 1.14.2
dropbox@10.45.0: {}
@@ -27007,7 +26952,7 @@ snapshots:
pathe: 2.0.3
ufo: 1.6.4
unifont: 0.7.5
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
vite: 8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)
transitivePeerDependencies:
- '@azure/app-configuration'
@@ -29110,9 +29055,9 @@ snapshots:
- react
- react-dom
- mountx@0.0.2(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))):
+ mountx@0.0.2(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))):
optionalDependencies:
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
mri@1.2.0: {}
@@ -29209,7 +29154,7 @@ snapshots:
cookie-es: 2.0.1
croner: 10.0.1
crossws: 0.3.5
- db0: 0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3)
+ db0: 0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3)
defu: 6.1.7
destr: 2.0.5
dot-prop: 10.2.0
@@ -29255,7 +29200,7 @@ snapshots:
unenv: 2.0.0-rc.24
unimport: 6.4.0(oxc-parser@0.131.0)(rolldown@1.2.4)
unplugin-utils: 0.3.2
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
untyped: 2.0.0
unwasm: 0.5.3
youch: 4.1.1
@@ -29275,7 +29220,6 @@ snapshots:
- '@vercel/kv'
- bare-abort-controller
- bare-buffer
- - better-sqlite3
- bun-types-no-globals
- encoding
- idb-keyval
@@ -29411,7 +29355,7 @@ snapshots:
site-config-stack: 4.2.3(vue@3.5.41)
ufo: 1.6.4
ultrahtml: 1.7.0
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -29428,7 +29372,7 @@ snapshots:
dependencies:
'@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
- nuxt-og-image@6.6.0(@takumi-rs/core@1.8.7)(@unhead/vue@3.3.1(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2))(tailwindcss@4.3.3)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))(zod@4.4.3):
+ nuxt-og-image@6.6.0(@takumi-rs/core@1.8.7)(@unhead/vue@3.3.1(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2))(tailwindcss@4.3.3)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))(zod@4.4.3):
dependencies:
'@clack/prompts': 1.7.0
'@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
@@ -29465,7 +29409,7 @@ snapshots:
ufo: 1.6.4
ultrahtml: 1.7.0
unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.4)(rollup@4.62.4)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
zod: 4.4.3
transitivePeerDependencies:
- '@farmfe/core'
@@ -29473,7 +29417,7 @@ snapshots:
- bun-types-no-globals
- unloader
- nuxt-og-image@6.7.8(c2c7467499ca19cdb9a2795eafb16a7e):
+ nuxt-og-image@6.7.8(e2e4a66c28873932e348a41fdf2c2189):
dependencies:
'@clack/prompts': 1.7.0
'@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(rolldown@1.2.4)
@@ -29506,7 +29450,7 @@ snapshots:
ufo: 1.6.4
ultrahtml: 1.7.0
unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.4)(rollup@4.62.4)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.109.2)
- unstorage: 2.0.0-alpha.7(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(lru-cache@11.5.2)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(ofetch@1.5.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 2.0.0-alpha.7(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(lru-cache@11.5.2)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(ofetch@1.5.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
optionalDependencies:
'@unocss/config': 66.7.5
'@unocss/core': 66.7.5
@@ -29663,7 +29607,6 @@ snapshots:
- '@vercel/kv'
- bare-abort-controller
- bare-buffer
- - better-sqlite3
- bufferutil
- bun-types-no-globals
- encoding
@@ -31688,7 +31631,7 @@ snapshots:
dependencies:
zod: 4.4.3
- skilld@2.3.0(@ai-sdk/google@4.0.44(zod@4.4.3))(@ai-sdk/openai@4.0.42(zod@4.4.3))(@cloudflare/sandbox@0.8.14)(@libsql/client@0.17.4)(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@vercel/queue@0.4.0(@opentelemetry/api@1.9.1))(@vercel/sandbox@1.10.2)(ai@7.0.66(zod@4.4.3))(pg@8.23.0)(playwright@1.62.1)(supports-color@8.1.1)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))(ws@8.21.3)(zod@4.4.3):
+ skilld@2.3.0(a1173244e7c44b145ae837824c120d5c):
dependencies:
'@clack/prompts': 1.7.0
'@earendil-works/pi-ai': 0.84.2(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(supports-color@8.1.1)(ws@8.21.3)(zod@4.4.3)
@@ -31711,7 +31654,7 @@ snapshots:
std-env: 4.2.0
typebox: 1.3.15
typescript: typescript-native-bridge@6.0.3-bridge.12.tsgo.7.0.2
- unagent: 0.0.8(@ai-sdk/google@4.0.44(zod@4.4.3))(@ai-sdk/openai@4.0.42(zod@4.4.3))(@cloudflare/sandbox@0.8.14)(@huggingface/transformers@4.2.0)(@libsql/client@0.17.4)(@vercel/queue@0.4.0(@opentelemetry/api@1.9.1))(@vercel/sandbox@1.10.2)(ai@7.0.66(zod@4.4.3))(pg@8.23.0)(sqlite-vec@0.1.9)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))
+ unagent: 0.0.8(@ai-sdk/google@4.0.44(zod@4.4.3))(@ai-sdk/openai@4.0.42(zod@4.4.3))(@cloudflare/sandbox@0.8.14)(@huggingface/transformers@4.2.0)(@libsql/client@0.17.4)(@vercel/queue@0.4.0(@opentelemetry/api@1.9.1))(@vercel/sandbox@1.10.2)(ai@7.0.66(zod@4.4.3))(pg@8.23.0)(sqlite-vec@0.1.9)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)))
verkit: 0.3.2
optionalDependencies:
'@napi-rs/keyring': 1.3.0
@@ -32452,7 +32395,7 @@ snapshots:
ultramatter@0.0.4: {}
- unagent@0.0.8(@ai-sdk/google@4.0.44(zod@4.4.3))(@ai-sdk/openai@4.0.42(zod@4.4.3))(@cloudflare/sandbox@0.8.14)(@huggingface/transformers@4.2.0)(@libsql/client@0.17.4)(@vercel/queue@0.4.0(@opentelemetry/api@1.9.1))(@vercel/sandbox@1.10.2)(ai@7.0.66(zod@4.4.3))(pg@8.23.0)(sqlite-vec@0.1.9)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))):
+ unagent@0.0.8(@ai-sdk/google@4.0.44(zod@4.4.3))(@ai-sdk/openai@4.0.42(zod@4.4.3))(@cloudflare/sandbox@0.8.14)(@huggingface/transformers@4.2.0)(@libsql/client@0.17.4)(@vercel/queue@0.4.0(@opentelemetry/api@1.9.1))(@vercel/sandbox@1.10.2)(ai@7.0.66(zod@4.4.3))(pg@8.23.0)(sqlite-vec@0.1.9)(unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))):
dependencies:
croner: 9.1.0
hookable: 6.1.1
@@ -32470,7 +32413,7 @@ snapshots:
ai: 7.0.66(zod@4.4.3)
pg: 8.23.0
sqlite-vec: 0.1.9
- unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
+ unstorage: 1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))
unbash@4.0.10: {}
@@ -32769,7 +32712,7 @@ snapshots:
escape-string-regexp: 5.0.0
ufo: 1.6.4
- unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)):
+ unstorage@1.17.5(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)):
dependencies:
anymatch: 3.1.3
chokidar: 5.0.0
@@ -32786,11 +32729,11 @@ snapshots:
'@vercel/blob': 2.8.0
'@vercel/functions': 3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3)
aws4fetch: 1.0.20
- db0: 0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3)
+ db0: 0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3)
ioredis: 5.11.1(supports-color@8.1.1)
uploadthing: 7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)
- unstorage@2.0.0-alpha.7(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(lru-cache@11.5.2)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(ofetch@1.5.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)):
+ unstorage@2.0.0-alpha.7(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@netlify/blobs@10.7.13)(@vercel/blob@2.8.0)(@vercel/functions@3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(aws4fetch@1.0.20)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3))(ioredis@5.11.1)(lru-cache@11.5.2)(mongodb@7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9))(ofetch@1.5.1)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3)):
optionalDependencies:
'@azure/identity': 4.13.1(supports-color@8.1.1)
'@azure/storage-blob': 12.33.0(supports-color@8.1.1)
@@ -32799,7 +32742,7 @@ snapshots:
'@vercel/functions': 3.9.3(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3)
aws4fetch: 1.0.20
chokidar: 5.0.0
- db0: 0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(mysql2@3.15.3)
+ db0: 0.3.4(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(mysql2@3.15.3)
ioredis: 5.11.1(supports-color@8.1.1)
lru-cache: 11.5.2
mongodb: 7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9)
@@ -32925,13 +32868,13 @@ snapshots:
'@netlify/blobs': 10.7.13
'@supabase/storage-js': 2.112.3
'@vercel/sandbox': 1.10.2
- '@vite-hub/agent': 0.0.3(fb90d311c8a27a2970f8785749842d62)
- '@vite-hub/auth': 0.0.3(@vite-hub/agent@0.0.3(fb90d311c8a27a2970f8785749842d62))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
+ '@vite-hub/agent': 0.0.3(f98c108717be27ec3f990b4c033b1a17)
+ '@vite-hub/auth': 0.0.3(@vite-hub/agent@0.0.3(f98c108717be27ec3f990b4c033b1a17))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@vite-hub/blob': 0.0.3(eac20ec5ccbbc7801d448298aa79187c)
'@vite-hub/box': 0.0.3(@cloudflare/sandbox@0.8.14)(@vercel/sandbox@1.10.2)
'@vite-hub/browser': 0.0.3(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@vite-hub/cli': 0.0.3(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
- '@vite-hub/database': 0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
+ '@vite-hub/database': 0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@vite-hub/email': 0.0.3(nodemailer@9.0.5)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@vite-hub/env': 0.0.3(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@vite-hub/kv': 0.0.3(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
@@ -32943,13 +32886,13 @@ snapshots:
'@vite-hub/schedule': 0.0.3(@vite-hub/kv@0.0.3(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
'@vite-hub/shell': 0.0.3(supports-color@8.1.1)
'@vite-hub/source': 0.0.3(zod@4.4.3)
- '@vite-hub/workflow': 0.0.3(@vite-hub/database@0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(@workflow/builders@5.0.0-beta.35)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(workflow@5.0.0-beta.35(@opentelemetry/api@1.9.1))
+ '@vite-hub/workflow': 0.0.3(@vite-hub/database@0.0.3(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0)))(@workflow/builders@5.0.0-beta.35)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(workflow@5.0.0-beta.35(@opentelemetry/api@1.9.1))
'@vite-hub/workspace': 0.0.3(@vercel/blob@2.8.0)(@vite-hub/shell@0.0.3)(ai@6.0.228(zod@4.4.3))(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))(vue@3.5.41)
'@workflow/builders': 5.0.0-beta.35(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)
ai: 6.0.228(zod@4.4.3)
box-typescript-sdk-gen: 1.19.1(supports-color@8.1.1)
drizzle-kit: 0.31.10
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
dropbox: 10.45.0
files-sdk: 2.2.3(@anthropic-ai/claude-agent-sdk@0.3.232(@anthropic-ai/sdk@0.91.1(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(zod@4.4.3))(@aws-sdk/client-s3@3.1111.0)(@aws-sdk/lib-storage@3.1111.0(@aws-sdk/client-s3@3.1111.0))(@aws-sdk/s3-presigned-post@3.1111.0)(@aws-sdk/s3-request-presigner@3.1111.0)(@azure/core-auth@1.11.0)(@azure/identity@4.13.1)(@azure/storage-blob@12.33.0)(@google-cloud/storage@7.21.0)(@googleapis/drive@20.2.0)(@microsoft/microsoft-graph-client@3.0.7(@azure/identity@4.13.1))(@nestjs/common@11.2.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@netlify/blobs@10.7.13)(@opentelemetry/api@1.9.1)(@supabase/storage-js@2.112.3)(@vercel/blob@2.8.0)(ai@6.0.228(zod@4.4.3))(box-typescript-sdk-gen@1.19.1)(dropbox@10.45.0)(google-auth-library@10.9.1)(h3@1.15.11)(hono@4.13.2)(openai@6.40.0(ws@8.21.3)(zod@4.4.3))(react@19.2.8)(react-dom@19.2.8(react@19.2.8))(uploadthing@7.7.4(express@5.2.1)(h3@1.15.11)(tailwindcss@4.3.3))(vue@3.5.41)(zod@4.4.3)
google-auth-library: 10.9.1(supports-color@8.1.1)
diff --git a/tsconfig.json b/tsconfig.json
index 8ffa916..6d583d3 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,6 +2,7 @@
"files": [],
"references": [
{ "path": "packages/shared" },
+ { "path": "packages/build-env" },
{ "path": "packages/config" },
{ "path": "packages/models" },
{ "path": "packages/runner" },
diff --git a/turbo.jsonc b/turbo.jsonc
index d7e6f75..91052e3 100644
--- a/turbo.jsonc
+++ b/turbo.jsonc
@@ -31,6 +31,32 @@
"NUXT_PUBLIC_SITE_URL",
"NITRO_PRESET",
"VITEHUB_HOSTING",
+ // Read by packages/build-env to resolve what the build is (version, commit, branch,
+ // deploy channel). Declared so strict env mode does not hide them from `nuxt build`, and
+ // so the resolved metadata is part of the cache key: a bundle that reports the wrong
+ // commit is worse than one that is rebuilt. Whatever a target leaves unset is completed
+ // at boot by the module's server pass instead.
+ "VERCEL",
+ "VERCEL_ENV",
+ "VERCEL_GIT_*",
+ "VERCEL_URL",
+ "VERCEL_PROJECT_PRODUCTION_URL",
+ "NUXT_ENV_VERCEL_*",
+ "NETLIFY",
+ "CONTEXT",
+ "BRANCH",
+ "HEAD",
+ "COMMIT_REF",
+ "REVIEW_ID",
+ "DEPLOY_PRIME_URL",
+ "DEPLOY_URL",
+ "URL",
+ "CF_PAGES*",
+ "GITHUB_ACTIONS",
+ "GITHUB_REF",
+ "GITHUB_REF_NAME",
+ "GITHUB_SHA",
+ "AGENT_ZERO_BUILD_*",
],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
// `.vercel/output/**` is where the `vercel` preset writes instead of `.output/`; both are
@@ -44,7 +70,37 @@
// NITRO_PRESET is declared so the deployment target is explicit and part of the cache key.
// Nitro does auto-detect a host from the platform variables Turborepo passes through, but
// those are not hashed, so a cached self-hosted build could otherwise be restored into one.
- "env": ["MARKETING_SITE_URL", "MARKETING_DASHBOARD_URL", "NITRO_PRESET"],
+ "env": [
+ "MARKETING_SITE_URL",
+ "MARKETING_DASHBOARD_URL",
+ "NITRO_PRESET",
+ // Read by packages/build-env to resolve what the build is (version, commit, branch,
+ // deploy channel). Declared so strict env mode does not hide them from `nuxt build`, and
+ // so the resolved metadata is part of the cache key: a bundle that reports the wrong
+ // commit is worse than one that is rebuilt. Whatever a target leaves unset is completed
+ // at boot by the module's server pass instead.
+ "VERCEL",
+ "VERCEL_ENV",
+ "VERCEL_GIT_*",
+ "VERCEL_URL",
+ "VERCEL_PROJECT_PRODUCTION_URL",
+ "NUXT_ENV_VERCEL_*",
+ "NETLIFY",
+ "CONTEXT",
+ "BRANCH",
+ "HEAD",
+ "COMMIT_REF",
+ "REVIEW_ID",
+ "DEPLOY_PRIME_URL",
+ "DEPLOY_URL",
+ "URL",
+ "CF_PAGES*",
+ "GITHUB_ACTIONS",
+ "GITHUB_REF",
+ "GITHUB_REF_NAME",
+ "GITHUB_SHA",
+ "AGENT_ZERO_BUILD_*",
+ ],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": [".output/**", ".vercel/output/**"],
},
From 87baf829ec0d3abaa7e0f4ec164919a55a4fdf9b Mon Sep 17 00:00:00 2001
From: RedStar
Date: Fri, 21 Aug 2026 15:38:31 +0200
Subject: [PATCH 02/10] feat(dashboard): show build info under the signed-in
user
Adds BuildEnvironment.vue (mirroring wolfstar.rocks' component of the
same name), rendered in the sidebar below UserMenu: build date, the
release version or deploy channel, and a linked short commit.
Replaces the sidebar's package.json-sourced version with useBuildInfo(),
so version, deploy channel, and commit come from one resolved source
instead of two that could drift. common.version.label becomes
common.build.{label,releaseAria,commitAria} in en/it, with the schema
regenerated.
---
.../shared/components/BuildEnvironment.vue | 70 +++++++++++++++++++
.../modules/shared/components/app/Sidebar.vue | 10 ++-
.../nuxt/components/BuildEnvironment.spec.ts | 68 ++++++++++++++++++
packages/i18n/locales/en/common.json | 6 +-
packages/i18n/locales/it/common.json | 6 +-
packages/i18n/schemas/common.schema.json | 8 ++-
6 files changed, 157 insertions(+), 11 deletions(-)
create mode 100644 apps/dashboard/modules/shared/components/BuildEnvironment.vue
create mode 100644 apps/dashboard/test/nuxt/components/BuildEnvironment.spec.ts
diff --git a/apps/dashboard/modules/shared/components/BuildEnvironment.vue b/apps/dashboard/modules/shared/components/BuildEnvironment.vue
new file mode 100644
index 0000000..4106bf6
--- /dev/null
+++ b/apps/dashboard/modules/shared/components/BuildEnvironment.vue
@@ -0,0 +1,70 @@
+
+
+
+
+ ·
+
+
+
+ v{{ buildInfo.version }}
+
+ {{ buildInfo.env }}
+
+
+ ·
+
+ {{ buildInfo.shortCommit }}
+
+
+
+
+
+
diff --git a/apps/dashboard/modules/shared/components/app/Sidebar.vue b/apps/dashboard/modules/shared/components/app/Sidebar.vue
index 3df9447..0b6014e 100644
--- a/apps/dashboard/modules/shared/components/app/Sidebar.vue
+++ b/apps/dashboard/modules/shared/components/app/Sidebar.vue
@@ -58,10 +58,10 @@
{{ $t('common.system.healthy') }}
-
- {{ $t('common.version.label') }}
- v{{ version }}
-
+ {{ $t('common.build.label') }}
+
+
diff --git a/packages/build-env/package.json b/packages/build-env/package.json
index 814fd85..52405d3 100644
--- a/packages/build-env/package.json
+++ b/packages/build-env/package.json
@@ -24,6 +24,10 @@
"test": "vitest run src --passWithNoTests",
"typecheck": "tsc --project tsconfig.json --pretty false --noEmit"
},
+ "dependencies": {
+ "pkg-types": "^2.3.1",
+ "ufo": "^1.6.4"
+ },
"devDependencies": {
"@nuxt/kit": "^4.5.2",
"@nuxt/schema": "^4.5.2",
diff --git a/packages/build-env/src/build-info.test.ts b/packages/build-env/src/build-info.test.ts
index fb0ff91..d72bc8e 100644
--- a/packages/build-env/src/build-info.test.ts
+++ b/packages/build-env/src/build-info.test.ts
@@ -1,14 +1,13 @@
import { describe, expect, it } from 'vitest';
import { runtimeBuildInfo, shortenCommit } from './build-info.js';
-import { type BuildInfo, unknownRevision } from './types.js';
+import type { BuildInfo } from './types.js';
-/** What a build that resolved nothing publishes: every revision field carries the sentinel. */
+/** What a build that resolved nothing publishes: every revision field is `null`. */
const unresolvedBuild: BuildInfo = {
version: '0.4.0',
- commit: unknownRevision,
- shortCommit: unknownRevision,
- branch: unknownRevision,
+ commit: null,
+ branch: null,
env: 'release',
time: 1_700_000_000_000,
prNumber: null,
@@ -20,7 +19,6 @@ const unresolvedBuild: BuildInfo = {
const resolvedBuild: BuildInfo = {
...unresolvedBuild,
commit: '1234567890abcdef',
- shortCommit: '1234567',
branch: 'main',
};
@@ -29,8 +27,8 @@ describe('shortenCommit', () => {
expect(shortenCommit('1234567890abcdef')).toBe('1234567');
});
- it('passes the unresolved sentinel through rather than slicing it', () => {
- expect(shortenCommit(unknownRevision)).toBe(unknownRevision);
+ it('passes null through rather than throwing on it', () => {
+ expect(shortenCommit(null)).toBeNull();
});
});
@@ -41,11 +39,7 @@ describe('runtimeBuildInfo', () => {
AGENT_ZERO_BUILD_COMMIT: 'fedcba0987654321',
AGENT_ZERO_BUILD_BRANCH: 'main',
}),
- ).toMatchObject({
- commit: 'fedcba0987654321',
- shortCommit: 'fedcba0',
- branch: 'main',
- });
+ ).toMatchObject({ commit: 'fedcba0987654321', branch: 'main' });
});
it('never rewrites a field the build resolved, since the commit is a property of the bundle', () => {
@@ -54,7 +48,7 @@ describe('runtimeBuildInfo', () => {
AGENT_ZERO_BUILD_COMMIT: 'fedcba0987654321',
AGENT_ZERO_BUILD_BRANCH: 'somewhere-else',
}),
- ).toMatchObject({ commit: '1234567890abcdef', shortCommit: '1234567', branch: 'main' });
+ ).toMatchObject({ commit: '1234567890abcdef', branch: 'main' });
});
it('is a no-op on Vercel, where the build already read the same variables', () => {
@@ -105,24 +99,6 @@ describe('runtimeBuildInfo', () => {
);
});
- it('treats the empty strings Nuxt rewrites null runtime-config values to as unresolved', () => {
- expect(
- runtimeBuildInfo(
- { ...resolvedBuild, prNumber: '', previewUrl: '', productionUrl: '' },
- {
- VERCEL_ENV: 'preview',
- VERCEL_GIT_COMMIT_REF: 'feat/env',
- VERCEL_GIT_PULL_REQUEST_ID: '7',
- VERCEL_URL: 'agent-zero-abc123.vercel.app',
- },
- ),
- ).toMatchObject({
- prNumber: '7',
- previewUrl: 'https://agent-zero-abc123.vercel.app',
- productionUrl: null,
- });
- });
-
it('fills the deploy URLs a build off the host could not know', () => {
expect(
runtimeBuildInfo(resolvedBuild, {
@@ -132,4 +108,19 @@ describe('runtimeBuildInfo', () => {
}),
).toMatchObject({ previewUrl: 'https://agent-zero-abc123.vercel.app', productionUrl: null });
});
+
+ it('clears a build-time pull-request number once the host reports this process as production', () => {
+ // A container image built for review app #42's preview, later promoted to serve production
+ // traffic, must not still claim to be preview #42 once the host says otherwise.
+ expect(
+ runtimeBuildInfo(
+ { ...resolvedBuild, prNumber: '42' },
+ { VERCEL_ENV: 'production', VERCEL_GIT_COMMIT_REF: 'main' },
+ ).prNumber,
+ ).toBeNull();
+ });
+
+ it('keeps a build-time pull-request number when the host reports no production context', () => {
+ expect(runtimeBuildInfo({ ...resolvedBuild, prNumber: '42' }, {}).prNumber).toBe('42');
+ });
});
diff --git a/packages/build-env/src/build-info.ts b/packages/build-env/src/build-info.ts
index 3058ea1..661129a 100644
--- a/packages/build-env/src/build-info.ts
+++ b/packages/build-env/src/build-info.ts
@@ -6,26 +6,21 @@ import {
previewUrlFromMetadata,
productionUrlFromMetadata,
} from './environment.js';
-import { type BuildInfo, type EnvironmentRecord, unknownRevision } from './types.js';
+import type { BuildInfo, EnvironmentRecord, EnvType } from './types.js';
/** Seven characters is what `git rev-parse --short` and every provider's UI abbreviate to. */
const shortCommitLength = 7;
-/** Abbreviates a commit SHA, passing the unresolved sentinel through unchanged. */
-export function shortenCommit(commit: string): string {
- return commit === unknownRevision ? unknownRevision : commit.slice(0, shortCommitLength);
-}
-
-/** Whether a revision field is still carrying the sentinel rather than a resolved value. */
-function isUnresolved(value: string): boolean {
- return value === unknownRevision;
+/** Abbreviates a commit SHA, passing `null` through unchanged. */
+export function shortenCommit(commit: string | null): string | null {
+ return commit === null ? null : commit.slice(0, shortCommitLength);
}
/**
* Completes build metadata from the environment the bundle is *running* in.
*
* This is the fallback for every deployment that is not Vercel. On Vercel the build itself runs
- * with `VERCEL_GIT_COMMIT_SHA` and the rest in scope, so the values are already baked in and this
+ * with `VERCEL_GIT_COMMIT_SHA` and the rest in scope, so the values are already resolved and this
* pass is a no-op that resolves to the same answers. A container image built in CI and started
* somewhere else has none of them at build time: the fields arrive at boot instead, from whatever
* the host exposes, or from the `AGENT_ZERO_BUILD_*` variables an operator sets on the process.
@@ -40,31 +35,26 @@ export function runtimeBuildInfo(
environment: EnvironmentRecord,
options: { readonly defaultBranch?: string } = {},
): BuildInfo {
- const metadata = deploymentMetadataFromEnvironment(environment);
+ const metadata = deploymentMetadataFromEnvironment(environment, options.defaultBranch);
- const commit = isUnresolved(buildInfo.commit)
- ? (metadata.commit ?? unknownRevision)
- : buildInfo.commit;
- const branch = isUnresolved(buildInfo.branch)
- ? (metadata.branch ?? unknownRevision)
- : buildInfo.branch;
- const prNumber = buildInfo.prNumber ?? metadata.prNumber;
+ const commit = buildInfo.commit ?? metadata.commit;
+ const branch = buildInfo.branch ?? metadata.branch;
+ // A host that explicitly reports production for the process running right now overrides
+ // whatever pull-request number was baked in at build time: an image built for review app #42
+ // and later promoted to production is not still preview #42.
+ const prNumber =
+ metadata.context === 'production' ? null : (buildInfo.prNumber ?? metadata.prNumber);
const env = runtimeEnvType(
buildInfo,
environment,
- { ...metadata, branch: isUnresolved(branch) ? null : branch, prNumber },
+ { ...metadata, branch, prNumber },
options.defaultBranch,
);
return {
...buildInfo,
commit,
- // Re-derived rather than carried over: a build that resolved neither field publishes both
- // sentinels, and the run-time commit is what the short form has to abbreviate.
- shortCommit: isUnresolved(buildInfo.shortCommit)
- ? shortenCommit(commit)
- : buildInfo.shortCommit,
branch,
env,
prNumber,
@@ -87,7 +77,7 @@ function runtimeEnvType(
environment: EnvironmentRecord,
metadata: DeploymentMetadata,
defaultBranch: string | undefined,
-): BuildInfo['env'] {
+): EnvType {
const override = envTypeOverrideFromEnvironment(environment);
if (override) return override;
if (buildInfo.env === 'dev') return 'dev';
diff --git a/packages/build-env/src/environment.test.ts b/packages/build-env/src/environment.test.ts
index 8c2f3c1..ed71039 100644
--- a/packages/build-env/src/environment.test.ts
+++ b/packages/build-env/src/environment.test.ts
@@ -66,6 +66,24 @@ describe('deploymentMetadataFromEnvironment', () => {
});
});
+ it('classifies a Cloudflare Pages deploy on the caller-configured default branch as production', () => {
+ expect(
+ deploymentMetadataFromEnvironment(
+ { CF_PAGES: '1', CF_PAGES_BRANCH: 'trunk', CF_PAGES_COMMIT_SHA: 'fedcba0987654321' },
+ 'trunk',
+ ),
+ ).toMatchObject({ context: 'production' });
+
+ // The module default (`main`) must not leak in once a caller configures a different one: the
+ // real production branch would otherwise still read as a preview.
+ expect(
+ deploymentMetadataFromEnvironment(
+ { CF_PAGES: '1', CF_PAGES_BRANCH: 'main', CF_PAGES_COMMIT_SHA: 'fedcba0987654321' },
+ 'trunk',
+ ),
+ ).toMatchObject({ context: 'preview' });
+ });
+
it('recovers the pull-request number a GitHub Actions run only carries in its ref', () => {
expect(
deploymentMetadataFromEnvironment({
@@ -77,6 +95,29 @@ describe('deploymentMetadataFromEnvironment', () => {
).toMatchObject({ provider: 'github-actions', prNumber: '17', commit: '0f0f0f0f0f0f0f0f' });
});
+ it('prefers GITHUB_HEAD_REF over GITHUB_REF_NAME, since the latter is "
/merge" on a pull_request event', () => {
+ expect(
+ deploymentMetadataFromEnvironment({
+ GITHUB_ACTIONS: 'true',
+ GITHUB_REF: 'refs/pull/17/merge',
+ GITHUB_REF_NAME: '17/merge',
+ GITHUB_HEAD_REF: 'feat/env',
+ GITHUB_SHA: '0f0f0f0f0f0f0f0f',
+ }),
+ ).toMatchObject({ branch: 'feat/env' });
+ });
+
+ it('falls back to GITHUB_REF_NAME on a push, where GITHUB_HEAD_REF is unset', () => {
+ expect(
+ deploymentMetadataFromEnvironment({
+ GITHUB_ACTIONS: 'true',
+ GITHUB_REF: 'refs/heads/main',
+ GITHUB_REF_NAME: 'main',
+ GITHUB_SHA: '0f0f0f0f0f0f0f0f',
+ }),
+ ).toMatchObject({ branch: 'main' });
+ });
+
it('lets an explicit self-hosted deployment override a provider that would be auto-detected', () => {
expect(
deploymentMetadataFromEnvironment({
@@ -87,6 +128,14 @@ describe('deploymentMetadataFromEnvironment', () => {
).toMatchObject({ provider: 'self-hosted', commit: 'from-operator' });
});
+ it('detects the self-hosted provider from the production URL alone, so it is not silently discarded', () => {
+ expect(
+ deploymentMetadataFromEnvironment({
+ AGENT_ZERO_BUILD_PRODUCTION_URL: 'agent-zero.example.com',
+ }),
+ ).toMatchObject({ provider: 'self-hosted', productionUrl: 'https://agent-zero.example.com' });
+ });
+
it('treats a variable that is set but blank as absent, so it never wins precedence', () => {
expect(deploymentMetadataFromEnvironment({ AGENT_ZERO_BUILD_COMMIT: ' ' })).toMatchObject({
provider: 'none',
diff --git a/packages/build-env/src/environment.ts b/packages/build-env/src/environment.ts
index 11fe5e5..d01a4c0 100644
--- a/packages/build-env/src/environment.ts
+++ b/packages/build-env/src/environment.ts
@@ -29,8 +29,8 @@ export interface DeploymentMetadata {
*/
const pullRequestRefPattern = /^refs\/pull\/(\d+)\//;
-/** The branch a deploy has to be on to count as `canary` rather than `preview`. */
-export const defaultBranchName = 'main';
+/** The branch a deploy has to be on to count as `canary` rather than `preview`, absent an override. */
+const defaultBranchName = 'main';
/** Reads a variable, treating one that is set but blank as absent. */
function read(environment: EnvironmentRecord, name: string): string | null {
@@ -53,15 +53,14 @@ function readFirst(environment: EnvironmentRecord, ...names: readonly string[]):
* `URL`, so every reader normalises through here rather than each one remembering which is which.
*
* `ufo`'s `withHttps` rather than a scheme regex of our own: it is already in the tree (Nuxt, h3,
- * vue-router all depend on it) and it leaves a protocol-relative `//host` alone, which a
+ * and vue-router all depend on it), and it leaves a protocol-relative `//host` alone, which a bare
* `/^https?:\/\//` test would not — that value would get a second scheme prefixed onto it.
*/
function toUrl(value: string | null): string | null {
- if (!value) return null;
- return withHttps(value);
+ return value ? withHttps(value) : null;
}
-/** What a provider needs to know from the caller to classify its own deploy. */
+/** What a provider needs from the caller to classify its own deploy. */
interface ProviderOptions {
/** The branch this project treats as production; `main` unless the caller says otherwise. */
readonly defaultBranch: string;
@@ -99,6 +98,7 @@ const deploymentProviders: readonly DeploymentProvider[] = [
'AGENT_ZERO_BUILD_BRANCH',
'AGENT_ZERO_BUILD_URL',
'AGENT_ZERO_BUILD_PR_NUMBER',
+ 'AGENT_ZERO_BUILD_PRODUCTION_URL',
),
),
read: (environment) => ({
@@ -148,16 +148,19 @@ const deploymentProviders: readonly DeploymentProvider[] = [
// @see https://developers.cloudflare.com/pages/configuration/build-configuration/
name: 'cloudflare-pages',
detects: (environment) => Boolean(read(environment, 'CF_PAGES')),
- read: (environment) => ({
+ read: (environment, options) => ({
branch: read(environment, 'CF_PAGES_BRANCH'),
commit: read(environment, 'CF_PAGES_COMMIT_SHA'),
// Cloudflare Pages exposes no pull-request number; a PR deploy is recognised by its branch
- // not being the default one, which the context below already covers.
+ // not being the production one, which the context below already covers.
prNumber: null,
deployUrl: toUrl(read(environment, 'CF_PAGES_URL')),
productionUrl: null,
+ // The caller's configured production branch, not the module default: a project whose
+ // production branch is not `main` must still be classified `production` here, or every
+ // deploy of it — including the real production one — reads as a preview.
context:
- read(environment, 'CF_PAGES_BRANCH') === defaultBranchName ? 'production' : 'preview',
+ read(environment, 'CF_PAGES_BRANCH') === options.defaultBranch ? 'production' : 'preview',
}),
},
{
@@ -167,7 +170,10 @@ const deploymentProviders: readonly DeploymentProvider[] = [
name: 'github-actions',
detects: (environment) => read(environment, 'GITHUB_ACTIONS') === 'true',
read: (environment) => ({
- branch: read(environment, 'GITHUB_REF_NAME'),
+ // `GITHUB_REF_NAME` is `/merge` on a `pull_request` event, not a branch name;
+ // `GITHUB_HEAD_REF` names the actual source branch and is only set for that event, so it is
+ // preferred when present and the ref-name form is used for every other trigger.
+ branch: readFirst(environment, 'GITHUB_HEAD_REF', 'GITHUB_REF_NAME'),
commit: read(environment, 'GITHUB_SHA'),
// `refs/pull//merge` is the only place a workflow triggered by `pull_request` carries
// the number without reading the event payload off disk.
@@ -199,10 +205,11 @@ const noMetadata: DeploymentMetadata = {
*/
export function deploymentMetadataFromEnvironment(
environment: EnvironmentRecord,
+ defaultBranch: string = defaultBranchName,
): DeploymentMetadata {
const provider = deploymentProviders.find((candidate) => candidate.detects(environment));
if (!provider) return noMetadata;
- return { provider: provider.name, ...provider.read(environment) };
+ return { provider: provider.name, ...provider.read(environment, { defaultBranch }) };
}
/**
diff --git a/packages/build-env/src/index.ts b/packages/build-env/src/index.ts
index 7c864c7..ee5bd5c 100644
--- a/packages/build-env/src/index.ts
+++ b/packages/build-env/src/index.ts
@@ -8,11 +8,10 @@
export { runtimeBuildInfo, shortenCommit } from './build-info.js';
export {
type DeploymentMetadata,
- defaultBranchName,
deploymentMetadataFromEnvironment,
envTypeFromMetadata,
envTypeOverrideFromEnvironment,
previewUrlFromMetadata,
productionUrlFromMetadata,
} from './environment.js';
-export { type BuildInfo, type EnvironmentRecord, type EnvType, unknownRevision } from './types.js';
+export type { BuildInfo, EnvironmentRecord, EnvType } from './types.js';
diff --git a/packages/build-env/src/nuxt.ts b/packages/build-env/src/nuxt.ts
index f6bcdec..732c5df 100644
--- a/packages/build-env/src/nuxt.ts
+++ b/packages/build-env/src/nuxt.ts
@@ -28,7 +28,6 @@ export interface BuildEnvModuleOptions {
const testBuildInfo: BuildInfo = {
version: '0.0.0',
commit: '0000000000000000000000000000000000000000',
- shortCommit: '0000000',
branch: 'test',
env: 'dev',
time: 0,
@@ -40,12 +39,16 @@ const testBuildInfo: BuildInfo = {
/**
* Publishes what this build is, under `runtimeConfig.public.buildInfo`.
*
- * `runtimeConfig.public` rather than `appConfig`, which is the opposite of the choice the dashboard
- * makes for its auth policy — and for the opposite reason. Auth policy must not be overridable at
- * run time, because a public runtime key would let a deployment advertise a sign-in method its
- * server rejects. Build metadata is the one thing a non-Vercel build *cannot* discover about
- * itself, so it has to stay overridable: the same `NUXT_PUBLIC_BUILD_INFO_*` channel that would be
- * a hazard for policy is the delivery mechanism here, alongside the server-side pass below.
+ * `runtimeConfig.public` rather than `appConfig`: the npmx.dev and wolfstar.rocks modules this
+ * package's shape is modelled on both use `appConfig` for the same data, but only because every
+ * build of theirs runs on a host (Vercel, Netlify) that already has full git metadata *at build
+ * time* — appConfig is a pure build-time constant, identical in the client and server bundles,
+ * with no channel to change after the fact. Agent Zero also ships a self-hosted bundle and can run
+ * behind hosts that only expose that metadata once the *server* starts, so this needs a value that
+ * can still be completed after the build without the client and server ending up with two
+ * different answers — which is what `runtimeConfig.public` plus the `useState`-backed composable
+ * below gives: the server-completed answer is serialised into the SSR payload the client hydrates
+ * from, rather than the client silently reverting to the build's uncompleted one.
*/
export default defineNuxtModule({
meta: {
@@ -67,15 +70,11 @@ export default defineNuxtModule({
: { defaultBranch: options.defaultBranch }),
});
- // Every key is declared, including the ones that resolved to a sentinel: Nuxt only applies a
+ // Every key is declared, including the ones that resolved to `null`: Nuxt only applies a
// `NUXT_PUBLIC_*` override to a key the build declared, so an omitted field could not be
// supplied by the deployment that needs to supply it.
nuxt.options.runtimeConfig.public.buildInfo = buildInfo;
- // The composable, not a Nitro plugin: Nitro deep-freezes its runtime config before the first
- // request, so nothing may write the completed metadata back into it. Resolving inside
- // `useState` instead keeps the answer server-side, serialises it into the SSR payload, and
- // leaves the client hydrating the same values the server rendered.
const composable = addTemplate({
filename: 'agent-zero-build-env.mjs',
write: true,
@@ -93,27 +92,31 @@ export default defineNuxtModule({
* client bundle never carries the fallback, or the `process.env` read behind it.
*/
function buildInfoComposable(options: BuildEnvModuleOptions): string {
- const resolveOptions =
- options.defaultBranch === undefined
- ? '{}'
- : JSON.stringify({ defaultBranch: options.defaultBranch });
- // Both branches go through `runtimeBuildInfo`, and the client's is handed an empty environment
- // rather than skipped: Nuxt rewrites the `null` fields of `runtimeConfig` to empty strings, and
- // that pass is also what normalises them back, so a client-only render reports the same shape a
- // server-rendered one does.
- const resolve = options.runtimeFallback
- ? `import.meta.server ? runtimeBuildInfo(buildInfo, process.env, ${resolveOptions}) : runtimeBuildInfo(buildInfo, {}, ${resolveOptions})`
- : `runtimeBuildInfo(buildInfo, {}, ${resolveOptions})`;
+ const resolveOptions = JSON.stringify(
+ options.defaultBranch === undefined ? {} : { defaultBranch: options.defaultBranch },
+ );
- return `${options.runtimeFallback ? "import process from 'node:process';\n\n" : ''}import { runtimeBuildInfo } from '@agent-zero/build-env';
+ return `import process from 'node:process';
+
+import { runtimeBuildInfo } from '@agent-zero/build-env';
import { useRuntimeConfig, useState } from '#imports';
+const runtimeFallback = ${JSON.stringify(Boolean(options.runtimeFallback))};
+const resolveOptions = ${resolveOptions};
+
+// Memoised across requests within one server process, rather than recomputed per request or per
+// prerendered route: the answer is a pure function of \`process.env\`, which does not change while
+// the process runs.
+let serverResolved;
+
export function useBuildInfo() {
- // Keyed state rather than a plain call: the value is resolved once on the server and travels to
- // the browser in the payload, so a component that renders it cannot hydrate to a different one.
+ // Keyed state rather than a plain call: the server-completed value is serialised into the SSR
+ // payload, so the client hydrates the same answer instead of falling back to the build's own.
return useState('agent-zero:build-info', () => {
const buildInfo = useRuntimeConfig().public.buildInfo;
- return ${resolve};
+ if (!import.meta.server || !runtimeFallback) return buildInfo;
+ serverResolved ??= runtimeBuildInfo(buildInfo, process.env, resolveOptions);
+ return serverResolved;
}).value;
}
`;
diff --git a/packages/build-env/src/resolve.test.ts b/packages/build-env/src/resolve.test.ts
index 1606114..194a027 100644
--- a/packages/build-env/src/resolve.test.ts
+++ b/packages/build-env/src/resolve.test.ts
@@ -5,7 +5,6 @@ import { join } from 'node:path';
import { beforeAll, describe, expect, it } from 'vitest';
import { packageVersion, resolveBuildInfo } from './resolve.js';
-import { unknownRevision } from './types.js';
/** A directory that is not a checkout, so nothing here can read the repository it runs in. */
let rootDirectory: string;
diff --git a/packages/build-env/src/resolve.ts b/packages/build-env/src/resolve.ts
index d97ac80..75f1195 100644
--- a/packages/build-env/src/resolve.ts
+++ b/packages/build-env/src/resolve.ts
@@ -1,7 +1,5 @@
-import { readFile } from 'node:fs/promises';
-import { join } from 'node:path';
+import { readPackageJSON } from 'pkg-types';
-import { shortenCommit } from './build-info.js';
import {
deploymentMetadataFromEnvironment,
envTypeFromMetadata,
@@ -10,7 +8,7 @@ import {
productionUrlFromMetadata,
} from './environment.js';
import { type GitMetadata, gitMetadata } from './git.js';
-import { type BuildInfo, type EnvironmentRecord, unknownRevision } from './types.js';
+import type { BuildInfo, EnvironmentRecord } from './types.js';
export interface ResolveBuildInfoOptions {
/** Where the build is running: the checkout git is read from, and the `package.json` version. */
@@ -38,12 +36,12 @@ export interface ResolveBuildInfoOptions {
* provider knows the branch a detached CI checkout cannot name, and knows whether the deploy is
* production. git is only consulted for what is still missing, which on Vercel is nothing.
*
- * Whatever is still unresolved is published as a sentinel rather than guessed at, so the run-time
- * pass (`runtimeBuildInfo`) can tell a field the build genuinely resolved from one it did not.
+ * Whatever is still unresolved stays `null` rather than being guessed at, so the run-time pass
+ * (`runtimeBuildInfo`) can tell a field the build genuinely resolved from one it did not.
*/
export async function resolveBuildInfo(options: ResolveBuildInfoOptions): Promise {
const environment = options.environment ?? process.env;
- const metadata = deploymentMetadataFromEnvironment(environment);
+ const metadata = deploymentMetadataFromEnvironment(environment, options.defaultBranch);
const readGit = options.readGitMetadata ?? gitMetadata;
const needsGit = metadata.branch === null || metadata.commit === null;
@@ -52,8 +50,8 @@ export async function resolveBuildInfo(options: ResolveBuildInfoOptions): Promis
packageVersion(options.rootDirectory),
]);
- const branch = metadata.branch ?? git.branch ?? unknownRevision;
- const commit = metadata.commit ?? git.commit ?? unknownRevision;
+ const branch = metadata.branch ?? git.branch;
+ const commit = metadata.commit ?? git.commit;
const env =
envTypeOverrideFromEnvironment(environment) ??
envTypeFromMetadata(metadata, {
@@ -64,7 +62,6 @@ export async function resolveBuildInfo(options: ResolveBuildInfoOptions): Promis
return {
version,
commit,
- shortCommit: shortenCommit(commit),
branch,
env,
time: options.now ?? Date.now(),
@@ -82,14 +79,8 @@ export async function resolveBuildInfo(options: ResolveBuildInfoOptions): Promis
*/
export async function packageVersion(rootDirectory: string): Promise {
try {
- const manifest: unknown = JSON.parse(
- await readFile(join(rootDirectory, 'package.json'), 'utf8'),
- );
- const version =
- typeof manifest === 'object' && manifest !== null && 'version' in manifest
- ? manifest.version
- : undefined;
- return typeof version === 'string' && version ? version : '0.0.0';
+ const manifest = await readPackageJSON(rootDirectory);
+ return typeof manifest.version === 'string' && manifest.version ? manifest.version : '0.0.0';
} catch {
return '0.0.0';
}
From 042200d6f47bd688d03b947c94d094c311ab47f7 Mon Sep 17 00:00:00 2001
From: RedStar
Date: Sat, 22 Aug 2026 15:00:20 +0200
Subject: [PATCH 07/10] refactor(build-env): add ufo and pkg-types dependencies
---
pnpm-lock.yaml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e123bb0..69865de 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -482,6 +482,13 @@ importers:
version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@8.2.1(@types/node@24.13.3)(@vitejs/devtools@0.4.12)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.50.0)(tsx@4.23.12)(yaml@2.9.0))
packages/build-env:
+ dependencies:
+ pkg-types:
+ specifier: ^2.3.1
+ version: 2.3.1
+ ufo:
+ specifier: ^1.6.4
+ version: 1.6.4
devDependencies:
'@nuxt/kit':
specifier: ^4.5.2
From cc04b487625b9856c43bc47bae4f62b8b1906eae Mon Sep 17 00:00:00 2001
From: RedStar
Date: Sat, 22 Aug 2026 15:36:48 +0200
Subject: [PATCH 08/10] refactor(build-env): normalize buildInfo and clear
stale deployment URLs
- Add normalizeBuildInfo to convert Nuxt's empty string serialization back to null
- Clear stale preview/production URLs when environment classification changes
- Preserve explicit URL schemes instead of always upgrading to https
- Update Turbo cache inputs to include git refs for proper build cache busting
- Remove shortCommit field references; derive via shortenCommit() on-demand
---
apps/dashboard/test/nuxt/build-env.spec.ts | 1 -
.../nuxt/components/BuildEnvironment.spec.ts | 5 +-
.../1.guide/4.environment-variables.md | 6 +-
packages/build-env/src/build-info.test.ts | 78 ++++++++++++++++++-
packages/build-env/src/build-info.ts | 40 ++++++++--
packages/build-env/src/environment.test.ts | 6 ++
packages/build-env/src/environment.ts | 12 +--
packages/build-env/src/index.ts | 2 +-
packages/build-env/src/nuxt.ts | 9 ++-
packages/build-env/src/resolve.test.ts | 6 +-
packages/build-env/src/resolve.ts | 3 +-
turbo.jsonc | 28 ++++++-
12 files changed, 167 insertions(+), 29 deletions(-)
diff --git a/apps/dashboard/test/nuxt/build-env.spec.ts b/apps/dashboard/test/nuxt/build-env.spec.ts
index 538e829..852f7cb 100644
--- a/apps/dashboard/test/nuxt/build-env.spec.ts
+++ b/apps/dashboard/test/nuxt/build-env.spec.ts
@@ -15,7 +15,6 @@ describe('useBuildInfo', () => {
expect(useBuildInfo()).toStrictEqual({
version: '0.0.0',
commit: '0000000000000000000000000000000000000000',
- shortCommit: '0000000',
branch: 'test',
env: 'dev',
time: 0,
diff --git a/apps/dashboard/test/nuxt/components/BuildEnvironment.spec.ts b/apps/dashboard/test/nuxt/components/BuildEnvironment.spec.ts
index f990284..b89e4d8 100644
--- a/apps/dashboard/test/nuxt/components/BuildEnvironment.spec.ts
+++ b/apps/dashboard/test/nuxt/components/BuildEnvironment.spec.ts
@@ -29,7 +29,7 @@ describe('BuildEnvironment', () => {
const commit = wrapper.get('a[href*="/commit/"]');
expect(commit.attributes('target')).toBe('_blank');
- expect(commit.attributes('rel')).toContain('noopener');
+ expect(commit.attributes('rel')).toContain('noreferrer');
expect(commit.attributes('aria-label')).toContain('0000000');
});
});
@@ -39,7 +39,6 @@ describe('BuildEnvironment on a release', () => {
const release = {
version: '1.2.3',
commit: '1234567890abcdef1234567890abcdef12345678',
- shortCommit: '1234567',
branch: 'main',
env: 'release',
time: 0,
@@ -60,7 +59,7 @@ describe('BuildEnvironment on a release', () => {
it('hides the commit link for a build that resolved no commit', async () => {
const wrapper = await mountSuspended(BuildEnvironment, {
- props: { buildInfo: { ...release, commit: 'unknown', shortCommit: 'unknown' } },
+ props: { buildInfo: { ...release, commit: null } },
});
expect(wrapper.find('a[href*="/commit/"]').exists()).toBe(false);
diff --git a/apps/docs/content/1.guide/4.environment-variables.md b/apps/docs/content/1.guide/4.environment-variables.md
index c951eb6..6d688b0 100644
--- a/apps/docs/content/1.guide/4.environment-variables.md
+++ b/apps/docs/content/1.guide/4.environment-variables.md
@@ -193,8 +193,10 @@ on its own: a self-hosted staging deployment is a `preview` in every way that ma
looking at it, and nothing about a plain `node .output/server/index.mjs` says so.
Individual fields can also be overridden through Nuxt's own public runtime config channel —
-`NUXT_PUBLIC_BUILD_INFO_COMMIT`, `NUXT_PUBLIC_BUILD_INFO_SHORT_COMMIT`, and so on — which applies
-before the server's own pass and needs no rebuild.
+`NUXT_PUBLIC_BUILD_INFO_COMMIT`, `NUXT_PUBLIC_BUILD_INFO_BRANCH`, and so on — which applies before
+the server's own pass and needs no rebuild. There is no `_SHORT_COMMIT` variant: the dashboard
+derives the abbreviated form from `commit` wherever it is displayed, rather than declaring it as
+its own field that could drift from the commit it abbreviates.
A prerendered route has no server left to ask, so on `apps/marketing` the second pass runs while
the page is prerendered rather than while it is served. On Vercel that changes nothing: the build
diff --git a/packages/build-env/src/build-info.test.ts b/packages/build-env/src/build-info.test.ts
index d72bc8e..08f93a0 100644
--- a/packages/build-env/src/build-info.test.ts
+++ b/packages/build-env/src/build-info.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
-import { runtimeBuildInfo, shortenCommit } from './build-info.js';
+import { normalizeBuildInfo, runtimeBuildInfo, shortenCommit } from './build-info.js';
import type { BuildInfo } from './types.js';
/** What a build that resolved nothing publishes: every revision field is `null`. */
@@ -123,4 +123,80 @@ describe('runtimeBuildInfo', () => {
it('keeps a build-time pull-request number when the host reports no production context', () => {
expect(runtimeBuildInfo({ ...resolvedBuild, prNumber: '42' }, {}).prNumber).toBe('42');
});
+
+ it('treats the empty strings Nuxt serialises null runtime-config values as, as unresolved', () => {
+ // A build published through `runtimeConfig.public` sees its own `null` fields arrive as `''`,
+ // not `null`, so the run-time pass must normalize them back before completing anything.
+ expect(
+ runtimeBuildInfo(
+ {
+ ...resolvedBuild,
+ commit: '',
+ branch: '',
+ prNumber: '',
+ previewUrl: '',
+ productionUrl: '',
+ },
+ {
+ AGENT_ZERO_BUILD_COMMIT: 'fedcba0987654321',
+ AGENT_ZERO_BUILD_BRANCH: 'feat/env',
+ AGENT_ZERO_BUILD_PR_NUMBER: '7',
+ AGENT_ZERO_BUILD_ENV: 'preview',
+ AGENT_ZERO_BUILD_URL: 'preview.example.com',
+ },
+ ),
+ ).toMatchObject({
+ commit: 'fedcba0987654321',
+ branch: 'feat/env',
+ prNumber: '7',
+ previewUrl: 'https://preview.example.com',
+ });
+ });
+
+ it('clears a stale preview URL once the host reclassifies the deploy as release', () => {
+ expect(
+ runtimeBuildInfo(
+ { ...resolvedBuild, env: 'preview', previewUrl: 'https://old-preview.example.com' },
+ { AGENT_ZERO_BUILD_ENV: 'release' },
+ ),
+ ).toMatchObject({ env: 'release', previewUrl: null });
+ });
+
+ it('clears a stale production URL once the host reclassifies the deploy as preview', () => {
+ expect(
+ runtimeBuildInfo(
+ {
+ ...resolvedBuild,
+ env: 'release',
+ productionUrl: 'https://agent-zero.example.com',
+ },
+ { AGENT_ZERO_BUILD_ENV: 'preview' },
+ ),
+ ).toMatchObject({ env: 'preview', productionUrl: null });
+ });
+});
+
+describe('normalizeBuildInfo', () => {
+ it('turns every blank nullable field back into null', () => {
+ expect(
+ normalizeBuildInfo({
+ ...resolvedBuild,
+ commit: '',
+ branch: '',
+ prNumber: '',
+ previewUrl: '',
+ productionUrl: '',
+ }),
+ ).toMatchObject({
+ commit: null,
+ branch: null,
+ prNumber: null,
+ previewUrl: null,
+ productionUrl: null,
+ });
+ });
+
+ it('leaves a resolved build untouched', () => {
+ expect(normalizeBuildInfo(resolvedBuild)).toStrictEqual(resolvedBuild);
+ });
});
diff --git a/packages/build-env/src/build-info.ts b/packages/build-env/src/build-info.ts
index 661129a..7926376 100644
--- a/packages/build-env/src/build-info.ts
+++ b/packages/build-env/src/build-info.ts
@@ -16,6 +16,25 @@ export function shortenCommit(commit: string | null): string | null {
return commit === null ? null : commit.slice(0, shortCommitLength);
}
+/**
+ * Turns a blank string back into `null`.
+ *
+ * Nuxt serialises a `null` default in `runtimeConfig.public` as `''`, so every key stays
+ * overridable through its own `NUXT_PUBLIC_*` variable — but that means an unresolved field
+ * arrives here as an empty string, not the `null` the build published. Without this, `??` would
+ * treat that empty string as already resolved and never complete it.
+ */
+export function normalizeBuildInfo(buildInfo: BuildInfo): BuildInfo {
+ return {
+ ...buildInfo,
+ commit: buildInfo.commit || null,
+ branch: buildInfo.branch || null,
+ prNumber: buildInfo.prNumber || null,
+ previewUrl: buildInfo.previewUrl || null,
+ productionUrl: buildInfo.productionUrl || null,
+ };
+}
+
/**
* Completes build metadata from the environment the bundle is *running* in.
*
@@ -35,31 +54,38 @@ export function runtimeBuildInfo(
environment: EnvironmentRecord,
options: { readonly defaultBranch?: string } = {},
): BuildInfo {
+ const normalized = normalizeBuildInfo(buildInfo);
const metadata = deploymentMetadataFromEnvironment(environment, options.defaultBranch);
- const commit = buildInfo.commit ?? metadata.commit;
- const branch = buildInfo.branch ?? metadata.branch;
+ const commit = normalized.commit ?? metadata.commit;
+ const branch = normalized.branch ?? metadata.branch;
// A host that explicitly reports production for the process running right now overrides
// whatever pull-request number was baked in at build time: an image built for review app #42
// and later promoted to production is not still preview #42.
const prNumber =
- metadata.context === 'production' ? null : (buildInfo.prNumber ?? metadata.prNumber);
+ metadata.context === 'production' ? null : (normalized.prNumber ?? metadata.prNumber);
const env = runtimeEnvType(
- buildInfo,
+ normalized,
environment,
{ ...metadata, branch, prNumber },
options.defaultBranch,
);
+ const previewUrl = normalized.previewUrl ?? previewUrlFromMetadata(metadata, env);
+ const productionUrl = normalized.productionUrl ?? productionUrlFromMetadata(metadata, env);
return {
- ...buildInfo,
+ ...normalized,
commit,
branch,
env,
prNumber,
- previewUrl: buildInfo.previewUrl ?? previewUrlFromMetadata(metadata, env),
- productionUrl: buildInfo.productionUrl ?? productionUrlFromMetadata(metadata, env),
+ // Gated by the *final* env rather than merely filled in when missing: a build classified
+ // `preview` and later reclassified `release` at runtime must stop serving its stale preview
+ // URL, and a build classified `release` and later demoted to `preview` must stop serving its
+ // stale production one — either survives an ordinary "fill if absent" merge.
+ previewUrl: env === 'release' ? null : previewUrl,
+ productionUrl: env === 'release' ? productionUrl : null,
};
}
diff --git a/packages/build-env/src/environment.test.ts b/packages/build-env/src/environment.test.ts
index ed71039..79090ad 100644
--- a/packages/build-env/src/environment.test.ts
+++ b/packages/build-env/src/environment.test.ts
@@ -136,6 +136,12 @@ describe('deploymentMetadataFromEnvironment', () => {
).toMatchObject({ provider: 'self-hosted', productionUrl: 'https://agent-zero.example.com' });
});
+ it('preserves an explicit http scheme rather than upgrading a deliberately TLS-less deploy', () => {
+ expect(
+ deploymentMetadataFromEnvironment({ AGENT_ZERO_BUILD_URL: 'http://internal.example.com' }),
+ ).toMatchObject({ deployUrl: 'http://internal.example.com' });
+ });
+
it('treats a variable that is set but blank as absent, so it never wins precedence', () => {
expect(deploymentMetadataFromEnvironment({ AGENT_ZERO_BUILD_COMMIT: ' ' })).toMatchObject({
provider: 'none',
diff --git a/packages/build-env/src/environment.ts b/packages/build-env/src/environment.ts
index d01a4c0..faf2124 100644
--- a/packages/build-env/src/environment.ts
+++ b/packages/build-env/src/environment.ts
@@ -1,4 +1,4 @@
-import { withHttps } from 'ufo';
+import { hasProtocol, withHttps } from 'ufo';
import type { EnvironmentRecord, EnvType } from './types.js';
@@ -52,12 +52,14 @@ function readFirst(environment: EnvironmentRecord, ...names: readonly string[]):
* Vercel's `VERCEL_URL` and `VERCEL_PROJECT_PRODUCTION_URL` omit the scheme, unlike Netlify's
* `URL`, so every reader normalises through here rather than each one remembering which is which.
*
- * `ufo`'s `withHttps` rather than a scheme regex of our own: it is already in the tree (Nuxt, h3,
- * and vue-router all depend on it), and it leaves a protocol-relative `//host` alone, which a bare
- * `/^https?:\/\//` test would not — that value would get a second scheme prefixed onto it.
+ * An existing scheme is kept exactly as given — including a deliberate `http://` on
+ * `AGENT_ZERO_BUILD_URL` for an internal, TLS-less self-hosted deploy — and only a value with none
+ * gets `https://` added, via `ufo`'s `withHttps` rather than a scheme regex of our own (it is
+ * already in the tree: Nuxt, h3, and vue-router all depend on it).
*/
function toUrl(value: string | null): string | null {
- return value ? withHttps(value) : null;
+ if (!value) return null;
+ return hasProtocol(value) ? value : withHttps(value);
}
/** What a provider needs from the caller to classify its own deploy. */
diff --git a/packages/build-env/src/index.ts b/packages/build-env/src/index.ts
index ee5bd5c..b4d73ff 100644
--- a/packages/build-env/src/index.ts
+++ b/packages/build-env/src/index.ts
@@ -5,7 +5,7 @@
* reads an environment record and nothing else — no filesystem, no subprocess, no `@nuxt/kit`. The
* build-time half, which reads the checkout and the app manifest, lives behind `./nuxt`.
*/
-export { runtimeBuildInfo, shortenCommit } from './build-info.js';
+export { normalizeBuildInfo, runtimeBuildInfo, shortenCommit } from './build-info.js';
export {
type DeploymentMetadata,
deploymentMetadataFromEnvironment,
diff --git a/packages/build-env/src/nuxt.ts b/packages/build-env/src/nuxt.ts
index 732c5df..00d255d 100644
--- a/packages/build-env/src/nuxt.ts
+++ b/packages/build-env/src/nuxt.ts
@@ -98,7 +98,7 @@ function buildInfoComposable(options: BuildEnvModuleOptions): string {
return `import process from 'node:process';
-import { runtimeBuildInfo } from '@agent-zero/build-env';
+import { normalizeBuildInfo, runtimeBuildInfo } from '@agent-zero/build-env';
import { useRuntimeConfig, useState } from '#imports';
const runtimeFallback = ${JSON.stringify(Boolean(options.runtimeFallback))};
@@ -114,7 +114,12 @@ export function useBuildInfo() {
// payload, so the client hydrates the same answer instead of falling back to the build's own.
return useState('agent-zero:build-info', () => {
const buildInfo = useRuntimeConfig().public.buildInfo;
- if (!import.meta.server || !runtimeFallback) return buildInfo;
+ if (!import.meta.server || !runtimeFallback) {
+ // Nuxt still serialises this build's own \`null\` fields as \`''\` even when nothing here
+ // completes them further, so every consumer sees the same two states \`BuildInfo\` declares
+ // (resolved or \`null\`) rather than a third, empty-string one.
+ return normalizeBuildInfo(buildInfo);
+ }
serverResolved ??= runtimeBuildInfo(buildInfo, process.env, resolveOptions);
return serverResolved;
}).value;
diff --git a/packages/build-env/src/resolve.test.ts b/packages/build-env/src/resolve.test.ts
index 194a027..026df05 100644
--- a/packages/build-env/src/resolve.test.ts
+++ b/packages/build-env/src/resolve.test.ts
@@ -42,7 +42,6 @@ describe('resolveBuildInfo', () => {
).resolves.toStrictEqual({
version: '1.2.3',
commit: '1234567890abcdef',
- shortCommit: '1234567',
branch: 'main',
env: 'release',
time: 1_700_000_000_000,
@@ -52,7 +51,7 @@ describe('resolveBuildInfo', () => {
});
});
- it('publishes sentinels for what it could not resolve, rather than guessing', async () => {
+ it('leaves what it could not resolve as null, rather than guessing', async () => {
await expect(
resolveBuildInfo({
rootDirectory,
@@ -64,8 +63,7 @@ describe('resolveBuildInfo', () => {
}),
).resolves.toMatchObject({
branch: 'main',
- commit: unknownRevision,
- shortCommit: unknownRevision,
+ commit: null,
env: 'release',
});
});
diff --git a/packages/build-env/src/resolve.ts b/packages/build-env/src/resolve.ts
index 75f1195..0279939 100644
--- a/packages/build-env/src/resolve.ts
+++ b/packages/build-env/src/resolve.ts
@@ -1,4 +1,5 @@
-import { readPackageJSON } from 'pkg-types';
+import { readFile } from 'node:fs/promises';
+import { join } from 'node:path';
import {
deploymentMetadataFromEnvironment,
diff --git a/turbo.jsonc b/turbo.jsonc
index 91052e3..a926d80 100644
--- a/turbo.jsonc
+++ b/turbo.jsonc
@@ -55,10 +55,22 @@
"GITHUB_ACTIONS",
"GITHUB_REF",
"GITHUB_REF_NAME",
+ // Only set for a `pull_request` trigger, where `GITHUB_REF_NAME` is `/merge` rather
+ // than a branch; packages/build-env prefers this one when both are present.
+ "GITHUB_HEAD_REF",
"GITHUB_SHA",
"AGENT_ZERO_BUILD_*",
],
- "inputs": ["$TURBO_DEFAULT$", ".env*"],
+ // `.git/HEAD` and the ref it points at, so a build with no platform variables in scope —
+ // where packages/build-env falls back to reading the checkout directly — still busts the
+ // cache when the branch or commit changes; without them, switching branches onto an
+ // identical tree could restore a cached bundle that reports the previous revision.
+ "inputs": [
+ "$TURBO_DEFAULT$",
+ ".env*",
+ "$TURBO_ROOT$/.git/HEAD",
+ "$TURBO_ROOT$/.git/refs/heads/**",
+ ],
// `.vercel/output/**` is where the `vercel` preset writes instead of `.output/`; both are
// listed so a cache hit restores whichever bundle the resolved target produced.
"outputs": [".output/**", ".vercel/output/**"],
@@ -98,10 +110,22 @@
"GITHUB_ACTIONS",
"GITHUB_REF",
"GITHUB_REF_NAME",
+ // Only set for a `pull_request` trigger, where `GITHUB_REF_NAME` is `/merge` rather
+ // than a branch; packages/build-env prefers this one when both are present.
+ "GITHUB_HEAD_REF",
"GITHUB_SHA",
"AGENT_ZERO_BUILD_*",
],
- "inputs": ["$TURBO_DEFAULT$", ".env*"],
+ // `.git/HEAD` and the ref it points at, so a build with no platform variables in scope —
+ // where packages/build-env falls back to reading the checkout directly — still busts the
+ // cache when the branch or commit changes; without them, switching branches onto an
+ // identical tree could restore a cached bundle that reports the previous revision.
+ "inputs": [
+ "$TURBO_DEFAULT$",
+ ".env*",
+ "$TURBO_ROOT$/.git/HEAD",
+ "$TURBO_ROOT$/.git/refs/heads/**",
+ ],
"outputs": [".output/**", ".vercel/output/**"],
},
"@agent-zero/docs#build": {
From a07205c571fbd5393690860213c78b57a7ed32ee Mon Sep 17 00:00:00 2001
From: Claude
Date: Sat, 22 Aug 2026 16:31:24 +0000
Subject: [PATCH 09/10] fix(deps): point the drizzle adapters at an existing
drizzle-orm snapshot
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The dashboard's Vercel build failed in Nitro's `node-externals` pass with
`ENOENT: realpath` on
`node_modules/.aube/@better-auth+drizzle-adapter@1.6.26_.../node_modules/drizzle-orm`.
Both `@better-auth/drizzle-adapter` snapshots in `pnpm-lock.yaml` listed their
`drizzle-orm` peer as
drizzle-orm@0.45.2(...)(prisma@7.9.1)(sql.js@1.14.2)
while the only `drizzle-orm@0.45.2` snapshot the lockfile defines — and the one
already embedded in each adapter's own snapshot key — is
drizzle-orm@0.45.2(...)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
The referenced peer variant has no snapshot entry, so the installer linked the
adapter's `drizzle-orm` at a store path it never materialized. `packages/auth`
imports `drizzleAdapter`, so Nitro traces into it and the dangling link aborts
the build; `apps/marketing` never reaches better-auth, which is why only the
dashboard deploy failed while marketing stayed green on the same commits.
Both references now name the snapshot that exists, matching the peer id each
adapter's snapshot key already carries. After the change the set of unresolved
snapshot references in the lockfile is identical to `main`'s.
Verified with a frozen install followed by
`NITRO_PRESET=vercel turbo run build --filter=@agent-zero/dashboard`, which now
completes and writes `.vercel/output`.
Co-Authored-By: Claude
Claude-Session: https://claude.ai/code/session_01SjNmQ7vt3nXuoeyAbrF7Nj
---
pnpm-lock.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 331b045..3aa1a70 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18141,7 +18141,7 @@ snapshots:
'@better-auth/core': 1.6.26(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)
'@better-auth/utils': 0.4.2
optionalDependencies:
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
'@better-auth/drizzle-adapter@1.7.0-rc.5(@better-auth/core@1.7.0-rc.5(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2))':
dependencies:
@@ -25024,7 +25024,7 @@ snapshots:
optionalDependencies:
'@prisma/client': 5.22.0(prisma@7.9.1)
drizzle-kit: 0.31.10
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1)(sql.js@1.14.2)
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.3)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0(prisma@7.9.1(better-sqlite3@12.11.1)))(@types/pg@8.23.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(mysql2@3.15.3)(pg@8.23.0)(postgres@3.4.9)(prisma@7.9.1(better-sqlite3@12.11.1))(sql.js@1.14.2)
mongodb: 7.5.0(@mongodb-js/zstd@7.0.0)(socks@2.8.9)
mysql2: 3.15.3
pg: 8.23.0
From bd5b08765d499bd4f61b86da6790add823b0f4bd Mon Sep 17 00:00:00 2001
From: Claude
Date: Sat, 22 Aug 2026 17:43:58 +0000
Subject: [PATCH 10/10] fix(build-env): finish the pkg-types refactor and
unbreak the CI checks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Four CI jobs were red on this branch — lint, typecheck, unit tests and the
unused-code check — plus the dashboard's sidebar navigation. Three causes:
`packages/build-env/src/resolve.ts` was left half-refactored. `packageVersion`
called `readPackageJSON` without importing it (TS2304, and the two `node:`
imports it replaced went unused, which is what oxlint reported), so the body no
longer matched the imports at the top of the file.
Restoring the direct read is the fix rather than adding the missing import:
`readPackageJSON` ascends to the *nearest* manifest, so in this workspace an app
without its own `package.json` resolves to the repository root's and reports
that version as the app's — the drift between two version sources this package
exists to remove. `src/resolve.test.ts` already pinned that contract and has
been failing since the refactor landed. `pkg-types` has no other consumer, so it
goes with it.
`aube run knip` pre-builds only `@agent-zero/i18n` and `@agent-zero/auth`. This
branch adds `@agent-zero/build-env`, which both Nuxt apps' `vitest.config.ts`
import as `@agent-zero/build-env/nuxt`, so with its `dist/` absent knip could
not load either config: 30 test files looked unreferenced and `@nuxt/schema`
looked unused. Building it alongside the other two resolves both, which is why
no `ignoreDependencies` entry is needed.
`Sidebar.vue` lost `import { NuxtLink } from '#components'` when the
`package.json` version import beside it was replaced by ``.
The template still uses `NuxtLink` as a value in ``, so this was
a typecheck error and, unchecked, would have rendered every nav item with a
route as nothing.
Verified against a frozen install: typecheck, lint, test (26/26) and build all
pass, `oxfmt --check` is clean over 482 files, and knip exits 0 with only the 13
configuration hints `main` already carries. `@agent-zero/i18n` is excluded
locally — its `@lunariajs/core` dependency is served from `pkg.pr.new`, which
this sandbox's egress policy denies; its CI job was already green.
Co-Authored-By: Claude
Claude-Session: https://claude.ai/code/session_01SjNmQ7vt3nXuoeyAbrF7Nj
---
.../modules/shared/components/app/Sidebar.vue | 4 ++++
package.json | 2 +-
packages/build-env/package.json | 1 -
packages/build-env/src/resolve.ts | 15 ++++++++++++---
pnpm-lock.yaml | 3 ---
5 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/apps/dashboard/modules/shared/components/app/Sidebar.vue b/apps/dashboard/modules/shared/components/app/Sidebar.vue
index 020b9ea..89bf4dd 100644
--- a/apps/dashboard/modules/shared/components/app/Sidebar.vue
+++ b/apps/dashboard/modules/shared/components/app/Sidebar.vue
@@ -100,6 +100,10 @@