From 6277cd24cf6fc9ab3fb03ea92d90456db9a24390 Mon Sep 17 00:00:00 2001
From: RedStar
Date: Sun, 9 Aug 2026 22:59:08 +0200
Subject: [PATCH 01/11] feat(server): productionize the control plane
Add durable task history, approval workflows, and sandbox runner pools.
Add oRPC 2, native provider adapters, and a Nuxt 5-compatible UnoCSS dashboard.
Closes #10
---
.agent-zero.example.yml | 6 +
.gitignore | 5 +-
.skills/agent-zero-safety/SKILL.md | 3 +
.skills/orpc-server/SKILL.md | 9 +-
README.md | 44 +-
apps/server/app/app.vue | 7 +
apps/server/app/assets/css/main.css | 94 +
apps/server/app/components/AppSidebar.vue | 59 +
apps/server/app/components/RunnerMetrics.vue | 38 +
apps/server/app/components/TaskInspector.vue | 141 +
apps/server/app/components/TaskStatus.vue | 23 +
apps/server/app/components/TaskTable.vue | 85 +
apps/server/app/components/TaskTimeline.vue | 43 +
apps/server/app/layouts/default.vue | 8 +
apps/server/app/pages/index.vue | 139 +
apps/server/nuxt.config.ts | 35 +
apps/server/package.json | 23 +-
apps/server/server/api/dashboard.get.ts | 10 +
.../server/api/tasks/[id]/approval.post.ts | 21 +
apps/server/server/routes/rpc/[...].ts | 17 +
apps/server/shared/dashboard.ts | 31 +
apps/server/src/control-plane.test.ts | 108 +
apps/server/src/control-plane.ts | 202 +
apps/server/src/dashboard.ts | 17 +
apps/server/src/index.ts | 18 +-
apps/server/src/router.test.ts | 40 +-
apps/server/src/router.ts | 259 +-
apps/server/src/rpc.ts | 41 +
apps/server/tsconfig.json | 4 +-
apps/server/uno.config.ts | 27 +
apps/server/uno.theme.ts | 24 +
docs/architecture.md | 10 +
docs/sandbox-providers.md | 24 +
package.json | 2 +-
packages/agent/package.json | 2 +-
packages/agent/src/agent.test.ts | 28 +
packages/agent/src/agent.ts | 26 +-
packages/cli/package.json | 2 +-
packages/cli/src/index.ts | 8 +-
packages/config/package.json | 2 +-
packages/config/src/index.test.ts | 38 +
packages/config/src/index.ts | 37 +-
packages/github/package.json | 2 +-
packages/models/package.json | 5 +-
packages/models/src/index.test.ts | 97 +-
packages/models/src/index.ts | 234 +-
packages/runner/package.json | 2 +-
packages/runner/src/index.ts | 10 +
packages/runner/src/sandbox.test.ts | 90 +
packages/runner/src/sandbox.ts | 149 +
packages/shared/package.json | 2 +-
packages/shared/src/evidence.test.ts | 9 +
packages/shared/src/index.ts | 4 +
packages/shared/src/types.ts | 46 +
pnpm-lock.yaml | 6345 ++++++++++++++++-
turbo.json | 2 +-
56 files changed, 8316 insertions(+), 441 deletions(-)
create mode 100644 apps/server/app/app.vue
create mode 100644 apps/server/app/assets/css/main.css
create mode 100644 apps/server/app/components/AppSidebar.vue
create mode 100644 apps/server/app/components/RunnerMetrics.vue
create mode 100644 apps/server/app/components/TaskInspector.vue
create mode 100644 apps/server/app/components/TaskStatus.vue
create mode 100644 apps/server/app/components/TaskTable.vue
create mode 100644 apps/server/app/components/TaskTimeline.vue
create mode 100644 apps/server/app/layouts/default.vue
create mode 100644 apps/server/app/pages/index.vue
create mode 100644 apps/server/nuxt.config.ts
create mode 100644 apps/server/server/api/dashboard.get.ts
create mode 100644 apps/server/server/api/tasks/[id]/approval.post.ts
create mode 100644 apps/server/server/routes/rpc/[...].ts
create mode 100644 apps/server/shared/dashboard.ts
create mode 100644 apps/server/src/control-plane.test.ts
create mode 100644 apps/server/src/control-plane.ts
create mode 100644 apps/server/src/dashboard.ts
create mode 100644 apps/server/src/rpc.ts
create mode 100644 apps/server/uno.config.ts
create mode 100644 apps/server/uno.theme.ts
create mode 100644 docs/sandbox-providers.md
create mode 100644 packages/runner/src/sandbox.test.ts
create mode 100644 packages/runner/src/sandbox.ts
diff --git a/.agent-zero.example.yml b/.agent-zero.example.yml
index faacfbc..8579095 100644
--- a/.agent-zero.example.yml
+++ b/.agent-zero.example.yml
@@ -57,5 +57,11 @@ runner:
maxOutputBytes: 200000
model:
+ # ai-gateway, anthropic, google, openai, or openai-compatible.
+ # Credentials are read only from the provider's documented environment variable; they are
+ # never accepted from repository configuration or persisted with task evidence.
provider: openai-compatible
name: gpt-5
+ # Optional explicit pricing enables deterministic cost accounting.
+ # inputCostPerMillionTokens: 1.25
+ # outputCostPerMillionTokens: 10
diff --git a/.gitignore b/.gitignore
index 634875b..e0a002c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,14 +2,13 @@ node_modules/
.turbo/
dist/
.output/
+.nuxt/
*.tsbuildinfo
coverage/
.env
.env.*
!.env.example
.agent-zero/
+.data/
*.log
.DS_Store
-
-# Nitro build output
-.output/
diff --git a/.skills/agent-zero-safety/SKILL.md b/.skills/agent-zero-safety/SKILL.md
index 42d7e69..cdf81e6 100644
--- a/.skills/agent-zero-safety/SKILL.md
+++ b/.skills/agent-zero-safety/SKILL.md
@@ -22,6 +22,9 @@ Safety properties are behavior, not documentation. Back every change with determ
- A failed verification cannot be represented as success. `verified` is derived once, where the terminal result is built.
- A run that cannot verify does not write. No checks means no change.
- Isolation is never approximated. Requesting a sandbox that cannot be provided must fail.
+- Remote sandbox credentials stay private to the provider adapter. Requests, leases, snapshots, task state, and logs remain credential-free.
+- Runner pools enforce active, per-repository, and lease-duration ceilings before provisioning and stop expired leases.
+- Persistent task records omit review input and checkout paths, and recursively redact every string before storage.
- A reviewer's claim is not evidence. Reject what the repository does not support, and keep the reasons.
## Review workflow
diff --git a/.skills/orpc-server/SKILL.md b/.skills/orpc-server/SKILL.md
index aac8264..2d4afc1 100644
--- a/.skills/orpc-server/SKILL.md
+++ b/.skills/orpc-server/SKILL.md
@@ -9,8 +9,9 @@ description: Use when changing apps/server procedures, oRPC contracts, handlers,
## Rules
-- Keep procedure contracts and router composition in `apps/server/src/router.ts`.
-- Keep Node HTTP startup in `apps/server/src/index.ts`.
+- Keep domain composition in `apps/server/src/router.ts` and oRPC procedures in `apps/server/src/rpc.ts`.
+- Nitro v3 scans `apps/server/routes/` because `nitro.config.ts` sets `serverDir: './'`; keep route files as thin transport adapters.
+- Pass persistence through oRPC context. Production routes construct `PersistentTaskStore` from Nitro storage; unit tests use `MemoryTaskStore`.
- Infer client types from the router; do not duplicate request or response interfaces.
- Validate inputs at the procedure boundary and return stable domain-shaped results.
- Procedures call the agent runtime through typed APIs. They do not execute shell commands or mutate checkouts directly.
@@ -20,8 +21,8 @@ description: Use when changing apps/server procedures, oRPC contracts, handlers,
## Workflow
1. Read the router, its tests, and the runtime method being exposed.
-2. Define or adjust the oRPC procedure contract.
+2. Define or adjust the oRPC procedure contract in `src/rpc.ts`.
3. Keep the handler thin: validate, authorize, delegate, translate.
-4. Add router tests without opening a real network port.
+4. Add router/store tests without opening a real network port, then verify the built Nitro route once.
5. Update the README client example when the public router shape changes.
6. Run `aube run test --filter @agent-zero/server`, typecheck, and build.
diff --git a/README.md b/README.md
index 29c2e4c..b27c3fa 100644
--- a/README.md
+++ b/README.md
@@ -36,7 +36,7 @@ Feedback is never treated as truth merely because it came from a human or an AI
GitHub webhook / CLI
│
▼
- Server API ─── task events
+ Nitro + oRPC control plane ─── durable task events / approvals
│
▼
Agent state machine
@@ -99,22 +99,56 @@ The CLI parses arguments with [`@bomb.sh/args`](https://github.com/bomb-sh/args)
## Control plane
-The type-safe oRPC API starts on `http://localhost:4040` and exposes `health`, `tasks.list`, `tasks.get`, and `tasks.create`. Call it from a dashboard or another service with `@orpc/client`:
+`aube run dev` starts the Nuxt control plane, backed by Nitro, on `http://localhost:3000`. The operational dashboard is served at `/`; the type-safe oRPC endpoint at `/rpc` exposes `health`, `tasks.list`, `tasks.get`, `tasks.create`, and `approvals.decide`.
+
+Task history, structured lifecycle events, evidence, model/token/latency/cost usage, and approval decisions are stored through Nitro storage. The development mount uses `.data/agent-zero`; production deployments can replace it with Redis or provider KV without changing task logic. Checkout paths, review input, provider credentials, and raw provider responses are not persisted, and all persisted strings are redacted before storage.
+
+Call the API from another service with `@orpc/client`:
```ts
import { createORPCClient } from '@orpc/client';
import { RPCLink } from '@orpc/client/fetch';
import type { RouterClient } from '@orpc/server';
-import type { AppRouter } from '@agent-zero/server/router';
+import type { RpcRouter } from '@agent-zero/server';
-const zero: RouterClient = createORPCClient(
- new RPCLink({ url: 'http://localhost:4040' }),
+const zero: RouterClient = createORPCClient(
+ new RPCLink({ url: 'http://localhost:3000/rpc' }),
);
await zero.tasks.create({ repository: '.', feedback: 'Check error handling', mode: 'observe' });
await zero.tasks.create({ repository: '.', trigger: 'proactive', mode: 'observe' });
```
+The scheduler admits at most four tasks globally, one active task per repository, and 100 queued tasks by default. Hosted execution is injected as a provider-neutral `RunnerPool`: every lease has a maximum lifetime, quota checks run before provisioning, expired sandboxes are stopped, and the agent receives only the ordinary `Runner` contract. See [the sandbox provider evaluation](./docs/sandbox-providers.md).
+
+Agent Zero supports native OpenAI, Anthropic, and Google Generative AI adapters, Vercel AI
+Gateway, and arbitrary OpenAI-compatible endpoints. Select the transport in repository policy and
+provide its credential through the environment:
+
+| `model.provider` | Credential environment variable | Model example |
+| ------------------- | -------------------------------------------------------- | ----------------------------- |
+| `ai-gateway` | `AI_GATEWAY_API_KEY` or Vercel OIDC | `anthropic/claude-sonnet-4.5` |
+| `anthropic` | `ANTHROPIC_API_KEY` | `claude-sonnet-4-5` |
+| `google` | `GOOGLE_GENERATIVE_AI_API_KEY` | `gemini-2.5-pro` |
+| `openai` | `OPENAI_API_KEY` | `gpt-5` |
+| `openai-compatible` | `OPENAI_COMPATIBLE_API_KEY` (or legacy `OPENAI_API_KEY`) | provider-specific |
+
+`AGENT_ZERO_MODEL_BASE_URL` is an optional operator environment variable for custom gateways and
+self-hosted endpoints. Endpoint URLs and credentials cannot be named or embedded in
+`.agent-zero.yml`, so untrusted repository policy cannot redirect a provider secret. The AI Gateway
+accepts `provider/model` identifiers and exposes the broader AI SDK provider catalog without adding
+provider-specific logic to the Agent Zero runtime.
+
+To record cost, configure explicit rates; Agent Zero never guesses provider pricing:
+
+```yaml
+model:
+ provider: openai-compatible
+ name: gpt-5
+ inputCostPerMillionTokens: 1.25
+ outputCostPerMillionTokens: 10
+```
+
`observe` is the safe default and never writes files. Proactive pull-request webhooks are ignored until `proactive.enabled` is true. Automatic changes additionally require `mode: fix` or `autonomous`, `autofix.enabled`, sufficient confidence, an allowed change-risk class, repository-native checks, and (by default for proactive/autonomous work) an isolated runner. High-impact changes always require human approval.
---
diff --git a/apps/server/app/app.vue b/apps/server/app/app.vue
new file mode 100644
index 0000000..13e62d3
--- /dev/null
+++ b/apps/server/app/app.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/apps/server/app/assets/css/main.css b/apps/server/app/assets/css/main.css
new file mode 100644
index 0000000..21d40a1
--- /dev/null
+++ b/apps/server/app/assets/css/main.css
@@ -0,0 +1,94 @@
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+:root {
+ color-scheme: dark;
+ --az-canvas: #080c0e;
+ --az-panel: #0d1215;
+ --az-raised: #11181c;
+ --az-line: #273137;
+ --az-ink: #edf2ef;
+ --az-muted: #94a0a7;
+ --az-accent: #82e849;
+ --az-warning: #f5bd38;
+ --az-danger: #ff675f;
+ --az-link: #57a7ff;
+ --az-font-sans:
+ Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+ font-family: var(--az-font-sans);
+ background: var(--az-canvas);
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
+ scrollbar-gutter: stable;
+}
+
+body {
+ margin: 0;
+ min-width: 320px;
+ background:
+ linear-gradient(rgb(130 232 73 / 0.018) 1px, transparent 1px),
+ linear-gradient(90deg, rgb(130 232 73 / 0.018) 1px, transparent 1px), var(--az-canvas);
+ background-size: 32px 32px;
+ color: var(--az-ink);
+ line-height: 1.5;
+}
+
+button,
+textarea {
+ font: inherit;
+}
+
+button {
+ cursor: pointer;
+}
+
+:focus-visible,
+:-moz-focusring {
+ outline: 2px solid var(--az-accent) !important;
+ outline-offset: 2px !important;
+}
+
+::selection {
+ color: var(--az-canvas);
+ background: var(--az-accent);
+}
+
+* {
+ scrollbar-color: var(--az-line) var(--az-canvas);
+}
+
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--az-canvas);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--az-line);
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--az-muted);
+}
+
+@media (prefers-contrast: more) {
+ :root {
+ --az-line: #aab3b8;
+ --az-muted: #d7ddda;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ input,
+ select,
+ textarea {
+ font-size: 16px !important;
+ }
+}
diff --git a/apps/server/app/components/AppSidebar.vue b/apps/server/app/components/AppSidebar.vue
new file mode 100644
index 0000000..1bd92be
--- /dev/null
+++ b/apps/server/app/components/AppSidebar.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
diff --git a/apps/server/app/components/RunnerMetrics.vue b/apps/server/app/components/RunnerMetrics.vue
new file mode 100644
index 0000000..fd98dad
--- /dev/null
+++ b/apps/server/app/components/RunnerMetrics.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ {{ metric.label }}
+
+
+ {{ metric.value }}
+
+
+
+
diff --git a/apps/server/app/components/TaskInspector.vue b/apps/server/app/components/TaskInspector.vue
new file mode 100644
index 0000000..a01d310
--- /dev/null
+++ b/apps/server/app/components/TaskInspector.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
{{ task.id }}
+
{{ task.repository }}
+
+
+
+
+
+
+
- Created
+ -
+ {{ new Date(task.createdAt).toLocaleString() }}
+
+
+
+
- Attempts
+ -
+ {{ task.result?.attempts ?? '—' }}
+
+
+
+
- Tokens
+ -
+ {{ task.result?.usage.totalTokens.toLocaleString() ?? '—' }}
+
+
+
+
- Verified
+ -
+ {{ task.result ? (task.result.verified ? 'YES' : 'NO') : '—' }}
+
+
+
+
+
+
Run summary
+
{{ task.result.summary }}
+
+
+
+
+
+
{{ error }}
+
+
+
+
+
+
+
+
Decision
+
+ {{ task.approval.decision }} by {{ task.approval.actor }}
+
+
+ {{ task.approval.comment }}
+
+
+
+
+
+
+
+
No task selected
+
+ Select a queue record to inspect evidence, usage, and approvals.
+
+
+
+
+
diff --git a/apps/server/app/components/TaskStatus.vue b/apps/server/app/components/TaskStatus.vue
new file mode 100644
index 0000000..466d5a2
--- /dev/null
+++ b/apps/server/app/components/TaskStatus.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ {{ status.replace('-', ' ') }}
+
+
diff --git a/apps/server/app/components/TaskTable.vue b/apps/server/app/components/TaskTable.vue
new file mode 100644
index 0000000..1ec99fb
--- /dev/null
+++ b/apps/server/app/components/TaskTable.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
Task queue
+
+ {{ tasks.length }}
+
+
+
Newest first
+
+
+
+
+
+
+ |
+ ID
+ |
+
+ Repository
+ |
+
+ Status
+ |
+
+ Updated
+ |
+
+
+
+
+ | {{ shortId(task.id) }} |
+
+ {{ repositoryName(task.repository) }}
+
+ {{ task.repository }}
+
+ |
+ |
+
+ {{ new Date(task.updatedAt).toLocaleString() }}
+ |
+
+
+
+
+
+
+
+
+
+
+
No tasks recorded
+
+ Submitted control-plane tasks appear here with their durable execution history.
+
+
+
+
+
diff --git a/apps/server/app/components/TaskTimeline.vue b/apps/server/app/components/TaskTimeline.vue
new file mode 100644
index 0000000..ecce5f3
--- /dev/null
+++ b/apps/server/app/components/TaskTimeline.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
Execution timeline
+ {{ task?.events.length ?? 0 }} events
+
+
+
+
+ -
+
+
+
+
+
+ {{ event.state }}
+
+
+
+
{{ event.message }}
+
+
+
+
+
+
+ Select a task to inspect its state transitions.
+
+
+
diff --git a/apps/server/app/layouts/default.vue b/apps/server/app/layouts/default.vue
new file mode 100644
index 0000000..3c8db8d
--- /dev/null
+++ b/apps/server/app/layouts/default.vue
@@ -0,0 +1,8 @@
+
+
+
diff --git a/apps/server/app/pages/index.vue b/apps/server/app/pages/index.vue
new file mode 100644
index 0000000..8cf881d
--- /dev/null
+++ b/apps/server/app/pages/index.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+ Dashboard unavailable: {{ error.message }}
+
+
+
+
+
+
+
diff --git a/apps/server/nuxt.config.ts b/apps/server/nuxt.config.ts
new file mode 100644
index 0000000..56a4c44
--- /dev/null
+++ b/apps/server/nuxt.config.ts
@@ -0,0 +1,35 @@
+import { defineNuxtConfig } from 'nuxt/config';
+
+export default defineNuxtConfig({
+ compatibilityDate: '2026-08-09',
+ devtools: { enabled: false },
+ future: {
+ compatibilityVersion: 5,
+ },
+ modules: ['@unocss/nuxt'],
+ css: ['~/assets/css/main.css'],
+ app: {
+ head: {
+ htmlAttrs: { lang: 'en' },
+ meta: [{ name: 'color-scheme', content: 'dark' }],
+ title: 'Agent Zero · Control Plane',
+ },
+ },
+ nitro: {
+ storage: {
+ 'agent-zero': {
+ driver: 'fs',
+ base: './.data/agent-zero',
+ },
+ },
+ },
+ routeRules: {
+ '/': { appLayout: 'default' },
+ '/api/**': { cache: false },
+ '/rpc/**': { cache: false },
+ },
+ typescript: {
+ strict: true,
+ typeCheck: false,
+ },
+});
diff --git a/apps/server/package.json b/apps/server/package.json
index 47ec417..f4c30cb 100644
--- a/apps/server/package.json
+++ b/apps/server/package.json
@@ -1,15 +1,15 @@
{
"name": "@agent-zero/server",
- "version": "0.2.0",
+ "version": "0.3.0",
"type": "module",
"scripts": {
- "build": "nitro build",
- "clean": "tsc -b --clean",
- "dev": "nitro dev",
- "lint": "oxlint --config ../../.oxlintrc.json --type-aware --type-check src server nitro.config.ts",
+ "build": "nuxt build",
+ "clean": "nuxt cleanup && tsc -b --clean",
+ "dev": "nuxt dev",
+ "lint": "oxlint --config ../../.oxlintrc.json --type-aware --type-check src server app shared",
"start": "node .output/server/index.mjs",
"test": "vitest run src --passWithNoTests",
- "typecheck": "nitro prepare && tsc --project tsconfig.json --pretty false --noEmit"
+ "typecheck": "nuxt prepare && vue-tsc -b --noEmit && tsc --project tsconfig.json --pretty false --noEmit"
},
"dependencies": {
"@agent-zero/agent": "workspace:*",
@@ -18,13 +18,20 @@
"@agent-zero/models": "workspace:*",
"@agent-zero/runner": "workspace:*",
"@agent-zero/shared": "workspace:*",
- "nitro": "3.0.260522-beta",
+ "@orpc/server": "2.0.0-beta.26",
+ "h3": "^1.15.11",
+ "nitropack": "^2.13.4",
+ "nuxt": "^4.5.2",
"zod": "^4.1.5"
},
"devDependencies": {
+ "@unocss/nuxt": "^66.7.5",
+ "@unocss/preset-wind4": "^66.7.5",
"oxlint": "^1.44.0",
"oxlint-tsgolint": "^7.0.2001",
"typescript": "^5.9.2",
- "vitest": "^3.2.4"
+ "unocss": "^66.7.5",
+ "vitest": "^3.2.4",
+ "vue-tsc": "^3.1.2"
}
}
diff --git a/apps/server/server/api/dashboard.get.ts b/apps/server/server/api/dashboard.get.ts
new file mode 100644
index 0000000..d178ddd
--- /dev/null
+++ b/apps/server/server/api/dashboard.get.ts
@@ -0,0 +1,10 @@
+import { defineEventHandler } from 'h3';
+import { useStorage } from 'nitropack/runtime';
+
+import { PersistentTaskStore } from '../../src/control-plane.js';
+import { dashboardOverview } from '../../src/dashboard.js';
+
+export default defineEventHandler(async () => {
+ const tasks = await new PersistentTaskStore(useStorage('agent-zero')).list();
+ return dashboardOverview(tasks);
+});
diff --git a/apps/server/server/api/tasks/[id]/approval.post.ts b/apps/server/server/api/tasks/[id]/approval.post.ts
new file mode 100644
index 0000000..771968e
--- /dev/null
+++ b/apps/server/server/api/tasks/[id]/approval.post.ts
@@ -0,0 +1,21 @@
+import { defineEventHandler, getRouterParam, readBody } from 'h3';
+import { useStorage } from 'nitropack/runtime';
+
+import { PersistentTaskStore } from '../../../../src/control-plane.js';
+import { approvalInput, decideApproval } from '../../../../src/router.js';
+
+export default defineEventHandler(async (event) => {
+ const taskId = getRouterParam(event, 'id');
+ const body: unknown = await readBody(event);
+ const input = approvalInput.parse({
+ ...(typeof body === 'object' && body !== null && !Array.isArray(body) ? body : {}),
+ taskId,
+ });
+ return decideApproval(
+ input.taskId,
+ input.decision,
+ input.actor,
+ input.comment,
+ new PersistentTaskStore(useStorage('agent-zero')),
+ );
+});
diff --git a/apps/server/server/routes/rpc/[...].ts b/apps/server/server/routes/rpc/[...].ts
new file mode 100644
index 0000000..9e6a6f9
--- /dev/null
+++ b/apps/server/server/routes/rpc/[...].ts
@@ -0,0 +1,17 @@
+import { RPCHandler } from '@orpc/server/fetch';
+import { defineEventHandler, toWebRequest } from 'h3';
+import { useStorage } from 'nitropack/runtime';
+
+import { PersistentTaskStore } from '../../../src/control-plane.js';
+import { rpcRouter } from '../../../src/rpc.js';
+
+const handler = new RPCHandler(rpcRouter);
+
+export default defineEventHandler(async (event): Promise => {
+ const store = new PersistentTaskStore(useStorage('agent-zero'));
+ const { response } = await handler.handle(toWebRequest(event), {
+ prefix: '/rpc',
+ context: { store },
+ });
+ return response ?? new Response('Not found', { status: 404 });
+});
diff --git a/apps/server/shared/dashboard.ts b/apps/server/shared/dashboard.ts
new file mode 100644
index 0000000..ca9a5c1
--- /dev/null
+++ b/apps/server/shared/dashboard.ts
@@ -0,0 +1,31 @@
+import type { TaskEvent, TaskResult } from '@agent-zero/shared';
+
+export type ControlPlaneTaskStatus = 'queued' | 'running' | 'completed' | 'needs-human' | 'failed';
+export type ApprovalDecision = 'approved' | 'rejected';
+
+export interface TaskApproval {
+ decision: ApprovalDecision;
+ actor: string;
+ comment: string | null;
+ decidedAt: string;
+}
+
+export interface DashboardTask {
+ id: string;
+ repository: string;
+ status: ControlPlaneTaskStatus;
+ createdAt: string;
+ updatedAt: string;
+ events: TaskEvent[];
+ result?: TaskResult;
+ approval?: TaskApproval;
+}
+
+export interface DashboardOverview {
+ tasks: DashboardTask[];
+ active: number;
+ queued: number;
+ awaitingApproval: number;
+ totalTokens: number;
+ costUsd: number;
+}
diff --git a/apps/server/src/control-plane.test.ts b/apps/server/src/control-plane.test.ts
new file mode 100644
index 0000000..d94fac4
--- /dev/null
+++ b/apps/server/src/control-plane.test.ts
@@ -0,0 +1,108 @@
+import { describe, expect, it } from 'vitest';
+
+import {
+ MemoryTaskStore,
+ PersistentTaskStore,
+ TaskQueueQuotaError,
+ TaskScheduler,
+ type KeyValueStorage,
+ type StoredTask,
+} from './control-plane.js';
+
+function record(id: string, summary = 'safe'): StoredTask {
+ return {
+ id,
+ repository: 'acme/app',
+ status: 'queued',
+ createdAt: '2026-08-09T10:00:00.000Z',
+ updatedAt: '2026-08-09T10:00:00.000Z',
+ events: [],
+ ...(summary === 'safe'
+ ? {}
+ : {
+ approval: {
+ decision: 'approved' as const,
+ actor: 'operator',
+ comment: summary,
+ decidedAt: '2026-08-09T10:00:00.000Z',
+ },
+ }),
+ };
+}
+
+class RecordingStorage implements KeyValueStorage {
+ readonly values = new Map();
+ async getItem(key: string): Promise {
+ return this.values.get(key) ?? null;
+ }
+ async setItem(key: string, value: unknown): Promise {
+ this.values.set(key, value);
+ }
+ async getKeys(base = ''): Promise {
+ return [...this.values.keys()].filter((key) => key.startsWith(base));
+ }
+}
+
+describe('task persistence', () => {
+ it('round-trips structured history through a provider-neutral store', async () => {
+ const storage = new RecordingStorage();
+ const store = new PersistentTaskStore(storage);
+ await store.save(record('az_1'));
+ await expect(store.get('az_1')).resolves.toMatchObject({ id: 'az_1', status: 'queued' });
+ await expect(store.list()).resolves.toHaveLength(1);
+ });
+
+ it('redacts credentials before persistence', async () => {
+ const storage = new RecordingStorage();
+ const store = new PersistentTaskStore(storage, ['provider-secret-value']);
+ await store.save(record('az_1', 'token=provider-secret-value'));
+ expect(JSON.stringify(storage.values.get('tasks:az_1'))).not.toContain('provider-secret-value');
+ await expect(store.get('az_1')).resolves.toMatchObject({
+ approval: { comment: 'token=[redacted]' },
+ });
+ });
+
+ it('keeps in-memory records isolated from caller mutation', async () => {
+ const store = new MemoryTaskStore();
+ const task = record('az_1');
+ await store.save(task);
+ task.status = 'failed';
+ await expect(store.get('az_1')).resolves.toMatchObject({ status: 'queued' });
+ });
+});
+
+describe('TaskScheduler', () => {
+ it('enforces global and repository concurrency while draining FIFO work', async () => {
+ const scheduler = new TaskScheduler({
+ maxConcurrent: 2,
+ maxQueued: 3,
+ maxConcurrentPerRepository: 1,
+ });
+ const releases: Array<() => void> = [];
+ const work = (value: number) =>
+ scheduler.schedule(
+ 'acme/app',
+ () => new Promise((resolve) => releases.push(() => resolve(value))),
+ );
+ const first = work(1);
+ const second = work(2);
+ expect(scheduler.snapshot()).toEqual({ active: 1, queued: 1, capacity: 2 });
+ releases.shift()?.();
+ await expect(first).resolves.toBe(1);
+ await Promise.resolve();
+ expect(scheduler.snapshot()).toMatchObject({ active: 1, queued: 0 });
+ releases.shift()?.();
+ await expect(second).resolves.toBe(2);
+ });
+
+ it('rejects work after the bounded queue is full', () => {
+ const scheduler = new TaskScheduler({
+ maxConcurrent: 1,
+ maxQueued: 1,
+ maxConcurrentPerRepository: 1,
+ });
+ void scheduler.schedule('one', () => new Promise(() => undefined));
+ void scheduler.schedule('two', () => new Promise(() => undefined));
+ expect(() => scheduler.schedule('three', async () => 3)).toThrow(TaskQueueQuotaError);
+ });
+});
diff --git a/apps/server/src/control-plane.ts b/apps/server/src/control-plane.ts
new file mode 100644
index 0000000..4106067
--- /dev/null
+++ b/apps/server/src/control-plane.ts
@@ -0,0 +1,202 @@
+import {
+ redactSecrets,
+ secretValuesFromEnvironment,
+ type EvidenceBundle,
+} from '@agent-zero/shared';
+
+import type { DashboardTask } from '../shared/dashboard.js';
+
+export type {
+ ApprovalDecision,
+ ControlPlaneTaskStatus,
+ TaskApproval,
+} from '../shared/dashboard.js';
+
+/** Durable, deliberately narrow task history. Review input and checkout paths are never stored. */
+export interface StoredTask extends DashboardTask {
+ evidence?: EvidenceBundle;
+}
+
+export interface TaskStore {
+ get(id: string): Promise;
+ list(): Promise;
+ save(task: StoredTask): Promise;
+ clear?(): Promise;
+}
+
+/** Minimal surface shared by Nitro storage, Redis/KV drivers, and deterministic test stores. */
+export interface KeyValueStorage {
+ getItem(key: string): Promise;
+ setItem(key: string, value: unknown): Promise;
+ getKeys(base?: string): Promise;
+ removeItem?(key: string): Promise;
+}
+
+const TASK_PREFIX = 'tasks:';
+
+/** Persists redacted records through Nitro's provider-neutral storage layer. */
+export class PersistentTaskStore implements TaskStore {
+ constructor(
+ private readonly storage: KeyValueStorage,
+ private readonly secrets: readonly string[] = secretValuesFromEnvironment(),
+ ) {}
+
+ async get(id: string): Promise {
+ const value = await this.storage.getItem(`${TASK_PREFIX}${id}`);
+ return isStoredTask(value) ? value : undefined;
+ }
+
+ async list(): Promise {
+ const keys = await this.storage.getKeys(TASK_PREFIX);
+ const records = await Promise.all(keys.map((key) => this.storage.getItem(key)));
+ return records
+ .filter(isStoredTask)
+ .toSorted((left, right) => right.createdAt.localeCompare(left.createdAt));
+ }
+
+ async save(task: StoredTask): Promise {
+ await this.storage.setItem(`${TASK_PREFIX}${task.id}`, sanitizeTask(task, this.secrets));
+ }
+}
+
+/** In-memory adapter used by embedded callers and tests; production Nitro routes use storage. */
+export class MemoryTaskStore implements TaskStore {
+ readonly records = new Map();
+
+ async get(id: string): Promise {
+ const value = this.records.get(id);
+ return value ? structuredClone(value) : undefined;
+ }
+
+ async list(): Promise {
+ return Array.from(this.records.values(), (task) => structuredClone(task)).toSorted(
+ (left, right) => right.createdAt.localeCompare(left.createdAt),
+ );
+ }
+
+ async save(task: StoredTask): Promise {
+ this.records.set(task.id, sanitizeTask(task, secretValuesFromEnvironment()));
+ }
+
+ async clear(): Promise {
+ this.records.clear();
+ }
+}
+
+export interface SchedulerOptions {
+ maxConcurrent: number;
+ maxQueued: number;
+ maxConcurrentPerRepository: number;
+}
+
+export interface SchedulerSnapshot {
+ active: number;
+ queued: number;
+ capacity: number;
+}
+
+export class TaskQueueQuotaError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = 'TaskQueueQuotaError';
+ }
+}
+
+interface QueuedJob {
+ repository: string;
+ start: () => Promise;
+}
+
+/** Bounded FIFO scheduler with a separate per-repository fairness quota. */
+export class TaskScheduler {
+ private active = 0;
+ private readonly activeByRepository = new Map();
+ private readonly queue: QueuedJob[] = [];
+
+ constructor(private readonly options: SchedulerOptions) {
+ assertPositiveInteger(options.maxConcurrent, 'maxConcurrent');
+ assertPositiveInteger(options.maxQueued, 'maxQueued');
+ assertPositiveInteger(options.maxConcurrentPerRepository, 'maxConcurrentPerRepository');
+ }
+
+ schedule(repository: string, run: () => Promise): Promise {
+ if (this.queue.length >= this.options.maxQueued && this.active >= this.options.maxConcurrent)
+ throw new TaskQueueQuotaError('Task queue capacity is exhausted');
+ return new Promise((resolve, reject) => {
+ this.queue.push({
+ repository,
+ start: async () => {
+ try {
+ resolve(await run());
+ } catch (error) {
+ reject(error);
+ }
+ },
+ });
+ this.drain();
+ });
+ }
+
+ snapshot(): SchedulerSnapshot {
+ return {
+ active: this.active,
+ queued: this.queue.length,
+ capacity: this.options.maxConcurrent,
+ };
+ }
+
+ private drain(): void {
+ while (this.active < this.options.maxConcurrent) {
+ const index = this.queue.findIndex(
+ (job) =>
+ (this.activeByRepository.get(job.repository) ?? 0) <
+ this.options.maxConcurrentPerRepository,
+ );
+ if (index < 0) return;
+ const [job] = this.queue.splice(index, 1);
+ if (!job) return;
+ this.active += 1;
+ this.activeByRepository.set(
+ job.repository,
+ (this.activeByRepository.get(job.repository) ?? 0) + 1,
+ );
+ void job.start().finally(() => {
+ this.active -= 1;
+ const repositoryActive = (this.activeByRepository.get(job.repository) ?? 1) - 1;
+ if (repositoryActive === 0) this.activeByRepository.delete(job.repository);
+ else this.activeByRepository.set(job.repository, repositoryActive);
+ this.drain();
+ });
+ }
+ }
+}
+
+function sanitizeTask(task: StoredTask, secrets: readonly string[]): StoredTask {
+ const serialized = JSON.stringify(task, (_key, value: unknown) =>
+ typeof value === 'string' ? redactSecrets(value, secrets) : value,
+ );
+ const value: unknown = JSON.parse(serialized);
+ if (!isStoredTask(value)) throw new Error('Refusing to persist an invalid task record');
+ return value;
+}
+
+function isStoredTask(value: unknown): value is StoredTask {
+ if (!isRecord(value)) return false;
+ const task = value;
+ return (
+ typeof task.id === 'string' &&
+ typeof task.repository === 'string' &&
+ typeof task.status === 'string' &&
+ typeof task.createdAt === 'string' &&
+ typeof task.updatedAt === 'string' &&
+ Array.isArray(task.events)
+ );
+}
+
+function isRecord(value: unknown): value is Record {
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
+}
+
+function assertPositiveInteger(value: number, name: string): void {
+ if (!Number.isInteger(value) || value < 1) throw new Error(`${name} must be a positive integer`);
+}
diff --git a/apps/server/src/dashboard.ts b/apps/server/src/dashboard.ts
new file mode 100644
index 0000000..d3e5484
--- /dev/null
+++ b/apps/server/src/dashboard.ts
@@ -0,0 +1,17 @@
+import type { DashboardOverview } from '../shared/dashboard.js';
+import type { StoredTask } from './control-plane.js';
+
+export type { DashboardOverview } from '../shared/dashboard.js';
+
+export function dashboardOverview(tasks: StoredTask[]): DashboardOverview {
+ return {
+ tasks,
+ active: tasks.filter((task) => task.status === 'running').length,
+ queued: tasks.filter((task) => task.status === 'queued').length,
+ awaitingApproval: tasks.filter(
+ (task) => task.status === 'needs-human' && task.approval === undefined,
+ ).length,
+ totalTokens: tasks.reduce((total, task) => total + (task.result?.usage.totalTokens ?? 0), 0),
+ costUsd: tasks.reduce((total, task) => total + (task.result?.usage.costUsd ?? 0), 0),
+ };
+}
diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts
index a378b40..64f0e74 100644
--- a/apps/server/src/index.ts
+++ b/apps/server/src/index.ts
@@ -1,7 +1,9 @@
export {
createTask,
+ decideApproval,
getTask,
getTaskEvidence,
+ getStoredTask,
githubTokenFromEnvironment,
health,
ingestWebhook,
@@ -11,8 +13,22 @@ export {
taskInput,
tasks,
type PublishOptions,
- type StoredTask,
type WebhookOptions,
type WebhookOutcome,
type WebhookRequest,
} from './router.js';
+export {
+ MemoryTaskStore,
+ PersistentTaskStore,
+ TaskQueueQuotaError,
+ TaskScheduler,
+ type ApprovalDecision,
+ type ControlPlaneTaskStatus,
+ type KeyValueStorage,
+ type SchedulerOptions,
+ type SchedulerSnapshot,
+ type StoredTask,
+ type TaskApproval,
+ type TaskStore,
+} from './control-plane.js';
+export { rpcRouter, type RpcContext, type RpcRouter } from './rpc.js';
diff --git a/apps/server/src/router.test.ts b/apps/server/src/router.test.ts
index 9ed492f..9b775d3 100644
--- a/apps/server/src/router.test.ts
+++ b/apps/server/src/router.test.ts
@@ -6,6 +6,8 @@ import { join } from 'node:path';
import { beforeEach, describe, expect, it } from 'vitest';
import {
+ decideApproval,
+ getStoredTask,
getTask,
getTaskEvidence,
health,
@@ -56,8 +58,8 @@ describe('server task API', () => {
expect(health()).toMatchObject({ status: 'ok', service: 'agent-zero' });
});
- it('starts with an empty task collection', () => {
- expect(listTasks()).toEqual({ tasks: [] });
+ it('starts with an empty task collection', async () => {
+ await expect(listTasks()).resolves.toEqual({ tasks: [] });
});
it('keeps task input validation independent from HTTP transport', () => {
@@ -71,6 +73,32 @@ describe('server task API', () => {
MODE_ERROR,
);
});
+
+ it('records a human approval only for a task awaiting review', async () => {
+ const timestamp = new Date(0).toISOString();
+ tasks.set('az_approval', {
+ id: 'az_approval',
+ repository: 'acme/app',
+ status: 'needs-human',
+ createdAt: timestamp,
+ updatedAt: timestamp,
+ events: [],
+ });
+
+ await expect(
+ decideApproval('az_approval', 'approved', 'release-manager', 'Reviewed evidence'),
+ ).resolves.toMatchObject({
+ status: 'needs-human',
+ approval: {
+ decision: 'approved',
+ actor: 'release-manager',
+ comment: 'Reviewed evidence',
+ },
+ });
+ await expect(getStoredTask('az_approval')).resolves.toMatchObject({
+ approval: { decision: 'approved' },
+ });
+ });
});
describe('runTask', () => {
@@ -80,9 +108,9 @@ describe('runTask', () => {
feedback: 'load() is wrong',
mode: 'observe',
});
- expect(getTask(result.id)).toBe(result);
- expect(getTaskEvidence(result.id)).toContain('## Agent Zero');
- expect(listTasks().tasks).toHaveLength(1);
+ await expect(getTask(result.id)).resolves.toEqual(result);
+ await expect(getTaskEvidence(result.id)).resolves.toContain('## Agent Zero');
+ await expect(listTasks()).resolves.toMatchObject({ tasks: [expect.any(Object)] });
});
it('produces a read-only boundary for an observe run', async () => {
@@ -217,7 +245,7 @@ describe('ingestWebhook', () => {
expect(outcome.status).toBe('accepted');
if (outcome.status !== 'accepted') return;
expect(outcome.result.runner.writable).toBe(false);
- expect(getTaskEvidence(outcome.result.id)).toContain('proactive finding');
+ await expect(getTaskEvidence(outcome.result.id)).resolves.toContain('proactive finding');
});
});
diff --git a/apps/server/src/router.ts b/apps/server/src/router.ts
index 1f0bc91..c5a9c07 100644
--- a/apps/server/src/router.ts
+++ b/apps/server/src/router.ts
@@ -7,24 +7,39 @@ import {
verifyWebhook,
} from '@agent-zero/github';
import { modelFromEnvironment } from '@agent-zero/models';
-import { createRunner, runnerOptionsFromPolicy } from '@agent-zero/runner';
+import { createRunner, runnerOptionsFromPolicy, type RunnerPool } from '@agent-zero/runner';
import {
evidenceFromResult,
+ now,
+ redactSecrets,
renderEvidenceMarkdown,
- type EvidenceBundle,
+ secretValuesFromEnvironment,
+ taskId,
type PullRequestRef,
type ReviewInput,
type TaskResult,
} from '@agent-zero/shared';
import { z } from 'zod';
-/** A finished run together with the evidence bundle derived from it. */
-export interface StoredTask {
- result: TaskResult;
- evidence: EvidenceBundle;
-}
+import {
+ MemoryTaskStore,
+ TaskScheduler,
+ type ApprovalDecision,
+ type StoredTask,
+ type TaskStore,
+} from './control-plane.js';
+
+const TRAILING_SLASH = /\/$/u;
+
+const defaultStore = new MemoryTaskStore();
+const defaultScheduler = new TaskScheduler({
+ maxConcurrent: 4,
+ maxQueued: 100,
+ maxConcurrentPerRepository: 1,
+});
-export const tasks = new Map();
+/** Backwards-compatible inspection hook for embedded callers and tests. */
+export const tasks = defaultStore.records;
export const taskInput = z
.object({
@@ -40,58 +55,173 @@ export const taskInput = z
context.addIssue({ code: 'custom', path: ['feedback'], message: 'Feedback is required' });
});
+export const approvalInput = z.object({
+ taskId: z.string().min(1),
+ decision: z.enum(['approved', 'rejected']),
+ actor: z.string().min(1).max(100),
+ comment: z.string().max(2_000).optional(),
+});
+
export function health() {
- return { status: 'ok' as const, service: 'agent-zero', version: '0.2.0' };
+ return { status: 'ok' as const, service: 'agent-zero', version: '0.3.0' };
+}
+
+export async function listTasks(store: TaskStore = defaultStore) {
+ return { tasks: await store.list() };
}
-export function listTasks() {
- return { tasks: Array.from(tasks.values(), (task) => task.result) };
+export async function getStoredTask(
+ id: string,
+ store: TaskStore = defaultStore,
+): Promise {
+ return store.get(id);
}
-export function getTask(id: string): TaskResult | undefined {
- return tasks.get(id)?.result;
+export async function getTask(
+ id: string,
+ store: TaskStore = defaultStore,
+): Promise {
+ return (await store.get(id))?.result;
}
/** The rendered evidence report for a finished run. */
-export function getTaskEvidence(id: string): string | undefined {
- const task = tasks.get(id);
- return task ? renderEvidenceMarkdown(task.evidence) : undefined;
-}
-
-export async function createTask(input: z.infer): Promise {
- return runTask({
- repository: input.repository,
- mode: input.mode,
- trigger: input.trigger,
- ...(input.feedback ? { feedback: input.feedback } : {}),
- ...(input.source ? { source: input.source } : {}),
- ...(input.files ? { files: input.files } : {}),
- });
+export async function getTaskEvidence(
+ id: string,
+ store: TaskStore = defaultStore,
+): Promise {
+ const task = await store.get(id);
+ return task?.evidence ? renderEvidenceMarkdown(task.evidence) : undefined;
+}
+
+export async function createTask(
+ input: z.infer,
+ store: TaskStore = defaultStore,
+ scheduler: TaskScheduler = defaultScheduler,
+): Promise {
+ return runTask(
+ {
+ repository: input.repository,
+ mode: input.mode,
+ trigger: input.trigger,
+ ...(input.feedback ? { feedback: input.feedback } : {}),
+ ...(input.source ? { source: input.source } : {}),
+ ...(input.files ? { files: input.files } : {}),
+ },
+ { store, scheduler },
+ );
+}
+
+export interface RunTaskOptions {
+ store?: TaskStore;
+ scheduler?: TaskScheduler;
+ /** Optional hosted execution pool; its leases still expose only the Runner boundary. */
+ runnerPool?: RunnerPool;
}
/**
- * Run one unit of work and store its evidence.
+ * Queue and run one unit of work, persisting its structured lifecycle and evidence.
*
- * This is the composition root: it resolves policy, builds an execution boundary that is read-only
- * unless the mode and the repository both authorize writing, and never lets the transport layer
- * choose those things for itself.
+ * This composition root resolves policy and constructs the only execution boundary. Neither the
+ * transport, persistence adapter, scheduler, nor dashboard can execute repository commands.
*/
-export async function runTask(input: ReviewInput): Promise {
- const config = await loadConfig(input.repository);
- const agent = new AgentZero({
- model: modelFromEnvironment(config.model.name, config.model.baseUrl),
- runner: createRunner(
- input.repository,
- runnerOptionsFromPolicy(config, mayModifyRepository(config, input.mode)),
- ),
- config,
- });
- const result = await agent.run(input);
- tasks.set(result.id, {
- result,
- evidence: evidenceFromResult(result, input),
- });
- return result;
+export async function runTask(
+ input: ReviewInput,
+ options: RunTaskOptions = {},
+): Promise {
+ const store = options.store ?? defaultStore;
+ const scheduler = options.scheduler ?? defaultScheduler;
+ const identifier = taskId();
+ const timestamp = now();
+ const record: StoredTask = {
+ id: identifier,
+ repository: repositoryLabel(input),
+ status: 'queued',
+ createdAt: timestamp,
+ updatedAt: timestamp,
+ events: [],
+ };
+ await store.save(record);
+
+ try {
+ return await scheduler.schedule(input.repository, async () => {
+ record.status = 'running';
+ record.updatedAt = now();
+ await store.save(record);
+
+ const config = await loadConfig(input.repository);
+ let eventWrites = Promise.resolve();
+ const writable = mayModifyRepository(config, input.mode);
+ const lease = options.runnerPool
+ ? await options.runnerPool.acquire({
+ taskId: identifier,
+ repository: input.repository,
+ mode: input.mode,
+ writable,
+ network: config.permissions.network,
+ leaseMs: config.agent.timeoutMs,
+ })
+ : undefined;
+ const runner =
+ lease?.runner ?? createRunner(input.repository, runnerOptionsFromPolicy(config, writable));
+ const agent = new AgentZero({
+ model: modelFromEnvironment(config.model),
+ runner,
+ config,
+ taskIdentifier: identifier,
+ onEvent: (event) => {
+ record.events.push(event);
+ record.updatedAt = event.timestamp;
+ eventWrites = eventWrites.then(() => store.save(record));
+ },
+ });
+ let result: TaskResult;
+ try {
+ result = await agent.run(input);
+ } finally {
+ if (lease) await options.runnerPool?.release(lease.id);
+ }
+ await eventWrites;
+ record.status = result.state;
+ record.updatedAt = now();
+ record.result = result;
+ record.evidence = evidenceFromResult(result, input);
+ await store.save(record);
+ return result;
+ });
+ } catch (error) {
+ record.status = 'failed';
+ record.updatedAt = now();
+ record.events.push({
+ state: 'failed',
+ message: redactSecrets(error instanceof Error ? error.message : String(error)),
+ timestamp: record.updatedAt,
+ });
+ await store.save(record);
+ throw error;
+ }
+}
+
+export async function decideApproval(
+ taskIdentifier: string,
+ decision: ApprovalDecision,
+ actor: string,
+ comment: string | undefined,
+ store: TaskStore = defaultStore,
+): Promise {
+ const record = await store.get(taskIdentifier);
+ if (!record) throw new Error(`Unknown task: ${taskIdentifier}`);
+ if (record.status !== 'needs-human')
+ throw new Error('Only tasks awaiting human review can receive an approval decision');
+ const timestamp = now();
+ record.approval = {
+ decision,
+ actor: redactSecrets(actor, secretValuesFromEnvironment()),
+ comment: comment ? redactSecrets(comment, secretValuesFromEnvironment()) : null,
+ decidedAt: timestamp,
+ };
+ record.updatedAt = timestamp;
+ await store.save(record);
+ return record;
}
export interface WebhookRequest {
@@ -102,10 +232,10 @@ export interface WebhookRequest {
export interface WebhookOptions {
secret: string;
- /** Where the pull request is already checked out. */
checkoutPath: string;
- /** Logins to ignore, so the agent never reacts to its own comments. */
ignoreAuthors?: readonly string[];
+ store?: TaskStore;
+ scheduler?: TaskScheduler;
}
export type WebhookOutcome =
@@ -113,13 +243,6 @@ export type WebhookOutcome =
| { status: 'ignored'; reason: string }
| { status: 'accepted'; result: TaskResult; pullRequest: PullRequestRef };
-/**
- * Handle an inbound GitHub webhook.
- *
- * The signature is verified before the payload is parsed. Feedback-triggered runs remain
- * read-only; proactive pull-request runs use repository mode only after proactive review is
- * explicitly enabled in that checkout. Writes still require the independent autofix policy gate.
- */
export async function ingestWebhook(
request: WebhookRequest,
options: WebhookOptions,
@@ -149,40 +272,44 @@ export async function ingestWebhook(
mode = config.mode;
}
+ const runOptions: RunTaskOptions = {
+ ...(options.store ? { store: options.store } : {}),
+ ...(options.scheduler ? { scheduler: options.scheduler } : {}),
+ };
const result = await runTask(
reviewInputFromEvent(event, { checkoutPath: options.checkoutPath, mode }),
+ runOptions,
);
return { status: 'accepted', result, pullRequest: event.pullRequest };
}
export interface PublishOptions {
- /** Supplied by the caller rather than read here, so no code path reaches GitHub implicitly. */
token: string | undefined;
fetch?: typeof globalThis.fetch;
+ store?: TaskStore;
}
-/** The credential a deployment configures for check reporting. */
export function githubTokenFromEnvironment(): string | undefined {
return process.env.GITHUB_TOKEN;
}
-/**
- * Publish a finished run to GitHub Checks.
- *
- * Reporting is skipped rather than faked when no token is configured, so a missing credential never
- * turns into a green check.
- */
export async function publishEvidence(
target: PullRequestRef,
taskIdentifier: string,
options: PublishOptions,
): Promise<{ published: boolean; reason?: string }> {
if (!options.token) return { published: false, reason: 'GITHUB_TOKEN is not configured' };
- const task = tasks.get(taskIdentifier);
- if (!task) return { published: false, reason: `Unknown task: ${taskIdentifier}` };
+ const task = await (options.store ?? defaultStore).get(taskIdentifier);
+ if (!task?.evidence) return { published: false, reason: `Unknown task: ${taskIdentifier}` };
await new GitHubChecks({
token: options.token,
...(options.fetch ? { fetch: options.fetch } : {}),
}).publish(target, task.evidence);
return { published: true };
}
+
+function repositoryLabel(input: ReviewInput): string {
+ if (input.pullRequest) return `${input.pullRequest.owner}/${input.pullRequest.repo}`;
+ const normalized = input.repository.replaceAll('\\', '/').replace(TRAILING_SLASH, '');
+ return redactSecrets(normalized.split('/').at(-1) || 'repository');
+}
diff --git a/apps/server/src/rpc.ts b/apps/server/src/rpc.ts
new file mode 100644
index 0000000..679de94
--- /dev/null
+++ b/apps/server/src/rpc.ts
@@ -0,0 +1,41 @@
+import { os } from '@orpc/server';
+import { z } from 'zod';
+
+import type { TaskStore } from './control-plane.js';
+import {
+ approvalInput,
+ createTask,
+ decideApproval,
+ getStoredTask,
+ health,
+ listTasks,
+ taskInput,
+} from './router.js';
+
+export interface RpcContext {
+ store: TaskStore;
+}
+
+const procedure = os.$context();
+
+export const rpcRouter = {
+ health: procedure.handler(() => health()),
+ tasks: {
+ list: procedure.handler(({ context }) => listTasks(context.store)),
+ get: procedure
+ .input(z.object({ id: z.string().min(1) }))
+ .handler(({ input, context }) => getStoredTask(input.id, context.store)),
+ create: procedure
+ .input(taskInput)
+ .handler(({ input, context }) => createTask(input, context.store)),
+ },
+ approvals: {
+ decide: procedure
+ .input(approvalInput)
+ .handler(({ input, context }) =>
+ decideApproval(input.taskId, input.decision, input.actor, input.comment, context.store),
+ ),
+ },
+};
+
+export type RpcRouter = typeof rpcRouter;
diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json
index 03f1c06..7aa810a 100644
--- a/apps/server/tsconfig.json
+++ b/apps/server/tsconfig.json
@@ -1,7 +1,7 @@
{
"extends": "../../tsconfig.base.json",
- "compilerOptions": { "rootDir": "src", "outDir": "dist" },
- "include": ["src/**/*.ts"],
+ "compilerOptions": { "rootDir": ".", "outDir": "dist" },
+ "include": ["src/**/*.ts", "shared/**/*.ts"],
"references": [
{ "path": "../../packages/agent" },
{ "path": "../../packages/config" },
diff --git a/apps/server/uno.config.ts b/apps/server/uno.config.ts
new file mode 100644
index 0000000..a345c18
--- /dev/null
+++ b/apps/server/uno.config.ts
@@ -0,0 +1,27 @@
+import { defineConfig, presetWind4, transformerDirectives, transformerVariantGroup } from 'unocss';
+
+import { theme } from './uno.theme.js';
+
+export default defineConfig({
+ content: {
+ pipeline: {
+ exclude: [/\.(css|postcss|sass|scss|less|stylus|styl)($|\?)/, /\?macro=true/],
+ include: [/\.(vue|html)($|\?)/],
+ },
+ },
+ presets: [presetWind4()],
+ transformers: [transformerDirectives({ enforce: 'pre' }), transformerVariantGroup()],
+ theme,
+ shortcuts: [
+ ['az-panel', 'border border-line bg-panel'],
+ [
+ 'az-section-title',
+ 'h-11 flex items-center justify-between border-b border-line px-3.5 font-650',
+ ],
+ ['az-mono', 'font-mono text-xs'],
+ [
+ 'az-focus',
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-canvas',
+ ],
+ ],
+});
diff --git a/apps/server/uno.theme.ts b/apps/server/uno.theme.ts
new file mode 100644
index 0000000..cb16fcd
--- /dev/null
+++ b/apps/server/uno.theme.ts
@@ -0,0 +1,24 @@
+import type { Theme } from '@unocss/preset-wind4/theme';
+
+export const theme = {
+ font: {
+ mono: "'Geist Mono', ui-monospace, SFMono-Regular, Consolas, monospace",
+ sans: "'Geist', Inter, ui-sans-serif, system-ui, sans-serif",
+ },
+ text: {
+ '3xs': { fontSize: '0.625rem' },
+ '4xs': { fontSize: '0.5625rem' },
+ },
+ colors: {
+ canvas: 'var(--az-canvas)',
+ panel: 'var(--az-panel)',
+ raised: 'var(--az-raised)',
+ line: 'var(--az-line)',
+ ink: 'var(--az-ink)',
+ muted: 'var(--az-muted)',
+ accent: 'var(--az-accent)',
+ warning: 'var(--az-warning)',
+ danger: 'var(--az-danger)',
+ link: 'var(--az-link)',
+ },
+} satisfies Theme;
diff --git a/docs/architecture.md b/docs/architecture.md
index 9026e5a..a8686b7 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -31,6 +31,16 @@ Git inspection runs in the trusting process because its argv is fixed by the run
`createRunner` and `runnerOptionsFromPolicy` are the only mapping from policy to a concrete boundary. `runnerOptionsFromPolicy` declares the policy fields it needs structurally, so the runner does not depend on the configuration package. Composition roots call both; nothing else constructs a runner.
+Hosted sandboxes follow the same rule. `RunnerPool` lives in `packages/runner`, accepts credential-free `SandboxRequest` values, enforces global/repository quotas and lease ceilings before provisioning, and returns only a `Runner`. Provider credentials are constructor state of a vendor adapter and never enter a request, lease snapshot, agent state, or log. The control plane may schedule and release a lease, but it cannot execute a command itself.
+
+Model transports follow the same adapter rule. `packages/models` owns the AI SDK integrations for OpenAI, Anthropic, Google, AI Gateway, and OpenAI-compatible endpoints behind one `ModelProvider` contract. Composition roots pass the validated provider policy; credentials come only from fixed provider-specific environment variables, and a custom endpoint can only come from the operator-owned `AGENT_ZERO_MODEL_BASE_URL` environment variable. The agent runtime sees neither SDK objects nor credentials, and all adapters share one structured-output, usage-accounting, timeout, and error-redaction path.
+
+## Control plane persistence
+
+`apps/server` is the Nitro composition root. Its oRPC procedures receive a `TaskStore` through request context; the production adapter writes to Nitro storage while tests use the same contract in memory. Durable records contain a repository label, structured lifecycle events, terminal evidence, aggregate usage, and approval decisions. They deliberately omit review input, checkout paths, credentials, and raw provider responses. A recursive string redaction pass runs before every write.
+
+The bounded `TaskScheduler` separates admission from execution. It limits active tasks, queued tasks, and concurrency per repository, while the runner pool separately owns sandbox capacity and expiration. Persistence, HTTP handlers, and the dashboard have no shell or target-filesystem capability.
+
## State transitions
The lifecycle is:
diff --git a/docs/sandbox-providers.md b/docs/sandbox-providers.md
new file mode 100644
index 0000000..e8af3b2
--- /dev/null
+++ b/docs/sandbox-providers.md
@@ -0,0 +1,24 @@
+# Hosted sandbox provider evaluation
+
+Agent Zero v0.3 defines the vendor-neutral lifecycle in `packages/runner`: provision a credential-free request, expose the resulting checkout only as a `Runner`, stop it explicitly, and expire bounded leases. A provider adapter owns its client and credentials privately. No SDK response or secret is copied into agent state, task history, lease snapshots, or logs.
+
+## Evaluation
+
+| Provider | Relevant primitives | Fit | Adapter note |
+| ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
+| [ViteHub](https://vitehub.dev/) | Workspace, Sandbox, KV, Queue, Workflow, Schedule | Strongest match for a portable control-plane vocabulary and persistent workspaces paired with isolated execution | Preferred first portability pilot. Keep Workspace identifiers inside the adapter and expose only `Runner` operations. |
+| [Cloudflare Sandbox](https://developers.cloudflare.com/sandbox/) | Workers, Durable Objects, Containers, command/file lifecycle, persistent storage and backups | Strong deployment-native option for a Cloudflare control plane | Map one lease to a Durable Object/container lifecycle. Inject bindings into the adapter; never serialize them. |
+| [Vercel Sandbox](https://vercel.com/docs/sandbox) | Ephemeral Firecracker microVMs, commands, snapshots, network policy and explicit stop | Strong isolated execution option for a Vercel deployment | Map `provision`, command/file operations, and `stop` to `@vercel/sandbox`; keep token/project/team configuration private to the adapter. |
+
+## Decision
+
+The core does not select a vendor. `SandboxProvider` and `RunnerPool` are the stable boundary; deployment packages can add ViteHub, Cloudflare, or Vercel implementations without changing the agent or server procedures. The first production adapter should pilot ViteHub because its Workspace/Sandbox split most directly represents Agent Zero's need for a durable checkout plus replaceable execution. Cloudflare and Vercel remain deployment-specific adapters behind the same tests.
+
+Every adapter must prove:
+
+- no credential appears in `SandboxRequest`, `SandboxLease`, `TaskResult`, stored task JSON, or captured output;
+- observe/suggest mounts are mechanically read-only;
+- network policy is applied rather than merely recorded;
+- CPU, memory, command timeout, output, active-count, per-repository, and lease-duration limits are enforced;
+- `release` is idempotent and an expiry sweep stops abandoned sandboxes;
+- repository reads, writes, git inspection, and commands still flow only through `Runner`.
diff --git a/package.json b/package.json
index d472c04..6f635fe 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "agent-zero",
- "version": "0.2.0",
+ "version": "0.3.0",
"private": true,
"description": "Open-source autonomous engineer that finds, fixes, and verifies problems in pull requests.",
"license": "Apache-2.0",
diff --git a/packages/agent/package.json b/packages/agent/package.json
index 707937b..848b073 100644
--- a/packages/agent/package.json
+++ b/packages/agent/package.json
@@ -1,6 +1,6 @@
{
"name": "@agent-zero/agent",
- "version": "0.2.0",
+ "version": "0.3.0",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
diff --git a/packages/agent/src/agent.test.ts b/packages/agent/src/agent.test.ts
index 38923be..5eb32a2 100644
--- a/packages/agent/src/agent.test.ts
+++ b/packages/agent/src/agent.test.ts
@@ -186,6 +186,34 @@ describe('read-only modes', () => {
expect(writes).toEqual([]);
});
+ it('aggregates adapter-authored model usage into the task result', async () => {
+ const { agent } = harness({
+ decisions: [
+ decision({
+ usage: {
+ provider: 'openai-compatible',
+ model: 'gpt-5',
+ inputTokens: 100,
+ outputTokens: 25,
+ totalTokens: 125,
+ latencyMs: 400,
+ costUsd: 0.001,
+ },
+ }),
+ ],
+ });
+ const result = await run(agent, 'observe');
+ expect(result.usage).toEqual({
+ modelCalls: 1,
+ inputTokens: 100,
+ outputTokens: 25,
+ totalTokens: 125,
+ latencyMs: 400,
+ costUsd: 0.001,
+ models: { 'gpt-5': 1 },
+ });
+ });
+
it('reports only when repository policy disables autofix', async () => {
const { agent, writes } = harness({
overrides: { autofix: { ...defaultConfig.autofix, enabled: false, minConfidence: 0.8 } },
diff --git a/packages/agent/src/agent.ts b/packages/agent/src/agent.ts
index 7832c53..7a4eb2a 100644
--- a/packages/agent/src/agent.ts
+++ b/packages/agent/src/agent.ts
@@ -10,6 +10,7 @@ import type { ModelProvider } from '@agent-zero/models';
import type { Runner } from '@agent-zero/runner';
import {
allChecksPassed,
+ emptyTaskUsage,
isRepositoryRelativePath,
now,
taskId,
@@ -18,11 +19,13 @@ import {
type ChangeRisk,
type Finding,
type ModelFinding,
+ type ModelCallUsage,
type ProposedChange,
type ReviewInput,
type TaskEvent,
type TaskResult,
type TaskState,
+ type TaskUsage,
type TerminalState,
} from '@agent-zero/shared';
@@ -34,6 +37,8 @@ export interface AgentDependencies {
runner: Runner;
config: AgentZeroConfig;
onEvent?: (event: TaskEvent) => void;
+ /** Control-plane supplied identifier used to correlate queued and running records. */
+ taskIdentifier?: string;
}
/** How much failing output is fed back into the next repair attempt. */
@@ -88,6 +93,7 @@ export class AgentZero {
`Interpreting ${describeFeedback(effectiveInput)} against the checkout`,
);
let decision = await model.decide({ input: effectiveInput, repositoryContext });
+ run.recordUsage(decision.usage);
run.emit('validating', 'Testing the claim against repository evidence');
const outcome = await validateFinding(
@@ -128,6 +134,7 @@ export class AgentZero {
repositoryContext,
...(previousFailure === undefined ? {} : { previousFailure }),
});
+ run.recordUsage(decision.usage);
changeRisk = classifyChangeRisk(decision.changeRisk, decision.changes);
run.recordChangeRisk(changeRisk);
run.plan = [...decision.plan];
@@ -249,7 +256,7 @@ export class AgentZero {
/** Mutable bookkeeping for one run, kept separate from the decisions the agent makes. */
class Run {
- readonly id = taskId();
+ readonly id: string;
readonly events: TaskEvent[] = [];
private readonly machine = new LifecycleMachine();
plan: string[] = [];
@@ -257,11 +264,14 @@ class Run {
changedFiles: string[] = [];
attempts = 0;
private finding: Finding | null = null;
+ private readonly usage: TaskUsage = emptyTaskUsage();
constructor(
private readonly dependencies: AgentDependencies,
private readonly input: ReviewInput,
- ) {}
+ ) {
+ this.id = dependencies.taskIdentifier ?? taskId();
+ }
emit(state: TaskState, message: string, attempt?: number): void {
this.machine.to(state);
@@ -299,6 +309,17 @@ class Run {
if (this.finding) this.finding.changeRisk = changeRisk;
}
+ recordUsage(usage: ModelCallUsage | undefined): void {
+ if (!usage) return;
+ this.usage.modelCalls += 1;
+ this.usage.inputTokens += usage.inputTokens;
+ this.usage.outputTokens += usage.outputTokens;
+ this.usage.totalTokens += usage.totalTokens;
+ this.usage.latencyMs += usage.latencyMs;
+ this.usage.costUsd += usage.costUsd;
+ this.usage.models[usage.model] = (this.usage.models[usage.model] ?? 0) + 1;
+ }
+
/**
* Produce the terminal result.
*
@@ -321,6 +342,7 @@ class Run {
changedFiles: [...this.changedFiles],
attempts: this.attempts,
events: [...this.events],
+ usage: { ...this.usage, models: { ...this.usage.models } },
runner: this.dependencies.runner.describe(),
summary: this.input.source ? `${summary} (${this.input.source})` : summary,
};
diff --git a/packages/cli/package.json b/packages/cli/package.json
index c675956..4f101d5 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@agent-zero/cli",
- "version": "0.2.0",
+ "version": "0.3.0",
"bin": {
"zero": "./dist/index.js"
},
diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts
index e648772..ad35e84 100644
--- a/packages/cli/src/index.ts
+++ b/packages/cli/src/index.ts
@@ -9,7 +9,7 @@ import {
loadConfig,
mayModifyRepository,
} from '@agent-zero/config';
-import { modelFromEnvironment } from '@agent-zero/models';
+import { isModelConfigured, modelFromEnvironment } from '@agent-zero/models';
import { createRunner, LocalRunner, runnerOptionsFromPolicy } from '@agent-zero/runner';
import {
evidenceFromResult,
@@ -119,7 +119,8 @@ async function runDoctor(asJson: boolean): Promise {
const status = {
node: process.version,
gitRepository: await exists(join(cwd, '.git')),
- modelConfigured: Boolean(process.env.OPENAI_API_KEY),
+ modelConfigured: isModelConfigured(config.model.provider),
+ modelProvider: config.model.provider,
mode: config.mode,
isolation: config.runner.isolation,
network: config.permissions.network,
@@ -135,6 +136,7 @@ async function runDoctor(asJson: boolean): Promise {
p.log.info(`Node ${status.node}`);
logCheck('Git repository', status.gitRepository);
logCheck('Model configured', status.modelConfigured);
+ p.log.info(`Model provider: ${status.modelProvider}`);
logCheck(
`Isolated runner (${status.isolation}, network ${status.network})`,
status.isolation === 'container',
@@ -173,7 +175,7 @@ async function runAgent(
);
const agent = new AgentZero({
- model: modelFromEnvironment(config.model.name, config.model.baseUrl),
+ model: modelFromEnvironment(config.model),
runner,
config,
onEvent: (event) => {
diff --git a/packages/config/package.json b/packages/config/package.json
index 44c554c..78f0b21 100644
--- a/packages/config/package.json
+++ b/packages/config/package.json
@@ -1,6 +1,6 @@
{
"name": "@agent-zero/config",
- "version": "0.2.0",
+ "version": "0.3.0",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
diff --git a/packages/config/src/index.test.ts b/packages/config/src/index.test.ts
index e3881e5..d1f9029 100644
--- a/packages/config/src/index.test.ts
+++ b/packages/config/src/index.test.ts
@@ -103,6 +103,44 @@ describe('validateConfig', () => {
),
).toThrow('runner.workdir must be an absolute container path');
});
+
+ it('rejects negative model pricing instead of recording misleading cost', () => {
+ expect(() =>
+ validateConfig(
+ config({
+ model: { ...defaultConfig.model, inputCostPerMillionTokens: -1 },
+ }),
+ ),
+ ).toThrow('model.inputCostPerMillionTokens must be a non-negative number');
+ });
+
+ it('accepts native and gateway model providers', () => {
+ for (const provider of ['ai-gateway', 'anthropic', 'google', 'openai'] as const)
+ expect(
+ validateConfig(config({ model: { ...defaultConfig.model, provider } })).model.provider,
+ ).toBe(provider);
+ });
+
+ it('rejects an unknown model provider', () => {
+ expect(() =>
+ validateConfig(
+ invalidConfig({ model: { ...defaultConfig.model, provider: 'mystery-cloud' } }),
+ ),
+ ).toThrow('Invalid model provider');
+ });
+
+ it('keeps custom provider endpoints out of repository policy', () => {
+ expect(() =>
+ validateConfig(
+ invalidConfig({
+ model: {
+ ...defaultConfig.model,
+ baseUrl: 'https://attacker.invalid/v1',
+ },
+ }),
+ ),
+ ).toThrow('AGENT_ZERO_MODEL_BASE_URL');
+ });
});
describe('mayModifyRepository', () => {
diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts
index d9378cd..1315e65 100644
--- a/packages/config/src/index.ts
+++ b/packages/config/src/index.ts
@@ -1,7 +1,7 @@
import { readFile } from 'node:fs/promises';
import { join } from 'node:path';
-import type { ChangeRisk, NetworkPolicy, RunMode } from '@agent-zero/shared';
+import type { ChangeRisk, ModelProviderKind, NetworkPolicy, RunMode } from '@agent-zero/shared';
import { parse } from 'yaml';
import { assertExecutableCommand } from './checks.js';
@@ -72,7 +72,12 @@ export interface AgentZeroConfig {
agent: { maxAttempts: number; timeoutMs: number; maxChangedFiles: number };
permissions: { network: NetworkPolicy };
runner: RunnerPolicy;
- model: { provider: 'openai-compatible'; name: string; baseUrl?: string };
+ model: {
+ provider: ModelProviderKind;
+ name: string;
+ inputCostPerMillionTokens?: number;
+ outputCostPerMillionTokens?: number;
+ };
}
export const defaultConfig: AgentZeroConfig = {
@@ -105,6 +110,13 @@ export const defaultConfig: AgentZeroConfig = {
const runModes = new Set(['observe', 'suggest', 'fix', 'autonomous']);
const networkPolicies = new Set(['none', 'restricted', 'full']);
+const modelProviders = new Set([
+ 'ai-gateway',
+ 'anthropic',
+ 'google',
+ 'openai',
+ 'openai-compatible',
+]);
function assertConfig(value: unknown): asserts value is Partial {
if (!value || typeof value !== 'object' || Array.isArray(value))
@@ -146,6 +158,14 @@ export function validateConfig(config: AgentZeroConfig): AgentZeroConfig {
if (!runModes.has(config.mode)) throw new Error(`Invalid mode: ${config.mode}`);
if (!networkPolicies.has(config.permissions.network))
throw new Error(`Invalid network policy: ${config.permissions.network}`);
+ if (!modelProviders.has(config.model.provider))
+ throw new Error(`Invalid model provider: ${config.model.provider}`);
+ if (typeof config.model.name !== 'string' || config.model.name.trim().length === 0)
+ throw new Error('model.name must be a non-empty string');
+ if (Object.hasOwn(config.model, 'baseUrl'))
+ throw new Error(
+ 'model.baseUrl is not allowed in repository policy; use AGENT_ZERO_MODEL_BASE_URL',
+ );
if (!Array.isArray(config.checks)) throw new Error('checks must be a list of commands');
for (const command of config.checks) {
@@ -170,6 +190,14 @@ export function validateConfig(config: AgentZeroConfig): AgentZeroConfig {
assertPositiveInteger(config.agent.timeoutMs, 'agent.timeoutMs');
assertPositiveInteger(config.agent.maxChangedFiles, 'agent.maxChangedFiles');
assertPositiveInteger(config.runner.maxOutputBytes, 'runner.maxOutputBytes');
+ assertNonNegativeOptional(
+ config.model.inputCostPerMillionTokens,
+ 'model.inputCostPerMillionTokens',
+ );
+ assertNonNegativeOptional(
+ config.model.outputCostPerMillionTokens,
+ 'model.outputCostPerMillionTokens',
+ );
if (config.runner.isolation !== 'local' && config.runner.isolation !== 'container')
throw new Error(`Invalid runner isolation: ${String(config.runner.isolation)}`);
@@ -207,6 +235,11 @@ function assertPositiveInteger(value: number, name: string): void {
if (!Number.isInteger(value) || value < 1) throw new Error(`${name} must be a positive integer`);
}
+function assertNonNegativeOptional(value: number | undefined, name: string): void {
+ if (value !== undefined && (!Number.isFinite(value) || value < 0))
+ throw new Error(`${name} must be a non-negative number`);
+}
+
function isRecord(value: unknown): value is Record {
return typeof value === 'object' && value !== null && !Array.isArray(value);
}
diff --git a/packages/github/package.json b/packages/github/package.json
index a2a83f4..dc853db 100644
--- a/packages/github/package.json
+++ b/packages/github/package.json
@@ -1,6 +1,6 @@
{
"name": "@agent-zero/github",
- "version": "0.2.0",
+ "version": "0.3.0",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
diff --git a/packages/models/package.json b/packages/models/package.json
index ab60b27..1ebcdbb 100644
--- a/packages/models/package.json
+++ b/packages/models/package.json
@@ -1,6 +1,6 @@
{
"name": "@agent-zero/models",
- "version": "0.2.0",
+ "version": "0.3.0",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
@@ -27,6 +27,9 @@
},
"dependencies": {
"@agent-zero/shared": "workspace:*",
+ "@ai-sdk/anthropic": "^4.0.36",
+ "@ai-sdk/google": "^4.0.39",
+ "@ai-sdk/openai": "^4.0.36",
"@ai-sdk/openai-compatible": "^3.0.16",
"ai": "^7.0.40",
"zod": "^4.4.3"
diff --git a/packages/models/src/index.test.ts b/packages/models/src/index.test.ts
index 60c97a4..5ea7c30 100644
--- a/packages/models/src/index.test.ts
+++ b/packages/models/src/index.test.ts
@@ -2,7 +2,11 @@ import type { AgentDecision, ReviewInput } from '@agent-zero/shared';
import { describe, expect, it } from 'vitest';
import {
+ AISdkModelProvider,
+ isModelConfigured,
isAgentDecision,
+ modelCredentialEnvironmentVariables,
+ modelFromEnvironment,
OpenAICompatibleProvider,
renderPrompt,
UnconfiguredModelProvider,
@@ -43,8 +47,14 @@ function jsonResponse(body: unknown, status = 200): Response {
});
}
-function chatResponse(content: string): Response {
- return jsonResponse({ choices: [{ message: { content }, finish_reason: 'stop' }] });
+function chatResponse(
+ content: string,
+ usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number },
+): Response {
+ return jsonResponse({
+ choices: [{ message: { content }, finish_reason: 'stop' }],
+ ...(usage ? { usage } : {}),
+ });
}
describe('renderPrompt', () => {
@@ -110,7 +120,17 @@ describe('OpenAICompatibleProvider', () => {
model: 'gpt-5',
fetch: async () => chatResponse(JSON.stringify(decision)),
});
- await expect(provider.decide(context())).resolves.toEqual(decision);
+ await expect(provider.decide(context())).resolves.toMatchObject({
+ ...decision,
+ usage: {
+ provider: 'openai-compatible',
+ model: 'gpt-5',
+ inputTokens: 0,
+ outputTokens: 0,
+ totalTokens: 0,
+ costUsd: 0,
+ },
+ });
});
it('sends the key as a bearer header and nothing else', async () => {
@@ -129,6 +149,29 @@ describe('OpenAICompatibleProvider', () => {
expect(seen?.signal).toBeDefined();
});
+ it('records provider usage and computes cost only from configured rates', async () => {
+ const provider = new OpenAICompatibleProvider({
+ apiKey: 'test-key-value',
+ model: 'gpt-5',
+ inputCostPerMillionTokens: 2,
+ outputCostPerMillionTokens: 10,
+ fetch: async () =>
+ chatResponse(JSON.stringify(decision), {
+ prompt_tokens: 1_000,
+ completion_tokens: 500,
+ total_tokens: 1_500,
+ }),
+ });
+ await expect(provider.decide(context())).resolves.toMatchObject({
+ usage: {
+ inputTokens: 1_000,
+ outputTokens: 500,
+ totalTokens: 1_500,
+ costUsd: 0.007,
+ },
+ });
+ });
+
it('rejects output that does not match the decision contract', async () => {
const provider = new OpenAICompatibleProvider({
apiKey: 'test-key-value',
@@ -167,6 +210,54 @@ describe('UnconfiguredModelProvider', () => {
});
});
+describe('modelFromEnvironment', () => {
+ it('selects each native provider with its dedicated credential', () => {
+ const cases = [
+ ['ai-gateway', 'AI_GATEWAY_API_KEY'],
+ ['anthropic', 'ANTHROPIC_API_KEY'],
+ ['google', 'GOOGLE_GENERATIVE_AI_API_KEY'],
+ ['openai', 'OPENAI_API_KEY'],
+ ['openai-compatible', 'OPENAI_COMPATIBLE_API_KEY'],
+ ] as const;
+
+ for (const [provider, key] of cases) {
+ const configured = modelFromEnvironment(
+ { provider, name: 'test-model' },
+ { [key]: 'test-key-value' },
+ );
+ expect(configured).toBeInstanceOf(AISdkModelProvider);
+ expect(configured).toMatchObject({ provider, model: 'test-model' });
+ }
+ });
+
+ it('preserves OPENAI_API_KEY compatibility for openai-compatible endpoints', () => {
+ expect(
+ modelFromEnvironment(
+ { provider: 'openai-compatible', name: 'legacy-model' },
+ { OPENAI_API_KEY: 'legacy-key-value' },
+ ),
+ ).toMatchObject({ provider: 'openai-compatible', model: 'legacy-model' });
+ });
+
+ it('stays unconfigured when the selected provider credential is absent', () => {
+ expect(modelFromEnvironment({ provider: 'anthropic', name: 'claude-test' }, {})).toBeInstanceOf(
+ UnconfiguredModelProvider,
+ );
+ expect(isModelConfigured('anthropic', {})).toBe(false);
+ });
+
+ it('documents every accepted credential source', () => {
+ expect(modelCredentialEnvironmentVariables('ai-gateway')).toEqual([
+ 'AI_GATEWAY_API_KEY',
+ 'VERCEL_OIDC_TOKEN',
+ ]);
+ expect(modelCredentialEnvironmentVariables('openai-compatible')).toEqual([
+ 'OPENAI_COMPATIBLE_API_KEY',
+ 'OPENAI_API_KEY',
+ ]);
+ });
+});
+
describe('isAgentDecision', () => {
it('accepts a well-formed decision', () => {
expect(isAgentDecision(decision)).toBe(true);
diff --git a/packages/models/src/index.ts b/packages/models/src/index.ts
index cd18aef..1c42366 100644
--- a/packages/models/src/index.ts
+++ b/packages/models/src/index.ts
@@ -3,10 +3,22 @@ import {
secretValuesFromEnvironment,
truncateHead,
type AgentDecision,
+ type ModelProviderKind,
type ReviewInput,
} from '@agent-zero/shared';
+import { createAnthropic } from '@ai-sdk/anthropic';
+import { createGoogleGenerativeAI } from '@ai-sdk/google';
+import { createOpenAI } from '@ai-sdk/openai';
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
-import { APICallError, generateText, JSONParseError, NoObjectGeneratedError, Output } from 'ai';
+import {
+ APICallError,
+ createGateway,
+ generateText,
+ JSONParseError,
+ NoObjectGeneratedError,
+ Output,
+ type LanguageModel,
+} from 'ai';
import { z } from 'zod';
export interface ModelContext {
@@ -63,29 +75,43 @@ export interface OpenAICompatibleOptions {
baseUrl?: string;
timeoutMs?: number;
fetch?: typeof globalThis.fetch;
+ inputCostPerMillionTokens?: number;
+ outputCostPerMillionTokens?: number;
}
-/**
- * Provider-agnostic model adapter built on the AI SDK OpenAI-compatible provider.
- *
- * AI SDK owns transport and structured-output decoding; Agent Zero still owns the runtime
- * validation that decides whether a model finding is actually supported by repository evidence.
- */
-export class OpenAICompatibleProvider implements ModelProvider {
- constructor(private readonly options: OpenAICompatibleOptions) {}
+export interface ModelSelection {
+ provider: ModelProviderKind;
+ name: string;
+ timeoutMs?: number;
+ inputCostPerMillionTokens?: number;
+ outputCostPerMillionTokens?: number;
+}
- async decide(context: ModelContext): Promise {
- const provider = createOpenAICompatible({
- name: 'agent-zero',
- apiKey: this.options.apiKey,
- baseURL: this.options.baseUrl ?? 'https://api.openai.com/v1',
- supportsStructuredOutputs: true,
- ...(this.options.fetch ? { fetch: this.options.fetch } : {}),
- });
+interface AISdkModelOptions {
+ provider: ModelProviderKind;
+ model: string;
+ languageModel: LanguageModel;
+ credentialSecrets: readonly string[];
+ timeoutMs?: number;
+ inputCostPerMillionTokens?: number;
+ outputCostPerMillionTokens?: number;
+}
+/** Shared AI SDK execution path used by every native and gateway adapter. */
+export class AISdkModelProvider implements ModelProvider {
+ readonly provider: ModelProviderKind;
+ readonly model: string;
+
+ constructor(private readonly options: AISdkModelOptions) {
+ this.provider = options.provider;
+ this.model = options.model;
+ }
+
+ async decide(context: ModelContext): Promise {
+ const startedAt = performance.now();
try {
const result = await generateText({
- model: provider(this.options.model),
+ model: this.options.languageModel,
system: SYSTEM_PROMPT,
prompt: renderPrompt(context),
output: Output.object({
@@ -96,7 +122,25 @@ export class OpenAICompatibleProvider implements ModelProvider {
}),
abortSignal: AbortSignal.timeout(this.options.timeoutMs ?? DEFAULT_TIMEOUT_MS),
});
- return result.output;
+ const inputTokens = result.usage.inputTokens ?? 0;
+ const outputTokens = result.usage.outputTokens ?? 0;
+ const totalTokens = result.usage.totalTokens ?? inputTokens + outputTokens;
+ const costUsd =
+ (inputTokens * (this.options.inputCostPerMillionTokens ?? 0) +
+ outputTokens * (this.options.outputCostPerMillionTokens ?? 0)) /
+ 1_000_000;
+ return {
+ ...result.output,
+ usage: {
+ provider: this.options.provider,
+ model: this.options.model,
+ inputTokens,
+ outputTokens,
+ totalTokens,
+ latencyMs: Math.max(0, Math.round(performance.now() - startedAt)),
+ costUsd,
+ },
+ };
} catch (error) {
if (NoObjectGeneratedError.isInstance(error))
throw new Error(
@@ -105,13 +149,13 @@ export class OpenAICompatibleProvider implements ModelProvider {
: 'Model returned an invalid decision',
{ cause: error },
);
- // API failures may echo the request or a credential back; redact before the message can
+ // Provider failures may echo the request or a credential back; redact before the message can
// reach a log, a check annotation, or published evidence.
const detail = APICallError.isInstance(error) ? (error.responseBody ?? '') : '';
const message = error instanceof Error ? error.message : String(error);
throw new Error(
redactSecrets(detail.length > 0 ? `${message}\n${detail}` : message, [
- this.options.apiKey,
+ ...this.options.credentialSecrets,
...secretValuesFromEnvironment(),
]),
{ cause: error },
@@ -120,6 +164,37 @@ export class OpenAICompatibleProvider implements ModelProvider {
}
}
+/**
+ * Provider-agnostic model adapter built on the AI SDK OpenAI-compatible provider.
+ *
+ * AI SDK owns transport and structured-output decoding; Agent Zero still owns the runtime
+ * validation that decides whether a model finding is actually supported by repository evidence.
+ */
+export class OpenAICompatibleProvider extends AISdkModelProvider {
+ constructor(options: OpenAICompatibleOptions) {
+ const provider = createOpenAICompatible({
+ name: 'agent-zero',
+ apiKey: options.apiKey,
+ baseURL: options.baseUrl ?? 'https://api.openai.com/v1',
+ supportsStructuredOutputs: true,
+ ...(options.fetch ? { fetch: options.fetch } : {}),
+ });
+ super({
+ provider: 'openai-compatible',
+ model: options.model,
+ languageModel: provider(options.model),
+ credentialSecrets: [options.apiKey],
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
+ ...(options.inputCostPerMillionTokens === undefined
+ ? {}
+ : { inputCostPerMillionTokens: options.inputCostPerMillionTokens }),
+ ...(options.outputCostPerMillionTokens === undefined
+ ? {}
+ : { outputCostPerMillionTokens: options.outputCostPerMillionTokens }),
+ });
+ }
+}
+
export class UnconfiguredModelProvider implements ModelProvider {
async decide({ input }: ModelContext): Promise {
return {
@@ -142,11 +217,118 @@ export class UnconfiguredModelProvider implements ModelProvider {
}
}
-export function modelFromEnvironment(model: string, baseUrl?: string): ModelProvider {
- const apiKey = process.env.OPENAI_API_KEY;
- return apiKey
- ? new OpenAICompatibleProvider({ apiKey, model, ...(baseUrl ? { baseUrl } : {}) })
- : new UnconfiguredModelProvider();
+export function modelFromEnvironment(
+ selection: ModelSelection,
+ environment: NodeJS.ProcessEnv = process.env,
+): ModelProvider {
+ const apiKey = providerApiKey(selection.provider, environment);
+ const baseUrl = environment.AGENT_ZERO_MODEL_BASE_URL;
+ if (!apiKey && !(selection.provider === 'ai-gateway' && environment.VERCEL_OIDC_TOKEN))
+ return new UnconfiguredModelProvider();
+
+ const common = {
+ provider: selection.provider,
+ model: selection.name,
+ credentialSecrets: apiKey ? [apiKey] : [],
+ ...(selection.timeoutMs === undefined ? {} : { timeoutMs: selection.timeoutMs }),
+ ...(selection.inputCostPerMillionTokens === undefined
+ ? {}
+ : { inputCostPerMillionTokens: selection.inputCostPerMillionTokens }),
+ ...(selection.outputCostPerMillionTokens === undefined
+ ? {}
+ : { outputCostPerMillionTokens: selection.outputCostPerMillionTokens }),
+ } satisfies Omit;
+
+ switch (selection.provider) {
+ case 'openai-compatible':
+ return new OpenAICompatibleProvider({
+ apiKey: apiKey ?? '',
+ model: selection.name,
+ ...(baseUrl ? { baseUrl } : {}),
+ ...(selection.timeoutMs === undefined ? {} : { timeoutMs: selection.timeoutMs }),
+ ...(selection.inputCostPerMillionTokens === undefined
+ ? {}
+ : { inputCostPerMillionTokens: selection.inputCostPerMillionTokens }),
+ ...(selection.outputCostPerMillionTokens === undefined
+ ? {}
+ : { outputCostPerMillionTokens: selection.outputCostPerMillionTokens }),
+ });
+ case 'openai': {
+ const provider = createOpenAI({
+ apiKey: apiKey ?? '',
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
+ });
+ return new AISdkModelProvider({ ...common, languageModel: provider(selection.name) });
+ }
+ case 'anthropic': {
+ const provider = createAnthropic({
+ apiKey: apiKey ?? '',
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
+ });
+ return new AISdkModelProvider({ ...common, languageModel: provider(selection.name) });
+ }
+ case 'google': {
+ const provider = createGoogleGenerativeAI({
+ apiKey: apiKey ?? '',
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
+ });
+ return new AISdkModelProvider({ ...common, languageModel: provider(selection.name) });
+ }
+ case 'ai-gateway': {
+ const provider = createGateway({
+ ...(apiKey ? { apiKey } : {}),
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
+ });
+ return new AISdkModelProvider({ ...common, languageModel: provider(selection.name) });
+ }
+ default:
+ return unsupportedModelProvider(selection.provider);
+ }
+}
+
+export function isModelConfigured(
+ provider: ModelProviderKind,
+ environment: NodeJS.ProcessEnv = process.env,
+): boolean {
+ return (
+ providerApiKey(provider, environment) !== undefined ||
+ (provider === 'ai-gateway' && Boolean(environment.VERCEL_OIDC_TOKEN))
+ );
+}
+
+export function modelCredentialEnvironmentVariables(
+ provider: ModelProviderKind,
+): readonly string[] {
+ switch (provider) {
+ case 'ai-gateway':
+ return ['AI_GATEWAY_API_KEY', 'VERCEL_OIDC_TOKEN'];
+ case 'anthropic':
+ return ['ANTHROPIC_API_KEY'];
+ case 'google':
+ return ['GOOGLE_GENERATIVE_AI_API_KEY'];
+ case 'openai':
+ return ['OPENAI_API_KEY'];
+ case 'openai-compatible':
+ return ['OPENAI_COMPATIBLE_API_KEY', 'OPENAI_API_KEY'];
+ default:
+ return unsupportedModelProvider(provider);
+ }
+}
+
+function unsupportedModelProvider(_provider: never): never {
+ throw new Error('Unsupported model provider');
+}
+
+function providerApiKey(
+ provider: ModelProviderKind,
+ environment: NodeJS.ProcessEnv,
+): string | undefined {
+ for (const name of modelCredentialEnvironmentVariables(provider)) {
+ if (name === 'VERCEL_OIDC_TOKEN') continue;
+ const value = environment[name];
+ if (value) return value;
+ }
+ return undefined;
}
export function renderPrompt(context: ModelContext): string {
diff --git a/packages/runner/package.json b/packages/runner/package.json
index e5b602c..8422113 100644
--- a/packages/runner/package.json
+++ b/packages/runner/package.json
@@ -1,6 +1,6 @@
{
"name": "@agent-zero/runner",
- "version": "0.2.0",
+ "version": "0.3.0",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
diff --git a/packages/runner/src/index.ts b/packages/runner/src/index.ts
index fc9b264..30b282d 100644
--- a/packages/runner/src/index.ts
+++ b/packages/runner/src/index.ts
@@ -28,6 +28,16 @@ export {
type ProcessOutcome,
type ProcessRunner,
} from './process.js';
+export {
+ RunnerPool,
+ RunnerPoolQuotaError,
+ type ProvisionedSandbox,
+ type RunnerPoolOptions,
+ type RunnerPoolSnapshot,
+ type SandboxLease,
+ type SandboxProvider,
+ type SandboxRequest,
+} from './sandbox.js';
export interface CreateRunnerOptions extends Omit {
isolation: 'local' | 'container';
diff --git a/packages/runner/src/sandbox.test.ts b/packages/runner/src/sandbox.test.ts
new file mode 100644
index 0000000..30b5350
--- /dev/null
+++ b/packages/runner/src/sandbox.test.ts
@@ -0,0 +1,90 @@
+import { describe, expect, it } from 'vitest';
+
+import type { Runner } from './boundary.js';
+import { RunnerPool, RunnerPoolQuotaError, type SandboxProvider } from './sandbox.js';
+
+const runner: Runner = {
+ describe: () => ({ kind: 'container', isolated: true, writable: false, network: 'none' }),
+ context: async () => '',
+ reviewFiles: async () => [],
+ read: async () => '',
+ exists: async () => false,
+ write: async () => undefined,
+ check: async (command) => ({
+ command,
+ exitCode: 0,
+ stdout: '',
+ stderr: '',
+ durationMs: 0,
+ }),
+ changedFiles: async () => [],
+};
+
+function provider(): SandboxProvider & { stopped: string[] } {
+ return {
+ kind: 'vitehub',
+ stopped: [],
+ async provision(request) {
+ return { externalId: `remote-${request.taskId}`, runner };
+ },
+ async stop(id) {
+ this.stopped.push(id);
+ },
+ };
+}
+
+describe('RunnerPool', () => {
+ const request = {
+ taskId: 'task-1',
+ repository: 'acme/app',
+ mode: 'observe' as const,
+ writable: false,
+ network: 'none' as const,
+ leaseMs: 1_000,
+ };
+
+ it('returns only the Runner boundary and public lifecycle metadata', async () => {
+ const adapter = provider();
+ const pool = new RunnerPool(adapter, {
+ maxActive: 2,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 2_000,
+ now: () => 10_000,
+ });
+ const lease = await pool.acquire(request);
+ expect(lease.runner).toBe(runner);
+ expect(pool.snapshot().leases[0]).not.toHaveProperty('runner');
+ expect(pool.snapshot()).toMatchObject({ active: 1, capacity: 2 });
+ });
+
+ it('enforces pool, repository, and lease quotas before provisioning', async () => {
+ const pool = new RunnerPool(provider(), {
+ maxActive: 2,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ await pool.acquire(request);
+ await expect(pool.acquire({ ...request, taskId: 'task-2' })).rejects.toBeInstanceOf(
+ RunnerPoolQuotaError,
+ );
+ await expect(
+ pool.acquire({ ...request, taskId: 'task-3', repository: 'acme/other', leaseMs: 2_000 }),
+ ).rejects.toThrow('exceeds');
+ });
+
+ it('stops expired sandboxes deterministically', async () => {
+ let current = 1_000;
+ const adapter = provider();
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ now: () => current,
+ });
+ await pool.acquire(request);
+ current = 2_000;
+ await expect(pool.sweepExpired()).resolves.toBe(1);
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ });
+});
diff --git a/packages/runner/src/sandbox.ts b/packages/runner/src/sandbox.ts
new file mode 100644
index 0000000..ac64433
--- /dev/null
+++ b/packages/runner/src/sandbox.ts
@@ -0,0 +1,149 @@
+import { randomUUID } from 'node:crypto';
+
+import type { NetworkPolicy, RunMode } from '@agent-zero/shared';
+
+import type { Runner } from './boundary.js';
+
+/** Public, credential-free request passed to every hosted sandbox adapter. */
+export interface SandboxRequest {
+ taskId: string;
+ repository: string;
+ mode: RunMode;
+ writable: boolean;
+ network: NetworkPolicy;
+ leaseMs: number;
+}
+
+/** A provisioned execution boundary. Provider credentials stay captured by the adapter instance. */
+export interface ProvisionedSandbox {
+ externalId: string;
+ runner: Runner;
+}
+
+/** Provider-neutral hosted sandbox lifecycle, implemented inside the runner package only. */
+export interface SandboxProvider {
+ readonly kind: 'vitehub' | 'cloudflare' | 'vercel' | 'custom';
+ provision(request: Readonly): Promise;
+ stop(externalId: string): Promise;
+}
+
+export interface SandboxLease {
+ id: string;
+ taskId: string;
+ repository: string;
+ provider: SandboxProvider['kind'];
+ externalId: string;
+ acquiredAt: string;
+ expiresAt: string;
+ runner: Runner;
+}
+
+export interface RunnerPoolOptions {
+ maxActive: number;
+ maxActivePerRepository: number;
+ maxLeaseMs: number;
+ now?: () => number;
+}
+
+export interface RunnerPoolSnapshot {
+ active: number;
+ capacity: number;
+ expiring: number;
+ leases: Array>;
+}
+
+/** Raised before provisioning when a pool quota would be exceeded. */
+export class RunnerPoolQuotaError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = 'RunnerPoolQuotaError';
+ }
+}
+
+/**
+ * Owns hosted runner leases and their bounded lifecycle.
+ *
+ * This class deliberately returns the regular `Runner` contract. The agent cannot observe or call
+ * a vendor SDK, and the control plane cannot execute a command through a second path.
+ */
+export class RunnerPool {
+ private readonly leases = new Map();
+ private readonly now: () => number;
+
+ constructor(
+ private readonly provider: SandboxProvider,
+ private readonly options: RunnerPoolOptions,
+ ) {
+ assertPositiveInteger(options.maxActive, 'maxActive');
+ assertPositiveInteger(options.maxActivePerRepository, 'maxActivePerRepository');
+ assertPositiveInteger(options.maxLeaseMs, 'maxLeaseMs');
+ this.now = options.now ?? Date.now;
+ }
+
+ async acquire(request: SandboxRequest): Promise {
+ if (this.leases.size >= this.options.maxActive)
+ throw new RunnerPoolQuotaError('Runner pool capacity is exhausted');
+ const repositoryActive = [...this.leases.values()].filter(
+ (lease) => lease.repository === request.repository,
+ ).length;
+ if (repositoryActive >= this.options.maxActivePerRepository)
+ throw new RunnerPoolQuotaError('Repository runner quota is exhausted');
+ if (request.leaseMs > this.options.maxLeaseMs)
+ throw new RunnerPoolQuotaError('Requested lease exceeds the configured maximum');
+
+ const started = this.now();
+ const provisioned = await this.provider.provision(Object.freeze({ ...request }));
+ const lease: SandboxLease = {
+ id: `lease_${randomUUID()}`,
+ taskId: request.taskId,
+ repository: request.repository,
+ provider: this.provider.kind,
+ externalId: provisioned.externalId,
+ acquiredAt: new Date(started).toISOString(),
+ expiresAt: new Date(started + request.leaseMs).toISOString(),
+ runner: provisioned.runner,
+ };
+ this.leases.set(lease.id, lease);
+ return lease;
+ }
+
+ async release(id: string): Promise {
+ const lease = this.leases.get(id);
+ if (!lease) return false;
+ this.leases.delete(id);
+ await this.provider.stop(lease.externalId);
+ return true;
+ }
+
+ async sweepExpired(): Promise {
+ const expired = [...this.leases.values()].filter(
+ (lease) => Date.parse(lease.expiresAt) <= this.now(),
+ );
+ await Promise.all(expired.map((lease) => this.release(lease.id)));
+ return expired.length;
+ }
+
+ snapshot(): RunnerPoolSnapshot {
+ const expiringBefore = this.now() + Math.min(15 * 60_000, this.options.maxLeaseMs);
+ return {
+ active: this.leases.size,
+ capacity: this.options.maxActive,
+ expiring: [...this.leases.values()].filter(
+ (lease) => Date.parse(lease.expiresAt) <= expiringBefore,
+ ).length,
+ leases: Array.from(this.leases.values(), (lease) => ({
+ id: lease.id,
+ taskId: lease.taskId,
+ repository: lease.repository,
+ provider: lease.provider,
+ externalId: lease.externalId,
+ acquiredAt: lease.acquiredAt,
+ expiresAt: lease.expiresAt,
+ })),
+ };
+ }
+}
+
+function assertPositiveInteger(value: number, name: string): void {
+ if (!Number.isInteger(value) || value < 1) throw new Error(`${name} must be a positive integer`);
+}
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 42b953d..c3add6b 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@agent-zero/shared",
- "version": "0.2.0",
+ "version": "0.3.0",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
diff --git a/packages/shared/src/evidence.test.ts b/packages/shared/src/evidence.test.ts
index 988cd43..0810296 100644
--- a/packages/shared/src/evidence.test.ts
+++ b/packages/shared/src/evidence.test.ts
@@ -26,6 +26,15 @@ const result: TaskResult = {
changedFiles: ['src/user.ts'],
attempts: 1,
events: [{ state: 'completed', message: 'All configured checks passed', timestamp: 'T0' }],
+ usage: {
+ modelCalls: 1,
+ inputTokens: 100,
+ outputTokens: 25,
+ totalTokens: 125,
+ latencyMs: 400,
+ costUsd: 0.001,
+ models: { 'gpt-5': 1 },
+ },
runner: { kind: 'container', isolated: true, writable: true, network: 'none' },
summary: 'Fixed and verified: Unhandled null dereference',
};
diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts
index 9f8a777..cd51986 100644
--- a/packages/shared/src/index.ts
+++ b/packages/shared/src/index.ts
@@ -19,6 +19,7 @@ export {
} from './redact.js';
export {
allChecksPassed,
+ emptyTaskUsage,
isRepositoryRelativePath,
type AgentDecision,
type ChangeRisk,
@@ -27,6 +28,8 @@ export {
type FeedbackKind,
type Finding,
type ModelFinding,
+ type ModelCallUsage,
+ type ModelProviderKind,
type NetworkPolicy,
type ProposedChange,
type PullRequestRef,
@@ -38,6 +41,7 @@ export {
type TaskEvent,
type TaskResult,
type TaskState,
+ type TaskUsage,
type TerminalState,
type Verdict,
} from './types.js';
diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts
index 4df5ad5..f534c05 100644
--- a/packages/shared/src/types.ts
+++ b/packages/shared/src/types.ts
@@ -22,6 +22,14 @@ export type Verdict = 'accepted' | 'rejected' | 'inconclusive';
/** Egress policy applied to runtime command execution. */
export type NetworkPolicy = 'none' | 'restricted' | 'full';
+/** Model transports supported by the composition roots. */
+export type ModelProviderKind =
+ | 'ai-gateway'
+ | 'anthropic'
+ | 'google'
+ | 'openai'
+ | 'openai-compatible';
+
/** Every state of the discover to review lifecycle, including terminal states. */
export type TaskState =
| 'queued'
@@ -125,6 +133,29 @@ export interface TaskEvent {
attempt?: number;
}
+/** Provider-neutral accounting for one model call. Credentials and provider payloads never enter it. */
+export interface ModelCallUsage {
+ provider: string;
+ model: string;
+ inputTokens: number;
+ outputTokens: number;
+ totalTokens: number;
+ latencyMs: number;
+ /** Cost is recorded only when explicit repository pricing is configured. */
+ costUsd: number;
+}
+
+/** Aggregated model usage persisted with a task result. */
+export interface TaskUsage {
+ modelCalls: number;
+ inputTokens: number;
+ outputTokens: number;
+ totalTokens: number;
+ latencyMs: number;
+ costUsd: number;
+ models: Record;
+}
+
/** What the execution boundary of a run was actually allowed to do. */
export interface RunnerDescription {
kind: 'local' | 'container';
@@ -150,6 +181,7 @@ export interface TaskResult {
changedFiles: string[];
attempts: number;
events: TaskEvent[];
+ usage: TaskUsage;
runner: RunnerDescription;
summary: string;
}
@@ -161,6 +193,20 @@ export interface AgentDecision {
changeRisk: ChangeRisk;
plan: string[];
changes: ProposedChange[];
+ /** Adapter-authored accounting metadata; never accepted from the model's structured output. */
+ usage?: ModelCallUsage;
+}
+
+export function emptyTaskUsage(): TaskUsage {
+ return {
+ modelCalls: 0,
+ inputTokens: 0,
+ outputTokens: 0,
+ totalTokens: 0,
+ latencyMs: 0,
+ costUsd: 0,
+ models: {},
+ };
}
/** True when at least one check ran and all of them succeeded. */
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e7da2a2..53cc51e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -29,6 +29,9 @@ importers:
vite:
specifier: '>=3'
version: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ webpack:
+ specifier: ^4 || ^5
+ version: 5.109.2
devDependencies:
'@arethetypeswrong/cli':
specifier: ^0.18.5
@@ -44,7 +47,7 @@ importers:
version: 0.8.0(oxlint@1.77.0(oxlint-tsgolint@7.0.2001))
'@redstardev/unplugin-version-injector':
specifier: 0.0.2
- version: 0.0.2(@nuxt/kit@3.21.11)(@nuxt/schema@3.21.11)(esbuild@0.28.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ version: 0.0.2(@nuxt/kit@3.21.11)(@nuxt/schema@3.21.11)(esbuild@0.28.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
'@types/node':
specifier: ^24.3.0
version: 24.13.3
@@ -92,47 +95,56 @@ importers:
dependencies:
'@agent-zero/agent':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/config':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/github':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/models':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/runner':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/shared':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
+ '@orpc/server':
+ specifier: 2.0.0-beta.26
+ version: 2.0.0-beta.26(crossws@0.4.10(srvx@0.11.22))
'@types/node':
- specifier: ^18.0.0 || ^20.0.0 || >=22.0.0
+ specifier: '>=18.12.0'
version: 24.13.3
- dotenv:
- specifier: '*'
- version: 17.4.2
- giget:
- specifier: '*'
- version: 3.3.1
- jiti:
- specifier: ^2.6.1
- version: 2.7.0
- nitro:
- specifier: 3.0.260522-beta
- version: 3.0.260522-beta(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
- rollup:
- specifier: ^4.60.3
- version: 4.62.4
- vite:
- specifier: ^7 || ^8
- version: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ '@unocss/webpack':
+ specifier: 66.7.5
+ version: 66.7.5(webpack@5.109.2)
+ crossws:
+ specifier: '>=0.3.4'
+ version: 0.4.10(srvx@0.11.22)
+ h3:
+ specifier: ^1.15.11
+ version: 1.15.11
+ nitropack:
+ specifier: ^2.13.4
+ version: 2.13.4
+ nuxt:
+ specifier: ^4.5.2
+ version: 4.5.2(@types/node@24.13.3)(rolldown@1.2.3)
+ rolldown:
+ specifier: ~1.2.1
+ version: 1.2.3
zod:
specifier: ^4.1.5
version: 4.4.3
devDependencies:
+ '@unocss/nuxt':
+ specifier: ^66.7.5
+ version: 66.7.5(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ '@unocss/preset-wind4':
+ specifier: ^66.7.5
+ version: 66.7.5
oxlint:
specifier: ^1.44.0
version: 1.77.0(oxlint-tsgolint@7.0.2001)
@@ -142,24 +154,30 @@ importers:
typescript:
specifier: ^5.9.2
version: typescript-native-bridge@6.0.3-bridge.12.tsgo.7.0.2
+ unocss:
+ specifier: ^66.7.5
+ version: 66.7.5(@unocss/webpack@66.7.5(webpack@5.109.2))
vitest:
specifier: ^3.2.4
version: 3.2.7(@types/node@24.13.3)
+ vue-tsc:
+ specifier: ^3.1.2
+ version: 3.3.9(typescript@6.0.3-bridge.12.tsgo.7.0.2)
packages/agent:
dependencies:
'@agent-zero/config':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/models':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/runner':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/shared':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@arethetypeswrong/core':
specifier: ^0.18.1
version: 0.18.5
@@ -193,19 +211,19 @@ importers:
dependencies:
'@agent-zero/agent':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/config':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/models':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/runner':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@agent-zero/shared':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@arethetypeswrong/core':
specifier: ^0.18.1
version: 0.18.5
@@ -245,7 +263,7 @@ importers:
dependencies:
'@agent-zero/shared':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@arethetypeswrong/core':
specifier: ^0.18.1
version: 0.18.5
@@ -257,7 +275,7 @@ importers:
version: 2.0.5
magic-regexp:
specifier: ^0.11.0
- version: 0.11.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ version: 0.11.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
publint:
specifier: ^0.3.8
version: 0.3.23
@@ -288,7 +306,7 @@ importers:
dependencies:
'@agent-zero/shared':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@arethetypeswrong/core':
specifier: ^0.18.1
version: 0.18.5
@@ -322,7 +340,16 @@ importers:
dependencies:
'@agent-zero/shared':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
+ '@ai-sdk/anthropic':
+ specifier: ^4.0.36
+ version: 4.0.36(zod@4.4.3)
+ '@ai-sdk/google':
+ specifier: ^4.0.39
+ version: 4.0.39(zod@4.4.3)
+ '@ai-sdk/openai':
+ specifier: ^4.0.36
+ version: 4.0.36(zod@4.4.3)
'@ai-sdk/openai-compatible':
specifier: ^3.0.16
version: 3.0.27(zod@4.4.3)
@@ -365,7 +392,7 @@ importers:
dependencies:
'@agent-zero/shared':
specifier: workspace:*
- version: 0.1.0
+ version: 0.3.0
'@arethetypeswrong/core':
specifier: ^0.18.1
version: 0.18.5
@@ -377,7 +404,7 @@ importers:
version: 0.0.3
magic-regexp:
specifier: ^0.11.0
- version: 0.11.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ version: 0.11.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
publint:
specifier: ^0.3.8
version: 0.3.23
@@ -434,18 +461,36 @@ importers:
packages:
+ '@ai-sdk/anthropic@4.0.36':
+ resolution: {integrity: sha512-Wg5jfray0X4+qkrr73GZ7U7K2JNGx+S+rNY9LorVlXhkhTqnvtNLYWRA1WxSxlCDCw3yjRCJdL9kyc+b7naAog==}
+ engines: {node: '>=22'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
'@ai-sdk/gateway@4.0.46':
resolution: {integrity: sha512-LIAO6kAG8fpXQb9L0iwPk1FIbXftvqnyC56v5NEAzeWTeL8fUsy/Hx86VPBTWEDFdwbVprjWifJOAqS6AOj3mA==}
engines: {node: '>=22'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
+ '@ai-sdk/google@4.0.39':
+ resolution: {integrity: sha512-+mRx7UBZn9PkJ4J6YXowaRZKMZYa290cknVqqOw/roZaDg186IUOLn9JHNQkvgaj91/MLW1AZNESy1ZD2yXDCg==}
+ engines: {node: '>=22'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
'@ai-sdk/openai-compatible@3.0.27':
resolution: {integrity: sha512-icGSoBDbFKZotUwehg7h/JjtD7arweeKfeDcsT9UsPY+YdwiT94JciD59bqAOAdNA3wlS+klW2vsaVLxTUUhbA==}
engines: {node: '>=22'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
+ '@ai-sdk/openai@4.0.36':
+ resolution: {integrity: sha512-wHJNArBdjJPXb8GXcA+FslbRt+7qIE1KoHSAVi+CeBFidinVrTVBZKFMJz3mNZMj8YILBMl/VIvTD/oGFjX6/g==}
+ engines: {node: '>=22'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
'@ai-sdk/provider-utils@5.0.25':
resolution: {integrity: sha512-xscPPHCSjCHWrdhai25sbHCJeKNLW/3D1uSpUZa4cEtTKXA8OnPQ3+Rfu1SmM5Ea/Mf8Dfn3cllw9zeMzo/zFA==}
engines: {node: '>=22'}
@@ -459,6 +504,9 @@ packages:
'@andrewbranch/untar.js@1.0.4':
resolution: {integrity: sha512-pVXSwPsLuw8IGLo2Di0EaOfsk+ntVvpkk942J/sHYIkwvtKUakEcPh7HBgZ6tuimgzKSEHgCvO4XgQ05DEbwDw==}
+ '@antfu/install-pkg@1.1.0':
+ resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+
'@anthropic-ai/sdk@0.91.1':
resolution: {integrity: sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==}
hasBin: true
@@ -578,17 +626,162 @@ packages:
resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
engines: {node: '>=6.9.0'}
+ '@babel/compat-data@7.29.7':
+ resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.29.7':
+ resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.29.8':
+ resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@8.0.0':
+ resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==}
+ engines: {node: ^22.18.0 || >=24.11.0}
+
+ '@babel/helper-annotate-as-pure@7.29.7':
+ resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.29.7':
+ resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-create-class-features-plugin@7.29.7':
+ resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-globals@7.29.7':
+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-member-expression-to-functions@7.29.7':
+ resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.29.7':
+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.29.7':
+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.29.7':
+ resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.29.7':
+ resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-replace-supers@7.29.7':
+ resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
+ resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@8.0.0':
+ resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==}
+ engines: {node: ^22.18.0 || >=24.11.0}
+
'@babel/helper-validator-identifier@7.29.7':
resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-identifier@8.0.4':
+ resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==}
+ engines: {node: ^22.18.0 || >=24.11.0}
+
+ '@babel/helper-validator-option@7.29.7':
+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.29.7':
+ resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.8':
+ resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/parser@8.0.4':
+ resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==}
+ engines: {node: ^22.18.0 || >=24.11.0}
+ hasBin: true
+
+ '@babel/plugin-syntax-jsx@7.29.7':
+ resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.29.7':
+ resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.29.7':
+ resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/runtime@7.29.7':
resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
engines: {node: '>=6.9.0'}
+ '@babel/template@7.29.7':
+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.8':
+ resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.8':
+ resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@8.0.4':
+ resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==}
+ engines: {node: ^22.18.0 || >=24.11.0}
+
'@bomb.sh/args@0.3.1':
resolution: {integrity: sha512-CwxKrfgcorUPP6KfYD59aRdBYWBTsfsxT+GmoLVnKo5Tmyoqbpo0UNcjngRMyU+6tiPbd18RuIYxhgAn44wU/Q==}
+ '@bomb.sh/tab@0.0.19':
+ resolution: {integrity: sha512-dTRfo9Q9B+lbLG3JCu8a/AGQSfD2XXcFcnakQzVjSOX+VvR/s9zpsH8TlqV3iHqazniRn1Ypwd1hcRlXcu/4BA==}
+ hasBin: true
+ peerDependencies:
+ cac: ^6.7.14
+ citty: ^0.1.6 || ^0.2.0
+ commander: ^13.1.0 || ^14.0.0 || ^15.0.0
+ peerDependenciesMeta:
+ cac:
+ optional: true
+ citty:
+ optional: true
+ commander:
+ optional: true
+
'@borewit/text-codec@0.2.2':
resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==}
@@ -603,6 +796,13 @@ packages:
resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==}
engines: {node: '>= 20.12.0'}
+ '@cloudflare/kv-asset-handler@0.4.2':
+ resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@colordx/core@5.5.0':
+ resolution: {integrity: sha512-3PxTH8itZzltK0U9jTwVVnjLXvnDYuq3m+QXsHkENxWiPRh4WaoLcs1SQjqgZ55kS+QyirpH5BVwzP2gMVG6EQ==}
+
'@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
@@ -692,6 +892,12 @@ packages:
resolution: {integrity: sha512-TzlTVpKPjaqW6qOYjQcYUDuGsLCNsvFHVBXkYGTAnf5V37jCWrE5haKNXzz0WZUtVHjrpV76L1buANjwXMfT8w==}
engines: {node: '>=22'}
+ '@dxup/nuxt@0.5.6':
+ resolution: {integrity: sha512-uZjAFoocWtWHr7YP9jm6FqwI8kjX2QN9bjcncoZt0GS+zExIAP3Ewv6EqEUvVP7w9pjZE+T19QxLHeoacN/MNg==}
+
+ '@dxup/unimport@0.1.2':
+ resolution: {integrity: sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ==}
+
'@e18e/eslint-plugin@0.8.0':
resolution: {integrity: sha512-js/TeM+XJyoJ2Zk4if5uTEchv3MEbqugc9gLgq8YdB6Dy+LvwGACpQiAwcul0r4LUl0TvhuzAKUeIUPtGp2cew==}
peerDependencies:
@@ -708,15 +914,24 @@ packages:
engines: {node: '>=22.19.0'}
hasBin: true
+ '@emnapi/core@1.10.0':
+ resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
+
'@emnapi/core@1.11.2':
resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==}
+ '@emnapi/runtime@1.10.0':
+ resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
+
'@emnapi/runtime@1.11.2':
resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==}
'@emnapi/runtime@1.11.3':
resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
+ '@emnapi/wasi-threads@1.2.1':
+ resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
+
'@emnapi/wasi-threads@1.2.2':
resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==}
@@ -895,6 +1110,12 @@ packages:
'@huggingface/transformers@4.2.0':
resolution: {integrity: sha512-8BRCoBMH0XsWaEIamuR0LrJGAfftgHAfb2Vrffy0VKlSAE/MnUJ5/h/zTfEP3fDIft+nk7TqB8xXEyABGitBjQ==}
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/utils@3.1.4':
+ resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==}
+
'@img/colour@1.1.0':
resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
@@ -1032,6 +1253,17 @@ packages:
cpu: [x64]
os: [win32]
+ '@ioredis/commands@1.10.0':
+ resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==}
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@isaacs/fs-minipass@4.0.1':
+ resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+ engines: {node: '>=18.0.0'}
+
'@jitl/quickjs-ffi-types@0.32.0':
resolution: {integrity: sha512-v9T+GQpmk43VDJ7d72sf0Nexhk+ArvtUihW27dy7lqAl0zBObFKtSBBIm5RBjwIhE8VwsPPm9PNuvPvNqLWUEg==}
@@ -1057,15 +1289,29 @@ packages:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@kwsites/file-exists@1.1.1':
+ resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==}
+
+ '@kwsites/promise-deferred@1.1.1':
+ resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==}
+
'@loaderkit/resolve@1.0.6':
resolution: {integrity: sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==}
+ '@mapbox/node-pre-gyp@2.0.3':
+ resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
'@mdream/crawl@1.5.12':
resolution: {integrity: sha512-jNR0HTQGagYwzKuO0oMG4HN+Og5esckbphtYlQI3esW9Ax8Pvd/EJK9evExikW/qikhamckMA6vgM9z+ZUR6AA==}
hasBin: true
@@ -1266,14 +1512,109 @@ packages:
'@nodable/entities@3.0.0':
resolution: {integrity: sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==}
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@nuxt/cli@3.37.0':
+ resolution: {integrity: sha512-Zj9NwHjEBzVrgezsgMFjpMhNqwNgROk9DzNi/dyfk1mCbXIRigV11br2xOl0Satek30bmv7oZAfMtCnDe6Ip0Q==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ hasBin: true
+ peerDependencies:
+ '@nuxt/schema': ^4.4.6
+ peerDependenciesMeta:
+ '@nuxt/schema':
+ optional: true
+
+ '@nuxt/devalue@2.0.2':
+ resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==}
+
+ '@nuxt/devtools-kit@3.4.1':
+ resolution: {integrity: sha512-6ltPm2yUW8GvDdf3VJna7+flLi+ej7xRfSr+S4ovevKt/CuPf9EqYOn1jW7Kw/U1MXt/71zkn+/O2vu3G6O9Hg==}
+ peerDependencies:
+ vite: '>=6.0'
+
+ '@nuxt/devtools-wizard@3.4.1':
+ resolution: {integrity: sha512-taGeuTnkHsZVjgD9r6NXvvHaBzB2j4mCgOmlmkz3ntsqgh1SJfmsD11Tmtl7FVAxJS8Wuvuzgt0GyTlADBW9Wg==}
+ hasBin: true
+
+ '@nuxt/devtools@3.4.1':
+ resolution: {integrity: sha512-20zZs6k/zAdi+PM7s1BwxE3hanZ+R1OGi5DWCKPyzSnhUUeeNebvWNgec7Rwnx6iKLkJfK4WFIZ+FL2QurG/ZQ==}
+ hasBin: true
+ peerDependencies:
+ '@vitejs/devtools': '*'
+ vite: '>=6.0'
+ peerDependenciesMeta:
+ '@vitejs/devtools':
+ optional: true
+
'@nuxt/kit@3.21.11':
resolution: {integrity: sha512-0Xi3tgwN77w43Q8GCPIrvWmF1J7Peehkts44E0uKNIml9lB8WoUn8YxyUjxBv47XtVR86NWoWALAT+/IEMHJEA==}
engines: {node: '>=18.12.0'}
+ '@nuxt/kit@4.5.2':
+ resolution: {integrity: sha512-l66LU9DcJYjmNwqwAj2I5UGRrUbnG2DOKGChnN70zIGtn0eq/z87gi/FRgha6eMb9/FmB1PFHgtx6PWVml1C2Q==}
+ engines: {node: '>=18.12.0'}
+
+ '@nuxt/nitro-server@4.5.2':
+ resolution: {integrity: sha512-sx/vtT8D1WIRUOMuKQz/9z8nZb7jgVWc6HWwlkXKDjYZ84otPFtYCozKqhXWv6xf3JxJvge/RUAOwh9Z7P4nQQ==}
+ engines: {node: ^22.19.0 || ^24.11.0 || >=26.0.0}
+ peerDependencies:
+ '@babel/plugin-proposal-decorators': ^7.25.0 || ^8.0.0
+ '@babel/plugin-syntax-typescript': ^7.25.0 || ^8.0.0
+ '@rollup/plugin-babel': ^6.0.0 || ^7.0.0
+ nuxt: ^4.5.2
+ peerDependenciesMeta:
+ '@babel/plugin-proposal-decorators':
+ optional: true
+ '@babel/plugin-syntax-typescript':
+ optional: true
+ '@rollup/plugin-babel':
+ optional: true
+
'@nuxt/schema@3.21.11':
resolution: {integrity: sha512-5Couz53Pl/SgTwtMQ9jlxVIC6wZk9aAbWyeOD7D6D1UIP5DzV/yV5lPDY/kM0nmiqPSzJf9WLTdJgB2gNm0dOA==}
engines: {node: ^14.18.0 || >=16.10.0}
+ '@nuxt/schema@4.5.2':
+ resolution: {integrity: sha512-h9g1kt9O2iU9nX6HDFu9gvwtpn+8oSJX0RSTWRBnEx/Pkz+WlOHtjuS0SbkTAXw5aT1+H1GysWVwNTjJfBY/0w==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ '@nuxt/telemetry@2.8.0':
+ resolution: {integrity: sha512-zAwXY24KYvpLTmiV+osagd2EHkfs5IF+7oDZYTQoit5r0kPlwaCNlzHp5I/wUAWT4LBw6lG8gZ6bWidAdv/erQ==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+ peerDependencies:
+ '@nuxt/kit': '>=3.0.0'
+
+ '@nuxt/vite-builder@4.5.2':
+ resolution: {integrity: sha512-fC8KUs5F1VpSEjTIjmx5pdflciMlp3FDCubx3AXElvRPLtBAPmyB69kmqVFjRnVQ8+vRHNyI7iBHUg9Se8srLA==}
+ engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0}
+ peerDependencies:
+ '@babel/plugin-proposal-decorators': ^7.25.0 || ^8.0.0
+ '@babel/plugin-syntax-jsx': ^7.25.0 || ^8.0.0
+ nuxt: 4.5.2
+ rolldown: ^1.0.0
+ rollup-plugin-visualizer: ^6.0.0 || ^7.0.1
+ vue: ^3.3.4
+ peerDependenciesMeta:
+ '@babel/plugin-proposal-decorators':
+ optional: true
+ '@babel/plugin-syntax-jsx':
+ optional: true
+ rolldown:
+ optional: true
+ rollup-plugin-visualizer:
+ optional: true
+
'@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
@@ -1282,6 +1623,37 @@ packages:
resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==}
engines: {node: '>=14'}
+ '@orpc/client@2.0.0-beta.26':
+ resolution: {integrity: sha512-TT2+S4TP/EzU19mXqzqnd938tuaOss7prtXqlowY1MZh1wxsEW6t5b+RI310yHtgLM5u/ovku26BvOpl5Fb49Q==}
+
+ '@orpc/contract@2.0.0-beta.26':
+ resolution: {integrity: sha512-tTeJBN0s+weE67t6Xyjt7pCnSaytWrUase4VdyajjjtWba2wxqIwMHITyvSKohmLVwym6LYAoGLqXF4ORgwHYQ==}
+
+ '@orpc/server@2.0.0-beta.26':
+ resolution: {integrity: sha512-IBvwkJkCkPMxOLd2A2Js2baTXc4FE//W+wnXrMXkdNXarwjId9AJ+NJngxHitjepQKqc2fnqvWlMDvypS3WdQg==}
+ peerDependencies:
+ crossws: '>=0.3.4'
+ fastify: '>=5.6.1'
+ peerDependenciesMeta:
+ crossws:
+ optional: true
+ fastify:
+ optional: true
+
+ '@orpc/shared@2.0.0-beta.26':
+ resolution: {integrity: sha512-rbzPz6fSE+5WWn1uesSnekBIy4aJFx0ocGI3EcWVAu8l0ILLjdufof6A2E9RwvRSZeEefIE9D7iadW044YCBSw==}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.9.0'
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+
+ '@oxc-parser/binding-android-arm-eabi@0.131.0':
+ resolution: {integrity: sha512-t2xicr9pfzkSRYx5aPqZqlLaayIwJTqgQ81Jor31Xep2nGyL2Aq3d0K5wOfeR7VevaSdxaS9dzSQP9xDwn8fDg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [android]
+
'@oxc-parser/binding-android-arm-eabi@0.142.0':
resolution: {integrity: sha512-ZiRGDutGsv1G6bL/ozy/koC0Sv39T1DqyoC4KD1DOy9ZoACm1O5UWhEK2c02Qdk+4lfLVkvFa/mQ0fm/4h1BtQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1294,6 +1666,12 @@ packages:
cpu: [arm]
os: [android]
+ '@oxc-parser/binding-android-arm64@0.131.0':
+ resolution: {integrity: sha512-nlGIod6gw75x1aEDgLS+srj+JRGY0HHm9MI9YgzE/B64l6d6+H3MSP9NOgp0+HTg8tp4vV9rVfgQGgd+TfVZcA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
'@oxc-parser/binding-android-arm64@0.142.0':
resolution: {integrity: sha512-WZkvGRLNQTz8lR9zP5nLjUdlroRCopBu3g9zF1p/laE6DzT1UbQo8Rdz5MWhaJUPYg/6gp+jo7HUgsyKaN1FtQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1306,6 +1684,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@oxc-parser/binding-darwin-arm64@0.131.0':
+ resolution: {integrity: sha512-jukuV6xe5RbQKFo7QD34NDCLDZp4PSOm8rmckhNdH/60ymG5zXbDzGBEyc+nTkuLQNama2aSGCt+CPfpjNTqyw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
'@oxc-parser/binding-darwin-arm64@0.142.0':
resolution: {integrity: sha512-l4khS8LQOOVYsGRVARo1gSaCT/aBSceUVXgtovWc2+drnxVuDr082WA3OCHVdVzIz5JIrP/y9CWsSKxBDNmYGg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1318,6 +1702,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@oxc-parser/binding-darwin-x64@0.131.0':
+ resolution: {integrity: sha512-g3JOo4khe9rslHm5WYaVDWb0HS/M1MLR3I9S8560MkKIcC96VQY00QjOlsuRyfSj/JDXj8i9T7ryPO2RidiXVg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
'@oxc-parser/binding-darwin-x64@0.142.0':
resolution: {integrity: sha512-QBsNF3nqlXmcH2B1YOPqQYmCJoy4HuIjUxGbBO/k5JAJUl68ghU2psRY2zPk+RyBaWqKP/qfL4oaFgEMCdwskA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1330,6 +1720,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@oxc-parser/binding-freebsd-x64@0.131.0':
+ resolution: {integrity: sha512-1hziITDTxjMePnX+dR9ocVT+EuZkQ8wm4FPAbmbEiKG+Phbo73J1ZnPAA6Y/aGsWF3McOFnQuZIktAFwalkfJQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
'@oxc-parser/binding-freebsd-x64@0.142.0':
resolution: {integrity: sha512-b7Q7m4Cqc6XqNhri3R+QhU+GVy646Pn+bkdhrDdWym/Fdi0ZUa+d73H9dm5H91JtbtAQ/z1d8XKMW3oOV8a4tQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1342,6 +1738,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@oxc-parser/binding-linux-arm-gnueabihf@0.131.0':
+ resolution: {integrity: sha512-9uRxfXwyKG9+MwmGQBo2ncPNwZH5HTmCETFM2WiuDBNDCW4NC5ttSQkwCAMrTAWgwMzVBH1CP8pM0v7nebCWXQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
'@oxc-parser/binding-linux-arm-gnueabihf@0.142.0':
resolution: {integrity: sha512-3riVS5IhdH3uCZj1Y9ftDQlR0dvLsIlw/edrRqk8JhgNd5K0XSs+UBtgh50N13CAlW9/TXj6sVGXaKNBocd0Yg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1354,6 +1756,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@oxc-parser/binding-linux-arm-musleabihf@0.131.0':
+ resolution: {integrity: sha512-mgbLvzRShXOLBdWGInf08Af4q+pfj1xD8hSgLClDZ9of/BXkB6+LIhTH7fihiDUipqB3yoSkKBWaZ3Ejlf5Yag==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
'@oxc-parser/binding-linux-arm-musleabihf@0.142.0':
resolution: {integrity: sha512-NmXUOpgpTSkhl795TiXmWppTwmSJ92RC1qvD6e4XOF+slgmo3e6Ah+kEu+6AN8s7NAOEwqGmir58MgSQSWmBSA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1366,6 +1774,13 @@ packages:
cpu: [arm]
os: [linux]
+ '@oxc-parser/binding-linux-arm64-gnu@0.131.0':
+ resolution: {integrity: sha512-OPT8++4aN6j2GJ8+3IZHS/byXoZP4aSBn+FoG6rgBJ2fKwPKXWF3MqrFMNW7NKHM28FLY579xYLxJSfgobEqPA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@oxc-parser/binding-linux-arm64-gnu@0.142.0':
resolution: {integrity: sha512-gc0EXsKtXgerujmU2Bql3u1L1HsSQ2774R83idq/FoNMPVV/RY/1ErFsvnit7KoiP/sLvzQixeUo4Ut0ic0wmw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1379,6 +1794,13 @@ packages:
cpu: [arm64]
os: [linux]
+ '@oxc-parser/binding-linux-arm64-musl@0.131.0':
+ resolution: {integrity: sha512-vtPiwmfVTAXzaxDKsOXG+LwgRAA7WEnaeHzhS5z0GE89gAK18KSXnly7Z6saXXq6L3dVMyK44uoTI03zKxrpmw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@oxc-parser/binding-linux-arm64-musl@0.142.0':
resolution: {integrity: sha512-F2XvmWSE0uWpie+jHKKIFgdVOe9ypGhkEZxKx5DuW215K6cbAC274yYaPkcM7EqY4Df3Weyhpcz3lsURyH2LVg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1392,6 +1814,13 @@ packages:
cpu: [arm64]
os: [linux]
+ '@oxc-parser/binding-linux-ppc64-gnu@0.131.0':
+ resolution: {integrity: sha512-8AW8L7w5cGHSdZPcyZX2yR0+GUODsT15rbRjfdD54rv6DMbtuEB19ysLOpKJlRGfH6UNYNpCHaU1uJWgTWf1/w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
'@oxc-parser/binding-linux-ppc64-gnu@0.142.0':
resolution: {integrity: sha512-wLMbT21U/QxknQsk+VvNF0b9D2/aGWhcaQQQ+VYlE8FwD5+GoWZIPPXNzyHmkYyhm0KB3itL+TBavjMatqNnYA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1405,6 +1834,13 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@oxc-parser/binding-linux-riscv64-gnu@0.131.0':
+ resolution: {integrity: sha512-vvpjkjEOUsPcsYf8evE4MO3aGx9+3wodXEBOicGNnOwTuAik8eBONNkgSdhkGsAblQmfVHJyanRnpxglddTXIA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
'@oxc-parser/binding-linux-riscv64-gnu@0.142.0':
resolution: {integrity: sha512-+G8F/4ckwT7FCJV4H2bt09xEzJbjNCfuL4Sp1AYNaFtFMVtgIGMuJlteT82U+K0UIZ/DzAR/LDlMFnEuajG7Kw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1418,6 +1854,13 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@oxc-parser/binding-linux-riscv64-musl@0.131.0':
+ resolution: {integrity: sha512-AqmcNC3fClXX+fxQ6VGEN1667xVFiRBkY0CZmDMSiaeFUsv1+UkBPYYi48IUKcA9/ivvoKNRzQl2I4//kT9F/w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
'@oxc-parser/binding-linux-riscv64-musl@0.142.0':
resolution: {integrity: sha512-hTsHtTLxMAfCo+rpF5K3qZJKW2NpPN/CHd4mYB3y7XlSdspHkd2gehDIofP64AacA9nWQw2tY3O7wR6UY8IVOA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1431,6 +1874,13 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@oxc-parser/binding-linux-s390x-gnu@0.131.0':
+ resolution: {integrity: sha512-7d3jOMKy7RSQCcDLIci+ySll2FgsOMl/GiRux4q2JNv0zg4EdhFISa9idvrdN/HEUIQQJNg6dmveUeJl2YErGA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@oxc-parser/binding-linux-s390x-gnu@0.142.0':
resolution: {integrity: sha512-6y7qYY3TCUDYjqswImdTGl92y+KA/80twALegQPN27kfY+bG7Ib1+L3jbmrCZQx6wrVnai9IPsEZp07I0hx7JQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1444,6 +1894,13 @@ packages:
cpu: [s390x]
os: [linux]
+ '@oxc-parser/binding-linux-x64-gnu@0.131.0':
+ resolution: {integrity: sha512-JHK/h95qVqVQ+ITER837kcTdwBDFpFaNnOTYGCP0zdUSX/mLKC7tXOoyrTb6vG7iRPwGlcgBil3v2IjYw1FqJA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@oxc-parser/binding-linux-x64-gnu@0.142.0':
resolution: {integrity: sha512-i69kAWU+2LgoH5bR+zWiiu+UzAw7Oxkwv7COeJTeY19pn4e70nKQcr9Pm6cL2Z0Z54d+gl9qADlK/0yyuCPiBA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1457,6 +1914,13 @@ packages:
cpu: [x64]
os: [linux]
+ '@oxc-parser/binding-linux-x64-musl@0.131.0':
+ resolution: {integrity: sha512-b2BO82O8azXAyf7EUgOPKu145nWypbNyk07HbU09fkzhm9lEA5oPvaN/M8Nlo7tOErVTa2WOgS4QbOnxAPXdDQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@oxc-parser/binding-linux-x64-musl@0.142.0':
resolution: {integrity: sha512-4SQs678MmjYVrmhAgCWD4o0vpaFszXw9xLX5p2Z9MMFcltxiLkA88wQjh80YHjPrXtpyZ2CWI5m+1yNKM0m2Pw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1470,6 +1934,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@oxc-parser/binding-openharmony-arm64@0.131.0':
+ resolution: {integrity: sha512-GHO9glZaX7LkX/OGfluEPf1yjg+ehiFbUdowbX6uNWOQhmwKWU4m4+nZ9FJkrHNKuxyI1KKertMdGjVKCApKWA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
'@oxc-parser/binding-openharmony-arm64@0.142.0':
resolution: {integrity: sha512-YHpx9N7Ln3a++Tc8rv+H7mrK1zyJQOAwCFg8LZ3lTs1T5afGWeZrLPhPT9HLnIwSjCyJqPWVMIrMxbjcmBr2oQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1482,11 +1952,22 @@ packages:
cpu: [arm64]
os: [openharmony]
+ '@oxc-parser/binding-wasm32-wasi@0.131.0':
+ resolution: {integrity: sha512-3SkikPaEFoih1N83qLVEDLRLeY4nYsf6JT9SnWiMCQ5lGQdKup6bEuKCqkRiG9dD1IIaFeYz9RjlciPmYoFIWA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [wasm32]
+
'@oxc-parser/binding-wasm32-wasi@0.142.0':
resolution: {integrity: sha512-3pLDyY3+oogW73RM5uehNgAiR/Xfb7fvO2Q1Z1gIqZ2+50XDVQmBVlRkHXZTU4gKnQHpwETNsYQVsJ3joVB2iA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [wasm32]
+ '@oxc-parser/binding-win32-arm64-msvc@0.131.0':
+ resolution: {integrity: sha512-Os5bEhryeA2jkH+ZrnZyAC1EP5gs+X4YB1Fjqml7UPD5kU7ecsK1MPEVMfCrdt/GDNpDbavYXiOXOdyJ5b3OPw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
'@oxc-parser/binding-win32-arm64-msvc@0.142.0':
resolution: {integrity: sha512-Had/VeVY28Oyb0K+Q4FV8KCzoBycIh93oDK6pCbya9lkzdq+ikMHMgBubsdqqlybjJmQRawCQRrnBRHyQwYvcQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1499,6 +1980,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@oxc-parser/binding-win32-ia32-msvc@0.131.0':
+ resolution: {integrity: sha512-m+jNz9EuF0NXoiptc6B9h5yompZQVW/a5MJeOu5zojfH5yWk82tvF2ccrHkfhgtrS9h9DD5l1Qv8dWlfY7Nz8g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ia32]
+ os: [win32]
+
'@oxc-parser/binding-win32-ia32-msvc@0.142.0':
resolution: {integrity: sha512-GGi3+YphVHavvgs6gum2UXoNCqzHAmPt/nXkn8ZQZstV2Q1qZD1Mn8fz/nWrDkefHQtrG/+1/XrbMxsBTo6Svw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1511,6 +1998,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@oxc-parser/binding-win32-x64-msvc@0.131.0':
+ resolution: {integrity: sha512-o14Hk8dAyiEUMFEWEgmAwFZvBt1RzAYLM3xeQ+5315JXgVYhoemivgYcbYVRbsFkS71ShMGlAFE0kPnr460rww==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
'@oxc-parser/binding-win32-x64-msvc@0.142.0':
resolution: {integrity: sha512-Ny/Wv4Us1LGC/ljwNTp+Hx3r/pH15EFfeDF0p+n898gt+TtRd6C9SccHcuUhDiNTb8s5tt7jdeAMDRQZ4Vq6hg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1523,6 +2016,9 @@ packages:
cpu: [x64]
os: [win32]
+ '@oxc-project/types@0.131.0':
+ resolution: {integrity: sha512-PgnWDfV0h+b16XNKbXU7Daib/BFSt/J2mEzfYIBu6JB/wNdlU+kVYXCkGA1A9fWkTbOgbjh4e6NhPeQOYvFhEA==}
+
'@oxc-project/types@0.142.0':
resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==}
@@ -1890,6 +2386,26 @@ packages:
cpu: [x64]
os: [win32]
+ '@parcel/watcher-wasm@2.6.0':
+ resolution: {integrity: sha512-dtjbDxKSDPQ8AmA+pS4OFaHE1FKrjtGpLGBxw85uKFkRorjNbvDM/aFPgqosu40wprbp1xw2ZSxIKqghCUHe2w==}
+ engines: {node: '>= 10.0.0'}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@polka/url@1.0.0-next.29':
+ resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
+
+ '@poppinss/colors@4.1.6':
+ resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==}
+
+ '@poppinss/dumper@0.7.0':
+ resolution: {integrity: sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==}
+
+ '@poppinss/exception@1.2.3':
+ resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==}
+
'@protobufjs/aspromise@1.1.2':
resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
@@ -2034,6 +2550,78 @@ packages:
'@rolldown/pluginutils@1.0.1':
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
+ '@rollup/plugin-alias@6.0.0':
+ resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==}
+ engines: {node: '>=20.19.0'}
+ peerDependencies:
+ rollup: '>=4.0.0'
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/plugin-commonjs@29.0.3':
+ resolution: {integrity: sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==}
+ engines: {node: '>=16.0.0 || 14 >= 14.17'}
+ peerDependencies:
+ rollup: ^2.68.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/plugin-inject@5.0.5':
+ resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/plugin-json@6.1.0':
+ resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/plugin-node-resolve@16.0.3':
+ resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^2.78.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/plugin-replace@6.0.3':
+ resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/plugin-terser@1.0.0':
+ resolution: {integrity: sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ rollup: ^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/pluginutils@5.4.0':
+ resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
'@rollup/rollup-android-arm-eabi@4.62.4':
resolution: {integrity: sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==}
cpu: [arm]
@@ -2163,6 +2751,12 @@ packages:
resolution: {integrity: sha512-693yWouX+hR9uJm1Jgq0uSSjbSD3UrblMaxiuGbHPjSwzLCSZTcm0h3kvdVhq3o/yl4+oeAWW3hiaJ0TELuRJQ==}
engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
+ '@simple-git/args-pathspec@1.0.3':
+ resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==}
+
+ '@simple-git/argv-parser@1.1.1':
+ resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==}
+
'@simple-libs/child-process-utils@2.0.0':
resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==}
engines: {node: '>=22'}
@@ -2175,6 +2769,14 @@ packages:
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
engines: {node: '>=10'}
+ '@sindresorhus/is@7.2.0':
+ resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==}
+ engines: {node: '>=18'}
+
+ '@sindresorhus/merge-streams@4.0.0':
+ resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+ engines: {node: '>=18'}
+
'@smithy/core@3.31.1':
resolution: {integrity: sha512-CyogUINxvi7C7LDsh8Syo6hVJOT9ckz4rG8dRZfTJ8r91HkMY59PnNooaj7WcHyxEkxPfBAmbgztZU+xTo76lg==}
engines: {node: '>=18.0.0'}
@@ -2215,9 +2817,38 @@ packages:
resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==}
engines: {node: '>=14.0.0'}
+ '@speed-highlight/core@1.2.23':
+ resolution: {integrity: sha512-iRoq6i6JDJP6Mt2A5JaPvzw0pgYHH6k92ij+yXiTrB7T2y9N789aWE3EHWj/5ztlJBokcCBja3iYLVdu5wgnkg==}
+
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+ '@standardserver/aws-lambda@0.7.1':
+ resolution: {integrity: sha512-fuwAx2M2O5Bnjk2JdFrtEQALmBwVtnn4jKApzFVmlIivWA7EGMj5kOzCNaJizxCQXlhPmC+doDHqf/H7FKMaNA==}
+
+ '@standardserver/core@0.7.1':
+ resolution: {integrity: sha512-ZMoFDR92p9HnaI6vXK1iNFKXyLK8/6r3D4EJUM+SqeyReUH3OEJO4CZKU8BfXyzAV1A6Nsa7y2dGqDOYqH5LlQ==}
+
+ '@standardserver/fastify@0.7.1':
+ resolution: {integrity: sha512-Oa+ttR0CyNkFjNczs2dO/WFFeZ4sAszVBKIOhKb1FFcDtD9VdqDgMBhbQ4sFR885fwpYckoYjFU6xXWWTueBlw==}
+ peerDependencies:
+ fastify: '>=5.6.1'
+ peerDependenciesMeta:
+ fastify:
+ optional: true
+
+ '@standardserver/fetch@0.7.1':
+ resolution: {integrity: sha512-BeiAWESedv0woYpoBHCnq2Y3xLZZ3voFahdzpFd+HqLyenXIL4XX3z7/WgWNQnf+WsSQrK6HzBkDWCicCXVoKQ==}
+
+ '@standardserver/node@0.7.1':
+ resolution: {integrity: sha512-Ikc07cGBTJ8tJgPd1OanNKVNpijcbixB1iKk0GdL/b1vkYbriGgNW3oHvbApM7+XqeCeNHj5XawHk6q90mwEEA==}
+
+ '@standardserver/peer@0.7.1':
+ resolution: {integrity: sha512-ggqPbwz4X4GIziQgoyCTDHFw9nM9YuEvlSpO21pfoXLYF80ijtpN/iq4P0zKpb4kcXnBoSVDRUSnBJSZi0SJDg==}
+
+ '@standardserver/shared@0.7.1':
+ resolution: {integrity: sha512-tBDheI3Me1gQEKPU+XhcCZ6/njmkKgJhA5rhi1/m6GauGhHq87UuVslDNc8qB+T/xsxVch/qETFhssEWO9c6BA==}
+
'@tokenizer/inflate@0.4.1':
resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==}
engines: {node: '>=18'}
@@ -2267,9 +2898,18 @@ packages:
'@types/estree@1.0.9':
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+ '@types/jsesc@2.5.1':
+ resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
'@types/node@24.13.3':
resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==}
+ '@types/resolve@1.20.2':
+ resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
+
'@types/retry@0.12.0':
resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
@@ -2308,6 +2948,130 @@ packages:
cpu: [x64]
os: [win32]
+ '@unhead/bundler@3.3.1':
+ resolution: {integrity: sha512-F9gEgqpUKqHFzOv+7Pgm3TbmXhUdLX+WjZiPAK/huLDzblzZmvAUE9vRDymWaOST7jqGT/tPKkwl2kqbgb3nPw==}
+ peerDependencies:
+ '@unhead/cli': ^3.3.1
+ '@vitejs/devtools-kit': ^0.4.1
+ esbuild: '>=0.17.0'
+ lightningcss: '>=1.20.0'
+ oxc-parser: '>=0.98.0'
+ rolldown: '>=1.0.0'
+ unhead: ^3.3.1
+ vite: '>=6.4.2'
+ webpack: '>=5.0.0'
+ peerDependenciesMeta:
+ '@unhead/cli':
+ optional: true
+ '@vitejs/devtools-kit':
+ optional: true
+ esbuild:
+ optional: true
+ lightningcss:
+ optional: true
+ oxc-parser:
+ optional: true
+ rolldown:
+ optional: true
+ vite:
+ optional: true
+ webpack:
+ optional: true
+
+ '@unhead/vue@3.3.1':
+ resolution: {integrity: sha512-iS+eiE1NehbV/eF7wzR7UUuUVTv8fIphFOCekQvEMuPqfKPCB8f3wf7sgPgUngYX6mdgM6PmkGmaOQgTBxqwbw==}
+ peerDependencies:
+ vite: '>=6.4.2'
+ vue: '>=3.5.18'
+ webpack: '>=5.0.0'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ webpack:
+ optional: true
+
+ '@unocss/cli@66.7.5':
+ resolution: {integrity: sha512-fgWkECRn2LGVo9sEpmjk/KJ3NSKUDitaZCNrJcEYM93DG+ELriTHcL+VWBlF4rcZf9fdGlq1nKbbRHUZirFCHQ==}
+ hasBin: true
+
+ '@unocss/config@66.7.5':
+ resolution: {integrity: sha512-dkPl9glhEahJ+Xoja5ZseKKnH+vZaeaKQzg8b0otcKcPPNrHQgu1nu3QgfeOjnXOGrjZIotHwUeVtt4ZA2Skgg==}
+
+ '@unocss/core@66.7.5':
+ resolution: {integrity: sha512-UdJb8MiMywcau8QrWEVgUAz0kvoFHyR+sACwYCgmBh/BpKJGyR/zw/Ys3wvysbm0f+i/20VGBex/QQxYVlzdyQ==}
+
+ '@unocss/extractor-arbitrary-variants@66.7.5':
+ resolution: {integrity: sha512-5zOkbnLIJc8E749qNjLXfPHl3FdHloop12h706/ojr6idK4ix0KLm43R//uLnphixCehdHJRuHnavnM4C/kQbA==}
+
+ '@unocss/inspector@66.7.5':
+ resolution: {integrity: sha512-WmTJMnj8bmRxvw/wGeShmL2eEHr2/L0BdGTXSxhfzwcO8y5XZEbBmVciLcM7pqaTXQ6JY4+KnITrDUf1urjZxQ==}
+
+ '@unocss/nuxt@66.7.5':
+ resolution: {integrity: sha512-jEpG/bvPjjpXqr/hmTXxDZLajI/SyakviVX03djtcJl8jih1khXMqUAAehLcFUJg1DvoUIUdReGagTJGdyGPNw==}
+
+ '@unocss/preset-attributify@66.7.5':
+ resolution: {integrity: sha512-1Oi1Cp81pqYJwG3h4+OlP5A0FKyaa07MFBXaXc4Yr3faiTbsI8SKj2TqnZCb+NQvBsEqslEd+jKXGZ3lKzCVOQ==}
+
+ '@unocss/preset-icons@66.7.5':
+ resolution: {integrity: sha512-ZsxadWnGGtHdANTikuMnjkQaT1qwUFJHZBF4fzVsPMnUiiKGs8rzXukwM9w3Gi9ontM7nbG2FYi9clWETSlpFg==}
+
+ '@unocss/preset-mini@66.7.5':
+ resolution: {integrity: sha512-o37TSl4ecT0dKu+3/TYuTYht75h82SEwDNl476m9ve0KW4Pv1O2tT/9TWd7N5cutEpySr8/YtjMwtWBD+drxBg==}
+
+ '@unocss/preset-tagify@66.7.5':
+ resolution: {integrity: sha512-/8YB1tXVi+WmNKPhsCdtO1xnQKEkshSnWDp6AbvVP3f6qOF7adlMYpAt3kpWCoVUBsfOQ06ZQlnfricMjObyoQ==}
+
+ '@unocss/preset-typography@66.7.5':
+ resolution: {integrity: sha512-2dxC8LT9KYa29UZT4muDFl7DbIXvKktTfeSMbUGMdZKbHcuMtKSP2U52wti1PL5I9duqp4v+8G33EeVutGTUaQ==}
+
+ '@unocss/preset-uno@66.7.5':
+ resolution: {integrity: sha512-zaUlYgNngbt50fZA/LbtsEnmPKojPqeiXCyUUiKQMv2uJQhncR32xhLZXVQ+TJD7hlfZ+6FAqlco1NIiAcub9w==}
+
+ '@unocss/preset-web-fonts@66.7.5':
+ resolution: {integrity: sha512-OLLTK7kswdSu51qxEm6O+AehecgCfS08Ivqo+280lKzFW7V1jXr5okeJ1ty+85oHCprJqzcD9iG1khxNRLomcA==}
+
+ '@unocss/preset-wind3@66.7.5':
+ resolution: {integrity: sha512-atFe/7Qein+oMdyZs0hEo+3EjV99Av2LVxDbzpCungxIfbS3TnQt70EIuHXMPNCVWLYwrMV+/P1n9Ntb0E3mow==}
+
+ '@unocss/preset-wind4@66.7.5':
+ resolution: {integrity: sha512-n3jIvQv8x1jXpmWfvNFBIqHNARki4mKZXfxAA31gekpXsRRTg16u1+yC1+PBBJgoEDFEnnmKnG7EZP88S8LVXA==}
+
+ '@unocss/preset-wind@66.7.5':
+ resolution: {integrity: sha512-LVKgGr0A9Lc7F85xGXrrb71DDXMlHGA8bcj/Kht8BCsuRdBZadNbLlnv5qnSJiHYhi3/blzcgVoaeRor6L9yNA==}
+
+ '@unocss/reset@66.7.5':
+ resolution: {integrity: sha512-z3wbt2cuQPjtT6w5xzRYZYFIIlUPzhVKz8yIcE9fvu7BgR3hO7uVsg/5mzDoGwQ96Ya3Sk68rpmI/gLYl4bJag==}
+
+ '@unocss/rule-utils@66.7.5':
+ resolution: {integrity: sha512-/AKHBRF6ZOexE3EDDv8ZEYh40P5e2Eha41IYUbE1wjigW7++ssmvimSTdufJzZvU5DGP++E3B3WEsFPprZMjAg==}
+
+ '@unocss/transformer-attributify-jsx@66.7.5':
+ resolution: {integrity: sha512-r8qDwNSt0eGSwWws3xsuIHb3PZYR2embFdYoE67hD/xlYgLjX1uPy/HUlGCSSh4uLc4vVYjurr0Oq5xF/B8YiA==}
+
+ '@unocss/transformer-compile-class@66.7.5':
+ resolution: {integrity: sha512-KuECgsGF7tGe808vIvKViEjI0UCUgYgneJfK+/TWBkjC7s8dLVaUtJzzcP9/r6OfGlgyn/x1YTdRqTaCENa7Xg==}
+
+ '@unocss/transformer-directives@66.7.5':
+ resolution: {integrity: sha512-VMJApXXOwlDubkW+cNMmOkfxLefFupJr+yU23gGYUB2NPsuVltc8H5CDM0gfVebpeL5CUW05evxzEAk2wsju+Q==}
+
+ '@unocss/transformer-variant-group@66.7.5':
+ resolution: {integrity: sha512-iDmP3mM8J+IxuQf5Uh33zsi528xnGxTpKRJ0c+LCrqBTTkR2tZr4aCzNmJ0g29Js2yEOsyNXRRc8BNTuvgn0AA==}
+
+ '@unocss/vite@66.7.5':
+ resolution: {integrity: sha512-1z1TBCNJCR2WzjPtjzmCHr8rtzXHosMjLdsCNe6Mzsfwiw044gzzLVuiEZO9vIjkI50lvQ+gIOxOiVQG0hGAeA==}
+ peerDependencies:
+ vite: ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0-0
+
+ '@unocss/webpack@66.7.5':
+ resolution: {integrity: sha512-9ji+BsB1VyspbEZwcwGPZPF6uuPpsRm9gBNMK14Toib33QIiBqpEBNzBNGNfbIjne3hmS6fGySN344Z0VldHcA==}
+ peerDependencies:
+ webpack: ^5
+
+ '@vercel/nft@1.10.2':
+ resolution: {integrity: sha512-w+WyX5Ulmj4dtTZrxaulqrjaLZHSbnPzx75SJsTNYmotKsqn1JlLnDJa+lz5hn90HJofhl/2MAtw0mCrgM3qYw==}
+ engines: {node: '>=20'}
+ hasBin: true
+
'@vercel/oidc@3.2.0':
resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==}
engines: {node: '>= 20'}
@@ -2316,6 +3080,20 @@ packages:
resolution: {integrity: sha512-opKUSsQOuxNSP9o6otsrxjSr7CVSHvuJFvTp/DTZUYUhhebMHdSdxslUBX08CEfk4ejc7IW6KQErlOJF4SmZnw==}
engines: {node: '>=24.0.0'}
+ '@vitejs/plugin-vue-jsx@5.1.6':
+ resolution: {integrity: sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ vue: ^3.0.0
+
+ '@vitejs/plugin-vue@6.0.8':
+ resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ vue: ^3.2.25
+
'@vitest/expect@3.2.7':
resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==}
@@ -2345,12 +3123,138 @@ packages:
'@vitest/utils@3.2.7':
resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==}
+ '@volar/language-core@2.4.28':
+ resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
+
+ '@volar/source-map@2.4.28':
+ resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==}
+
+ '@volar/typescript@2.4.28':
+ resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==}
+
+ '@vue-macros/common@3.1.4':
+ resolution: {integrity: sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==}
+ engines: {node: '>=20.19.0'}
+ peerDependencies:
+ vue: ^2.7.0 || ^3.2.25
+ peerDependenciesMeta:
+ vue:
+ optional: true
+
+ '@vue/babel-helper-vue-transform-on@2.0.1':
+ resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==}
+
+ '@vue/babel-plugin-jsx@2.0.1':
+ resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+
+ '@vue/babel-plugin-resolve-type@2.0.1':
+ resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@vue/compiler-core@3.5.41':
+ resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==}
+
+ '@vue/compiler-dom@3.5.41':
+ resolution: {integrity: sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==}
+
+ '@vue/compiler-sfc@3.5.41':
+ resolution: {integrity: sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==}
+
+ '@vue/compiler-ssr@3.5.41':
+ resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==}
+
+ '@vue/devtools-api@8.2.1':
+ resolution: {integrity: sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==}
+
+ '@vue/devtools-core@8.2.1':
+ resolution: {integrity: sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==}
+ peerDependencies:
+ vue: ^3.0.0
+
+ '@vue/devtools-kit@8.2.1':
+ resolution: {integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==}
+
+ '@vue/devtools-shared@8.2.1':
+ resolution: {integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==}
+
+ '@vue/language-core@3.3.9':
+ resolution: {integrity: sha512-in/68oAa4BCtVY6n/nkuhLIkV8DHYd2UivedJ6cMZ6UYtlq9jaoaSNUBHYCVO44z3nKg7MdE5OBoHKt5SxeBKQ==}
+
+ '@vue/reactivity@3.5.41':
+ resolution: {integrity: sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==}
+
+ '@vue/runtime-core@3.5.41':
+ resolution: {integrity: sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==}
+
+ '@vue/runtime-dom@3.5.41':
+ resolution: {integrity: sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==}
+
+ '@vue/server-renderer@3.5.41':
+ resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==}
+
'@vue/shared@3.5.41':
resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==}
+ '@webassemblyjs/ast@1.14.1':
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2':
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+ '@webassemblyjs/helper-api-error@1.13.2':
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+ '@webassemblyjs/helper-buffer@1.14.1':
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+ '@webassemblyjs/ieee754@1.13.2':
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+ '@webassemblyjs/leb128@1.13.2':
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+ '@webassemblyjs/utf8@1.13.2':
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
'@workflow/serde@4.1.0':
resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==}
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
'@yuku-codegen/binding-android-arm64@0.8.4':
resolution: {integrity: sha512-rsYkGl2kOkDRsh1mxriYnk1qBS78vjlBJ3+T2XwtwKwqOliy2n+2Ae0EDxJ/uX1DZLm3KkBZarGO5isEnmHchA==}
cpu: [arm64]
@@ -2474,6 +3378,19 @@ packages:
'@yuku-toolchain/types@0.8.4':
resolution: {integrity: sha512-p7JE8flrj7ijZ/qLjHi4UwKqMarMD6zumbKXhrjp2I2iLJOuTYiQyci2U36VlXcUlNyzsY7E/mLnKCHotbzJVw==}
+ abbrev@3.0.1:
+ resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+
+ acorn-import-attributes@1.9.5:
+ resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
+ peerDependencies:
+ acorn: ^8
+
acorn@8.18.0:
resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
engines: {node: '>=0.4.0'}
@@ -2493,9 +3410,25 @@ packages:
peerDependencies:
zod: ^3.25.76 || ^4.1.8
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-keywords@5.1.0:
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+
ajv@8.20.0:
resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+ alien-signals@3.2.1:
+ resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==}
+
ansi-escapes@7.3.0:
resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==}
engines: {node: '>=18'}
@@ -2523,9 +3456,21 @@ packages:
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
anynum@1.0.1:
resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==}
+ archiver-utils@5.0.2:
+ resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==}
+ engines: {node: '>= 14'}
+
+ archiver@7.0.1:
+ resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==}
+ engines: {node: '>= 14'}
+
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
@@ -2537,19 +3482,105 @@ packages:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
+ ast-kit@2.2.0:
+ resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==}
+ engines: {node: '>=20.19.0'}
+
+ ast-walker-scope@0.9.0:
+ resolution: {integrity: sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==}
+ engines: {node: '>=20.19.0'}
+
+ async-sema@3.1.1:
+ resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==}
+
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ autoprefixer@10.5.4:
+ resolution: {integrity: sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
+ b4a@1.8.1:
+ resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==}
+ peerDependencies:
+ react-native-b4a: '*'
+ peerDependenciesMeta:
+ react-native-b4a:
+ optional: true
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
balanced-match@4.0.4:
resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
engines: {node: 18 || 20 || >=22}
+ bare-events@2.9.1:
+ resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==}
+ peerDependencies:
+ bare-abort-controller: '*'
+ peerDependenciesMeta:
+ bare-abort-controller:
+ optional: true
+
+ bare-fs@4.8.0:
+ resolution: {integrity: sha512-fM+MhCvdQhZ7NV6S95a07gPSqjIYKn6mFaXfx266wN3ajZGl/+1AzH+ubkXQ0fFZvOe2nk9VHkzdYkQE5zMV3Q==}
+ engines: {bare: '>=1.28.0'}
+ peerDependencies:
+ bare-buffer: '*'
+ peerDependenciesMeta:
+ bare-buffer:
+ optional: true
+
+ bare-path@3.1.1:
+ resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==}
+
+ bare-stream@2.13.3:
+ resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==}
+ peerDependencies:
+ bare-abort-controller: '*'
+ bare-buffer: '*'
+ bare-events: '*'
+ peerDependenciesMeta:
+ bare-abort-controller:
+ optional: true
+ bare-buffer:
+ optional: true
+ bare-events:
+ optional: true
+
+ bare-url@2.5.1:
+ resolution: {integrity: sha512-cD5ciQuKlx+eumTCfqbfiL+fhQm+dHbVNB/cX4+d+I/nx4JsVop9VoFEPAs5RJ6I84QR6bZIBjpd2kjDOYeWcg==}
+
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ baseline-browser-mapping@2.11.13:
+ resolution: {integrity: sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
bignumber.js@9.3.1:
resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
+ bindings@1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+
+ birpc@2.9.0:
+ resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==}
+
+ birpc@4.0.0:
+ resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==}
+
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
boolean@3.2.0:
resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
@@ -2557,17 +3588,43 @@ packages:
bowser@2.14.1:
resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==}
+ brace-expansion@2.1.4:
+ resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==}
+
brace-expansion@5.0.9:
resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==}
engines: {node: 20 || >=22}
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.28.8:
+ resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-crc32@1.0.0:
+ resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
+ engines: {node: '>=8.0.0'}
+
buffer-equal-constant-time@1.0.1:
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
- c12@3.3.4:
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ bundle-name@4.1.0:
+ resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+ engines: {node: '>=18'}
+
+ c12@3.3.4:
resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==}
peerDependencies:
magicast: '*'
@@ -2587,6 +3644,12 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
+ caniuse-api@4.0.0:
+ resolution: {integrity: sha512-B0hQ1OLyJuHTQSOWXvwibWqM6DCoqJdvBA6X1S/53bd4XU7LJ1yurIPlrsouol3mw1jh9pGI4ivubSpmJeIqCA==}
+
+ caniuse-lite@1.0.30001809:
+ resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==}
+
chai@5.3.3:
resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
engines: {node: '>=18'}
@@ -2614,6 +3677,14 @@ packages:
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+ chownr@3.0.0:
+ resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+ engines: {node: '>=18'}
+
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
citty@0.1.6:
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
@@ -2643,6 +3714,10 @@ packages:
resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
engines: {node: '>=20'}
+ cluster-key-slot@1.1.1:
+ resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==}
+ engines: {node: '>=0.10.0'}
+
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
@@ -2650,14 +3725,34 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
commander@10.0.1:
resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
engines: {node: '>=14'}
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
commander@6.2.1:
resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
engines: {node: '>= 6'}
+ commondir@1.0.1:
+ resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+
+ compatx@0.2.0:
+ resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==}
+
+ compress-commons@6.0.2:
+ resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==}
+ engines: {node: '>= 14'}
+
confbox@0.1.8:
resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
@@ -2681,6 +3776,25 @@ packages:
engines: {node: '>=22'}
hasBin: true
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie-es@1.2.3:
+ resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==}
+
+ cookie-es@2.0.1:
+ resolution: {integrity: sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==}
+
+ cookie-es@3.1.1:
+ resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==}
+
+ cookie@2.0.1:
+ resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==}
+ engines: {node: '>=22'}
+
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
cosmiconfig-typescript-loader@6.3.0:
resolution: {integrity: sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==}
engines: {node: '>=v18'}
@@ -2698,10 +3812,30 @@ packages:
typescript:
optional: true
+ crc-32@1.2.2:
+ resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
+ engines: {node: '>=0.8'}
+ hasBin: true
+
+ crc32-stream@6.0.0:
+ resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==}
+ engines: {node: '>= 14'}
+
+ croner@10.0.1:
+ resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==}
+ engines: {node: '>=18.0'}
+
croner@9.1.0:
resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==}
engines: {node: '>=18.0'}
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ crossws@0.3.5:
+ resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
+
crossws@0.4.10:
resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==}
peerDependencies:
@@ -2710,6 +3844,51 @@ packages:
srvx:
optional: true
+ css-select@5.2.2:
+ resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@3.2.1:
+ resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ cssnano-preset-default@8.0.4:
+ resolution: {integrity: sha512-WUn2NmdLD0FlUI8XdQrlfDjVNGLOI3cxaw7Y6msbfxn4G2vJByuO6M73Wo5B9Rd0Ap36SQhG7wsOXAMnVdC2eQ==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ cssnano-utils@6.0.2:
+ resolution: {integrity: sha512-AqysikWP69dOKAP/UMvUYrlZ1gvvQu0/eMFVUKLhH+ZM23dUAKXC31xKvNyL9It2UMF2uDmK4XotBeO9vSBKzg==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ cssnano@8.0.4:
+ resolution: {integrity: sha512-m6epEvKkzysdXamdK4BU9S6lQzx+syY+5Qm4f2dbpxlewBtEYOKi2v2iIr1jLsjuAr3V1WjRp6hXFPH1BEDirw==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
@@ -2758,10 +3937,26 @@ packages:
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
engines: {node: '>=4.0.0'}
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ default-browser-id@5.0.1:
+ resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==}
+ engines: {node: '>=18'}
+
+ default-browser@5.5.0:
+ resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==}
+ engines: {node: '>=18'}
+
define-data-property@1.1.4:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
+ define-lazy-prop@3.0.0:
+ resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+ engines: {node: '>=12'}
+
define-properties@1.2.1:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
@@ -2769,6 +3964,14 @@ packages:
defu@6.1.7:
resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+ denque@2.1.0:
+ resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
+ engines: {node: '>=0.10'}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
destr@2.0.5:
resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
@@ -2779,10 +3982,30 @@ packages:
detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+ devalue@5.9.0:
+ resolution: {integrity: sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==}
+
diff@8.0.4:
resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==}
engines: {node: '>=0.3.1'}
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dot-prop@10.2.0:
+ resolution: {integrity: sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==}
+ engines: {node: '>=20'}
+
dotenv@17.4.2:
resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
engines: {node: '>=12'}
@@ -2796,15 +4019,30 @@ packages:
oxc-resolver:
optional: true
+ duplexer@0.1.2:
+ resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
ecdsa-sig-formatter@1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ electron-to-chromium@1.5.402:
+ resolution: {integrity: sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==}
+
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
emojilib@2.4.0:
resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==}
@@ -2812,31 +4050,29 @@ packages:
resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==}
engines: {node: '>=14'}
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+ enhanced-resolve@5.24.5:
+ resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==}
+ engines: {node: '>=10.13.0'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@7.0.1:
+ resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
+ engines: {node: '>=0.12'}
+
env-paths@2.2.1:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
- env-runner@0.1.16:
- resolution: {integrity: sha512-2LRJM4P2KLX6J83QZZrMqvgCDt/D5ea7wPcI3yYiy5cG/9rX5QwdwZFx0D7ktWnjdRyZxYjttGGorb5nFqb1CA==}
- hasBin: true
- peerDependencies:
- '@netlify/runtime': ^4.1.23
- '@vercel/queue': '>=0.2.0'
- miniflare: ^4.20260515.0
- wrangler: ^4.0.0
- peerDependenciesMeta:
- '@netlify/runtime':
- optional: true
- '@vercel/queue':
- optional: true
- miniflare:
- optional: true
- wrangler:
- optional: true
-
environment@1.1.0:
resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
engines: {node: '>=18'}
@@ -2844,6 +4080,12 @@ packages:
error-ex@1.3.4:
resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+ error-stack-parser-es@1.0.5:
+ resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==}
+
+ error-stack-parser-es@2.0.1:
+ resolution: {integrity: sha512-J36ntO+rMQVRuR/umlmxmfLi4TpWwtmTnHoJoXTiC2xDNazs0VDPKcX6pbhZMDd2HFtH9isMBJXMdbki+A++Pg==}
+
errx@0.1.2:
resolution: {integrity: sha512-chfpPHmCerdo/rXr/nNvPZRkV4WwDRwzwnsJ0Uzz3tVi8Z41tDctRjduYy1138ii77AFlts1qvWtX3g/Acg91Q==}
@@ -2858,6 +4100,9 @@ packages:
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+ es-module-lexer@2.3.1:
+ resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==}
+
es-toolkit@1.50.0:
resolution: {integrity: sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==}
@@ -2873,17 +4118,62 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+
+ events-universal@1.0.1:
+ resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
eventsource-parser@3.1.0:
resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==}
engines: {node: '>=18.0.0'}
+ execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+
expand-template@2.0.3:
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
engines: {node: '>=6'}
@@ -2901,6 +4191,17 @@ packages:
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ fast-fifo@1.3.2:
+ resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-npm-meta@2.2.0:
+ resolution: {integrity: sha512-99jPl8JkCSCa4VlboNU1XuL98ijm74Pm9CGo6H4BoMVoVh1uhguQcvwLgXDT8Vkl2qj/UEQ0J9gD8beHjTFk1w==}
+ hasBin: true
+
fast-string-truncated-width@3.0.3:
resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==}
@@ -2920,6 +4221,9 @@ packages:
resolution: {integrity: sha512-IEMIf7298kXuZSRFoGfMYrl7is8LpavODgbNz1cwIudv7KwVFnuU+UsMporfq6PD6aXSlawZlARiA3UywCTfMw==}
hasBin: true
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
fd-package-json@2.0.0:
resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==}
@@ -2943,9 +4247,23 @@ packages:
resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==}
engines: {node: '>=20'}
+ file-uri-to-path@1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
flatbuffers@25.9.23:
resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==}
+ fnv1a-64@0.1.2:
+ resolution: {integrity: sha512-mJbcILTPybAR1jdOwt/lVv8N2cffeJFFP+gVbSAwLEx1ujXH27RpPd8Rokec/KX9c76UYIB6Co+H4lQzxPnJfA==}
+
+ foreground-child@3.3.1:
+ resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+ engines: {node: '>=14'}
+
formatly@0.3.0:
resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==}
engines: {node: '>=18.3.0'}
@@ -2955,6 +4273,13 @@ packages:
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
engines: {node: '>=12.20.0'}
+ fraction.js@5.3.4:
+ resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
+
+ fresh@2.0.0:
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+ engines: {node: '>= 0.8'}
+
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
@@ -2963,6 +4288,16 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ fuse.js@7.5.0:
+ resolution: {integrity: sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==}
+ engines: {node: '>=10'}
+
+ fzf@0.5.2:
+ resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==}
+
gaxios@7.3.0:
resolution: {integrity: sha512-RB5vLV+vvQeoFPCX4QMK6/hjVkbIamPp1QSUD0CiZcnj12qbpiL+pLbYtgD+oZkWl0tl9z+o2Utp+MpM3QRhBA==}
engines: {node: '>=18'}
@@ -2971,6 +4306,13 @@ packages:
resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==}
engines: {node: '>=18'}
+ generic-names@4.0.0:
+ resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -2979,6 +4321,13 @@ packages:
resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==}
engines: {node: '>=18'}
+ get-port-please@3.2.0:
+ resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==}
+
+ get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+
get-tsconfig@4.14.1:
resolution: {integrity: sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A==}
@@ -2993,10 +4342,27 @@ packages:
github-from-package@0.0.0:
resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob@10.5.0:
+ resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+ hasBin: true
+
+ glob@13.0.6:
+ resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
+ engines: {node: 18 || 20 || >=22}
+
global-agent@3.0.0:
resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==}
engines: {node: '>=10.0'}
+ global-directory@4.0.1:
+ resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+ engines: {node: '>=18'}
+
global-directory@5.0.0:
resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==}
engines: {node: '>=20'}
@@ -3005,6 +4371,10 @@ packages:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
+ globby@16.2.3:
+ resolution: {integrity: sha512-VZX7TV7jmd/pn71vdnLKtgwy1IWqc3KjI9x1/UtPkwoKk5fKrNLY30ltDe3cAM5xruIN7YuuaulFt133jRrKZg==}
+ engines: {node: '>=20'}
+
google-auth-library@10.9.1:
resolution: {integrity: sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==}
engines: {node: '>=18'}
@@ -3017,18 +4387,22 @@ packages:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
guid-typescript@1.0.9:
resolution: {integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==}
- h3@2.0.1-rc.26:
- resolution: {integrity: sha512-GDxlvDsKxgjRvG5UBRJYyGJTMWLV30CJ4cV+e7QCTgftDHihrvio1fVPbNembhEr6J4WNm8IWy3fookgyTweLw==}
- engines: {node: '>=20.11.1'}
- hasBin: true
- peerDependencies:
- crossws: ^0.4.9
- peerDependenciesMeta:
- crossws:
- optional: true
+ gzip-size@6.0.0:
+ resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
+ engines: {node: '>=10'}
+
+ gzip-size@7.0.0:
+ resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ h3@1.15.11:
+ resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==}
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
@@ -3037,16 +4411,31 @@ packages:
has-property-descriptors@1.0.2:
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+ hasown@2.0.4:
+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
+ engines: {node: '>= 0.4'}
+
highlight.js@10.7.3:
resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+ hookable@5.5.3:
+ resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
hookable@6.1.1:
resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==}
+ http-errors@2.0.1:
+ resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
+ engines: {node: '>= 0.8'}
+
http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
+ http-shutdown@1.2.2:
+ resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==}
+ engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+
https-proxy-agent@7.0.6:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
engines: {node: '>= 14'}
@@ -3054,6 +4443,10 @@ packages:
httpxy@0.5.5:
resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==}
+ human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+
husky@9.1.7:
resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
engines: {node: '>=18'}
@@ -3066,27 +4459,60 @@ packages:
resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==}
engines: {node: '>= 4'}
+ image-meta@0.2.2:
+ resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==}
+
import-fresh@3.3.1:
resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
engines: {node: '>=6'}
+ import-meta-resolve@4.2.0:
+ resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
+
import-without-cache@0.4.0:
resolution: {integrity: sha512-NkJQA7oZ4YHQhd2+H3BoRFKF3d/XNsiKpHZCQEMH9pDX27hQQLsTyOocyRgaIVtf8gHX3Nt3LPkR4e5EdtPAGQ==}
engines: {node: ^22.18.0 || >=24.0.0}
+ impound@1.1.6:
+ resolution: {integrity: sha512-ugavDQkE74SGrBjagNIwNVHNBxX14mmfQnTm4jFGzOoWwYsgihqV698BNr5xwRY9quKK4rEg8bc6ECltllMr+w==}
+
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
ini@1.3.8:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ ini@4.1.1:
+ resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
ini@6.0.0:
resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==}
engines: {node: ^20.17.0 || >=22.9.0}
+ ioredis@5.11.1:
+ resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==}
+ engines: {node: '>=12.22.0'}
+
+ iron-webcrypto@1.2.1:
+ resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+
is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ is-core-module@2.16.2:
+ resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==}
+ engines: {node: '>= 0.4'}
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
@@ -3095,13 +4521,73 @@ packages:
resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
engines: {node: '>=18'}
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-in-ssh@1.0.0:
+ resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==}
+ engines: {node: '>=20'}
+
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-installed-globally@1.0.0:
+ resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==}
+ engines: {node: '>=18'}
+
+ is-module@1.0.0:
+ resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-path-inside@4.0.0:
+ resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==}
+ engines: {node: '>=12'}
+
is-plain-obj@4.1.0:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
+ is-reference@1.2.1:
+ resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
is-unsafe@2.0.0:
resolution: {integrity: sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==}
+ is-wsl@3.1.1:
+ resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
+ engines: {node: '>=16'}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ isexe@4.0.0:
+ resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==}
+ engines: {node: '>=20'}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
@@ -3110,6 +4596,9 @@ packages:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
+ js-tokens@10.0.0:
+ resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==}
+
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -3120,6 +4609,11 @@ packages:
resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==}
hasBin: true
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
json-bigint@1.0.0:
resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
@@ -3139,6 +4633,11 @@ packages:
json-stringify-safe@5.0.1:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
jsonc-parser@3.3.1:
resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
@@ -3153,6 +4652,10 @@ packages:
jws@4.0.1:
resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==}
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
klona@2.0.6:
resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
engines: {node: '>= 8'}
@@ -3165,9 +4668,114 @@ packages:
knitwork@1.3.0:
resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==}
+ launch-editor@2.14.1:
+ resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==}
+
+ lazystream@1.0.1:
+ resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
+ engines: {node: '>= 0.6.3'}
+
+ lightningcss-android-arm64@1.33.0:
+ resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.33.0:
+ resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.33.0:
+ resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.33.0:
+ resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.33.0:
+ resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.33.0:
+ resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ lightningcss-linux-arm64-musl@1.33.0:
+ resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ lightningcss-linux-x64-gnu@1.33.0:
+ resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ lightningcss-linux-x64-musl@1.33.0:
+ resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ lightningcss-win32-arm64-msvc@1.33.0:
+ resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.33.0:
+ resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.33.0:
+ resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
+ engines: {node: '>= 12.0.0'}
+
+ lilconfig@3.1.3:
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+ engines: {node: '>=14'}
+
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ listhen@1.10.1:
+ resolution: {integrity: sha512-6nt/86SkqUQSLW1ofz8MxC6RhRMqOl3ONISe6qqvJ3xj09aJWQx6DhgSZpugs3PX4PXdOas/WD6A9jx6J2N19A==}
+ hasBin: true
+ peerDependencies:
+ '@parcel/watcher': ^2.5.6
+ peerDependenciesMeta:
+ '@parcel/watcher':
+ optional: true
+
+ loader-utils@3.3.1:
+ resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
+ engines: {node: '>= 12.13.0'}
+
+ local-pkg@1.2.1:
+ resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==}
+ engines: {node: '>=14'}
+
+ lodash@4.18.1:
+ resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==}
+
log-update@8.0.0:
resolution: {integrity: sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg==}
engines: {node: '>=22'}
@@ -3178,16 +4786,35 @@ packages:
loupe@3.2.1:
resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
lru-cache@11.5.2:
resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==}
engines: {node: 20 || >=22}
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ magic-regexp@0.10.0:
+ resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==}
+
magic-regexp@0.11.0:
resolution: {integrity: sha512-LG77Z/gVnwz7oaDpD4heX6ryl+lcr4l1B2gnP4MMvt2pGhGC1Dfj7dl1pXpP4ih+VQFLuAadeKVa+lARAzfW+Q==}
+ magic-string-ast@1.0.3:
+ resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==}
+ engines: {node: '>=20.19.0'}
+
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ magic-string@1.1.0:
+ resolution: {integrity: sha512-kS3VHe0nEPST2saQV4Rbkchcd3UBRkVTQHo1D3h/ZTwFDhai/mfKkmtPAtD129EOI7K3HlHIsFOt0WrI2/oU9g==}
+
+ magicast@0.5.4:
+ resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==}
+
marked-terminal@7.3.0:
resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==}
engines: {node: '>=16.0.0'}
@@ -3203,10 +4830,44 @@ packages:
resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
engines: {node: '>=10'}
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.27.1:
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
+
mdream@1.5.12:
resolution: {integrity: sha512-9d+Bq09UUe3fQa0QTfRD2e3djGqA4rTbesn2hEDXg6blRjZBfRcLEgEwt2FvfiFb/QJlIP+LJzIZ6UxFfa5Y5Q==}
hasBin: true
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@3.0.2:
+ resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
+ engines: {node: '>=18'}
+
+ mime@4.1.0:
+ resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
mimic-function@5.0.1:
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
engines: {node: '>=18'}
@@ -3219,15 +4880,77 @@ packages:
resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
engines: {node: 18 || 20 || >=22}
+ minimatch@5.1.9:
+ resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==}
+ engines: {node: '>=10'}
+
+ minimatch@9.0.9:
+ resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ minimizer-webpack-plugin@5.6.1:
+ resolution: {integrity: sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@minify-html/node': '*'
+ '@swc/core': '*'
+ '@swc/css': '*'
+ '@swc/html': '*'
+ clean-css: '*'
+ cssnano: '*'
+ csso: '*'
+ esbuild: '*'
+ html-minifier-terser: '*'
+ lightningcss: '*'
+ postcss: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@minify-html/node':
+ optional: true
+ '@swc/core':
+ optional: true
+ '@swc/css':
+ optional: true
+ '@swc/html':
+ optional: true
+ clean-css:
+ optional: true
+ cssnano:
+ optional: true
+ csso:
+ optional: true
+ esbuild:
+ optional: true
+ html-minifier-terser:
+ optional: true
+ lightningcss:
+ optional: true
+ postcss:
+ optional: true
+ uglify-js:
+ optional: true
+
+ minipass@7.1.3:
+ resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minizlib@3.1.0:
+ resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+ engines: {node: '>= 18'}
+
mkdirp-classic@0.5.3:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
mlly@1.8.2:
resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
+ mocked-exports@0.1.1:
+ resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==}
+
modern-tar@0.7.7:
resolution: {integrity: sha512-t9VmxaqrmANnEOBhpSDI6HD192Ge48k8vmWqQQL7hSFEqHEYwZbbsu49+aKLWZeRvFs3j1pMhXOqqF4kPlvjkQ==}
engines: {node: '>=18.0.0'}
@@ -3239,9 +4962,16 @@ packages:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
@@ -3255,42 +4985,24 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanotar@0.3.0:
+ resolution: {integrity: sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==}
+
napi-build-utils@2.0.0:
resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==}
- nf3@0.3.23:
- resolution: {integrity: sha512-RWVLAWozmVD3AaDmaU3qMGB3v+yNlH5d9qqStI4e/WLlNQVnJ4YErGDbYCIrGFyrHdbF6I6Baf0Ae6c7tFYmSg==}
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
- nitro@3.0.260522-beta:
- resolution: {integrity: sha512-L/z2eOWgkiQHc65kv+SEMgau505afSRF7NJlbooaaZEZscFrNSD7rXZzeVubQlgIzPbhOG8o73bk9soIiGTHRA==}
+ nitropack@2.13.4:
+ resolution: {integrity: sha512-tX7bT6zxNeMwkc6hxHiZeUoTOjVrcjoh1Z3cmxOlodIqjl4HISgqfGOmkWSayky3Nv9Z5+KQH52F8nmXJY5AAA==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
- '@vercel/queue': ^0.2.0
- dotenv: '*'
- giget: '*'
- jiti: ^2.6.1
- rollup: ^4.60.3
- vite: ^7 || ^8
xml2js: ^0.6.2
- zephyr-agent: ^0.2.0
peerDependenciesMeta:
- '@vercel/queue':
- optional: true
- dotenv:
- optional: true
- giget:
- optional: true
- jiti:
- optional: true
- rollup:
- optional: true
- vite:
- optional: true
xml2js:
optional: true
- zephyr-agent:
- optional: true
node-abi@3.94.0:
resolution: {integrity: sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==}
@@ -3312,10 +5024,23 @@ packages:
node-fetch-native@1.6.7:
resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
node-fetch@3.3.2:
resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ node-forge@1.4.0:
+ resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==}
+ engines: {node: '>= 6.13.0'}
+
node-gyp-build@4.8.4:
resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
hasBin: true
@@ -3325,6 +5050,50 @@ packages:
engines: {node: '>=16.0.0'}
hasBin: true
+ node-mock-http@1.0.5:
+ resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==}
+
+ node-releases@2.0.53:
+ resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==}
+ engines: {node: '>=18'}
+
+ nopt@8.1.0:
+ resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+ hasBin: true
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ nostics@1.2.0:
+ resolution: {integrity: sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ npm-run-path@6.0.0:
+ resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
+ engines: {node: '>=18'}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ nuxt@4.5.2:
+ resolution: {integrity: sha512-tR3fcqeHlHmmkLMpIg3V7Y+1ltr302lW8djMw/iy+myfo7QSSz+BVJDuQhg5j73b9oteSyBfOKTDYTgvMtj6TA==}
+ engines: {node: ^22.19.0 || ^24.11.0 || >=26.0.0}
+ hasBin: true
+ peerDependencies:
+ '@parcel/watcher': ^2.1.0
+ '@types/node': '>=18.12.0'
+ rolldown: ~1.2.1
+ peerDependenciesMeta:
+ '@parcel/watcher':
+ optional: true
+ '@types/node':
+ optional: true
+
nypm@0.6.9:
resolution: {integrity: sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==}
engines: {node: '>=18'}
@@ -3334,6 +5103,9 @@ packages:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
+ object-identity@0.2.3:
+ resolution: {integrity: sha512-2J8Joz2Tf7aaylhqFvIUJHNgpuGR38Hh75Voq9GzTbStBxJUaOtN0K1aOd3cV5qp+ij1pMqRbPrGCGMOyX303w==}
+
object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
@@ -3342,9 +5114,6 @@ packages:
resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
engines: {node: '>=12.20.0'}
- ocache@0.1.5:
- resolution: {integrity: sha512-kNNnkkVQup/QDvmTz8Q84wc2ntiyoVHDxa6eHWKt5qdGAmFRBIxy83rxgCYEjW0x06UJ9E3P6VgM2yY4rOBH4w==}
-
ofetch@1.5.1:
resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
@@ -3354,9 +5123,21 @@ packages:
ohash@2.0.11:
resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+ on-change@6.0.2:
+ resolution: {integrity: sha512-08+12qcOVEA0fS9g/VxKS27HaT94nRutUT77J2dr8zv/unzXopvhBuF8tNLWsoLQ5IgrQ6eptGeGqUYat82U1w==}
+ engines: {node: '>=20'}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
onetime@7.0.0:
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
@@ -3374,6 +5155,10 @@ packages:
onnxruntime-web@1.26.0-dev.20260416-b7804b056c:
resolution: {integrity: sha512-MD6Ss4GSpQBo6zqoJzyT9LRbKYs7x/JVN23FT24EcEvlqF4VuzPOeH6X38orZPKHQDbprn7K+SBpu0/mj2CQiw==}
+ open@11.0.0:
+ resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==}
+ engines: {node: '>=20'}
+
openai@6.26.0:
resolution: {integrity: sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==}
hasBin: true
@@ -3386,6 +5171,10 @@ packages:
zod:
optional: true
+ oxc-parser@0.131.0:
+ resolution: {integrity: sha512-SJ3/7ZPbgie8dr5Z9BI/M51zZbpXba+hRSG0MDzVwMW5CRQg2fjYE0jHGlLX4eeiibGgC/mzoDFKSDHwVZEHRQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
oxc-parser@0.142.0:
resolution: {integrity: sha512-kKR+jPiRJYJDexVoziIg/FVGvr1fT1FZSSJOk6tVoMKKSlsf1Cso+cgGCJkOEDWOP174vRntCPFKg+AS7InWvw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -3397,6 +5186,25 @@ packages:
oxc-resolver@11.24.2:
resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==}
+ oxc-walker@0.7.0:
+ resolution: {integrity: sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==}
+ peerDependencies:
+ oxc-parser: '>=0.98.0'
+
+ oxc-walker@1.1.1:
+ resolution: {integrity: sha512-Hwd7dq28zu/Er99+bpWp16CGwFrhyalJh0W3JOB7XpPvgWo3MqMi2ksWGKuzzA9zt50mJ2pIUwR5lpAdZ9ACNQ==}
+ peerDependencies:
+ '@oxc-project/types': '>=0.98.0'
+ oxc-parser: '>=0.98.0'
+ rolldown: '>=1.0.0'
+ peerDependenciesMeta:
+ '@oxc-project/types':
+ optional: true
+ oxc-parser:
+ optional: true
+ rolldown:
+ optional: true
+
oxfmt@0.62.0:
resolution: {integrity: sha512-vxgGHTmnDU9j4CX7dDBLzxgmHxfda/yPcgJkGCMUSCwRmz+euo/V08xXLNgXTeqAB9Fhf3Pe2nO1RNKLCVgphQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -3435,6 +5243,9 @@ packages:
resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
engines: {node: '>=8'}
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
package-manager-detector@1.8.0:
resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==}
@@ -3458,13 +5269,39 @@ packages:
parse5@6.0.1:
resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
partial-json@0.1.7:
resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==}
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
path-expression-matcher@1.6.2:
resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==}
engines: {node: '>=14.0.0'}
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ path-scurry@2.0.2:
+ resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
+ engines: {node: 18 || 20 || >=22}
+
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
@@ -3478,6 +5315,10 @@ packages:
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
picomatch@4.0.5:
resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==}
engines: {node: '>=12'}
@@ -3491,16 +5332,203 @@ packages:
platform@1.3.6:
resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
+ postcss-calc@10.1.1:
+ resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==}
+ engines: {node: ^18.12 || ^20.9 || >=22.0}
+ peerDependencies:
+ postcss: ^8.4.38
+
+ postcss-colormin@8.0.2:
+ resolution: {integrity: sha512-3puH3etbn8GPaJuF8OybCdUW6PJO0KU9ZnsaA/1VG9HU0Wdrf94dOTQkbQnA8/qkYdPjwHzcWvzUGXIeawBa0w==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-convert-values@8.0.2:
+ resolution: {integrity: sha512-KA6VVp93xASmDI0HWgRQ7938XR20hZEVL525YCbcTVsuxn4BNxs+ge4wLNow+ay+uqPuy3uEh51zhjfI92uN4w==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-discard-comments@8.0.2:
+ resolution: {integrity: sha512-tQk36szZkG9ngZM9bKrUp3hM2SxdclYJVnMtAMKyi0RqY7IQpx67TJ3+0thRMV47niKBw9Y/1auGkBeCfPC97A==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-discard-duplicates@8.0.2:
+ resolution: {integrity: sha512-Y2IDdRqvnpzsOH5ZLcJnvh/Eiye8O3r6uO7oFTe3YuFfrat3xQRDPjTVohRmi8RWuOIq2rGjva1n4Adus4pljw==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-discard-empty@8.0.2:
+ resolution: {integrity: sha512-fGHTnqg2S4fBudyd+tCE+qT57R4YRUaYLannCrKYsE8u/rCMGCBMPwIM4jcNWJLP5vMEBitGrXa5mGB7VKA+Eg==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-discard-overridden@8.0.2:
+ resolution: {integrity: sha512-a9Dvv5ccOI7P94oCaeytj4FCSsHiXyH8KwXQorU/GJWDRvwFMY9yUs4uPKSG2HBSGtR49xo3ieml6F1EQCJtZA==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-merge-longhand@8.0.2:
+ resolution: {integrity: sha512-iN1JQ21vKd3ZdbHmj69lqOwaWiFvxlXVQ5EeH/sw5M3TqI1sFR28G4yleAcNkMwB55E6qGRRVR3lem+ZJazmoQ==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-merge-rules@8.0.2:
+ resolution: {integrity: sha512-ipELN1m3k/GLGD+wmYHtiEVE2TMW5OKm4CgSRqYDeDz1ZX89AbeUCoeos0dUdTcpMilSa+zIRwvD78U3Uv/1BA==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-minify-font-values@8.0.2:
+ resolution: {integrity: sha512-T6oURfdYH/BtXLLN/biomuY1hSYSGbfRyLyxQ+7+VCRw7Zj1ROpRwHpaX2PP/rpmT/0yHaGIVUNShmanvm3PXw==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-minify-gradients@8.0.2:
+ resolution: {integrity: sha512-s49jAcFm5eF7GLLU0+28e4mQc/vISBMtu+1gQbq/Uf7+w155G8nbItaQp5NYY7QsYerpj2qvtNkYN25gZWWYdw==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-minify-params@8.0.2:
+ resolution: {integrity: sha512-ifaU795JsBddkffWbTOXl8ubUyBqpNiLS8xjqKmE/Sw9AOpjWG2uFPfpEv3AZPXWNkWJf8kGvW9wLHImEUJUkA==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-minify-selectors@8.0.3:
+ resolution: {integrity: sha512-3WchKL9xoA80/jNkRcimRGIc9mP6sHPQUY/1WzV+GbF69I/upieyaKzZcIdQzf9cBmCJ6vjxi+NrKqCojoOb7Q==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-charset@8.0.2:
+ resolution: {integrity: sha512-iy3/b+gX+dHfbNZq/4rfThbMAqxhneBJEhS71y5toliav5rLowkZ6g0ZJGymXRZytDOt/u+fRSFkNJLkRPYaug==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-display-values@8.0.2:
+ resolution: {integrity: sha512-T6Az9mgc7FUWvI6mK0uOsItT6csep7fdLtDSRC2XBMTCvrQmtYiz86T5hEM6sfAkZVVhfrALPhdPxJWVoNAktw==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-positions@8.0.2:
+ resolution: {integrity: sha512-BBg188AxYLC86LDEnkbQTcdnZugP2vDwYQQDV+Htju2gpTqM2a3o/oQ91/h9+j0277InjNgrI7l1LDDRrlWQ5w==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-repeat-style@8.0.2:
+ resolution: {integrity: sha512-6mbVJzuogwcAHMd6MMpmAMcc3BkleOcY2xazCp+HCMiod78tx7rdOrufTrPYGjBLaTjkgNUr8KCkLHj8mfH6WQ==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-string@8.0.2:
+ resolution: {integrity: sha512-8UK2KJSChlv7V12QgWTWtbRzzZcki/f21e8egMlFHTE9rEBCCyLo60rcY3mh77cDZhrBSIfKM9ciOsU6249nbA==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-timing-functions@8.0.2:
+ resolution: {integrity: sha512-C2OyYiEMKjCxA0m+QJ5SeMf12OenIIGqrXEuWizEunZZP+s5TRq1aT8naxqr/8rytSRqD4SwH4mywc9G44u4cw==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-unicode@8.0.2:
+ resolution: {integrity: sha512-ttWq9oM88gSPpfspoZB49r/lv1fvjOadi79E/4BxGVt0rughnNDdTnDLmWj+epOjS6iKhmse3kbNcISR6Jl+3A==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-url@8.0.2:
+ resolution: {integrity: sha512-PvSiaJOQpP0AW5GSHrWZXupfhUgLUtS1MubJX+wPwh6RZZP6CHnZQy/S8uX2vvHMd57qIZ44Sb/37rFMiAWPfA==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-normalize-whitespace@8.0.2:
+ resolution: {integrity: sha512-Fipz8bjy96XPmtMPsqbGw3fypbS+aOHJfpTzfQY9z0lDYFqqGIqYWwrfsi2ZOv7B86pY81vQGJ6mSHWvTXDV7g==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-ordered-values@8.0.2:
+ resolution: {integrity: sha512-LBqMGd6Bam4TVp9dKui01o0prWtsGfPP+WtENunNs3L9oi+t75uPyEmzzaimxinmGgeiFLix9xLI0FfD+qedjw==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-reduce-initial@8.0.2:
+ resolution: {integrity: sha512-+612lhSpyp1g4ZU0zQKwmdHnAi8LevMpzvQuP2RVhq+EUWqAwwUMk03OQEfzy+es9OSdRTuy5ugnFeEeOiIe2A==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-reduce-transforms@8.0.2:
+ resolution: {integrity: sha512-7D2vDXJ2HBNQpbiw5dY9UyLfBRCGRBjV0ChMqHdHghFsjAH3hIIUgb/rE+e77LFiT8VjXUK2fZh3omG4R96n8A==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-selector-parser@7.1.5:
+ resolution: {integrity: sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==}
+ engines: {node: '>=4'}
+
+ postcss-svgo@8.0.3:
+ resolution: {integrity: sha512-ADG8YNtwE5bcqvxw1gU0X7FkgdvinZZxWKHSCMwayX7gPl4XRmBMyiC84Ukal5bPS9Nk/2tI7siJwqxIN4/grg==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-unique-selectors@8.0.2:
+ resolution: {integrity: sha512-cIftRB4rW3UCqnQjFAS6WlUzragjsU2AtMzWDdDQKTMjgPh1rO8qYgnoYqkUgRXKnxd3902laOWbkkYO/GYEHw==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
postcss@8.5.26:
resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
engines: {node: ^10 || ^12 || >=14}
+ powershell-utils@0.1.0:
+ resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==}
+ engines: {node: '>=20'}
+
prebuild-install@7.1.3:
resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==}
engines: {node: '>=10'}
deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
hasBin: true
+ pretty-bytes@7.1.1:
+ resolution: {integrity: sha512-X+vn9z8nOFZQlxOLmfJ0iKDdMD7jYTsTW12OAlCpdoE3Igik6L37pugIZi+N3usuyp5McfgKPWi12q3zvHLeGQ==}
+ engines: {node: '>=20'}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+
+ proper-lockfile@4.1.2:
+ resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==}
+
protobufjs@7.6.5:
resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==}
engines: {node: '>=12.0.0'}
@@ -3513,9 +5541,15 @@ packages:
pump@3.0.4:
resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==}
+ quansync@0.2.11:
+ resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
quansync@1.0.0:
resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==}
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
quickjs-emscripten-core@0.32.0:
resolution: {integrity: sha512-QFnPfjFey8EqknSrSxe1hZrf1/8z7/6s1QzGOmKo6++02r7QRRX7ZoyNaZh7JuVjWsVW87KnQrbZqnHkOAzUyg==}
@@ -3523,6 +5557,17 @@ packages:
resolution: {integrity: sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA==}
engines: {node: '>=16.0.0'}
+ radash@12.1.1:
+ resolution: {integrity: sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==}
+ engines: {node: '>=14.18.0'}
+
+ radix3@1.1.2:
+ resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
+
+ range-parser@1.3.0:
+ resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==}
+ engines: {node: '>= 0.6'}
+
rc9@3.0.1:
resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==}
@@ -3533,14 +5578,32 @@ packages:
re2js@1.3.3:
resolution: {integrity: sha512-s/I5zEAo79SUK0Qw4dpZKpiMwbQ6Gz0KU2NRr7eaO4x/p2g7Vvmn3hdeXDg8VsaUjfj/ora+e9oi27LX/C9+mw==}
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
readable-stream@3.6.2:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
+ readable-stream@4.7.0:
+ resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ readdir-glob@1.1.3:
+ resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
+
readdirp@5.1.1:
resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
engines: {node: '>= 20.19.0'}
+ redis-errors@1.2.0:
+ resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
+ engines: {node: '>=4'}
+
+ redis-parser@3.0.0:
+ resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==}
+ engines: {node: '>=4'}
+
regexp-tree@0.1.27:
resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
hasBin: true
@@ -3564,6 +5627,11 @@ packages:
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ resolve@1.22.12:
+ resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
restore-cursor@5.1.0:
resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
engines: {node: '>=18'}
@@ -3609,10 +5677,18 @@ packages:
typescript:
optional: true
+ retry@0.12.0:
+ resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
+ engines: {node: '>= 4'}
+
retry@0.13.1:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
engines: {node: '>= 4'}
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
roarr@2.15.4:
resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
engines: {node: '>=8.0'}
@@ -3636,11 +5712,33 @@ packages:
vue-tsc:
optional: true
+ rolldown-string@0.3.1:
+ resolution: {integrity: sha512-dv8GOXkYqUQdI0rsXB8hmzO95pKWSuX2eg5/JSJa9czfEVIFuKNR7ZJDfat8LlmD35RAhWY+evS7/wXXqFDfSg==}
+ engines: {node: '>=20.19.0'}
+ peerDependencies:
+ rolldown: '*'
+ peerDependenciesMeta:
+ rolldown:
+ optional: true
+
rolldown@1.2.3:
resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
+ rollup-plugin-visualizer@7.0.1:
+ resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==}
+ engines: {node: '>=22'}
+ hasBin: true
+ peerDependencies:
+ rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc
+ rollup: 2.x || 3.x || 4.x
+ peerDependenciesMeta:
+ rolldown:
+ optional: true
+ rollup:
+ optional: true
+
rollup@4.62.4:
resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -3649,13 +5747,31 @@ packages:
rou3@0.9.1:
resolution: {integrity: sha512-z/sSmzvtwMDDnxsPVhfWMuG6F6mbmhFDXoVqLmMfbpDD9qfV3GDmSQpf0+W296/ZDIpW2wcMmBfpVFzcnOi/nA==}
+ run-applescript@7.1.0:
+ resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
+ engines: {node: '>=18'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
sade@1.8.1:
resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
engines: {node: '>=6'}
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ sax@1.6.1:
+ resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
+ engines: {node: '>=11.0.0'}
+
+ schema-utils@4.3.3:
+ resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
+ engines: {node: '>= 10.13.0'}
+
scule@1.3.0:
resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
@@ -3666,15 +5782,41 @@ packages:
semver-compare@1.0.0:
resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
semver@7.8.5:
resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
engines: {node: '>=10'}
hasBin: true
+ send@1.2.1:
+ resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
+ engines: {node: '>= 18'}
+
serialize-error@7.0.1:
resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==}
engines: {node: '>=10'}
+ serialize-javascript@7.1.0:
+ resolution: {integrity: sha512-RNEqWOyhhUQYN9V1GfHwu9AR/g+NTciH6Z5u3/no6X3/w+04J2lVDL+svFQVXgXrEGBMG2puMVN3gq2SNGuTGw==}
+ engines: {node: '>=20.0.0'}
+
+ seroval@1.6.2:
+ resolution: {integrity: sha512-mPT+SD2TrlB6wvte1KkYOYUkubaTbd6pZ/6Kk3C9nxzrHmCZyhxOO7XGAeL7f+yLKZglzGtM9odUVvg/EhO+vQ==}
+ engines: {node: '>=10'}
+
+ serve-placeholder@2.0.2:
+ resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==}
+
+ serve-static@2.2.1:
+ resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
+ engines: {node: '>= 18'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
sh-syntax@0.6.0:
resolution: {integrity: sha512-52VK6z/cdZHv7UURjIcwfBUQZrAhIEEe0bY4lrkfypjnFIKsDZdD3Uaz/dBiw/sF8BeX0Mssv140s8EnrsJ9dQ==}
engines: {node: '>=16.0.0'}
@@ -3683,9 +5825,24 @@ packages:
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ shell-quote@1.10.0:
+ resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==}
+ engines: {node: '>= 0.4'}
+
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
@@ -3696,6 +5853,13 @@ packages:
simple-get@4.0.1:
resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
+ simple-git@3.36.0:
+ resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==}
+
+ sirv@3.0.2:
+ resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
+ engines: {node: '>=18'}
+
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@@ -3712,10 +5876,18 @@ packages:
resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==}
engines: {node: '>=8'}
+ slash@5.1.0:
+ resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+ engines: {node: '>=14.16'}
+
slice-ansi@9.0.0:
resolution: {integrity: sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==}
engines: {node: '>=22'}
+ smob@1.6.2:
+ resolution: {integrity: sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==}
+ engines: {node: '>=20.0.0'}
+
smol-toml@1.7.1:
resolution: {integrity: sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ==}
engines: {node: '>= 18'}
@@ -3724,6 +5896,17 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
sprintf-js@1.1.3:
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
@@ -3763,24 +5946,33 @@ packages:
engines: {node: '>=20.16.0'}
hasBin: true
- srvx@0.12.5:
- resolution: {integrity: sha512-IuvtDNQg5EIwv3c6dleyau7u8hCyGQ7D6+V/QM799Aud07z0wCUcurKLTRfyG33C8oUY+UWcVBFkfHMcbtmRLA==}
- engines: {node: '>=20.16.0'}
- hasBin: true
-
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ standard-as-callback@2.1.0:
+ resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==}
+
+ statuses@2.0.2:
+ resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
+ engines: {node: '>= 0.8'}
+
std-env@3.10.0:
resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
std-env@4.2.0:
resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==}
+ streamx@2.28.0:
+ resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==}
+
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
string-width@7.2.0:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
@@ -3789,6 +5981,9 @@ packages:
resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==}
engines: {node: '>=20'}
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
@@ -3800,6 +5995,10 @@ packages:
resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
engines: {node: '>=12'}
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
strip-json-comments@2.0.1:
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
engines: {node: '>=0.10.0'}
@@ -3811,6 +6010,9 @@ packages:
strip-literal@3.1.0:
resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
+ strip-literal@4.0.0:
+ resolution: {integrity: sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==}
+
strnum@2.4.1:
resolution: {integrity: sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==}
@@ -3818,14 +6020,48 @@ packages:
resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==}
engines: {node: '>=18'}
+ structured-clone-es@2.0.1:
+ resolution: {integrity: sha512-10ZL5r77LhknxlP1FBiCW+VdnuWOEFLdSS2SKtjyEV+L4qP1hUEIMIZW94LC3jKxRmT/Dj7KkD1mqh/IY6lhKQ==}
+
+ stylehacks@8.0.2:
+ resolution: {integrity: sha512-3d5vjQODiMc4VwED1w24fAYSfeAjdIRLy88cJQ9NAYkZr/6ozCVbusda5N+0kXsfGWW3pizUgYK2TOZxiU0cSQ==}
+ engines: {node: ^22.11.0 || ^24.11.0 || >=26.0}
+ peerDependencies:
+ postcss: ^8.5.25
+
+ supports-color@10.2.2:
+ resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
+ engines: {node: '>=18'}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
supports-hyperlinks@3.2.0:
resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==}
engines: {node: '>=14.18'}
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svgo@4.0.2:
+ resolution: {integrity: sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ tagged-tag@1.0.0:
+ resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==}
+ engines: {node: '>=20'}
+
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+ engines: {node: '>=6'}
+
tar-fs@2.1.5:
resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==}
@@ -3833,6 +6069,24 @@ packages:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
engines: {node: '>=6'}
+ tar-stream@3.2.0:
+ resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==}
+
+ tar@7.5.22:
+ resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==}
+ engines: {node: '>=18'}
+
+ teex@1.0.1:
+ resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==}
+
+ terser@5.49.2:
+ resolution: {integrity: sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ text-decoder@1.2.7:
+ resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==}
+
thenify-all@1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'}
@@ -3840,9 +6094,16 @@ packages:
thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+ tinyclip@0.1.15:
+ resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==}
+ engines: {node: ^16.14.0 || >= 17.3.0}
+
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
@@ -3877,10 +6138,25 @@ packages:
resolution: {integrity: sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==}
hasBin: true
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
token-types@6.1.2:
resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==}
engines: {node: '>=14.16'}
+ totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
tree-kill@1.2.2:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
@@ -3945,6 +6221,10 @@ packages:
resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
engines: {node: '>=10'}
+ type-fest@5.8.0:
+ resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==}
+ engines: {node: '>=20'}
+
type-level-regexp@0.1.17:
resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==}
@@ -3966,6 +6246,9 @@ packages:
resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
engines: {node: '>=18'}
+ ultrahtml@1.7.0:
+ resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==}
+
unagent@0.0.8:
resolution: {integrity: sha512-xIZpO1mnllQRAdgI3Ibr0gNdkcNs6d6oQDSpDGEbycv/KYCDopH1+hD5tFOwHRXiqeMyQxbPPHcnkpBgzm4QYA==}
peerDependencies:
@@ -4041,9 +6324,32 @@ packages:
unconfig-core@7.5.0:
resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==}
+ unconfig@7.5.0:
+ resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==}
+
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
unctx@2.5.0:
resolution: {integrity: sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==}
+ unctx@3.0.0:
+ resolution: {integrity: sha512-DoXdZVeyi2jyEsn86i8MO5RTItm1kffUkH9/+DQORn3Q688AMOy2551CIl6AdGL2UpwD675wtbNOl75wIQN/uA==}
+ peerDependencies:
+ magic-string: '>=0.30.21'
+ oxc-parser: '>=0.140.0'
+ rolldown: ^1.1.5
+ unplugin: ^3.3.0
+ peerDependenciesMeta:
+ magic-string:
+ optional: true
+ oxc-parser:
+ optional: true
+ rolldown:
+ optional: true
+ unplugin:
+ optional: true
+
undici-types@7.18.2:
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
@@ -4051,13 +6357,63 @@ packages:
resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==}
engines: {node: '>=20.18.1'}
+ undici@8.10.0:
+ resolution: {integrity: sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==}
+ engines: {node: '>=22.19.0'}
+
unenv@2.0.0-rc.24:
resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==}
+ unhead@3.3.1:
+ resolution: {integrity: sha512-eqHlbLyuvIXw898WopQmosTml4PdYW5ZhXDom/sf7ysAqQB9uvYrw2/dNvbrmkJTufSkmNmgGCjoQcvoT2mS/A==}
+ peerDependencies:
+ vite: '>=6.4.2'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
unicode-emoji-modifier-base@1.0.0:
resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==}
engines: {node: '>=4'}
+ unicorn-magic@0.3.0:
+ resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+ engines: {node: '>=18'}
+
+ unicorn-magic@0.4.0:
+ resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==}
+ engines: {node: '>=20'}
+
+ unimport@6.4.0:
+ resolution: {integrity: sha512-JJOOuNMFq8b4ZPBKwQUxEcba4MplskDzYI1Lvrf8rJfWphZTWvPNXWa493qsPngHUmub89w6C7j+SeLWTE/UIQ==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ oxc-parser: '*'
+ rolldown: ^1.0.0
+ peerDependenciesMeta:
+ oxc-parser:
+ optional: true
+ rolldown:
+ optional: true
+
+ unocss@66.7.5:
+ resolution: {integrity: sha512-nAdmU8TwnQoiLnQjZ6Hm1GmHy9lTexKsAZNEJtZnxN9wyFRc1eLjQgmh9r7UEGxBQMQLD8OZOgmk5HpwObbh0Q==}
+ peerDependencies:
+ '@unocss/astro': 66.7.5
+ '@unocss/postcss': 66.7.5
+ '@unocss/webpack': 66.7.5
+ peerDependenciesMeta:
+ '@unocss/astro':
+ optional: true
+ '@unocss/postcss':
+ optional: true
+ '@unocss/webpack':
+ optional: true
+
+ unplugin-utils@0.3.2:
+ resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==}
+ engines: {node: '>=20.19.0'}
+
unplugin@2.3.11:
resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==}
engines: {node: '>=18.12.0'}
@@ -4095,32 +6451,31 @@ packages:
webpack:
optional: true
- unstorage@2.0.0-alpha.7:
- resolution: {integrity: sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog==}
+ unrouting@0.2.2:
+ resolution: {integrity: sha512-EoCab68s1o9AWFq9fjKsMEsmjKrPO11SAsvopikks2eEm/KLXgZMCof4cgpVgdy0Vz71OFBJw6DoDqu1oOSFGw==}
+
+ unstorage@1.17.5:
+ resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==}
peerDependencies:
- '@azure/app-configuration': ^1.11.0
- '@azure/cosmos': ^4.9.1
- '@azure/data-tables': ^13.3.2
- '@azure/identity': ^4.13.0
- '@azure/keyvault-secrets': ^4.10.0
- '@azure/storage-blob': ^12.31.0
+ '@azure/app-configuration': ^1.8.0
+ '@azure/cosmos': ^4.2.0
+ '@azure/data-tables': ^13.3.0
+ '@azure/identity': ^4.6.0
+ '@azure/keyvault-secrets': ^4.9.0
+ '@azure/storage-blob': ^12.26.0
'@capacitor/preferences': ^6 || ^7 || ^8
- '@deno/kv': '>=0.13.0'
+ '@deno/kv': '>=0.9.0'
'@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
'@planetscale/database': ^1.19.0
- '@upstash/redis': ^1.36.2
- '@vercel/blob': '>=0.27.3'
+ '@upstash/redis': ^1.34.3
+ '@vercel/blob': '>=0.27.1'
'@vercel/functions': ^2.2.12 || ^3.0.0
- '@vercel/kv': ^1.0.1
+ '@vercel/kv': ^1 || ^2 || ^3
aws4fetch: ^1.0.20
- chokidar: ^4 || ^5
- db0: '>=0.3.4'
- idb-keyval: ^6.2.2
- ioredis: ^5.9.3
- lru-cache: ^11.2.6
- mongodb: ^6 || ^7
- ofetch: '*'
- uploadthing: ^7.7.4
+ db0: '>=0.2.1'
+ idb-keyval: ^6.2.1
+ ioredis: ^5.4.2
+ uploadthing: ^7.4.4
peerDependenciesMeta:
'@azure/app-configuration':
optional: true
@@ -4152,27 +6507,35 @@ packages:
optional: true
aws4fetch:
optional: true
- chokidar:
- optional: true
db0:
optional: true
idb-keyval:
optional: true
ioredis:
optional: true
- lru-cache:
- optional: true
- mongodb:
- optional: true
- ofetch:
- optional: true
uploadthing:
optional: true
+ untun@0.2.2:
+ resolution: {integrity: sha512-+NnOJcSiEtYsVgJmXUzQbJeRAFXJC4yPJYuh6kF9B0Rm6zunXcs/3GZOTllyocSbUDIxD6Bj7e/4ATw7sph1Sw==}
+ hasBin: true
+
untyped@2.0.0:
resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==}
hasBin: true
+ unwasm@0.5.3:
+ resolution: {integrity: sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==}
+
+ update-browserslist-db@1.3.0:
+ resolution: {integrity: sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uqr@0.1.3:
+ resolution: {integrity: sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA==}
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -4184,11 +6547,73 @@ packages:
resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==}
engines: {node: '>=18.12.0'}
+ vite-dev-rpc@2.0.0:
+ resolution: {integrity: sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==}
+ peerDependencies:
+ vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0
+
+ vite-hot-client@2.2.0:
+ resolution: {integrity: sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==}
+ peerDependencies:
+ vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0
+
vite-node@3.2.4:
resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
+ vite-node@6.0.0:
+ resolution: {integrity: sha512-oj4PVrT+pDh6GYf5wfUXkcZyekYS8kKPfLPXVl8qe324Ec6l4K2DUKNadRbZ3LQl0qGcDz+PyOo7ZAh00Y+JjQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
+ vite-plugin-checker@0.14.5:
+ resolution: {integrity: sha512-c9lQ92eisUO+F7Fd93aelojmiOS+NQpPgQ1XR2LTQHox1/laZf4yAoQj+L3RA9Vgh10e2nFd9b8r2LLyYZsbpA==}
+ engines: {node: '>=20.19.0'}
+ peerDependencies:
+ '@biomejs/biome': '>=2.4.12'
+ eslint: '>=9.39.4'
+ meow: ^13.2.0 || ^14.0.0
+ optionator: ^0.9.4
+ oxlint: '>=1'
+ stylelint: '>=16.26.1'
+ typescript: '*'
+ vite: '>=5.4.21'
+ vue-tsc: ~2.2.10 || ^3.0.0
+ peerDependenciesMeta:
+ '@biomejs/biome':
+ optional: true
+ eslint:
+ optional: true
+ meow:
+ optional: true
+ optionator:
+ optional: true
+ oxlint:
+ optional: true
+ stylelint:
+ optional: true
+ typescript:
+ optional: true
+ vue-tsc:
+ optional: true
+
+ vite-plugin-inspect@11.4.1:
+ resolution: {integrity: sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@nuxt/kit': '*'
+ vite: ^6.0.0 || ^7.0.0-0 || ^8.0.0-0
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+
+ vite-plugin-vue-tracer@1.4.0:
+ resolution: {integrity: sha512-0tQCjCqZWVSK6UeRW9S4ABbf47lKQ68zvrT2FNvZmiL+alDydCVyH/T3Jlfbdc3T3C2Iuyyl5aVsMbF8IQIoxA==}
+ peerDependencies:
+ vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ vue: ^3.5.0
+
vite@7.3.6:
resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -4229,6 +6654,49 @@ packages:
yaml:
optional: true
+ vite@8.2.1:
+ resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.4.0
+ esbuild: ^0.27.0 || ^0.28.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
vitest@3.2.7:
resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -4257,17 +6725,95 @@ packages:
jsdom:
optional: true
+ vscode-uri@3.1.0:
+ resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
+ vue-bundle-renderer@2.3.2:
+ resolution: {integrity: sha512-BtazFw0lm3N/ZE4+tre2g8G+c5wolfizu+e5jxZAcao0gcy5KJei9Yopl1svDato2poeFldVLfmLMk57Sg8rLg==}
+
+ vue-component-type-helpers@3.3.9:
+ resolution: {integrity: sha512-3c/UfMe0SqyEfcGTyH7mfshHagJ9QTCbppCb0/uGpHZpFug7+If3GeGZN7I0YheKEExemx3xldQPoO7PQSOLQg==}
+
+ vue-devtools-stub@0.1.0:
+ resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==}
+
+ vue-router@5.2.0:
+ resolution: {integrity: sha512-QAC5i0LEb1GLG0LXDQmHu8L7FX12j0KwU/JTKmLQUJMrn04gQdKP6Du+p0QwpHb3iy71vBlqnHQ8WAfOSAWhqw==}
+ peerDependencies:
+ '@pinia/colada': '>=0.21.2'
+ '@vue/compiler-sfc': ^3.5.34 || ^4.0.0
+ pinia: ^3.0.4 || ^4.0.2
+ vite: ^7.3.0 || ^8.0.0
+ vue: ^3.5.34 || ^4.0.0
+ peerDependenciesMeta:
+ '@pinia/colada':
+ optional: true
+ '@vue/compiler-sfc':
+ optional: true
+ pinia:
+ optional: true
+ vite:
+ optional: true
+
+ vue-tsc@3.3.9:
+ resolution: {integrity: sha512-TS3Y1ux/IRoE8OCP2PpACAeOseuIs0UvWrcr7u+w3PmfY+SlCfEf8zjrBgnQksHUgLpthi5vHlffcQTQTdPBZA==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.0.0'
+
+ vue@3.5.41:
+ resolution: {integrity: sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
walk-up-path@4.0.0:
resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==}
engines: {node: 20 || >=22}
+ watchpack@2.5.2:
+ resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==}
+ engines: {node: '>=10.13.0'}
+
web-streams-polyfill@3.3.3:
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
engines: {node: '>= 8'}
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ webpack-sources@3.5.1:
+ resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==}
+ engines: {node: '>=10.13.0'}
+
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+ webpack@5.109.2:
+ resolution: {integrity: sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ which@6.0.1:
+ resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+ hasBin: true
+
why-is-node-running@2.3.0:
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
engines: {node: '>=8'}
@@ -4281,6 +6827,10 @@ packages:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
wrap-ansi@9.0.2:
resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
engines: {node: '>=18'}
@@ -4300,6 +6850,10 @@ packages:
utf-8-validate:
optional: true
+ wsl-utils@0.3.1:
+ resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==}
+ engines: {node: '>=20'}
+
xml-naming@0.3.0:
resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==}
engines: {node: '>=16.0.0'}
@@ -4308,6 +6862,13 @@ packages:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@5.0.0:
+ resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+ engines: {node: '>=18'}
+
yaml@2.9.0:
resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
engines: {node: '>= 14.6'}
@@ -4333,6 +6894,12 @@ packages:
resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
engines: {node: '>=12.20'}
+ youch-core@0.3.3:
+ resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==}
+
+ youch@4.1.1:
+ resolution: {integrity: sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==}
+
yuku-ast@0.8.4:
resolution: {integrity: sha512-s7EWfWIQkaGmsGnyr/BU0jli9YTN5TvrKIsSmALyRD9elumDQInuhv0BrVObENKVCxr9W3Ikmnx5u02KvfuUmw==}
@@ -4342,6 +6909,10 @@ packages:
yuku-parser@0.8.4:
resolution: {integrity: sha512-sw41wouvT5rUmLIp87hmvm5vtF+MRSI3x6yjq6xqpYmtkQj+Ht6N7xRQ8lMhLv8N7JAzughGj0Rfi0jQRSu9HQ==}
+ zip-stream@6.0.1:
+ resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==}
+ engines: {node: '>= 14'}
+
zod-to-json-schema@3.25.2:
resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}
peerDependencies:
@@ -4352,6 +6923,12 @@ packages:
snapshots:
+ '@ai-sdk/anthropic@4.0.36(zod@4.4.3)':
+ dependencies:
+ '@ai-sdk/provider': 4.0.7
+ '@ai-sdk/provider-utils': 5.0.25(zod@4.4.3)
+ zod: 4.4.3
+
'@ai-sdk/gateway@4.0.46(zod@4.4.3)':
dependencies:
'@ai-sdk/provider': 4.0.7
@@ -4359,12 +6936,24 @@ snapshots:
'@vercel/oidc': 3.2.0
zod: 4.4.3
+ '@ai-sdk/google@4.0.39(zod@4.4.3)':
+ dependencies:
+ '@ai-sdk/provider': 4.0.7
+ '@ai-sdk/provider-utils': 5.0.25(zod@4.4.3)
+ zod: 4.4.3
+
'@ai-sdk/openai-compatible@3.0.27(zod@4.4.3)':
dependencies:
'@ai-sdk/provider': 4.0.7
'@ai-sdk/provider-utils': 5.0.25(zod@4.4.3)
zod: 4.4.3
+ '@ai-sdk/openai@4.0.36(zod@4.4.3)':
+ dependencies:
+ '@ai-sdk/provider': 4.0.7
+ '@ai-sdk/provider-utils': 5.0.25(zod@4.4.3)
+ zod: 4.4.3
+
'@ai-sdk/provider-utils@5.0.25(zod@4.4.3)':
dependencies:
'@ai-sdk/provider': 4.0.7
@@ -4380,6 +6969,11 @@ snapshots:
'@andrewbranch/untar.js@1.0.4': {}
+ '@antfu/install-pkg@1.1.0':
+ dependencies:
+ package-manager-detector: 1.8.0
+ tinyexec: 1.3.0
+
'@anthropic-ai/sdk@0.91.1(zod@4.4.3)':
dependencies:
json-schema-to-ts: 3.1.1
@@ -4627,27 +7221,216 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
- '@babel/helper-validator-identifier@7.29.7': {}
+ '@babel/compat-data@7.29.7': {}
- '@babel/runtime@7.29.7': {}
+ '@babel/core@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-compilation-targets': 7.29.7
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
+ '@babel/helpers': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
- '@bomb.sh/args@0.3.1': {}
+ '@babel/generator@7.29.8':
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
- '@borewit/text-codec@0.2.2': {}
+ '@babel/generator@8.0.0':
+ dependencies:
+ '@babel/parser': 8.0.4
+ '@babel/types': 8.0.4
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ '@types/jsesc': 2.5.1
+ jsesc: 3.1.0
- '@braidai/lang@1.1.2': {}
+ '@babel/helper-annotate-as-pure@7.29.7':
+ dependencies:
+ '@babel/types': 7.29.8
- '@clack/core@1.4.3':
+ '@babel/helper-compilation-targets@7.29.7':
dependencies:
- fast-wrap-ansi: 0.2.2
- sisteransi: 1.0.5
+ '@babel/compat-data': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
+ browserslist: 4.28.8
+ lru-cache: 5.1.1
+ semver: 6.3.1
- '@clack/prompts@1.7.0':
+ '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)':
dependencies:
- '@clack/core': 1.4.3
- fast-string-width: 3.0.2
- fast-wrap-ansi: 0.2.2
- sisteransi: 1.0.5
+ '@babel/core': 7.29.7
+ '@babel/helper-annotate-as-pure': 7.29.7
+ '@babel/helper-member-expression-to-functions': 7.29.7
+ '@babel/helper-optimise-call-expression': 7.29.7
+ '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
+ '@babel/traverse': 7.29.8
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-globals@7.29.7': {}
+
+ '@babel/helper-member-expression-to-functions@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+ '@babel/traverse': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.29.7':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@babel/helper-plugin-utils@7.29.7': {}
+
+ '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-member-expression-to-functions': 7.29.7
+ '@babel/helper-optimise-call-expression': 7.29.7
+ '@babel/traverse': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.29.7': {}
+
+ '@babel/helper-string-parser@8.0.0': {}
+
+ '@babel/helper-validator-identifier@7.29.7': {}
+
+ '@babel/helper-validator-identifier@8.0.4': {}
+
+ '@babel/helper-validator-option@7.29.7': {}
+
+ '@babel/helpers@7.29.7':
+ dependencies:
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+
+ '@babel/parser@7.29.8':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@babel/parser@8.0.4':
+ dependencies:
+ '@babel/types': 8.0.4
+
+ '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+
+ '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+
+ '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-annotate-as-pure': 7.29.7
+ '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7)
+ '@babel/helper-plugin-utils': 7.29.7
+ '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
+ '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/runtime@7.29.7': {}
+
+ '@babel/template@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+
+ '@babel/traverse@7.29.8':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-globals': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.29.8':
+ dependencies:
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+
+ '@babel/types@8.0.4':
+ dependencies:
+ '@babel/helper-string-parser': 8.0.0
+ '@babel/helper-validator-identifier': 8.0.4
+
+ '@bomb.sh/args@0.3.1': {}
+
+ '@bomb.sh/tab@0.0.19(citty@0.2.2)':
+ dependencies:
+ citty: 0.2.2
+
+ '@borewit/text-codec@0.2.2': {}
+
+ '@braidai/lang@1.1.2': {}
+
+ '@clack/core@1.4.3':
+ dependencies:
+ fast-wrap-ansi: 0.2.2
+ sisteransi: 1.0.5
+
+ '@clack/prompts@1.7.0':
+ dependencies:
+ '@clack/core': 1.4.3
+ fast-string-width: 3.0.2
+ fast-wrap-ansi: 0.2.2
+ sisteransi: 1.0.5
+
+ '@cloudflare/kv-asset-handler@0.4.2': {}
+
+ '@colordx/core@5.5.0': {}
'@colors/colors@1.5.0':
optional: true
@@ -4764,6 +7547,27 @@ snapshots:
'@conventional-changelog/template@1.2.1': {}
+ '@dxup/nuxt@0.5.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)':
+ dependencies:
+ '@dxup/unimport': 0.1.2
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ '@vue/compiler-dom': 3.5.41
+ chokidar: 5.0.0
+ knitwork: 1.3.0
+ magic-string: 1.1.0
+ pathe: 2.0.3
+ tinyglobby: 0.2.17
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - magicast
+ - oxc-parser
+ - unloader
+
+ '@dxup/unimport@0.1.2': {}
+
'@e18e/eslint-plugin@0.8.0(oxlint@1.77.0(oxlint-tsgolint@7.0.2001))':
dependencies:
empathic: 2.0.1
@@ -4791,12 +7595,23 @@ snapshots:
- supports-color
- utf-8-validate
+ '@emnapi/core@1.10.0':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.1
+ tslib: 2.8.1
+ optional: true
+
'@emnapi/core@1.11.2':
dependencies:
'@emnapi/wasi-threads': 1.2.2
tslib: 2.8.1
optional: true
+ '@emnapi/runtime@1.10.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@emnapi/runtime@1.11.2':
dependencies:
tslib: 2.8.1
@@ -4807,6 +7622,11 @@ snapshots:
tslib: 2.8.1
optional: true
+ '@emnapi/wasi-threads@1.2.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@emnapi/wasi-threads@1.2.2':
dependencies:
tslib: 2.8.1
@@ -4913,6 +7733,14 @@ snapshots:
onnxruntime-web: 1.26.0-dev.20260416-b7804b056c
sharp: 0.34.5
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/utils@3.1.4':
+ dependencies:
+ '@antfu/install-pkg': 1.1.0
+ '@iconify/types': 2.0.0
+ import-meta-resolve: 4.2.0
+
'@img/colour@1.1.0': {}
'@img/sharp-darwin-arm64@0.34.5':
@@ -5009,6 +7837,21 @@ snapshots:
'@img/sharp-win32-x64@0.34.5':
optional: true
+ '@ioredis/commands@1.10.0': {}
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.2.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@isaacs/fs-minipass@4.0.1':
+ dependencies:
+ minipass: 7.1.3
+
'@jitl/quickjs-ffi-types@0.32.0': {}
'@jitl/quickjs-wasmfile-debug-asyncify@0.32.0':
@@ -5039,6 +7882,11 @@ snapshots:
'@jridgewell/resolve-uri@3.1.2': {}
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.31':
@@ -5046,10 +7894,31 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@kwsites/file-exists@1.1.1':
+ dependencies:
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@kwsites/promise-deferred@1.1.1': {}
+
'@loaderkit/resolve@1.0.6':
dependencies:
'@braidai/lang': 1.1.2
+ '@mapbox/node-pre-gyp@2.0.3':
+ dependencies:
+ consola: 3.4.2
+ detect-libc: 2.1.2
+ https-proxy-agent: 7.0.6
+ node-fetch: 2.7.0
+ nopt: 8.1.0
+ semver: 7.8.5
+ tar: 7.5.22
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
'@mdream/crawl@1.5.12':
dependencies:
'@clack/prompts': 1.7.0
@@ -5185,6 +8054,13 @@ snapshots:
'@napi-rs/lzma-linux-x64-gnu@1.5.1':
optional: true
+ '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)':
+ dependencies:
+ '@emnapi/core': 1.10.0
+ '@emnapi/runtime': 1.10.0
+ '@tybys/wasm-util': 0.10.3
+ optional: true
+
'@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
dependencies:
'@emnapi/core': 1.11.2
@@ -5194,6 +8070,140 @@ snapshots:
'@nodable/entities@3.0.0': {}
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.1
+
+ '@nuxt/cli@3.37.0(@nuxt/schema@4.5.2)':
+ dependencies:
+ '@bomb.sh/tab': 0.0.19(citty@0.2.2)
+ '@clack/prompts': 1.7.0
+ '@nuxt/schema': 4.5.2
+ c12: 3.3.4
+ citty: 0.2.2
+ confbox: 0.2.4
+ consola: 3.4.2
+ debug: 4.4.3
+ defu: 6.1.7
+ exsolve: 1.1.1
+ fuse.js: 7.5.0
+ fzf: 0.5.2
+ giget: 3.3.1
+ jiti: 2.7.0
+ listhen: 1.10.1
+ nypm: 0.6.9
+ ofetch: 1.5.1
+ ohash: 2.0.11
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ pkg-types: 2.3.1
+ scule: 1.3.0
+ semver: 7.8.5
+ srvx: 0.11.22
+ std-env: 4.2.0
+ tinyclip: 0.1.15
+ tinyexec: 1.3.0
+ ufo: 1.6.4
+ youch: 4.1.1
+ transitivePeerDependencies:
+ - '@parcel/watcher'
+ - cac
+ - commander
+ - magicast
+ - supports-color
+
+ '@nuxt/devalue@2.0.2': {}
+
+ '@nuxt/devtools-kit@3.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))':
+ dependencies:
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ execa: 8.0.1
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ transitivePeerDependencies:
+ - magicast
+ - oxc-parser
+
+ '@nuxt/devtools-wizard@3.4.1':
+ dependencies:
+ '@clack/prompts': 1.7.0
+ consola: 3.4.2
+ diff: 8.0.4
+ execa: 8.0.1
+ magicast: 0.5.4
+ pathe: 2.0.3
+ pkg-types: 2.3.1
+ semver: 7.8.5
+
+ '@nuxt/devtools@3.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))':
+ dependencies:
+ '@nuxt/devtools-kit': 3.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ '@nuxt/devtools-wizard': 3.4.1
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ '@vue/devtools-core': 8.2.1(vue@3.5.41)
+ '@vue/devtools-kit': 8.2.1
+ birpc: 4.0.0
+ consola: 3.4.2
+ destr: 2.0.5
+ error-stack-parser-es: 2.0.1
+ execa: 8.0.1
+ fast-npm-meta: 2.2.0
+ get-port-please: 3.2.0
+ hookable: 6.1.1
+ image-meta: 0.2.2
+ is-installed-globally: 1.0.0
+ launch-editor: 2.14.1
+ local-pkg: 1.2.1
+ magicast: 0.5.4
+ nypm: 0.6.9
+ ohash: 2.0.11
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ pkg-types: 2.3.1
+ semver: 7.8.5
+ simple-git: 3.36.0
+ sirv: 3.0.2
+ structured-clone-es: 2.0.1
+ tinyglobby: 0.2.17
+ unstorage: 1.17.5
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ vite-plugin-inspect: 11.4.1(@nuxt/kit@4.5.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ vite-plugin-vue-tracer: 1.4.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(vue@3.5.41)
+ which: 6.0.1
+ ws: 8.21.3
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - idb-keyval
+ - ioredis
+ - magicast
+ - oxc-parser
+ - supports-color
+ - uploadthing
+ - utf-8-validate
+
'@nuxt/kit@3.21.11':
dependencies:
c12: 3.3.4
@@ -5220,114 +8230,383 @@ snapshots:
transitivePeerDependencies:
- magicast
- '@nuxt/schema@3.21.11':
+ '@nuxt/kit@4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))':
dependencies:
- '@vue/shared': 3.5.41
+ c12: 3.3.4
+ consola: 3.4.2
defu: 6.1.7
+ destr: 2.0.5
+ errx: 0.1.2
+ exsolve: 1.1.1
+ ignore: 7.0.6
+ jiti: 2.7.0
+ klona: 2.0.6
+ mlly: 1.8.2
+ nostics: 1.2.0
+ ohash: 2.0.11
pathe: 2.0.3
pkg-types: 2.3.1
- std-env: 4.2.0
-
- '@opentelemetry/api@1.9.0': {}
-
- '@opentelemetry/semantic-conventions@1.43.0': {}
-
- '@oxc-parser/binding-android-arm-eabi@0.142.0':
- optional: true
-
- '@oxc-parser/binding-android-arm-eabi@0.143.0':
- optional: true
+ rc9: 3.0.1
+ scule: 1.3.0
+ tinyglobby: 0.2.17
+ ufo: 1.6.4
+ unctx: 3.0.0(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ untyped: 2.0.0
+ verkit: 0.3.2
+ transitivePeerDependencies:
+ - magicast
+ - oxc-parser
- '@oxc-parser/binding-android-arm64@0.142.0':
- optional: true
+ '@nuxt/nitro-server@4.5.2(nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.3))':
+ dependencies:
+ '@nuxt/devalue': 2.0.2
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ '@unhead/vue': 3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
+ '@vue/shared': 3.5.41
+ consola: 3.4.2
+ defu: 6.1.7
+ destr: 2.0.5
+ devalue: 5.9.0
+ errx: 0.1.2
+ escape-string-regexp: 5.0.0
+ exsolve: 1.1.1
+ h3: 1.15.11
+ impound: 1.1.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ klona: 2.0.6
+ mocked-exports: 0.1.1
+ nitropack: 2.13.4
+ nostics: 1.2.0
+ nuxt: 4.5.2(@types/node@24.13.3)(rolldown@1.2.3)
+ nypm: 0.6.9
+ ohash: 2.0.11
+ pathe: 2.0.3
+ rou3: 0.9.1
+ std-env: 4.2.0
+ ufo: 1.6.4
+ unctx: 3.0.0(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ unstorage: 1.17.5
+ vue: 3.5.41
+ vue-bundle-renderer: 2.3.2
+ vue-devtools-stub: 0.1.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@electric-sql/pglite'
+ - '@farmfe/core'
+ - '@libsql/client'
+ - '@netlify/blobs'
+ - '@oxc-project/types'
+ - '@parcel/watcher'
+ - '@planetscale/database'
+ - '@rspack/core'
+ - '@unhead/cli'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - '@vitejs/devtools-kit'
+ - aws4fetch
+ - bare-abort-controller
+ - bare-buffer
+ - better-sqlite3
+ - bun-types-no-globals
+ - db0
+ - drizzle-orm
+ - encoding
+ - idb-keyval
+ - ioredis
+ - lightningcss
+ - magicast
+ - mysql2
+ - oxc-parser
+ - react-native-b4a
+ - sqlite3
+ - supports-color
+ - typescript
+ - unloader
+ - uploadthing
+ - xml2js
+
+ '@nuxt/schema@3.21.11':
+ dependencies:
+ '@vue/shared': 3.5.41
+ defu: 6.1.7
+ pathe: 2.0.3
+ pkg-types: 2.3.1
+ std-env: 4.2.0
+
+ '@nuxt/schema@4.5.2':
+ dependencies:
+ '@vue/shared': 3.5.41
+ defu: 6.1.7
+ nostics: 1.2.0
+ pathe: 2.0.3
+ pkg-types: 2.3.1
+ std-env: 4.2.0
+
+ '@nuxt/telemetry@2.8.0(@nuxt/kit@4.5.2)':
+ dependencies:
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ citty: 0.2.2
+ consola: 3.4.2
+ ofetch: 2.0.0-alpha.3
+ rc9: 3.0.1
+ std-env: 4.2.0
+
+ '@nuxt/vite-builder@4.5.2(nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.3))(rolldown@1.2.3)(vue@3.5.41)':
+ dependencies:
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ '@vitejs/plugin-vue': 6.0.8(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))(vue@3.5.41)
+ '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))(vue@3.5.41)
+ autoprefixer: 10.5.4(postcss@8.5.26)
+ consola: 3.4.2
+ cssnano: 8.0.4(postcss@8.5.26)
+ defu: 6.1.7
+ escape-string-regexp: 5.0.0
+ exsolve: 1.1.1
+ generic-names: 4.0.0
+ get-port-please: 3.2.0
+ jiti: 2.7.0
+ js-tokens: 10.0.0
+ knitwork: 1.3.0
+ mlly: 1.8.2
+ mocked-exports: 0.1.1
+ nuxt: 4.5.2(@types/node@24.13.3)(rolldown@1.2.3)
+ nypm: 0.6.9
+ pathe: 2.0.3
+ pkg-types: 2.3.1
+ postcss: 8.5.26
+ rolldown: 1.2.3
+ rolldown-string: 0.3.1(rolldown@1.2.3)
+ seroval: 1.6.2
+ std-env: 4.2.0
+ ufo: 1.6.4
+ unenv: 2.0.0-rc.24
+ vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)
+ vite-node: 6.0.0(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)
+ vite-plugin-checker: 0.14.5(oxlint@1.77.0(oxlint-tsgolint@7.0.2001))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))(vue-tsc@3.3.9(typescript@6.0.3-bridge.12.tsgo.7.0.2))
+ vue: 3.5.41
+ vue-bundle-renderer: 2.3.2
+ transitivePeerDependencies:
+ - '@biomejs/biome'
+ - '@vitejs/devtools'
+ - eslint
+ - less
+ - magicast
+ - meow
+ - optionator
+ - oxc-parser
+ - sass
+ - sass-embedded
+ - stylelint
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - typescript
+ - yaml
+
+ '@opentelemetry/api@1.9.0': {}
+
+ '@opentelemetry/semantic-conventions@1.43.0': {}
+
+ '@orpc/client@2.0.0-beta.26':
+ dependencies:
+ '@orpc/shared': 2.0.0-beta.26
+ '@standardserver/core': 0.7.1
+ '@standardserver/fetch': 0.7.1
+ '@standardserver/peer': 0.7.1
+ transitivePeerDependencies:
+ - '@opentelemetry/api'
+
+ '@orpc/contract@2.0.0-beta.26':
+ dependencies:
+ '@orpc/client': 2.0.0-beta.26
+ '@orpc/shared': 2.0.0-beta.26
+ '@standard-schema/spec': 1.1.0
+ transitivePeerDependencies:
+ - '@opentelemetry/api'
+
+ '@orpc/server@2.0.0-beta.26(crossws@0.4.10(srvx@0.11.22))':
+ dependencies:
+ '@orpc/client': 2.0.0-beta.26
+ '@orpc/contract': 2.0.0-beta.26
+ '@orpc/shared': 2.0.0-beta.26
+ '@standardserver/aws-lambda': 0.7.1
+ '@standardserver/core': 0.7.1
+ '@standardserver/fastify': 0.7.1
+ '@standardserver/fetch': 0.7.1
+ '@standardserver/node': 0.7.1
+ '@standardserver/peer': 0.7.1
+ cookie: 2.0.1
+ crossws: 0.4.10(srvx@0.11.22)
+ transitivePeerDependencies:
+ - '@opentelemetry/api'
+ - fastify
+
+ '@orpc/shared@2.0.0-beta.26':
+ dependencies:
+ '@standardserver/shared': 0.7.1
+ radash: 12.1.1
+ type-fest: 5.8.0
+
+ '@oxc-parser/binding-android-arm-eabi@0.131.0':
+ optional: true
+
+ '@oxc-parser/binding-android-arm-eabi@0.142.0':
+ optional: true
+
+ '@oxc-parser/binding-android-arm-eabi@0.143.0':
+ optional: true
+
+ '@oxc-parser/binding-android-arm64@0.131.0':
+ optional: true
+
+ '@oxc-parser/binding-android-arm64@0.142.0':
+ optional: true
'@oxc-parser/binding-android-arm64@0.143.0':
optional: true
+ '@oxc-parser/binding-darwin-arm64@0.131.0':
+ optional: true
+
'@oxc-parser/binding-darwin-arm64@0.142.0':
optional: true
'@oxc-parser/binding-darwin-arm64@0.143.0':
optional: true
+ '@oxc-parser/binding-darwin-x64@0.131.0':
+ optional: true
+
'@oxc-parser/binding-darwin-x64@0.142.0':
optional: true
'@oxc-parser/binding-darwin-x64@0.143.0':
optional: true
+ '@oxc-parser/binding-freebsd-x64@0.131.0':
+ optional: true
+
'@oxc-parser/binding-freebsd-x64@0.142.0':
optional: true
'@oxc-parser/binding-freebsd-x64@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-arm-gnueabihf@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-arm-gnueabihf@0.142.0':
optional: true
'@oxc-parser/binding-linux-arm-gnueabihf@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-arm-musleabihf@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-arm-musleabihf@0.142.0':
optional: true
'@oxc-parser/binding-linux-arm-musleabihf@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-arm64-gnu@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-arm64-gnu@0.142.0':
optional: true
'@oxc-parser/binding-linux-arm64-gnu@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-arm64-musl@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-arm64-musl@0.142.0':
optional: true
'@oxc-parser/binding-linux-arm64-musl@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-ppc64-gnu@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-ppc64-gnu@0.142.0':
optional: true
'@oxc-parser/binding-linux-ppc64-gnu@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-riscv64-gnu@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-riscv64-gnu@0.142.0':
optional: true
'@oxc-parser/binding-linux-riscv64-gnu@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-riscv64-musl@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-riscv64-musl@0.142.0':
optional: true
'@oxc-parser/binding-linux-riscv64-musl@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-s390x-gnu@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-s390x-gnu@0.142.0':
optional: true
'@oxc-parser/binding-linux-s390x-gnu@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-x64-gnu@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-x64-gnu@0.142.0':
optional: true
'@oxc-parser/binding-linux-x64-gnu@0.143.0':
optional: true
+ '@oxc-parser/binding-linux-x64-musl@0.131.0':
+ optional: true
+
'@oxc-parser/binding-linux-x64-musl@0.142.0':
optional: true
'@oxc-parser/binding-linux-x64-musl@0.143.0':
optional: true
+ '@oxc-parser/binding-openharmony-arm64@0.131.0':
+ optional: true
+
'@oxc-parser/binding-openharmony-arm64@0.142.0':
optional: true
'@oxc-parser/binding-openharmony-arm64@0.143.0':
optional: true
+ '@oxc-parser/binding-wasm32-wasi@0.131.0':
+ dependencies:
+ '@emnapi/core': 1.10.0
+ '@emnapi/runtime': 1.10.0
+ '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)
+ optional: true
+
'@oxc-parser/binding-wasm32-wasi@0.142.0':
dependencies:
'@emnapi/core': 1.11.2
@@ -5335,24 +8614,35 @@ snapshots:
'@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
optional: true
+ '@oxc-parser/binding-win32-arm64-msvc@0.131.0':
+ optional: true
+
'@oxc-parser/binding-win32-arm64-msvc@0.142.0':
optional: true
'@oxc-parser/binding-win32-arm64-msvc@0.143.0':
optional: true
+ '@oxc-parser/binding-win32-ia32-msvc@0.131.0':
+ optional: true
+
'@oxc-parser/binding-win32-ia32-msvc@0.142.0':
optional: true
'@oxc-parser/binding-win32-ia32-msvc@0.143.0':
optional: true
+ '@oxc-parser/binding-win32-x64-msvc@0.131.0':
+ optional: true
+
'@oxc-parser/binding-win32-x64-msvc@0.142.0':
optional: true
'@oxc-parser/binding-win32-x64-msvc@0.143.0':
optional: true
+ '@oxc-project/types@0.131.0': {}
+
'@oxc-project/types@0.142.0': {}
'@oxc-project/types@0.143.0': {}
@@ -5550,6 +8840,30 @@ snapshots:
'@oxlint/binding-win32-x64-msvc@1.77.0':
optional: true
+ '@parcel/watcher-wasm@2.6.0':
+ dependencies:
+ is-glob: 4.0.3
+ picomatch: 4.0.5
+ bundledDependencies:
+ - napi-wasm
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@polka/url@1.0.0-next.29': {}
+
+ '@poppinss/colors@4.1.6':
+ dependencies:
+ kleur: 4.1.5
+
+ '@poppinss/dumper@0.7.0':
+ dependencies:
+ '@poppinss/colors': 4.1.6
+ '@sindresorhus/is': 7.2.0
+ supports-color: 10.2.2
+
+ '@poppinss/exception@1.2.3': {}
+
'@protobufjs/aspromise@1.1.2': {}
'@protobufjs/base64@1.1.2': {}
@@ -5578,12 +8892,13 @@ snapshots:
dependencies:
quansync: 1.0.0
- '@redstardev/unplugin-version-injector@0.0.2(@nuxt/kit@3.21.11)(@nuxt/schema@3.21.11)(esbuild@0.28.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))':
+ '@redstardev/unplugin-version-injector@0.0.2(@nuxt/kit@3.21.11)(@nuxt/schema@3.21.11)(esbuild@0.28.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)':
dependencies:
'@nuxt/kit': 3.21.11
'@nuxt/schema': 3.21.11
'@sapphire/result': 2.8.0
- unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ webpack: 5.109.2
optionalDependencies:
esbuild: 0.28.1
vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
@@ -5592,7 +8907,6 @@ snapshots:
- '@rspack/core'
- bun-types-no-globals
- unloader
- - webpack
'@rolldown/binding-android-arm64@1.2.3':
optional: true
@@ -5638,6 +8952,62 @@ snapshots:
'@rolldown/pluginutils@1.0.1': {}
+ '@rollup/plugin-alias@6.0.0(rollup@4.62.4)':
+ dependencies:
+ rollup: 4.62.4
+
+ '@rollup/plugin-commonjs@29.0.3(rollup@4.62.4)':
+ dependencies:
+ '@rollup/pluginutils': 5.4.0(rollup@4.62.4)
+ commondir: 1.0.1
+ estree-walker: 2.0.2
+ fdir: 6.5.0(picomatch@4.0.5)
+ is-reference: 1.2.1
+ magic-string: 0.30.21
+ picomatch: 4.0.5
+ rollup: 4.62.4
+
+ '@rollup/plugin-inject@5.0.5(rollup@4.62.4)':
+ dependencies:
+ '@rollup/pluginutils': 5.4.0(rollup@4.62.4)
+ estree-walker: 2.0.2
+ magic-string: 0.30.21
+ rollup: 4.62.4
+
+ '@rollup/plugin-json@6.1.0(rollup@4.62.4)':
+ dependencies:
+ '@rollup/pluginutils': 5.4.0(rollup@4.62.4)
+ rollup: 4.62.4
+
+ '@rollup/plugin-node-resolve@16.0.3(rollup@4.62.4)':
+ dependencies:
+ '@rollup/pluginutils': 5.4.0(rollup@4.62.4)
+ '@types/resolve': 1.20.2
+ deepmerge: 4.3.1
+ is-module: 1.0.0
+ resolve: 1.22.12
+ rollup: 4.62.4
+
+ '@rollup/plugin-replace@6.0.3(rollup@4.62.4)':
+ dependencies:
+ '@rollup/pluginutils': 5.4.0(rollup@4.62.4)
+ magic-string: 0.30.21
+ rollup: 4.62.4
+
+ '@rollup/plugin-terser@1.0.0(rollup@4.62.4)':
+ dependencies:
+ rollup: 4.62.4
+ serialize-javascript: 7.1.0
+ smob: 1.6.2
+ terser: 5.49.2
+
+ '@rollup/pluginutils@5.4.0(rollup@4.62.4)':
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-walker: 2.0.2
+ picomatch: 4.0.5
+ rollup: 4.62.4
+
'@rollup/rollup-android-arm-eabi@4.62.4':
optional: true
@@ -5715,6 +9085,12 @@ snapshots:
'@sapphire/result@2.8.0': {}
+ '@simple-git/args-pathspec@1.0.3': {}
+
+ '@simple-git/argv-parser@1.1.1':
+ dependencies:
+ '@simple-git/args-pathspec': 1.0.3
+
'@simple-libs/child-process-utils@2.0.0':
dependencies:
'@simple-libs/stream-utils': 2.0.0
@@ -5723,6 +9099,10 @@ snapshots:
'@sindresorhus/is@4.6.0': {}
+ '@sindresorhus/is@7.2.0': {}
+
+ '@sindresorhus/merge-streams@4.0.0': {}
+
'@smithy/core@3.31.1':
dependencies:
'@smithy/types': 4.16.1
@@ -5776,8 +9156,44 @@ snapshots:
'@smithy/util-buffer-from': 2.2.0
tslib: 2.8.1
+ '@speed-highlight/core@1.2.23': {}
+
'@standard-schema/spec@1.1.0': {}
+ '@standardserver/aws-lambda@0.7.1':
+ dependencies:
+ '@standardserver/core': 0.7.1
+ '@standardserver/fetch': 0.7.1
+ '@standardserver/node': 0.7.1
+ '@standardserver/shared': 0.7.1
+
+ '@standardserver/core@0.7.1':
+ dependencies:
+ '@standardserver/shared': 0.7.1
+
+ '@standardserver/fastify@0.7.1':
+ dependencies:
+ '@standardserver/core': 0.7.1
+ '@standardserver/node': 0.7.1
+
+ '@standardserver/fetch@0.7.1':
+ dependencies:
+ '@standardserver/core': 0.7.1
+ '@standardserver/shared': 0.7.1
+
+ '@standardserver/node@0.7.1':
+ dependencies:
+ '@standardserver/core': 0.7.1
+ '@standardserver/fetch': 0.7.1
+ '@standardserver/shared': 0.7.1
+
+ '@standardserver/peer@0.7.1':
+ dependencies:
+ '@standardserver/core': 0.7.1
+ '@standardserver/shared': 0.7.1
+
+ '@standardserver/shared@0.7.1': {}
+
'@tokenizer/inflate@0.4.1':
dependencies:
debug: 4.4.3
@@ -5819,10 +9235,16 @@ snapshots:
'@types/estree@1.0.9': {}
+ '@types/jsesc@2.5.1': {}
+
+ '@types/json-schema@7.0.15': {}
+
'@types/node@24.13.3':
dependencies:
undici-types: 7.18.2
+ '@types/resolve@1.20.2': {}
+
'@types/retry@0.12.0': {}
'@typescript-native-bridge/darwin-arm64@6.0.3-bridge.12.tsgo.7.0.2':
@@ -5846,29 +9268,279 @@ snapshots:
'@typescript-native-bridge/win32-x64@6.0.3-bridge.12.tsgo.7.0.2':
optional: true
- '@vercel/oidc@3.2.0': {}
-
- '@vite-hub/shell@0.0.3':
+ '@unhead/bundler@3.3.1(esbuild@0.28.1)(rolldown@1.2.3)(unhead@3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)))(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)':
dependencies:
- just-bash: 3.2.0
- sh-syntax: 0.6.0
+ esbuild: 0.28.1
+ magic-string: 1.1.0
+ oxc-walker: 1.1.1(rolldown@1.2.3)
+ rolldown: 1.2.3
+ unhead: 3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ webpack: 5.109.2
transitivePeerDependencies:
- - supports-color
-
- '@vitest/expect@3.2.7':
- dependencies:
- '@types/chai': 5.2.3
- '@vitest/spy': 3.2.7
- '@vitest/utils': 3.2.7
- chai: 5.3.3
- tinyrainbow: 2.0.0
+ - '@farmfe/core'
+ - '@oxc-project/types'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - oxc-parser
+ - unloader
- '@vitest/mocker@3.2.7(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))':
+ '@unhead/vue@3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)':
dependencies:
- '@vitest/spy': 3.2.7
- estree-walker: 3.0.3
- magic-string: 0.30.21
- optionalDependencies:
+ '@unhead/bundler': 3.3.1(esbuild@0.28.1)(rolldown@1.2.3)(unhead@3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)))(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ hookable: 6.1.1
+ unhead: 3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ vue: 3.5.41
+ webpack: 5.109.2
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@oxc-project/types'
+ - '@rspack/core'
+ - '@unhead/cli'
+ - '@vitejs/devtools-kit'
+ - bun-types-no-globals
+ - lightningcss
+ - oxc-parser
+ - unloader
+
+ '@unocss/cli@66.7.5':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ '@unocss/config': 66.7.5
+ '@unocss/core': 66.7.5
+ '@unocss/preset-wind3': 66.7.5
+ '@unocss/preset-wind4': 66.7.5
+ '@unocss/transformer-directives': 66.7.5
+ cac: 7.0.0
+ chokidar: 5.0.0
+ colorette: 2.0.20
+ consola: 3.4.2
+ magic-string: 0.30.21
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ tinyglobby: 0.2.17
+ unplugin-utils: 0.3.2
+
+ '@unocss/config@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ colorette: 2.0.20
+ consola: 3.4.2
+ unconfig: 7.5.0
+
+ '@unocss/core@66.7.5': {}
+
+ '@unocss/extractor-arbitrary-variants@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+
+ '@unocss/inspector@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ '@unocss/rule-utils': 66.7.5
+ colorette: 2.0.20
+ gzip-size: 6.0.0
+ sirv: 3.0.2
+
+ '@unocss/nuxt@66.7.5(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)':
+ dependencies:
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ '@unocss/config': 66.7.5
+ '@unocss/core': 66.7.5
+ '@unocss/preset-attributify': 66.7.5
+ '@unocss/preset-icons': 66.7.5
+ '@unocss/preset-tagify': 66.7.5
+ '@unocss/preset-typography': 66.7.5
+ '@unocss/preset-web-fonts': 66.7.5
+ '@unocss/preset-wind3': 66.7.5
+ '@unocss/preset-wind4': 66.7.5
+ '@unocss/reset': 66.7.5
+ '@unocss/vite': 66.7.5(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ '@unocss/webpack': 66.7.5(webpack@5.109.2)
+ unocss: 66.7.5(@unocss/webpack@66.7.5(webpack@5.109.2))
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - '@unocss/astro'
+ - '@unocss/postcss'
+ - bun-types-no-globals
+ - magicast
+ - oxc-parser
+ - unloader
+
+ '@unocss/preset-attributify@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+
+ '@unocss/preset-icons@66.7.5':
+ dependencies:
+ '@iconify/utils': 3.1.4
+ '@unocss/core': 66.7.5
+ ofetch: 1.5.1
+
+ '@unocss/preset-mini@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ '@unocss/extractor-arbitrary-variants': 66.7.5
+ '@unocss/rule-utils': 66.7.5
+
+ '@unocss/preset-tagify@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+
+ '@unocss/preset-typography@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ '@unocss/rule-utils': 66.7.5
+
+ '@unocss/preset-uno@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ '@unocss/preset-wind3': 66.7.5
+
+ '@unocss/preset-web-fonts@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ ofetch: 1.5.1
+
+ '@unocss/preset-wind3@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ '@unocss/preset-mini': 66.7.5
+ '@unocss/rule-utils': 66.7.5
+
+ '@unocss/preset-wind4@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ '@unocss/extractor-arbitrary-variants': 66.7.5
+ '@unocss/rule-utils': 66.7.5
+
+ '@unocss/preset-wind@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ '@unocss/preset-wind3': 66.7.5
+
+ '@unocss/reset@66.7.5': {}
+
+ '@unocss/rule-utils@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ magic-string: 0.30.21
+
+ '@unocss/transformer-attributify-jsx@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ oxc-parser: 0.131.0
+ oxc-walker: 0.7.0(oxc-parser@0.131.0)
+
+ '@unocss/transformer-compile-class@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+
+ '@unocss/transformer-directives@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+ '@unocss/rule-utils': 66.7.5
+ css-tree: 3.2.1
+
+ '@unocss/transformer-variant-group@66.7.5':
+ dependencies:
+ '@unocss/core': 66.7.5
+
+ '@unocss/vite@66.7.5(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ '@unocss/config': 66.7.5
+ '@unocss/core': 66.7.5
+ '@unocss/inspector': 66.7.5
+ chokidar: 5.0.0
+ magic-string: 0.30.21
+ pathe: 2.0.3
+ tinyglobby: 0.2.17
+ unplugin-utils: 0.3.2
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+
+ '@unocss/webpack@66.7.5(webpack@5.109.2)':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ '@unocss/config': 66.7.5
+ '@unocss/core': 66.7.5
+ chokidar: 5.0.0
+ magic-string: 0.30.21
+ pathe: 2.0.3
+ tinyglobby: 0.2.17
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ unplugin-utils: 0.3.2
+ webpack: 5.109.2
+ webpack-sources: 3.5.1
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - unloader
+
+ '@vercel/nft@1.10.2(rollup@4.62.4)':
+ dependencies:
+ '@mapbox/node-pre-gyp': 2.0.3
+ '@rollup/pluginutils': 5.4.0(rollup@4.62.4)
+ acorn: 8.18.0
+ acorn-import-attributes: 1.9.5(acorn@8.18.0)
+ async-sema: 3.1.1
+ bindings: 1.5.0
+ estree-walker: 2.0.2
+ glob: 13.0.6
+ graceful-fs: 4.2.11
+ node-gyp-build: 4.8.4
+ picomatch: 4.0.5
+ resolve-from: 5.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@vercel/oidc@3.2.0': {}
+
+ '@vite-hub/shell@0.0.3':
+ dependencies:
+ just-bash: 3.2.0
+ sh-syntax: 0.6.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitejs/plugin-vue-jsx@5.1.6(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))(vue@3.5.41)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7)
+ '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
+ '@rolldown/pluginutils': 1.0.1
+ '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7)
+ vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)
+ vue: 3.5.41
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitejs/plugin-vue@6.0.8(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))(vue@3.5.41)':
+ dependencies:
+ '@rolldown/pluginutils': 1.0.1
+ vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)
+ vue: 3.5.41
+
+ '@vitest/expect@3.2.7':
+ dependencies:
+ '@types/chai': 5.2.3
+ '@vitest/spy': 3.2.7
+ '@vitest/utils': 3.2.7
+ chai: 5.3.3
+ tinyrainbow: 2.0.0
+
+ '@vitest/mocker@3.2.7(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))':
+ dependencies:
+ '@vitest/spy': 3.2.7
+ estree-walker: 3.0.3
+ magic-string: 0.30.21
+ optionalDependencies:
vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
'@vitest/pretty-format@3.2.7':
@@ -5897,10 +9569,220 @@ snapshots:
loupe: 3.2.1
tinyrainbow: 2.0.0
+ '@volar/language-core@2.4.28':
+ dependencies:
+ '@volar/source-map': 2.4.28
+
+ '@volar/source-map@2.4.28': {}
+
+ '@volar/typescript@2.4.28':
+ dependencies:
+ '@volar/language-core': 2.4.28
+ path-browserify: 1.0.1
+ vscode-uri: 3.1.0
+
+ '@vue-macros/common@3.1.4(vue@3.5.41)':
+ dependencies:
+ '@vue/compiler-sfc': 3.5.41
+ ast-kit: 2.2.0
+ local-pkg: 1.2.1
+ magic-string-ast: 1.0.3
+ unplugin-utils: 0.3.2
+ vue: 3.5.41
+
+ '@vue/babel-helper-vue-transform-on@2.0.1': {}
+
+ '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+ '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
+ '@babel/template': 7.29.7
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ '@vue/babel-helper-vue-transform-on': 2.0.1
+ '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.7)
+ '@vue/shared': 3.5.41
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/core': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+ '@babel/parser': 7.29.8
+ '@vue/compiler-sfc': 3.5.41
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vue/compiler-core@3.5.41':
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@vue/shared': 3.5.41
+ entities: 7.0.1
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.41':
+ dependencies:
+ '@vue/compiler-core': 3.5.41
+ '@vue/shared': 3.5.41
+
+ '@vue/compiler-sfc@3.5.41':
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@vue/compiler-core': 3.5.41
+ '@vue/compiler-dom': 3.5.41
+ '@vue/compiler-ssr': 3.5.41
+ '@vue/shared': 3.5.41
+ estree-walker: 2.0.2
+ magic-string: 0.30.21
+ postcss: 8.5.26
+ source-map-js: 1.2.1
+
+ '@vue/compiler-ssr@3.5.41':
+ dependencies:
+ '@vue/compiler-dom': 3.5.41
+ '@vue/shared': 3.5.41
+
+ '@vue/devtools-api@8.2.1':
+ dependencies:
+ '@vue/devtools-kit': 8.2.1
+
+ '@vue/devtools-core@8.2.1(vue@3.5.41)':
+ dependencies:
+ '@vue/devtools-kit': 8.2.1
+ '@vue/devtools-shared': 8.2.1
+ vue: 3.5.41
+
+ '@vue/devtools-kit@8.2.1':
+ dependencies:
+ '@vue/devtools-shared': 8.2.1
+ birpc: 2.9.0
+ hookable: 5.5.3
+ perfect-debounce: 2.1.0
+
+ '@vue/devtools-shared@8.2.1': {}
+
+ '@vue/language-core@3.3.9':
+ dependencies:
+ '@volar/language-core': 2.4.28
+ '@vue/compiler-dom': 3.5.41
+ '@vue/shared': 3.5.41
+ alien-signals: 3.2.1
+ muggle-string: 0.4.1
+ path-browserify: 1.0.1
+ picomatch: 4.0.5
+
+ '@vue/reactivity@3.5.41':
+ dependencies:
+ '@vue/shared': 3.5.41
+
+ '@vue/runtime-core@3.5.41':
+ dependencies:
+ '@vue/reactivity': 3.5.41
+ '@vue/shared': 3.5.41
+
+ '@vue/runtime-dom@3.5.41':
+ dependencies:
+ '@vue/reactivity': 3.5.41
+ '@vue/runtime-core': 3.5.41
+ '@vue/shared': 3.5.41
+ csstype: 3.2.3
+
+ '@vue/server-renderer@3.5.41':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.41
+ '@vue/runtime-dom': 3.5.41
+ '@vue/shared': 3.5.41
+
'@vue/shared@3.5.41': {}
+ '@webassemblyjs/ast@1.14.1':
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+ '@webassemblyjs/helper-api-error@1.13.2': {}
+
+ '@webassemblyjs/helper-buffer@1.14.1': {}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
+
+ '@webassemblyjs/ieee754@1.13.2':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.13.2':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.13.2': {}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@xtuc/long': 4.2.2
+
'@workflow/serde@4.1.0': {}
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
'@yuku-codegen/binding-android-arm64@0.8.4':
optional: true
@@ -5975,6 +9857,16 @@ snapshots:
'@yuku-toolchain/types@0.8.4': {}
+ abbrev@3.0.1: {}
+
+ abort-controller@3.0.0:
+ dependencies:
+ event-target-shim: 5.0.1
+
+ acorn-import-attributes@1.9.5(acorn@8.18.0):
+ dependencies:
+ acorn: 8.18.0
+
acorn@8.18.0: {}
adm-zip@0.5.18: {}
@@ -5988,6 +9880,15 @@ snapshots:
'@ai-sdk/provider-utils': 5.0.25(zod@4.4.3)
zod: 4.4.3
+ ajv-formats@2.1.1(ajv@8.20.0):
+ dependencies:
+ ajv: 8.20.0
+
+ ajv-keywords@5.1.0(ajv@8.20.0):
+ dependencies:
+ ajv: 8.20.0
+ fast-deep-equal: 3.1.3
+
ajv@8.20.0:
dependencies:
fast-deep-equal: 3.1.3
@@ -5995,6 +9896,8 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
+ alien-signals@3.2.1: {}
+
ansi-escapes@7.3.0:
dependencies:
environment: 1.1.0
@@ -6013,20 +9916,117 @@ snapshots:
any-promise@1.3.0: {}
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.2
+
anynum@1.0.1: {}
+ archiver-utils@5.0.2:
+ dependencies:
+ glob: 10.5.0
+ graceful-fs: 4.2.11
+ is-stream: 2.0.1
+ lazystream: 1.0.1
+ lodash: 4.18.1
+ normalize-path: 3.0.0
+ readable-stream: 4.7.0
+
+ archiver@7.0.1:
+ dependencies:
+ archiver-utils: 5.0.2
+ async: 3.2.6
+ buffer-crc32: 1.0.0
+ readable-stream: 4.7.0
+ readdir-glob: 1.1.3
+ tar-stream: 3.2.0
+ zip-stream: 6.0.1
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - bare-buffer
+ - react-native-b4a
+
argparse@2.0.1: {}
argue-cli@3.1.0: {}
assertion-error@2.0.1: {}
+ ast-kit@2.2.0:
+ dependencies:
+ '@babel/parser': 7.29.8
+ pathe: 2.0.3
+
+ ast-walker-scope@0.9.0:
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ ast-kit: 2.2.0
+
+ async-sema@3.1.1: {}
+
+ async@3.2.6: {}
+
+ autoprefixer@10.5.4(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ caniuse-lite: 1.0.30001809
+ fraction.js: 5.3.4
+ picocolors: 1.1.1
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ b4a@1.8.1: {}
+
+ balanced-match@1.0.2: {}
+
balanced-match@4.0.4: {}
+ bare-events@2.9.1: {}
+
+ bare-fs@4.8.0:
+ dependencies:
+ bare-events: 2.9.1
+ bare-path: 3.1.1
+ bare-stream: 2.13.3(bare-events@2.9.1)
+ bare-url: 2.5.1
+ fast-fifo: 1.3.2
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - bare-buffer
+ - react-native-b4a
+
+ bare-path@3.1.1: {}
+
+ bare-stream@2.13.3(bare-events@2.9.1):
+ dependencies:
+ b4a: 1.8.1
+ bare-events: 2.9.1
+ streamx: 2.28.0
+ teex: 1.0.1
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
+
+ bare-url@2.5.1:
+ dependencies:
+ bare-path: 3.1.1
+
base64-js@1.5.1: {}
+ baseline-browser-mapping@2.11.13: {}
+
bignumber.js@9.3.1: {}
+ bindings@1.5.0:
+ dependencies:
+ file-uri-to-path: 1.0.0
+
+ birpc@2.9.0: {}
+
+ birpc@4.0.0: {}
+
bl@4.1.0:
dependencies:
buffer: 5.7.1
@@ -6034,22 +10034,53 @@ snapshots:
readable-stream: 3.6.2
optional: true
+ boolbase@1.0.0: {}
+
boolean@3.2.0: {}
bowser@2.14.1: {}
+ brace-expansion@2.1.4:
+ dependencies:
+ balanced-match: 1.0.2
+
brace-expansion@5.0.9:
dependencies:
balanced-match: 4.0.4
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.28.8:
+ dependencies:
+ baseline-browser-mapping: 2.11.13
+ caniuse-lite: 1.0.30001809
+ electron-to-chromium: 1.5.402
+ node-releases: 2.0.53
+ update-browserslist-db: 1.3.0(browserslist@4.28.8)
+
+ buffer-crc32@1.0.0: {}
+
buffer-equal-constant-time@1.0.1: {}
+ buffer-from@1.1.2: {}
+
buffer@5.7.1:
dependencies:
base64-js: 1.5.1
ieee754: 1.2.1
optional: true
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ bundle-name@4.1.0:
+ dependencies:
+ run-applescript: 7.1.0
+
c12@3.3.4:
dependencies:
chokidar: 5.0.0
@@ -6065,12 +10096,35 @@ snapshots:
pkg-types: 2.3.1
rc9: 3.0.1
+ c12@3.3.4(magicast@0.5.4):
+ dependencies:
+ chokidar: 5.0.0
+ confbox: 0.2.4
+ defu: 6.1.7
+ dotenv: 17.4.2
+ exsolve: 1.1.1
+ giget: 3.3.1
+ jiti: 2.7.0
+ magicast: 0.5.4
+ ohash: 2.0.11
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ pkg-types: 2.3.1
+ rc9: 3.0.1
+
cac@6.7.14: {}
cac@7.0.0: {}
callsites@3.1.0: {}
+ caniuse-api@4.0.0:
+ dependencies:
+ browserslist: 4.28.8
+ caniuse-lite: 1.0.30001809
+
+ caniuse-lite@1.0.30001809: {}
+
chai@5.3.3:
dependencies:
assertion-error: 2.0.1
@@ -6097,6 +10151,10 @@ snapshots:
chownr@1.1.4:
optional: true
+ chownr@3.0.0: {}
+
+ chrome-trace-event@1.0.4: {}
+
citty@0.1.6:
dependencies:
consola: 3.4.2
@@ -6136,16 +10194,36 @@ snapshots:
strip-ansi: 7.2.0
wrap-ansi: 9.0.2
+ cluster-key-slot@1.1.1: {}
+
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
color-name@1.1.4: {}
+ colorette@2.0.20: {}
+
commander@10.0.1: {}
+ commander@11.1.0: {}
+
+ commander@2.20.3: {}
+
commander@6.2.1: {}
+ commondir@1.0.1: {}
+
+ compatx@0.2.0: {}
+
+ compress-commons@6.0.2:
+ dependencies:
+ crc-32: 1.2.2
+ crc32-stream: 6.0.0
+ is-stream: 2.0.1
+ normalize-path: 3.0.0
+ readable-stream: 4.7.0
+
confbox@0.1.8: {}
confbox@0.2.4: {}
@@ -6165,6 +10243,18 @@ snapshots:
'@simple-libs/stream-utils': 2.0.0
argue-cli: 3.1.0
+ convert-source-map@2.0.0: {}
+
+ cookie-es@1.2.3: {}
+
+ cookie-es@2.0.1: {}
+
+ cookie-es@3.1.1: {}
+
+ cookie@2.0.1: {}
+
+ core-util-is@1.0.3: {}
+
cosmiconfig-typescript-loader@6.3.0(@types/node@24.13.3)(cosmiconfig@9.0.2)(typescript@6.0.3-bridge.12.tsgo.7.0.2):
dependencies:
'@types/node': 24.13.3
@@ -6181,16 +10271,101 @@ snapshots:
optionalDependencies:
typescript: typescript-native-bridge@6.0.3-bridge.12.tsgo.7.0.2
+ crc-32@1.2.2: {}
+
+ crc32-stream@6.0.0:
+ dependencies:
+ crc-32: 1.2.2
+ readable-stream: 4.7.0
+
+ croner@10.0.1: {}
+
croner@9.1.0: {}
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ crossws@0.3.5:
+ dependencies:
+ uncrypto: 0.1.3
+
crossws@0.4.10(srvx@0.11.22):
optionalDependencies:
srvx: 0.11.22
- crossws@0.4.10(srvx@0.12.5):
- optionalDependencies:
- srvx: 0.12.5
- optional: true
+ css-select@5.2.2:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@3.2.1:
+ dependencies:
+ mdn-data: 2.27.1
+ source-map-js: 1.2.1
+
+ css-what@6.2.2: {}
+
+ cssesc@3.0.0: {}
+
+ cssnano-preset-default@8.0.4(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ cssnano-utils: 6.0.2(postcss@8.5.26)
+ postcss: 8.5.26
+ postcss-calc: 10.1.1(postcss@8.5.26)
+ postcss-colormin: 8.0.2(postcss@8.5.26)
+ postcss-convert-values: 8.0.2(postcss@8.5.26)
+ postcss-discard-comments: 8.0.2(postcss@8.5.26)
+ postcss-discard-duplicates: 8.0.2(postcss@8.5.26)
+ postcss-discard-empty: 8.0.2(postcss@8.5.26)
+ postcss-discard-overridden: 8.0.2(postcss@8.5.26)
+ postcss-merge-longhand: 8.0.2(postcss@8.5.26)
+ postcss-merge-rules: 8.0.2(postcss@8.5.26)
+ postcss-minify-font-values: 8.0.2(postcss@8.5.26)
+ postcss-minify-gradients: 8.0.2(postcss@8.5.26)
+ postcss-minify-params: 8.0.2(postcss@8.5.26)
+ postcss-minify-selectors: 8.0.3(postcss@8.5.26)
+ postcss-normalize-charset: 8.0.2(postcss@8.5.26)
+ postcss-normalize-display-values: 8.0.2(postcss@8.5.26)
+ postcss-normalize-positions: 8.0.2(postcss@8.5.26)
+ postcss-normalize-repeat-style: 8.0.2(postcss@8.5.26)
+ postcss-normalize-string: 8.0.2(postcss@8.5.26)
+ postcss-normalize-timing-functions: 8.0.2(postcss@8.5.26)
+ postcss-normalize-unicode: 8.0.2(postcss@8.5.26)
+ postcss-normalize-url: 8.0.2(postcss@8.5.26)
+ postcss-normalize-whitespace: 8.0.2(postcss@8.5.26)
+ postcss-ordered-values: 8.0.2(postcss@8.5.26)
+ postcss-reduce-initial: 8.0.2(postcss@8.5.26)
+ postcss-reduce-transforms: 8.0.2(postcss@8.5.26)
+ postcss-svgo: 8.0.3(postcss@8.5.26)
+ postcss-unique-selectors: 8.0.2(postcss@8.5.26)
+
+ cssnano-utils@6.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+
+ cssnano@8.0.4(postcss@8.5.26):
+ dependencies:
+ cssnano-preset-default: 8.0.4(postcss@8.5.26)
+ lilconfig: 3.1.3
+ postcss: 8.5.26
+
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
+ csstype@3.2.3: {}
data-uri-to-buffer@4.0.1: {}
@@ -6210,12 +10385,23 @@ snapshots:
deep-extend@0.6.0:
optional: true
+ deepmerge@4.3.1: {}
+
+ default-browser-id@5.0.1: {}
+
+ default-browser@5.5.0:
+ dependencies:
+ bundle-name: 4.1.0
+ default-browser-id: 5.0.1
+
define-data-property@1.1.4:
dependencies:
es-define-property: 1.0.1
es-errors: 1.3.0
gopd: 1.2.0
+ define-lazy-prop@3.0.0: {}
+
define-properties@1.2.1:
dependencies:
define-data-property: 1.1.4
@@ -6224,43 +10410,85 @@ snapshots:
defu@6.1.7: {}
+ denque@2.1.0: {}
+
+ depd@2.0.0: {}
+
destr@2.0.5: {}
detect-libc@2.1.2: {}
detect-node@2.1.0: {}
+ devalue@5.9.0: {}
+
diff@8.0.4: {}
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dot-prop@10.2.0:
+ dependencies:
+ type-fest: 5.8.0
+
dotenv@17.4.2: {}
dts-resolver@3.0.0: {}
+ duplexer@0.1.2: {}
+
+ eastasianwidth@0.2.0: {}
+
ecdsa-sig-formatter@1.0.11:
dependencies:
safe-buffer: 5.2.1
+ ee-first@1.1.1: {}
+
+ electron-to-chromium@1.5.402: {}
+
emoji-regex@10.6.0: {}
emoji-regex@8.0.0: {}
+ emoji-regex@9.2.2: {}
+
emojilib@2.4.0: {}
empathic@2.0.1: {}
+ encodeurl@2.0.0: {}
+
end-of-stream@1.4.5:
dependencies:
once: 1.4.0
optional: true
- env-paths@2.2.1: {}
-
- env-runner@0.1.16:
+ enhanced-resolve@5.24.5:
dependencies:
- crossws: 0.4.10(srvx@0.11.22)
- exsolve: 1.1.1
- httpxy: 0.5.5
- srvx: 0.11.22
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
+ entities@4.5.0: {}
+
+ entities@7.0.1: {}
+
+ env-paths@2.2.1: {}
environment@1.1.0: {}
@@ -6268,6 +10496,10 @@ snapshots:
dependencies:
is-arrayish: 0.2.1
+ error-stack-parser-es@1.0.5: {}
+
+ error-stack-parser-es@2.0.1: {}
+
errx@0.1.2: {}
es-define-property@1.0.1: {}
@@ -6276,6 +10508,8 @@ snapshots:
es-module-lexer@1.7.0: {}
+ es-module-lexer@2.3.1: {}
+
es-toolkit@1.50.0: {}
es6-error@4.1.1: {}
@@ -6311,14 +10545,57 @@ snapshots:
escalade@3.2.0: {}
+ escape-html@1.0.3: {}
+
escape-string-regexp@4.0.0: {}
+ escape-string-regexp@5.0.0: {}
+
+ eslint-scope@5.1.1:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@4.3.0: {}
+
+ estraverse@5.3.0: {}
+
+ estree-walker@2.0.2: {}
+
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.9
+ etag@1.8.1: {}
+
+ event-target-shim@5.0.1: {}
+
+ events-universal@1.0.1:
+ dependencies:
+ bare-events: 2.9.1
+ transitivePeerDependencies:
+ - bare-abort-controller
+
+ events@3.3.0: {}
+
eventsource-parser@3.1.0: {}
+ execa@8.0.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 8.0.1
+ human-signals: 5.0.0
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+
expand-template@2.0.3:
optional: true
@@ -6330,6 +10607,20 @@ snapshots:
fast-deep-equal@3.1.3: {}
+ fast-fifo@1.3.2: {}
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-npm-meta@2.2.0:
+ dependencies:
+ cac: 7.0.0
+
fast-string-truncated-width@3.0.3: {}
fast-string-width@3.0.2:
@@ -6356,6 +10647,10 @@ snapshots:
strnum: 2.4.1
xml-naming: 0.3.0
+ fastq@1.20.1:
+ dependencies:
+ reusify: 1.1.0
+
fd-package-json@2.0.0:
dependencies:
walk-up-path: 4.0.0
@@ -6380,8 +10675,21 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ file-uri-to-path@1.0.0: {}
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
flatbuffers@25.9.23: {}
+ fnv1a-64@0.1.2: {}
+
+ foreground-child@3.3.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
formatly@0.3.0:
dependencies:
fd-package-json: 2.0.0
@@ -6390,12 +10698,22 @@ snapshots:
dependencies:
fetch-blob: 3.2.0
+ fraction.js@5.3.4: {}
+
+ fresh@2.0.0: {}
+
fs-constants@1.0.0:
optional: true
fsevents@2.3.3:
optional: true
+ function-bind@1.1.2: {}
+
+ fuse.js@7.5.0: {}
+
+ fzf@0.5.2: {}
+
gaxios@7.3.0:
dependencies:
extend: 3.0.2
@@ -6412,10 +10730,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ generic-names@4.0.0:
+ dependencies:
+ loader-utils: 3.3.1
+
+ gensync@1.0.0-beta.2: {}
+
get-caller-file@2.0.5: {}
get-east-asian-width@1.6.0: {}
+ get-port-please@3.2.0: {}
+
+ get-stream@8.0.1: {}
+
get-tsconfig@4.14.1:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -6429,6 +10757,25 @@ snapshots:
github-from-package@0.0.0:
optional: true
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@10.5.0:
+ dependencies:
+ foreground-child: 3.3.1
+ jackspeak: 3.4.3
+ minimatch: 9.0.9
+ minipass: 7.1.3
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
+ glob@13.0.6:
+ dependencies:
+ minimatch: 10.2.6
+ minipass: 7.1.3
+ path-scurry: 2.0.2
+
global-agent@3.0.0:
dependencies:
boolean: 3.2.0
@@ -6438,6 +10785,10 @@ snapshots:
semver: 7.8.5
serialize-error: 7.0.1
+ global-directory@4.0.1:
+ dependencies:
+ ini: 4.1.1
+
global-directory@5.0.0:
dependencies:
ini: 6.0.0
@@ -6447,6 +10798,15 @@ snapshots:
define-properties: 1.2.1
gopd: 1.2.0
+ globby@16.2.3:
+ dependencies:
+ '@sindresorhus/merge-streams': 4.0.0
+ fast-glob: 3.3.3
+ ignore: 7.0.6
+ is-path-inside: 4.0.0
+ slash: 5.1.0
+ unicorn-magic: 0.4.0
+
google-auth-library@10.9.1:
dependencies:
base64-js: 1.5.1
@@ -6462,78 +10822,204 @@ snapshots:
gopd@1.2.0: {}
+ graceful-fs@4.2.11: {}
+
guid-typescript@1.0.9: {}
- h3@2.0.1-rc.26(crossws@0.4.10(srvx@0.11.22)):
+ gzip-size@6.0.0:
dependencies:
- rou3: 0.9.1
- srvx: 0.12.5
- optionalDependencies:
- crossws: 0.4.10(srvx@0.12.5)
+ duplexer: 0.1.2
+
+ gzip-size@7.0.0:
+ dependencies:
+ duplexer: 0.1.2
+
+ h3@1.15.11:
+ dependencies:
+ cookie-es: 1.2.3
+ crossws: 0.3.5
+ defu: 6.1.7
+ destr: 2.0.5
+ iron-webcrypto: 1.2.1
+ node-mock-http: 1.0.5
+ radix3: 1.1.2
+ ufo: 1.6.4
+ uncrypto: 0.1.3
has-flag@4.0.0: {}
has-property-descriptors@1.0.2:
dependencies:
- es-define-property: 1.0.1
+ es-define-property: 1.0.1
+
+ hasown@2.0.4:
+ dependencies:
+ function-bind: 1.1.2
+
+ highlight.js@10.7.3: {}
+
+ hookable@5.5.3: {}
+
+ hookable@6.1.1: {}
+
+ http-errors@2.0.1:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ toidentifier: 1.0.1
+
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ http-shutdown@1.2.2: {}
+
+ https-proxy-agent@7.0.6:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ httpxy@0.5.5: {}
+
+ human-signals@5.0.0: {}
+
+ husky@9.1.7: {}
+
+ ieee754@1.2.1: {}
+
+ ignore@7.0.6: {}
+
+ image-meta@0.2.2: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ import-meta-resolve@4.2.0: {}
+
+ import-without-cache@0.4.0: {}
+
+ impound@1.1.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ es-module-lexer: 2.3.1
+ pathe: 2.0.3
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ unplugin-utils: 0.3.2
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - unloader
+
+ inherits@2.0.4: {}
+
+ ini@1.3.8:
+ optional: true
+
+ ini@4.1.1: {}
+
+ ini@6.0.0: {}
+
+ ioredis@5.11.1:
+ dependencies:
+ '@ioredis/commands': 1.10.0
+ cluster-key-slot: 1.1.1
+ debug: 4.4.3
+ denque: 2.1.0
+ redis-errors: 1.2.0
+ redis-parser: 3.0.0
+ standard-as-callback: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ iron-webcrypto@1.2.1: {}
+
+ is-arrayish@0.2.1: {}
+
+ is-core-module@2.16.2:
+ dependencies:
+ hasown: 2.0.4
+
+ is-docker@3.0.0: {}
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@5.1.0:
+ dependencies:
+ get-east-asian-width: 1.6.0
- highlight.js@10.7.3: {}
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
- hookable@6.1.1: {}
+ is-in-ssh@1.0.0: {}
- http-proxy-agent@7.0.2:
+ is-inside-container@1.0.0:
dependencies:
- agent-base: 7.1.4
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
+ is-docker: 3.0.0
- https-proxy-agent@7.0.6:
+ is-installed-globally@1.0.0:
dependencies:
- agent-base: 7.1.4
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
+ global-directory: 4.0.1
+ is-path-inside: 4.0.0
- httpxy@0.5.5: {}
+ is-module@1.0.0: {}
- husky@9.1.7: {}
+ is-number@7.0.0: {}
- ieee754@1.2.1: {}
+ is-path-inside@4.0.0: {}
- ignore@7.0.6: {}
+ is-plain-obj@4.1.0: {}
- import-fresh@3.3.1:
+ is-reference@1.2.1:
dependencies:
- parent-module: 1.0.1
- resolve-from: 4.0.0
+ '@types/estree': 1.0.9
- import-without-cache@0.4.0: {}
+ is-stream@2.0.1: {}
- inherits@2.0.4:
- optional: true
+ is-stream@3.0.0: {}
- ini@1.3.8:
- optional: true
+ is-unsafe@2.0.0: {}
- ini@6.0.0: {}
+ is-wsl@3.1.1:
+ dependencies:
+ is-inside-container: 1.0.0
- is-arrayish@0.2.1: {}
+ isarray@1.0.0: {}
- is-fullwidth-code-point@3.0.0: {}
+ isexe@2.0.0: {}
- is-fullwidth-code-point@5.1.0:
- dependencies:
- get-east-asian-width: 1.6.0
+ isexe@4.0.0: {}
- is-plain-obj@4.1.0: {}
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
- is-unsafe@2.0.0: {}
+ jest-worker@27.5.1:
+ dependencies:
+ '@types/node': 24.13.3
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
jiti@2.6.1: {}
jiti@2.7.0: {}
+ js-tokens@10.0.0: {}
+
js-tokens@4.0.0: {}
js-tokens@9.0.1: {}
@@ -6542,6 +11028,8 @@ snapshots:
dependencies:
argparse: 2.0.1
+ jsesc@3.1.0: {}
+
json-bigint@1.0.0:
dependencies:
bignumber.js: 9.3.1
@@ -6559,6 +11047,8 @@ snapshots:
json-stringify-safe@5.0.1: {}
+ json5@2.2.3: {}
+
jsonc-parser@3.3.1: {}
just-bash@3.2.0:
@@ -6596,6 +11086,8 @@ snapshots:
jwa: 2.0.1
safe-buffer: 5.2.1
+ kleur@4.1.5: {}
+
klona@2.0.6: {}
knip@6.32.0:
@@ -6616,8 +11108,97 @@ snapshots:
knitwork@1.3.0: {}
+ launch-editor@2.14.1:
+ dependencies:
+ picocolors: 1.1.1
+ shell-quote: 1.10.0
+
+ lazystream@1.0.1:
+ dependencies:
+ readable-stream: 2.3.8
+
+ lightningcss-android-arm64@1.33.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.33.0:
+ optional: true
+
+ lightningcss-darwin-x64@1.33.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.33.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.33.0:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.33.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.33.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.33.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.33.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.33.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.33.0:
+ optional: true
+
+ lightningcss@1.33.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.33.0
+ lightningcss-darwin-arm64: 1.33.0
+ lightningcss-darwin-x64: 1.33.0
+ lightningcss-freebsd-x64: 1.33.0
+ lightningcss-linux-arm-gnueabihf: 1.33.0
+ lightningcss-linux-arm64-gnu: 1.33.0
+ lightningcss-linux-arm64-musl: 1.33.0
+ lightningcss-linux-x64-gnu: 1.33.0
+ lightningcss-linux-x64-musl: 1.33.0
+ lightningcss-win32-arm64-msvc: 1.33.0
+ lightningcss-win32-x64-msvc: 1.33.0
+
+ lilconfig@3.1.3: {}
+
lines-and-columns@1.2.4: {}
+ listhen@1.10.1:
+ dependencies:
+ '@parcel/watcher-wasm': 2.6.0
+ citty: 0.2.2
+ consola: 3.4.2
+ crossws: 0.4.10(srvx@0.11.22)
+ defu: 6.1.7
+ get-port-please: 3.2.0
+ h3: 1.15.11
+ http-shutdown: 1.2.2
+ jiti: 2.7.0
+ node-forge: 1.4.0
+ pathe: 2.0.3
+ std-env: 4.2.0
+ tinyclip: 0.1.15
+ ufo: 1.6.4
+ untun: 0.2.2
+ uqr: 0.1.3
+
+ loader-utils@3.3.1: {}
+
+ local-pkg@1.2.1:
+ dependencies:
+ mlly: 1.8.2
+ pkg-types: 2.3.1
+ quansync: 0.2.11
+
+ lodash@4.18.1: {}
+
log-update@8.0.0:
dependencies:
ansi-escapes: 7.3.0
@@ -6631,25 +11212,54 @@ snapshots:
loupe@3.2.1: {}
+ lru-cache@10.4.3: {}
+
lru-cache@11.5.2: {}
- magic-regexp@0.11.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)):
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ magic-regexp@0.10.0:
+ dependencies:
+ estree-walker: 3.0.3
+ magic-string: 0.30.21
+ mlly: 1.8.2
+ regexp-tree: 0.1.27
+ type-level-regexp: 0.1.17
+ ufo: 1.6.4
+ unplugin: 2.3.11
+
+ magic-regexp@0.11.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2):
dependencies:
magic-string: 0.30.21
regexp-tree: 0.1.27
type-level-regexp: 0.1.17
- unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
transitivePeerDependencies:
- '@farmfe/core'
- '@rspack/core'
- bun-types-no-globals
- unloader
- - webpack
+
+ magic-string-ast@1.0.3:
+ dependencies:
+ magic-string: 0.30.21
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ magic-string@1.1.0:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ magicast@0.5.4:
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ source-map-js: 1.2.1
+
marked-terminal@7.3.0(marked@9.1.6):
dependencies:
ansi-escapes: 7.3.0
@@ -6667,6 +11277,10 @@ snapshots:
dependencies:
escape-string-regexp: 4.0.0
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.27.1: {}
+
mdream@1.5.12:
optionalDependencies:
'@mdream/rust-android-arm-eabi': 1.5.12
@@ -6683,6 +11297,25 @@ snapshots:
'@mdream/rust-win32-arm64-msvc': 1.5.12
'@mdream/rust-win32-x64-msvc': 1.5.12
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
+
+ mime-db@1.54.0: {}
+
+ mime-types@3.0.2:
+ dependencies:
+ mime-db: 1.54.0
+
+ mime@4.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
mimic-function@5.0.1: {}
mimic-response@3.1.0:
@@ -6692,9 +11325,32 @@ snapshots:
dependencies:
brace-expansion: 5.0.9
+ minimatch@5.1.9:
+ dependencies:
+ brace-expansion: 2.1.4
+
+ minimatch@9.0.9:
+ dependencies:
+ brace-expansion: 2.1.4
+
minimist@1.2.8:
optional: true
+ minimizer-webpack-plugin@5.6.1(esbuild@0.28.1)(webpack@5.109.2):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ esbuild: 0.28.1
+ jest-worker: 27.5.1
+ schema-utils: 4.3.3
+ terser: 5.49.2
+ webpack: 5.109.2
+
+ minipass@7.1.3: {}
+
+ minizlib@3.1.0:
+ dependencies:
+ minipass: 7.1.3
+
mkdirp-classic@0.5.3:
optional: true
@@ -6705,14 +11361,20 @@ snapshots:
pkg-types: 1.3.1
ufo: 1.6.4
+ mocked-exports@0.1.1: {}
+
modern-tar@0.7.7: {}
module-replacements@3.1.0: {}
mri@1.2.0: {}
+ mrmime@2.0.1: {}
+
ms@2.1.3: {}
+ muggle-string@0.4.1: {}
+
mz@2.7.0:
dependencies:
any-promise: 1.3.0
@@ -6723,33 +11385,248 @@ snapshots:
nanoid@3.3.18: {}
+ nanotar@0.3.0: {}
+
napi-build-utils@2.0.0:
optional: true
- nf3@0.3.23: {}
+ neo-async@2.6.2: {}
- nitro@3.0.260522-beta(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)):
+ nitropack@2.13.4:
dependencies:
+ '@cloudflare/kv-asset-handler': 0.4.2
+ '@rollup/plugin-alias': 6.0.0(rollup@4.62.4)
+ '@rollup/plugin-commonjs': 29.0.3(rollup@4.62.4)
+ '@rollup/plugin-inject': 5.0.5(rollup@4.62.4)
+ '@rollup/plugin-json': 6.1.0(rollup@4.62.4)
+ '@rollup/plugin-node-resolve': 16.0.3(rollup@4.62.4)
+ '@rollup/plugin-replace': 6.0.3(rollup@4.62.4)
+ '@rollup/plugin-terser': 1.0.0(rollup@4.62.4)
+ '@vercel/nft': 1.10.2(rollup@4.62.4)
+ archiver: 7.0.1
+ c12: 3.3.4(magicast@0.5.4)
+ chokidar: 5.0.0
+ citty: 0.2.2
+ compatx: 0.2.0
+ confbox: 0.2.4
consola: 3.4.2
- crossws: 0.4.10(srvx@0.11.22)
+ cookie-es: 2.0.1
+ croner: 10.0.1
+ crossws: 0.3.5
db0: 0.3.4
- env-runner: 0.1.16
- h3: 2.0.1-rc.26(crossws@0.4.10(srvx@0.11.22))
+ defu: 6.1.7
+ destr: 2.0.5
+ dot-prop: 10.2.0
+ esbuild: 0.28.1
+ escape-string-regexp: 5.0.0
+ etag: 1.8.1
+ exsolve: 1.1.1
+ globby: 16.2.3
+ gzip-size: 7.0.0
+ h3: 1.15.11
+ hookable: 5.5.3
+ httpxy: 0.5.5
+ ioredis: 5.11.1
+ jiti: 2.7.0
+ klona: 2.0.6
+ knitwork: 1.3.0
+ listhen: 1.10.1
+ magic-string: 0.30.21
+ magicast: 0.5.4
+ mime: 4.1.0
+ mlly: 1.8.2
+ node-fetch-native: 1.6.7
+ node-mock-http: 1.0.5
+ ofetch: 1.5.1
+ ohash: 2.0.11
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ pkg-types: 2.3.1
+ pretty-bytes: 7.1.1
+ radix3: 1.1.2
+ rollup: 4.62.4
+ rollup-plugin-visualizer: 7.0.1(rolldown@1.2.3)(rollup@4.62.4)
+ scule: 1.3.0
+ semver: 7.8.5
+ serve-placeholder: 2.0.2
+ serve-static: 2.2.1
+ source-map: 0.7.6
+ std-env: 4.2.0
+ ufo: 1.6.4
+ ultrahtml: 1.7.0
+ uncrypto: 0.1.3
+ unctx: 2.5.0
+ unenv: 2.0.0-rc.24
+ unimport: 6.4.0(rolldown@1.2.3)
+ unplugin-utils: 0.3.2
+ unstorage: 1.17.5(db0@0.3.4)(ioredis@5.11.1)
+ untyped: 2.0.0
+ unwasm: 0.5.3
+ youch: 4.1.1
+ youch-core: 0.3.3
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@electric-sql/pglite'
+ - '@farmfe/core'
+ - '@libsql/client'
+ - '@netlify/blobs'
+ - '@parcel/watcher'
+ - '@planetscale/database'
+ - '@rspack/core'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bare-abort-controller
+ - bare-buffer
+ - better-sqlite3
+ - bun-types-no-globals
+ - drizzle-orm
+ - encoding
+ - idb-keyval
+ - mysql2
+ - oxc-parser
+ - react-native-b4a
+ - sqlite3
+ - supports-color
+ - unloader
+ - uploadthing
+
+ node-abi@3.94.0:
+ dependencies:
+ semver: 7.8.5
+ optional: true
+
+ node-addon-api@8.9.1:
+ optional: true
+
+ node-domexception@1.0.0: {}
+
+ node-emoji@2.2.0:
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ char-regex: 1.0.2
+ emojilib: 2.4.0
+ skin-tone: 2.0.0
+
+ node-fetch-native@1.6.7: {}
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ node-fetch@3.3.2:
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+
+ node-forge@1.4.0: {}
+
+ node-gyp-build@4.8.4: {}
+
+ node-liblzma@2.2.0:
+ dependencies:
+ node-addon-api: 8.9.1
+ node-gyp-build: 4.8.4
+ optional: true
+
+ node-mock-http@1.0.5: {}
+
+ node-releases@2.0.53: {}
+
+ nopt@8.1.0:
+ dependencies:
+ abbrev: 3.0.1
+
+ normalize-path@3.0.0: {}
+
+ nostics@1.2.0: {}
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ npm-run-path@6.0.0:
+ dependencies:
+ path-key: 4.0.0
+ unicorn-magic: 0.3.0
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.3):
+ dependencies:
+ '@dxup/nuxt': 0.5.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ '@nuxt/cli': 3.37.0(@nuxt/schema@4.5.2)
+ '@nuxt/devtools': 3.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ '@nuxt/nitro-server': 4.5.2(nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.3))
+ '@nuxt/schema': 4.5.2
+ '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.5.2)
+ '@nuxt/vite-builder': 4.5.2(nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.3))(rolldown@1.2.3)(vue@3.5.41)
+ '@types/node': 24.13.3
+ '@unhead/vue': 3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(vue@3.5.41)(webpack@5.109.2)
+ '@vue/shared': 3.5.41
+ chokidar: 5.0.0
+ compatx: 0.2.0
+ consola: 3.4.2
+ cookie-es: 3.1.1
+ defu: 6.1.7
+ devalue: 5.9.0
+ errx: 0.1.2
+ escape-string-regexp: 5.0.0
+ exsolve: 1.1.1
+ fnv1a-64: 0.1.2
hookable: 6.1.1
- nf3: 0.3.23
- ocache: 0.1.5
- ofetch: 2.0.0-alpha.3
+ ignore: 7.0.6
+ impound: 1.1.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ jiti: 2.7.0
+ klona: 2.0.6
+ knitwork: 1.3.0
+ magic-string: 1.1.0
+ mlly: 1.8.2
+ nanotar: 0.3.0
+ nostics: 1.2.0
+ nypm: 0.6.9
+ object-identity: 0.2.3
+ ofetch: 1.5.1
ohash: 2.0.11
+ on-change: 6.0.2
+ oxc-walker: 1.1.1(rolldown@1.2.3)
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ picomatch: 4.0.5
+ pkg-types: 2.3.1
rolldown: 1.2.3
- srvx: 0.11.22
- unenv: 2.0.0-rc.24
- unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(lru-cache@11.5.2)
- optionalDependencies:
- dotenv: 17.4.2
- giget: 3.3.1
- jiti: 2.7.0
- rollup: 4.62.4
- vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ rolldown-string: 0.3.1(rolldown@1.2.3)
+ rou3: 0.9.1
+ scule: 1.3.0
+ std-env: 4.2.0
+ tinyglobby: 0.2.17
+ ufo: 1.6.4
+ ultrahtml: 1.7.0
+ uncrypto: 0.1.3
+ unctx: 3.0.0(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ undici: 8.10.0
+ unhead: 3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ unimport: 6.4.0(rolldown@1.2.3)
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ unrouting: 0.2.2
+ untyped: 2.0.0
+ verkit: 0.3.2
+ vue: 3.5.41
+ vue-component-type-helpers: 3.3.9
+ vue-router: 5.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(vue@3.5.41)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -6757,63 +11634,68 @@ snapshots:
- '@azure/identity'
- '@azure/keyvault-secrets'
- '@azure/storage-blob'
+ - '@babel/plugin-proposal-decorators'
+ - '@babel/plugin-syntax-jsx'
+ - '@babel/plugin-syntax-typescript'
+ - '@biomejs/biome'
- '@capacitor/preferences'
- '@deno/kv'
- '@electric-sql/pglite'
+ - '@farmfe/core'
- '@libsql/client'
- '@netlify/blobs'
- - '@netlify/runtime'
+ - '@oxc-project/types'
+ - '@parcel/watcher'
+ - '@pinia/colada'
- '@planetscale/database'
+ - '@rollup/plugin-babel'
+ - '@rspack/core'
+ - '@unhead/cli'
- '@upstash/redis'
- '@vercel/blob'
- '@vercel/functions'
- '@vercel/kv'
- - '@vercel/queue'
+ - '@vitejs/devtools'
+ - '@vitejs/devtools-kit'
+ - '@vue/compiler-sfc'
- aws4fetch
+ - bare-abort-controller
+ - bare-buffer
- better-sqlite3
+ - bufferutil
+ - bun-types-no-globals
+ - cac
+ - commander
+ - db0
- drizzle-orm
+ - encoding
+ - eslint
- idb-keyval
- ioredis
- - miniflare
- - mongodb
+ - less
+ - lightningcss
+ - magicast
+ - meow
- mysql2
+ - optionator
+ - oxc-parser
+ - pinia
+ - react-native-b4a
+ - rollup-plugin-visualizer
+ - sass
+ - sass-embedded
- sqlite3
+ - stylelint
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - typescript
+ - unloader
- uploadthing
- - wrangler
-
- node-abi@3.94.0:
- dependencies:
- semver: 7.8.5
- optional: true
-
- node-addon-api@8.9.1:
- optional: true
-
- node-domexception@1.0.0: {}
-
- node-emoji@2.2.0:
- dependencies:
- '@sindresorhus/is': 4.6.0
- char-regex: 1.0.2
- emojilib: 2.4.0
- skin-tone: 2.0.0
-
- node-fetch-native@1.6.7: {}
-
- node-fetch@3.3.2:
- dependencies:
- data-uri-to-buffer: 4.0.1
- fetch-blob: 3.2.0
- formdata-polyfill: 4.0.10
-
- node-gyp-build@4.8.4:
- optional: true
-
- node-liblzma@2.2.0:
- dependencies:
- node-addon-api: 8.9.1
- node-gyp-build: 4.8.4
- optional: true
+ - utf-8-validate
+ - xml2js
+ - yaml
nypm@0.6.9:
dependencies:
@@ -6823,14 +11705,12 @@ snapshots:
object-assign@4.1.1: {}
+ object-identity@0.2.3: {}
+
object-keys@1.1.1: {}
obug@2.1.4: {}
- ocache@0.1.5:
- dependencies:
- ohash: 2.0.11
-
ofetch@1.5.1:
dependencies:
destr: 2.0.5
@@ -6841,11 +11721,21 @@ snapshots:
ohash@2.0.11: {}
+ on-change@6.0.2: {}
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
once@1.4.0:
dependencies:
wrappy: 1.0.2
optional: true
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
onetime@7.0.0:
dependencies:
mimic-function: 5.0.1
@@ -6869,11 +11759,45 @@ snapshots:
platform: 1.3.6
protobufjs: 7.6.5
+ open@11.0.0:
+ dependencies:
+ default-browser: 5.5.0
+ define-lazy-prop: 3.0.0
+ is-in-ssh: 1.0.0
+ is-inside-container: 1.0.0
+ powershell-utils: 0.1.0
+ wsl-utils: 0.3.1
+
openai@6.26.0(ws@8.21.3)(zod@4.4.3):
optionalDependencies:
ws: 8.21.3
zod: 4.4.3
+ oxc-parser@0.131.0:
+ dependencies:
+ '@oxc-project/types': 0.131.0
+ optionalDependencies:
+ '@oxc-parser/binding-android-arm-eabi': 0.131.0
+ '@oxc-parser/binding-android-arm64': 0.131.0
+ '@oxc-parser/binding-darwin-arm64': 0.131.0
+ '@oxc-parser/binding-darwin-x64': 0.131.0
+ '@oxc-parser/binding-freebsd-x64': 0.131.0
+ '@oxc-parser/binding-linux-arm-gnueabihf': 0.131.0
+ '@oxc-parser/binding-linux-arm-musleabihf': 0.131.0
+ '@oxc-parser/binding-linux-arm64-gnu': 0.131.0
+ '@oxc-parser/binding-linux-arm64-musl': 0.131.0
+ '@oxc-parser/binding-linux-ppc64-gnu': 0.131.0
+ '@oxc-parser/binding-linux-riscv64-gnu': 0.131.0
+ '@oxc-parser/binding-linux-riscv64-musl': 0.131.0
+ '@oxc-parser/binding-linux-s390x-gnu': 0.131.0
+ '@oxc-parser/binding-linux-x64-gnu': 0.131.0
+ '@oxc-parser/binding-linux-x64-musl': 0.131.0
+ '@oxc-parser/binding-openharmony-arm64': 0.131.0
+ '@oxc-parser/binding-wasm32-wasi': 0.131.0
+ '@oxc-parser/binding-win32-arm64-msvc': 0.131.0
+ '@oxc-parser/binding-win32-ia32-msvc': 0.131.0
+ '@oxc-parser/binding-win32-x64-msvc': 0.131.0
+
oxc-parser@0.142.0:
dependencies:
'@oxc-project/types': 0.142.0
@@ -6945,6 +11869,15 @@ snapshots:
'@oxc-resolver/binding-win32-arm64-msvc': 11.24.2
'@oxc-resolver/binding-win32-x64-msvc': 11.24.2
+ oxc-walker@0.7.0(oxc-parser@0.131.0):
+ dependencies:
+ magic-regexp: 0.10.0
+ oxc-parser: 0.131.0
+
+ oxc-walker@1.1.1(rolldown@1.2.3):
+ dependencies:
+ rolldown: 1.2.3
+
oxfmt@0.62.0:
dependencies:
tinypool: 2.1.0
@@ -7010,6 +11943,8 @@ snapshots:
'@types/retry': 0.12.0
retry: 0.13.1
+ package-json-from-dist@1.0.1: {}
+
package-manager-detector@1.8.0: {}
papaparse@5.5.4: {}
@@ -7033,10 +11968,30 @@ snapshots:
parse5@6.0.1: {}
+ parseurl@1.3.3: {}
+
partial-json@0.1.7: {}
+ path-browserify@1.0.1: {}
+
path-expression-matcher@1.6.2: {}
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.3
+
+ path-scurry@2.0.2:
+ dependencies:
+ lru-cache: 11.5.2
+ minipass: 7.1.3
+
pathe@2.0.3: {}
pathval@2.0.1: {}
@@ -7045,6 +12000,8 @@ snapshots:
picocolors@1.1.1: {}
+ picomatch@2.3.2: {}
+
picomatch@4.0.5: {}
pkg-types@1.3.1:
@@ -7061,12 +12018,172 @@ snapshots:
platform@1.3.6: {}
+ postcss-calc@10.1.1(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-selector-parser: 7.1.5
+ postcss-value-parser: 4.2.0
+
+ postcss-colormin@8.0.2(postcss@8.5.26):
+ dependencies:
+ '@colordx/core': 5.5.0
+ browserslist: 4.28.8
+ caniuse-api: 4.0.0
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-convert-values@8.0.2(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-discard-comments@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-selector-parser: 7.1.5
+
+ postcss-discard-duplicates@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+
+ postcss-discard-empty@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+
+ postcss-discard-overridden@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+
+ postcss-merge-longhand@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+ stylehacks: 8.0.2(postcss@8.5.26)
+
+ postcss-merge-rules@8.0.2(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ caniuse-api: 4.0.0
+ cssnano-utils: 6.0.2(postcss@8.5.26)
+ postcss: 8.5.26
+ postcss-selector-parser: 7.1.5
+
+ postcss-minify-font-values@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-minify-gradients@8.0.2(postcss@8.5.26):
+ dependencies:
+ '@colordx/core': 5.5.0
+ cssnano-utils: 6.0.2(postcss@8.5.26)
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-minify-params@8.0.2(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ cssnano-utils: 6.0.2(postcss@8.5.26)
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-minify-selectors@8.0.3(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ caniuse-api: 4.0.0
+ cssesc: 3.0.0
+ postcss: 8.5.26
+ postcss-selector-parser: 7.1.5
+
+ postcss-normalize-charset@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+
+ postcss-normalize-display-values@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-normalize-positions@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-normalize-repeat-style@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-normalize-string@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-normalize-timing-functions@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-normalize-unicode@8.0.2(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-normalize-url@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-normalize-whitespace@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-ordered-values@8.0.2(postcss@8.5.26):
+ dependencies:
+ cssnano-utils: 6.0.2(postcss@8.5.26)
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-reduce-initial@8.0.2(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ caniuse-api: 4.0.0
+ postcss: 8.5.26
+
+ postcss-reduce-transforms@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ postcss-selector-parser@7.1.5:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-svgo@8.0.3(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+ svgo: 4.0.2
+
+ postcss-unique-selectors@8.0.2(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-selector-parser: 7.1.5
+
+ postcss-value-parser@4.2.0: {}
+
postcss@8.5.26:
dependencies:
nanoid: 3.3.18
picocolors: 1.1.1
source-map-js: 1.2.1
+ powershell-utils@0.1.0: {}
+
prebuild-install@7.1.3:
dependencies:
detect-libc: 2.1.2
@@ -7083,6 +12200,18 @@ snapshots:
tunnel-agent: 0.6.0
optional: true
+ pretty-bytes@7.1.1: {}
+
+ process-nextick-args@2.0.1: {}
+
+ process@0.11.10: {}
+
+ proper-lockfile@4.1.2:
+ dependencies:
+ graceful-fs: 4.2.11
+ retry: 0.12.0
+ signal-exit: 3.0.7
+
protobufjs@7.6.5:
dependencies:
'@protobufjs/aspromise': 1.1.2
@@ -7110,8 +12239,12 @@ snapshots:
once: 1.4.0
optional: true
+ quansync@0.2.11: {}
+
quansync@1.0.0: {}
+ queue-microtask@1.2.3: {}
+
quickjs-emscripten-core@0.32.0:
dependencies:
'@jitl/quickjs-ffi-types': 0.32.0
@@ -7124,6 +12257,12 @@ snapshots:
'@jitl/quickjs-wasmfile-release-sync': 0.32.0
quickjs-emscripten-core: 0.32.0
+ radash@12.1.1: {}
+
+ radix3@1.1.2: {}
+
+ range-parser@1.3.0: {}
+
rc9@3.0.1:
dependencies:
defu: 6.1.7
@@ -7139,6 +12278,16 @@ snapshots:
re2js@1.3.3: {}
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
readable-stream@3.6.2:
dependencies:
inherits: 2.0.4
@@ -7146,8 +12295,26 @@ snapshots:
util-deprecate: 1.0.2
optional: true
+ readable-stream@4.7.0:
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+
+ readdir-glob@1.1.3:
+ dependencies:
+ minimatch: 5.1.9
+
readdirp@5.1.1: {}
+ redis-errors@1.2.0: {}
+
+ redis-parser@3.0.0:
+ dependencies:
+ redis-errors: 1.2.0
+
regexp-tree@0.1.27: {}
require-directory@2.1.1: {}
@@ -7160,6 +12327,13 @@ snapshots:
resolve-pkg-maps@1.0.0: {}
+ resolve@1.22.12:
+ dependencies:
+ es-errors: 1.3.0
+ is-core-module: 2.16.2
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
restore-cursor@5.1.0:
dependencies:
onetime: 7.0.0
@@ -7171,8 +12345,12 @@ snapshots:
sqlite-vec: 0.1.9
typescript: typescript-native-bridge@6.0.3-bridge.12.tsgo.7.0.2
+ retry@0.12.0: {}
+
retry@0.13.1: {}
+ reusify@1.1.0: {}
+
roarr@2.15.4:
dependencies:
boolean: 3.2.0
@@ -7196,6 +12374,11 @@ snapshots:
transitivePeerDependencies:
- oxc-resolver
+ rolldown-string@0.3.1(rolldown@1.2.3):
+ dependencies:
+ magic-string: 1.1.0
+ rolldown: 1.2.3
+
rolldown@1.2.3:
dependencies:
'@oxc-project/types': 0.143.0
@@ -7216,6 +12399,15 @@ snapshots:
'@rolldown/binding-win32-arm64-msvc': 1.2.3
'@rolldown/binding-win32-x64-msvc': 1.2.3
+ rollup-plugin-visualizer@7.0.1(rolldown@1.2.3)(rollup@4.62.4):
+ dependencies:
+ open: 11.0.0
+ picomatch: 4.0.5
+ rolldown: 1.2.3
+ rollup: 4.62.4
+ source-map: 0.7.6
+ yargs: 18.1.0
+
rollup@4.62.4:
dependencies:
'@types/estree': 1.0.9
@@ -7250,12 +12442,29 @@ snapshots:
rou3@0.9.1: {}
+ run-applescript@7.1.0: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
sade@1.8.1:
dependencies:
mri: 1.2.0
+ safe-buffer@5.1.2: {}
+
safe-buffer@5.2.1: {}
+ sax@1.6.1: {}
+
+ schema-utils@4.3.3:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.20.0
+ ajv-formats: 2.1.1(ajv@8.20.0)
+ ajv-keywords: 5.1.0(ajv@8.20.0)
+
scule@1.3.0: {}
seek-bzip@2.0.0:
@@ -7264,12 +12473,49 @@ snapshots:
semver-compare@1.0.0: {}
+ semver@6.3.1: {}
+
semver@7.8.5: {}
+ send@1.2.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ mime-types: 3.0.2
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.3.0
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
serialize-error@7.0.1:
dependencies:
type-fest: 0.13.1
+ serialize-javascript@7.1.0: {}
+
+ seroval@1.6.2: {}
+
+ serve-placeholder@2.0.2:
+ dependencies:
+ defu: 6.1.7
+
+ serve-static@2.2.1:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 1.2.1
+ transitivePeerDependencies:
+ - supports-color
+
+ setprototypeof@1.2.0: {}
+
sh-syntax@0.6.0: {}
sharp@0.34.5:
@@ -7303,8 +12549,18 @@ snapshots:
'@img/sharp-win32-ia32': 0.34.5
'@img/sharp-win32-x64': 0.34.5
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ shell-quote@1.10.0: {}
+
siginfo@2.0.0: {}
+ signal-exit@3.0.7: {}
+
signal-exit@4.1.0: {}
simple-concat@1.0.1:
@@ -7317,6 +12573,22 @@ snapshots:
simple-concat: 1.0.1
optional: true
+ simple-git@3.36.0:
+ dependencies:
+ '@kwsites/file-exists': 1.1.1
+ '@kwsites/promise-deferred': 1.1.1
+ '@simple-git/args-pathspec': 1.0.3
+ '@simple-git/argv-parser': 1.1.1
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ sirv@3.0.2:
+ dependencies:
+ '@polka/url': 1.0.0-next.29
+ mrmime: 2.0.1
+ totalist: 3.0.1
+
sisteransi@1.0.5: {}
skilld-protocol@2.1.0:
@@ -7382,15 +12654,28 @@ snapshots:
dependencies:
unicode-emoji-modifier-base: 1.0.0
+ slash@5.1.0: {}
+
slice-ansi@9.0.0:
dependencies:
ansi-styles: 6.2.3
is-fullwidth-code-point: 5.1.0
+ smob@1.6.2: {}
+
smol-toml@1.7.1: {}
source-map-js@1.2.1: {}
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.6: {}
+
sprintf-js@1.1.3: {}
sql.js@1.14.1: {}
@@ -7420,20 +12705,37 @@ snapshots:
srvx@0.11.22: {}
- srvx@0.12.5: {}
-
stackback@0.0.2: {}
+ standard-as-callback@2.1.0: {}
+
+ statuses@2.0.2: {}
+
std-env@3.10.0: {}
std-env@4.2.0: {}
+ streamx@2.28.0:
+ dependencies:
+ events-universal: 1.0.1
+ fast-fifo: 1.3.2
+ text-decoder: 1.2.7
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
+
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.2.0
+
string-width@7.2.0:
dependencies:
emoji-regex: 10.6.0
@@ -7445,10 +12747,13 @@ snapshots:
get-east-asian-width: 1.6.0
strip-ansi: 7.2.0
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
string_decoder@1.3.0:
dependencies:
safe-buffer: 5.2.1
- optional: true
strip-ansi@6.0.1:
dependencies:
@@ -7458,6 +12763,8 @@ snapshots:
dependencies:
ansi-regex: 6.2.2
+ strip-final-newline@3.0.0: {}
+
strip-json-comments@2.0.1:
optional: true
@@ -7467,6 +12774,10 @@ snapshots:
dependencies:
js-tokens: 9.0.1
+ strip-literal@4.0.0:
+ dependencies:
+ js-tokens: 10.0.0
+
strnum@2.4.1:
dependencies:
anynum: 1.0.1
@@ -7475,15 +12786,45 @@ snapshots:
dependencies:
'@tokenizer/token': 0.3.0
+ structured-clone-es@2.0.1: {}
+
+ stylehacks@8.0.2(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ postcss: 8.5.26
+ postcss-selector-parser: 7.1.5
+
+ supports-color@10.2.2: {}
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
supports-hyperlinks@3.2.0:
dependencies:
has-flag: 4.0.0
supports-color: 7.2.0
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ svgo@4.0.2:
+ dependencies:
+ commander: 11.1.0
+ css-select: 5.2.2
+ css-tree: 3.2.1
+ css-what: 6.2.2
+ csso: 5.0.5
+ picocolors: 1.1.1
+ sax: 1.6.1
+
+ tagged-tag@1.0.0: {}
+
+ tapable@2.3.3: {}
+
tar-fs@2.1.5:
dependencies:
chownr: 1.1.4
@@ -7501,6 +12842,45 @@ snapshots:
readable-stream: 3.6.2
optional: true
+ tar-stream@3.2.0:
+ dependencies:
+ b4a: 1.8.1
+ bare-fs: 4.8.0
+ fast-fifo: 1.3.2
+ streamx: 2.28.0
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - bare-buffer
+ - react-native-b4a
+
+ tar@7.5.22:
+ dependencies:
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.3
+ minizlib: 3.1.0
+ yallist: 5.0.0
+
+ teex@1.0.1:
+ dependencies:
+ streamx: 2.28.0
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
+
+ terser@5.49.2:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.18.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ text-decoder@1.2.7:
+ dependencies:
+ b4a: 1.8.1
+ transitivePeerDependencies:
+ - react-native-b4a
+
thenify-all@1.6.0:
dependencies:
thenify: 3.3.1
@@ -7509,8 +12889,12 @@ snapshots:
dependencies:
any-promise: 1.3.0
+ tiny-invariant@1.3.3: {}
+
tinybench@2.9.0: {}
+ tinyclip@0.1.15: {}
+
tinyexec@0.3.2: {}
tinyexec@1.3.0: {}
@@ -7534,12 +12918,22 @@ snapshots:
dependencies:
tldts-core: 7.4.10
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toidentifier@1.0.1: {}
+
token-types@6.1.2:
dependencies:
'@borewit/text-codec': 0.2.2
'@tokenizer/token': 0.3.0
ieee754: 1.2.1
+ totalist@3.0.1: {}
+
+ tr46@0.0.3: {}
+
tree-kill@1.2.2: {}
ts-algebra@2.0.0: {}
@@ -7600,6 +12994,10 @@ snapshots:
type-fest@0.13.1: {}
+ type-fest@5.8.0:
+ dependencies:
+ tagged-tag: 1.0.0
+
type-level-regexp@0.1.17: {}
typebox@1.3.11: {}
@@ -7620,6 +13018,8 @@ snapshots:
uint8array-extras@1.5.0: {}
+ ultrahtml@1.7.0: {}
+
unagent@0.0.8(@huggingface/transformers@4.2.0)(sqlite-vec@0.1.9):
dependencies:
croner: 9.1.0
@@ -7638,6 +13038,16 @@ snapshots:
'@quansync/fs': 1.0.0
quansync: 1.0.0
+ unconfig@7.5.0:
+ dependencies:
+ '@quansync/fs': 1.0.0
+ defu: 6.1.7
+ jiti: 2.7.0
+ quansync: 1.0.0
+ unconfig-core: 7.5.0
+
+ uncrypto@0.1.3: {}
+
unctx@2.5.0:
dependencies:
acorn: 8.18.0
@@ -7645,16 +13055,88 @@ snapshots:
magic-string: 0.30.21
unplugin: 2.3.11
+ unctx@3.0.0(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)):
+ dependencies:
+ magic-string: 1.1.0
+ rolldown: 1.2.3
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+
undici-types@7.18.2: {}
undici@7.29.0: {}
+ undici@8.10.0: {}
+
unenv@2.0.0-rc.24:
dependencies:
pathe: 2.0.3
+ unhead@3.3.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)):
+ dependencies:
+ hookable: 6.1.1
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - unloader
+
unicode-emoji-modifier-base@1.0.0: {}
+ unicorn-magic@0.3.0: {}
+
+ unicorn-magic@0.4.0: {}
+
+ unimport@6.4.0(rolldown@1.2.3):
+ dependencies:
+ acorn: 8.18.0
+ escape-string-regexp: 5.0.0
+ estree-walker: 3.0.3
+ local-pkg: 1.2.1
+ magic-string: 1.1.0
+ mlly: 1.8.2
+ pathe: 2.0.3
+ picomatch: 4.0.5
+ pkg-types: 2.3.1
+ rolldown: 1.2.3
+ scule: 1.3.0
+ strip-literal: 4.0.0
+ tinyglobby: 0.2.17
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ unplugin-utils: 0.3.2
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - unloader
+
+ unocss@66.7.5(@unocss/webpack@66.7.5(webpack@5.109.2)):
+ dependencies:
+ '@unocss/cli': 66.7.5
+ '@unocss/core': 66.7.5
+ '@unocss/preset-attributify': 66.7.5
+ '@unocss/preset-icons': 66.7.5
+ '@unocss/preset-mini': 66.7.5
+ '@unocss/preset-tagify': 66.7.5
+ '@unocss/preset-typography': 66.7.5
+ '@unocss/preset-uno': 66.7.5
+ '@unocss/preset-web-fonts': 66.7.5
+ '@unocss/preset-wind': 66.7.5
+ '@unocss/preset-wind3': 66.7.5
+ '@unocss/preset-wind4': 66.7.5
+ '@unocss/transformer-attributify-jsx': 66.7.5
+ '@unocss/transformer-compile-class': 66.7.5
+ '@unocss/transformer-directives': 66.7.5
+ '@unocss/transformer-variant-group': 66.7.5
+ '@unocss/vite': 66.7.5(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ '@unocss/webpack': 66.7.5(webpack@5.109.2)
+
+ unplugin-utils@0.3.2:
+ dependencies:
+ pathe: 2.0.3
+ picomatch: 4.0.5
+
unplugin@2.3.11:
dependencies:
'@jridgewell/remapping': 2.3.5
@@ -7662,23 +13144,48 @@ snapshots:
picomatch: 4.0.5
webpack-virtual-modules: 0.6.2
- unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)):
+ unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2):
dependencies:
'@jridgewell/remapping': 2.3.5
picomatch: 4.0.5
rollup: 4.62.4
+ webpack: 5.109.2
webpack-virtual-modules: 0.6.2
optionalDependencies:
esbuild: 0.28.1
rolldown: 1.2.3
vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
- unstorage@2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(lru-cache@11.5.2):
- optionalDependencies:
+ unrouting@0.2.2:
+ dependencies:
+ escape-string-regexp: 5.0.0
+ ufo: 1.6.4
+
+ unstorage@1.17.5:
+ dependencies:
+ anymatch: 3.1.3
+ chokidar: 5.0.0
+ destr: 2.0.5
+ h3: 1.15.11
+ lru-cache: 11.5.2
+ node-fetch-native: 1.6.7
+ ofetch: 1.5.1
+ ufo: 1.6.4
+
+ unstorage@1.17.5(db0@0.3.4)(ioredis@5.11.1):
+ dependencies:
+ anymatch: 3.1.3
chokidar: 5.0.0
db0: 0.3.4
+ destr: 2.0.5
+ h3: 1.15.11
+ ioredis: 5.11.1
lru-cache: 11.5.2
- ofetch: 2.0.0-alpha.3
+ node-fetch-native: 1.6.7
+ ofetch: 1.5.1
+ ufo: 1.6.4
+
+ untun@0.2.2: {}
untyped@2.0.0:
dependencies:
@@ -7688,13 +13195,39 @@ snapshots:
knitwork: 1.3.0
scule: 1.3.0
- util-deprecate@1.0.2:
- optional: true
+ unwasm@0.5.3:
+ dependencies:
+ exsolve: 1.1.1
+ knitwork: 1.3.0
+ magic-string: 0.30.21
+ mlly: 1.8.2
+ pathe: 2.0.3
+ pkg-types: 2.3.1
+
+ update-browserslist-db@1.3.0(browserslist@4.28.8):
+ dependencies:
+ browserslist: 4.28.8
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uqr@0.1.3: {}
+
+ util-deprecate@1.0.2: {}
validate-npm-package-name@5.0.1: {}
verkit@0.3.2: {}
+ vite-dev-rpc@2.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)):
+ dependencies:
+ birpc: 4.0.0
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ vite-hot-client: 2.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+
+ vite-hot-client@2.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)):
+ dependencies:
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+
vite-node@3.2.4(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0):
dependencies:
cac: 6.7.14
@@ -7712,6 +13245,60 @@ snapshots:
- supports-color
- terser
+ vite-node@6.0.0(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11):
+ dependencies:
+ cac: 7.0.0
+ es-module-lexer: 2.3.1
+ obug: 2.1.4
+ pathe: 2.0.3
+ vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)
+ transitivePeerDependencies:
+ - '@vitejs/devtools'
+ - less
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - terser
+ - yaml
+
+ vite-plugin-checker@0.14.5(oxlint@1.77.0(oxlint-tsgolint@7.0.2001))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))(vue-tsc@3.3.9(typescript@6.0.3-bridge.12.tsgo.7.0.2)):
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ chokidar: 5.0.0
+ npm-run-path: 6.0.0
+ oxlint: 1.77.0(oxlint-tsgolint@7.0.2001)
+ picocolors: 1.1.1
+ picomatch: 4.0.5
+ proper-lockfile: 4.1.2
+ tiny-invariant: 1.3.3
+ vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)
+ vue-tsc: 3.3.9(typescript@6.0.3-bridge.12.tsgo.7.0.2)
+
+ vite-plugin-inspect@11.4.1(@nuxt/kit@4.5.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)):
+ dependencies:
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ ansis: 4.3.1
+ error-stack-parser-es: 1.0.5
+ obug: 2.1.4
+ ohash: 2.0.11
+ open: 11.0.0
+ perfect-debounce: 2.1.0
+ sirv: 3.0.2
+ unplugin-utils: 0.3.2
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ vite-dev-rpc: 2.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+
+ vite-plugin-vue-tracer@1.4.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(vue@3.5.41):
+ dependencies:
+ estree-walker: 3.0.3
+ exsolve: 1.1.1
+ magic-string: 0.30.21
+ pathe: 2.0.3
+ source-map-js: 1.2.1
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ vue: 3.5.41
+
vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0):
dependencies:
esbuild: 0.28.1
@@ -7727,6 +13314,20 @@ snapshots:
tsx: 4.23.11
yaml: 2.9.0
+ vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11):
+ dependencies:
+ '@types/node': 24.13.3
+ esbuild: 0.28.1
+ jiti: 2.7.0
+ lightningcss: 1.33.0
+ picomatch: 4.0.5
+ postcss: 8.5.26
+ rolldown: 1.2.3
+ tinyglobby: 0.2.17
+ tsx: 4.23.11
+ optionalDependencies:
+ fsevents: 2.3.3
+
vitest@3.2.7(@types/node@24.13.3):
dependencies:
'@types/chai': 5.2.3
@@ -7765,12 +13366,120 @@ snapshots:
- supports-color
- terser
+ vscode-uri@3.1.0: {}
+
+ vue-bundle-renderer@2.3.2:
+ dependencies:
+ ufo: 1.6.4
+
+ vue-component-type-helpers@3.3.9: {}
+
+ vue-devtools-stub@0.1.0: {}
+
+ vue-router@5.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(vue@3.5.41):
+ dependencies:
+ '@babel/generator': 8.0.0
+ '@vue-macros/common': 3.1.4(vue@3.5.41)
+ '@vue/devtools-api': 8.2.1
+ ast-walker-scope: 0.9.0
+ chokidar: 5.0.0
+ json5: 2.2.3
+ local-pkg: 1.2.1
+ magic-string: 0.30.21
+ mlly: 1.8.2
+ muggle-string: 0.4.1
+ nostics: 1.2.0
+ pathe: 2.0.3
+ picomatch: 4.0.5
+ scule: 1.3.0
+ tinyglobby: 0.2.17
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ unplugin-utils: 0.3.2
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ vue: 3.5.41
+ yaml: 2.9.0
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - unloader
+
+ vue-tsc@3.3.9(typescript@6.0.3-bridge.12.tsgo.7.0.2):
+ dependencies:
+ '@volar/typescript': 2.4.28
+ '@vue/language-core': 3.3.9
+ typescript: typescript-native-bridge@6.0.3-bridge.12.tsgo.7.0.2
+
+ vue@3.5.41:
+ dependencies:
+ '@vue/compiler-dom': 3.5.41
+ '@vue/compiler-sfc': 3.5.41
+ '@vue/runtime-dom': 3.5.41
+ '@vue/server-renderer': 3.5.41
+ '@vue/shared': 3.5.41
+
walk-up-path@4.0.0: {}
+ watchpack@2.5.2:
+ dependencies:
+ graceful-fs: 4.2.11
+
web-streams-polyfill@3.3.3: {}
+ webidl-conversions@3.0.1: {}
+
+ webpack-sources@3.5.1: {}
+
webpack-virtual-modules@0.6.2: {}
+ webpack@5.109.2:
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/json-schema': 7.0.15
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.18.0
+ browserslist: 4.28.8
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.24.5
+ es-module-lexer: 2.3.1
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ graceful-fs: 4.2.11
+ mime-db: 1.54.0
+ minimizer-webpack-plugin: 5.6.1(esbuild@0.28.1)(webpack@5.109.2)
+ neo-async: 2.6.2
+ schema-utils: 4.3.3
+ tapable: 2.3.3
+ watchpack: 2.5.2
+ webpack-sources: 3.5.1
+ transitivePeerDependencies:
+ - '@minify-html/node'
+ - '@swc/core'
+ - '@swc/css'
+ - '@swc/html'
+ - clean-css
+ - cssnano
+ - csso
+ - html-minifier-terser
+ - lightningcss
+ - postcss
+ - uglify-js
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ which@6.0.1:
+ dependencies:
+ isexe: 4.0.0
+
why-is-node-running@2.3.0:
dependencies:
siginfo: 2.0.0
@@ -7788,6 +13497,12 @@ snapshots:
string-width: 4.2.3
strip-ansi: 6.0.1
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 5.1.2
+ strip-ansi: 7.2.0
+
wrap-ansi@9.0.2:
dependencies:
ansi-styles: 6.2.3
@@ -7799,10 +13514,19 @@ snapshots:
ws@8.21.3: {}
+ wsl-utils@0.3.1:
+ dependencies:
+ is-wsl: 3.1.1
+ powershell-utils: 0.1.0
+
xml-naming@0.3.0: {}
y18n@5.0.8: {}
+ yallist@3.1.1: {}
+
+ yallist@5.0.0: {}
+
yaml@2.9.0: {}
yargs-parser@20.2.9: {}
@@ -7830,6 +13554,19 @@ snapshots:
yocto-queue@1.2.2: {}
+ youch-core@0.3.3:
+ dependencies:
+ '@poppinss/exception': 1.2.3
+ error-stack-parser-es: 1.0.5
+
+ youch@4.1.1:
+ dependencies:
+ '@poppinss/colors': 4.1.6
+ '@poppinss/dumper': 0.7.0
+ '@speed-highlight/core': 1.2.23
+ cookie-es: 3.1.1
+ youch-core: 0.3.3
+
yuku-ast@0.8.4:
dependencies:
'@yuku-toolchain/types': 0.8.4
@@ -7869,6 +13606,12 @@ snapshots:
'@yuku-parser/binding-win32-arm64': 0.8.4
'@yuku-parser/binding-win32-x64': 0.8.4
+ zip-stream@6.0.1:
+ dependencies:
+ archiver-utils: 5.0.2
+ compress-commons: 6.0.2
+ readable-stream: 4.7.0
+
zod-to-json-schema@3.25.2(zod@4.4.3):
dependencies:
zod: 4.4.3
diff --git a/turbo.json b/turbo.json
index b09f315..84ce202 100644
--- a/turbo.json
+++ b/turbo.json
@@ -11,7 +11,7 @@
"tasks": {
"build": {
"dependsOn": ["^build"],
- "outputs": ["dist/**", "*.tsbuildinfo"]
+ "outputs": ["dist/**", ".output/**", "*.tsbuildinfo"]
},
"typecheck": {
"dependsOn": ["^build"],
From f84c8160cd0d9837c9e8fa4a26a67c3da9e9b32b Mon Sep 17 00:00:00 2001
From: RedStar
Date: Sun, 9 Aug 2026 23:52:59 +0200
Subject: [PATCH 02/11] refactor(dashboard): make the Nuxt app frontend-only
Rename the server app and remove its API, oRPC, persistence, and runtime dependencies.
Keep presentation contracts local to Nuxt and add browser coverage for the frontend shell.
Refs #10
---
.agents/skills/orpc-server | 1 -
.github/ISSUE_TEMPLATE/bug_report.yml | 2 +-
.github/ISSUE_TEMPLATE/feature_request.yml | 2 +-
.github/copilot-instructions.md | 2 +-
.gitignore | 3 +
.skills/agent-zero-architecture/SKILL.md | 4 +-
.skills/orpc-server/SKILL.md | 28 --
.skills/tsdown/SKILL.md | 2 +-
AGENTS.md | 4 +-
CONTRIBUTING.md | 2 +-
README.md | 39 +-
apps/{server => dashboard}/app/app.vue | 0
apps/dashboard/app/assets/css/main.css | 122 ++++++
.../app/components/AppSidebar.vue | 12 +-
.../app/components/ColorModeToggle.vue | 37 ++
.../app/components/RunnerMetrics.vue | 2 +-
.../app/components/TaskInspector.vue | 73 +---
.../app/components/TaskStatus.vue | 4 +-
.../app/components/TaskTable.vue | 4 +-
.../app/components/TaskTimeline.vue | 2 +-
.../app/layouts/default.vue | 0
.../{server => dashboard}/app/pages/index.vue | 64 +---
apps/dashboard/app/types/dashboard.ts | 35 ++
apps/{server => dashboard}/nuxt.config.ts | 27 +-
apps/{server => dashboard}/package.json | 27 +-
apps/dashboard/playwright.config.ts | 38 ++
apps/dashboard/test/e2e/dashboard.spec.ts | 63 ++++
apps/dashboard/test/e2e/test-utils.ts | 42 +++
apps/dashboard/tsconfig.e2e.json | 11 +
apps/dashboard/tsconfig.json | 5 +
apps/{server => dashboard}/uno.config.ts | 0
apps/{server => dashboard}/uno.theme.ts | 0
apps/server/app/assets/css/main.css | 94 -----
apps/server/server/api/dashboard.get.ts | 10 -
.../server/api/tasks/[id]/approval.post.ts | 21 --
apps/server/server/routes/rpc/[...].ts | 17 -
apps/server/shared/dashboard.ts | 31 --
apps/server/src/control-plane.test.ts | 108 ------
apps/server/src/control-plane.ts | 202 ----------
apps/server/src/dashboard.ts | 17 -
apps/server/src/index.ts | 34 --
apps/server/src/router.test.ts | 314 ----------------
apps/server/src/router.ts | 315 ----------------
apps/server/src/rpc.ts | 41 --
apps/server/tsconfig.json | 13 -
apps/server/tsdown.config.ts | 3 -
docs/architecture.md | 25 +-
package.json | 1 +
pnpm-lock.yaml | 352 +++++++++---------
tsconfig.json | 2 +-
turbo.json | 5 +
51 files changed, 634 insertions(+), 1628 deletions(-)
delete mode 120000 .agents/skills/orpc-server
delete mode 100644 .skills/orpc-server/SKILL.md
rename apps/{server => dashboard}/app/app.vue (100%)
create mode 100644 apps/dashboard/app/assets/css/main.css
rename apps/{server => dashboard}/app/components/AppSidebar.vue (90%)
create mode 100644 apps/dashboard/app/components/ColorModeToggle.vue
rename apps/{server => dashboard}/app/components/RunnerMetrics.vue (95%)
rename apps/{server => dashboard}/app/components/TaskInspector.vue (50%)
rename apps/{server => dashboard}/app/components/TaskStatus.vue (84%)
rename apps/{server => dashboard}/app/components/TaskTable.vue (95%)
rename apps/{server => dashboard}/app/components/TaskTimeline.vue (96%)
rename apps/{server => dashboard}/app/layouts/default.vue (100%)
rename apps/{server => dashboard}/app/pages/index.vue (59%)
create mode 100644 apps/dashboard/app/types/dashboard.ts
rename apps/{server => dashboard}/nuxt.config.ts (57%)
rename apps/{server => dashboard}/package.json (53%)
create mode 100644 apps/dashboard/playwright.config.ts
create mode 100644 apps/dashboard/test/e2e/dashboard.spec.ts
create mode 100644 apps/dashboard/test/e2e/test-utils.ts
create mode 100644 apps/dashboard/tsconfig.e2e.json
create mode 100644 apps/dashboard/tsconfig.json
rename apps/{server => dashboard}/uno.config.ts (100%)
rename apps/{server => dashboard}/uno.theme.ts (100%)
delete mode 100644 apps/server/app/assets/css/main.css
delete mode 100644 apps/server/server/api/dashboard.get.ts
delete mode 100644 apps/server/server/api/tasks/[id]/approval.post.ts
delete mode 100644 apps/server/server/routes/rpc/[...].ts
delete mode 100644 apps/server/shared/dashboard.ts
delete mode 100644 apps/server/src/control-plane.test.ts
delete mode 100644 apps/server/src/control-plane.ts
delete mode 100644 apps/server/src/dashboard.ts
delete mode 100644 apps/server/src/index.ts
delete mode 100644 apps/server/src/router.test.ts
delete mode 100644 apps/server/src/router.ts
delete mode 100644 apps/server/src/rpc.ts
delete mode 100644 apps/server/tsconfig.json
delete mode 100644 apps/server/tsdown.config.ts
diff --git a/.agents/skills/orpc-server b/.agents/skills/orpc-server
deleted file mode 120000
index 6eb7756..0000000
--- a/.agents/skills/orpc-server
+++ /dev/null
@@ -1 +0,0 @@
-../../.skills/orpc-server
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 166d603..d163f78 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -31,7 +31,7 @@ body:
- Agent runtime
- Runner
- CLI
- - oRPC server
+ - Dashboard
- GitHub adapter
- Configuration
- Build or CI
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 265de2d..2e465cc 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -32,7 +32,7 @@ body:
- Agent runtime
- Runner
- CLI
- - oRPC server
+ - Dashboard
- GitHub adapter
- Model provider
- Developer experience
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 9945c0e..c022dad 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -7,6 +7,6 @@ Read `/AGENTS.md` before editing and load the relevant skill from `/.agents/skil
- Keep runtime command execution and target-repository mutation inside `packages/runner`.
- Keep `observe` mode read-only.
- Add deterministic tests for behavior, state transitions, and safety-sensitive changes.
-- Use oRPC in `apps/server`, `@bomb.sh/args` plus `@clack/prompts` in the CLI, tsdown for builds, and Oxlint/Oxfmt for code quality.
+- Keep `apps/dashboard` frontend-only, use `@bomb.sh/args` plus `@clack/prompts` in the CLI, tsdown for package builds, and Oxlint/Oxfmt for code quality.
- Do not introduce Hono, ESLint, Prettier, npm, Yarn, or Bun without an accepted architectural proposal.
- Run `aube run check:repo`, `aube run lint:ci`, `aube run typecheck`, `aube test`, and `aube run build` before handing off a complete change.
diff --git a/.gitignore b/.gitignore
index e0a002c..24b3692 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,9 @@ dist/
.nuxt/
*.tsbuildinfo
coverage/
+playwright-report/
+test-results/
+test-report.junit.xml
.env
.env.*
!.env.example
diff --git a/.skills/agent-zero-architecture/SKILL.md b/.skills/agent-zero-architecture/SKILL.md
index 8347cf3..5a423e2 100644
--- a/.skills/agent-zero-architecture/SKILL.md
+++ b/.skills/agent-zero-architecture/SKILL.md
@@ -16,7 +16,7 @@ Keep dependency direction explicit while changing the monorepo.
- `runner`: command execution and checkout mutation boundary, plus the policy-to-boundary factory.
- `agent`: orchestration, the lifecycle machine, and the validation policy.
- `cli`: argument parsing and terminal presentation.
-- `apps/server`: composition root for webhook ingestion, task execution, and evidence publication.
+- `apps/dashboard`: frontend-only Nuxt operational dashboard with no runtime-package dependencies.
## Workflow
@@ -30,7 +30,7 @@ Keep dependency direction explicit while changing the monorepo.
## Reject these designs
-- Shell execution in the server, CLI presentation, GitHub adapter, model adapter, or agent state machine.
+- Shell execution in a transport adapter, CLI presentation, GitHub adapter, model adapter, or agent state machine.
- HTTP request/response types inside the runtime.
- GitHub SDK objects passed through shared contracts.
- A generic `utils` package used to bypass ownership decisions.
diff --git a/.skills/orpc-server/SKILL.md b/.skills/orpc-server/SKILL.md
deleted file mode 100644
index 2d4afc1..0000000
--- a/.skills/orpc-server/SKILL.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-name: orpc-server
-description: Use when changing apps/server procedures, oRPC contracts, handlers, middleware, transport setup, or typed clients.
----
-
-# oRPC server
-
-`apps/server` is a transport adapter and composition root built with oRPC.
-
-## Rules
-
-- Keep domain composition in `apps/server/src/router.ts` and oRPC procedures in `apps/server/src/rpc.ts`.
-- Nitro v3 scans `apps/server/routes/` because `nitro.config.ts` sets `serverDir: './'`; keep route files as thin transport adapters.
-- Pass persistence through oRPC context. Production routes construct `PersistentTaskStore` from Nitro storage; unit tests use `MemoryTaskStore`.
-- Infer client types from the router; do not duplicate request or response interfaces.
-- Validate inputs at the procedure boundary and return stable domain-shaped results.
-- Procedures call the agent runtime through typed APIs. They do not execute shell commands or mutate checkouts directly.
-- Keep transport-specific headers, status mapping, and request objects out of runtime packages.
-- Do not introduce Hono or a second HTTP framework.
-
-## Workflow
-
-1. Read the router, its tests, and the runtime method being exposed.
-2. Define or adjust the oRPC procedure contract in `src/rpc.ts`.
-3. Keep the handler thin: validate, authorize, delegate, translate.
-4. Add router/store tests without opening a real network port, then verify the built Nitro route once.
-5. Update the README client example when the public router shape changes.
-6. Run `aube run test --filter @agent-zero/server`, typecheck, and build.
diff --git a/.skills/tsdown/SKILL.md b/.skills/tsdown/SKILL.md
index 307abc8..ad8556a 100644
--- a/.skills/tsdown/SKILL.md
+++ b/.skills/tsdown/SKILL.md
@@ -10,7 +10,7 @@ Use this skill when changing build entries, output formats, declarations, packag
## Repository rules
- The base configuration is `scripts/tsdown.config.ts`.
-- Every package or app keeps a small `tsdown.config.ts` that imports the shared factory.
+- Every workspace built with tsdown keeps a small `tsdown.config.ts` that imports the shared factory. The Nuxt dashboard uses the Nuxt build pipeline and does not keep a tsdown config.
- Publishable packages output ESM and CommonJS with declarations and source maps.
- Apps and the CLI output ESM executables without publishable-library declarations unless explicitly needed.
- Publishable package builds must keep `publint` and `attw` validation enabled.
diff --git a/AGENTS.md b/AGENTS.md
index 04f4f63..a2d907e 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -15,7 +15,7 @@ These instructions apply to humans and coding agents working in this repository.
- Use aube for dependencies and scripts. It reads and writes `pnpm-lock.yaml` and `pnpm-workspace.yaml` in place; keep both files and do not create npm, Yarn, or Bun lockfiles.
- `typescript` is overridden to `typescript-native-bridge` in `pnpm-workspace.yaml`, so `tsc` and every Compiler API consumer type-check on tsgo. Keep the pin exact and reinstall after changing it.
- Use Turborepo through the root scripts; do not duplicate orchestration in package scripts.
-- Use tsdown through each package's `tsdown.config.ts` and the shared `scripts/tsdown.config.ts`.
+- Use tsdown through each tsdown-built package's `tsdown.config.ts` and the shared `scripts/tsdown.config.ts`. The Nuxt dashboard uses the Nuxt build pipeline.
- Use Oxlint with type-aware checks and Oxfmt. Do not add ESLint or Prettier.
- Do not edit `dist/`, `.turbo/`, or generated declaration files.
@@ -28,7 +28,7 @@ These instructions apply to humans and coding agents working in this repository.
- `packages/config`: configuration parsing and policy.
- `packages/shared`: stable cross-package contracts.
- `packages/cli`: argument parsing and terminal presentation.
-- `apps/server`: oRPC transport and control-plane composition.
+- `apps/dashboard`: frontend-only Nuxt operational dashboard.
The runtime must remain independent from HTTP, GitHub, terminal UI, and specific model providers. Adapters depend on the runtime; the runtime must not depend on adapters.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7ebea78..d488e9e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -41,7 +41,7 @@ aube test
| Configuration and policy | `packages/config` |
| Shared contracts | `packages/shared` |
| CLI parsing and presentation | `packages/cli` |
-| HTTP control-plane composition | `apps/server` |
+| Dashboard frontend | `apps/dashboard` |
Read [AGENTS.md](AGENTS.md) and the matching files in `.agents/skills/` before making architectural or safety-sensitive changes.
diff --git a/README.md b/README.md
index b27c3fa..a5e43f4 100644
--- a/README.md
+++ b/README.md
@@ -33,10 +33,7 @@ Feedback is never treated as truth merely because it came from a human or an AI
## Architecture
```text
-GitHub webhook / CLI
- │
- ▼
- Nitro + oRPC control plane ─── durable task events / approvals
+GitHub adapter / CLI
│
▼
Agent state machine
@@ -46,6 +43,8 @@ GitHub webhook / CLI
│
▼
Runner boundary ─── repository commands and file operations
+
+Nuxt dashboard ─── frontend-only operational interface
```
| Package | Responsibility |
@@ -57,7 +56,7 @@ GitHub webhook / CLI
| [`packages/config`](./packages/config) | Configuration parsing and policy |
| [`packages/shared`](./packages/shared) | Stable cross-package contracts |
| [`packages/cli`](./packages/cli) | Argument parsing and terminal presentation |
-| [`apps/server`](./apps/server) | oRPC transport and control-plane composition |
+| [`apps/dashboard`](./apps/dashboard) | Frontend-only Nuxt operational dashboard |
Adapters depend on the runtime; the runtime never depends on adapters. See [docs/architecture.md](./docs/architecture.md) for the full dependency rules.
@@ -97,29 +96,13 @@ The CLI parses arguments with [`@bomb.sh/args`](https://github.com/bomb-sh/args)
---
-## Control plane
-
-`aube run dev` starts the Nuxt control plane, backed by Nitro, on `http://localhost:3000`. The operational dashboard is served at `/`; the type-safe oRPC endpoint at `/rpc` exposes `health`, `tasks.list`, `tasks.get`, `tasks.create`, and `approvals.decide`.
+## Dashboard
-Task history, structured lifecycle events, evidence, model/token/latency/cost usage, and approval decisions are stored through Nitro storage. The development mount uses `.data/agent-zero`; production deployments can replace it with Redis or provider KV without changing task logic. Checkout paths, review input, provider credentials, and raw provider responses are not persisted, and all persisted strings are redacted before storage.
+`aube run dev` starts the frontend-only Nuxt dashboard on `http://localhost:3000`. It is an operational interface shell: it does not expose API or RPC routes, persist task data, import runtime packages, or execute repository work.
-Call the API from another service with `@orpc/client`:
-
-```ts
-import { createORPCClient } from '@orpc/client';
-import { RPCLink } from '@orpc/client/fetch';
-import type { RouterClient } from '@orpc/server';
-import type { RpcRouter } from '@agent-zero/server';
-
-const zero: RouterClient = createORPCClient(
- new RPCLink({ url: 'http://localhost:3000/rpc' }),
-);
-
-await zero.tasks.create({ repository: '.', feedback: 'Check error handling', mode: 'observe' });
-await zero.tasks.create({ repository: '.', trigger: 'proactive', mode: 'observe' });
-```
+`aube run test:e2e` builds the dashboard, starts the production preview on port 5678, and runs the Playwright smoke suite. Use `aube --filter @agent-zero/dashboard run test:e2e:ui` for Playwright UI mode.
-The scheduler admits at most four tasks globally, one active task per repository, and 100 queued tasks by default. Hosted execution is injected as a provider-neutral `RunnerPool`: every lease has a maximum lifetime, quota checks run before provisioning, expired sandboxes are stopped, and the agent receives only the ordinary `Runner` contract. See [the sandbox provider evaluation](./docs/sandbox-providers.md).
+Hosted execution is available through the provider-neutral `RunnerPool`: every lease has a maximum lifetime, quota checks run before provisioning, expired sandboxes are stopped, and the agent receives only the ordinary `Runner` contract. See [the sandbox provider evaluation](./docs/sandbox-providers.md).
Agent Zero supports native OpenAI, Anthropic, and Google Generative AI adapters, Vercel AI
Gateway, and arbitrary OpenAI-compatible endpoints. Select the transport in repository policy and
@@ -158,7 +141,7 @@ model:
- **[aube](https://aube.jdx.dev)** – package manager, pinned through `packageManager`, reusing the pnpm lockfile and workspace files.
- **[typescript-native-bridge](https://github.com/johnsoncodehk/typescript-native-bridge)** – overrides `typescript` repo-wide, so `tsc` keeps the classic package surface while the checker runs on tsgo in-process. The override lives in `pnpm-workspace.yaml` and is pinned exactly; the fork only publishes prerelease versions.
- **[Turborepo](https://turborepo.dev)** – schedules workspace tasks in dependency order and caches tsdown build outputs.
-- **[tsdown](https://tsdown.dev)** – builds publishable packages as ESM and CommonJS with matching declarations and source maps, through the shared [tsdown configuration](./scripts/tsdown.config.ts). Apps stay ESM-only.
+- **[tsdown](https://tsdown.dev)** – builds publishable packages as ESM and CommonJS with matching declarations and source maps, through the shared [tsdown configuration](./scripts/tsdown.config.ts). The Nuxt dashboard uses the Nuxt build pipeline instead.
- **[Oxlint](https://oxc.rs) + [Oxfmt](https://oxc.rs)** – type-aware linting and repository-wide formatting, extended with [`@e18e/eslint-plugin`](https://github.com/e18e/eslint-plugin) for modernization, module-replacement, and performance rules.
- **[Knip](https://knip.dev)** – detects unused files, exports, and dependencies across the workspace as part of `lint:ci`.
- **[`@arethetypeswrong/cli`](https://github.com/arethetypeswrong/arethetypeswrong.github.io) + [Publint](https://publint.dev)** – validate every package build.
@@ -170,7 +153,7 @@ GitHub Actions run typecheck, build/export validation, Oxlint, Oxfmt, tests, and
## Security model
-The included `LocalRunner` is intended for trusted local development. Production deployments must place it inside Docker, a microVM, or another ephemeral sandbox with CPU, memory, filesystem, and network policies. The server never invokes shell commands directly.
+The included `LocalRunner` is intended for trusted local development. Production deployments must place it inside Docker, a microVM, or another ephemeral sandbox with CPU, memory, filesystem, and network policies. Only `packages/runner` may invoke shell commands.
Report vulnerabilities privately as described in [SECURITY.md](./SECURITY.md). Do not open a public issue.
@@ -178,7 +161,7 @@ Report vulnerabilities privately as described in [SECURITY.md](./SECURITY.md). D
## Agent Skills
-Task-specific Agent Skills live in `.skills/` and are exposed to coding agents through `.agents/skills/`. Skilld manages the versioned tsdown skill, and the same portable layout covers architecture, CLI, oRPC, Turborepo, and safety work:
+Task-specific Agent Skills live in `.skills/` and are exposed to coding agents through `.agents/skills/`. Skilld manages the versioned tsdown skill, and the same portable layout covers architecture, CLI, Turborepo, and safety work:
```bash
aube run skills:list
diff --git a/apps/server/app/app.vue b/apps/dashboard/app/app.vue
similarity index 100%
rename from apps/server/app/app.vue
rename to apps/dashboard/app/app.vue
diff --git a/apps/dashboard/app/assets/css/main.css b/apps/dashboard/app/assets/css/main.css
new file mode 100644
index 0000000..6925b92
--- /dev/null
+++ b/apps/dashboard/app/assets/css/main.css
@@ -0,0 +1,122 @@
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+:root:not([data-theme='light']),
+:root[data-theme='dark'] {
+ color-scheme: dark;
+ --az-canvas: oklch(0.15 0.012 160);
+ --az-panel: oklch(0.18 0.012 160);
+ --az-raised: oklch(0.22 0.014 160);
+ --az-line: oklch(0.3 0.014 160);
+ --az-ink: oklch(0.96 0.008 145);
+ --az-muted: oklch(0.7 0.018 160);
+ --az-accent: oklch(0.82 0.2 136);
+ --az-warning: oklch(0.82 0.15 80);
+ --az-danger: oklch(0.68 0.2 25);
+ --az-link: oklch(0.73 0.15 250);
+ --az-grid: color-mix(in oklch, var(--az-accent) 3%, transparent);
+ --az-accent-glow: color-mix(in oklch, var(--az-accent) 72%, transparent);
+}
+
+:root[data-theme='light'] {
+ color-scheme: light;
+ --az-canvas: oklch(0.985 0.004 145);
+ --az-panel: oklch(0.965 0.006 145);
+ --az-raised: oklch(0.93 0.01 145);
+ --az-line: oklch(0.82 0.014 145);
+ --az-ink: oklch(0.18 0.018 155);
+ --az-muted: oklch(0.44 0.025 155);
+ --az-accent: oklch(0.46 0.17 140);
+ --az-warning: oklch(0.55 0.14 75);
+ --az-danger: oklch(0.55 0.2 25);
+ --az-link: oklch(0.48 0.17 250);
+ --az-grid: color-mix(in oklch, var(--az-accent) 5%, transparent);
+ --az-accent-glow: color-mix(in oklch, var(--az-accent) 36%, transparent);
+}
+
+:root {
+ --az-font-sans:
+ Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+ font-family: var(--az-font-sans);
+ background: var(--az-canvas);
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
+ scrollbar-gutter: stable;
+}
+
+body {
+ margin: 0;
+ min-width: 320px;
+ background:
+ linear-gradient(var(--az-grid) 1px, transparent 1px),
+ linear-gradient(90deg, var(--az-grid) 1px, transparent 1px), var(--az-canvas);
+ background-size: 32px 32px;
+ color: var(--az-ink);
+ line-height: 1.5;
+}
+
+button,
+textarea {
+ font: inherit;
+}
+
+button {
+ cursor: pointer;
+}
+
+:focus-visible,
+:-moz-focusring {
+ outline: 2px solid var(--az-accent) !important;
+ outline-offset: 2px !important;
+}
+
+::selection {
+ color: var(--az-canvas);
+ background: var(--az-accent);
+}
+
+* {
+ scrollbar-color: var(--az-line) var(--az-canvas);
+}
+
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--az-canvas);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--az-line);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--az-muted);
+}
+
+@media (prefers-contrast: more) {
+ :root[data-theme='dark'] {
+ --az-line: oklch(0.74 0.01 160);
+ --az-muted: oklch(0.88 0.01 160);
+ }
+
+ :root[data-theme='light'] {
+ --az-line: oklch(0.38 0.014 145);
+ --az-muted: oklch(0.28 0.02 155);
+ }
+}
+
+@media screen and (max-width: 767px) {
+ input,
+ select,
+ textarea {
+ font-size: 16px !important;
+ }
+}
diff --git a/apps/server/app/components/AppSidebar.vue b/apps/dashboard/app/components/AppSidebar.vue
similarity index 90%
rename from apps/server/app/components/AppSidebar.vue
rename to apps/dashboard/app/components/AppSidebar.vue
index 1bd92be..2d5a61d 100644
--- a/apps/server/app/components/AppSidebar.vue
+++ b/apps/dashboard/app/components/AppSidebar.vue
@@ -13,11 +13,11 @@ const navItems = [
>
-
+
AGENT ZERO
-
Control plane
+
Dashboard
@@ -47,13 +47,11 @@ const navItems = [
SYSTEM
-
- ONLINE
+
+ READY
-
- Durable queue · isolated runners
-
+ Frontend interface
diff --git a/apps/dashboard/app/components/ColorModeToggle.vue b/apps/dashboard/app/components/ColorModeToggle.vue
new file mode 100644
index 0000000..a30dca2
--- /dev/null
+++ b/apps/dashboard/app/components/ColorModeToggle.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
diff --git a/apps/server/app/components/RunnerMetrics.vue b/apps/dashboard/app/components/RunnerMetrics.vue
similarity index 95%
rename from apps/server/app/components/RunnerMetrics.vue
rename to apps/dashboard/app/components/RunnerMetrics.vue
index fd98dad..5b59f2b 100644
--- a/apps/server/app/components/RunnerMetrics.vue
+++ b/apps/dashboard/app/components/RunnerMetrics.vue
@@ -1,5 +1,5 @@
@@ -67,60 +54,6 @@ function decide(decision: ApprovalDecision): void {
Run summary
{{ task.result.summary }}
-
-
-
-
-
{{ error }}
-
-
-
-
-
-
-
-
Decision
-
- {{ task.approval.decision }} by {{ task.approval.actor }}
-
-
- {{ task.approval.comment }}
-
-
@@ -133,7 +66,7 @@ function decide(decision: ApprovalDecision): void {
No task selected
- Select a queue record to inspect evidence, usage, and approvals.
+ Select a queue record to inspect evidence and usage.
diff --git a/apps/server/app/components/TaskStatus.vue b/apps/dashboard/app/components/TaskStatus.vue
similarity index 84%
rename from apps/server/app/components/TaskStatus.vue
rename to apps/dashboard/app/components/TaskStatus.vue
index 466d5a2..8ebbbfe 100644
--- a/apps/server/app/components/TaskStatus.vue
+++ b/apps/dashboard/app/components/TaskStatus.vue
@@ -1,7 +1,7 @@
diff --git a/apps/server/app/layouts/default.vue b/apps/dashboard/app/layouts/default.vue
similarity index 100%
rename from apps/server/app/layouts/default.vue
rename to apps/dashboard/app/layouts/default.vue
diff --git a/apps/server/app/pages/index.vue b/apps/dashboard/app/pages/index.vue
similarity index 59%
rename from apps/server/app/pages/index.vue
rename to apps/dashboard/app/pages/index.vue
index 8cf881d..d4a53a6 100644
--- a/apps/server/app/pages/index.vue
+++ b/apps/dashboard/app/pages/index.vue
@@ -1,5 +1,5 @@
@@ -78,21 +54,26 @@ async function decide(decision: ApprovalDecision, comment: string): Promise
Agent Zero / Operations
- Control plane
+ Dashboard
{{ now.toISOString().slice(0, 19) }}Z
- Live telemetry
+ Local interface
+
+
+
+
+
+
diff --git a/apps/dashboard/app/types/dashboard.ts b/apps/dashboard/app/types/dashboard.ts
new file mode 100644
index 0000000..52456c2
--- /dev/null
+++ b/apps/dashboard/app/types/dashboard.ts
@@ -0,0 +1,35 @@
+export type DashboardTaskStatus = 'queued' | 'running' | 'completed' | 'needs-human' | 'failed';
+
+interface DashboardTaskEvent {
+ state: string;
+ message: string;
+ timestamp: string;
+}
+
+interface DashboardTaskResult {
+ attempts: number;
+ verified: boolean;
+ summary: string;
+ usage: {
+ totalTokens: number;
+ };
+}
+
+export interface DashboardTask {
+ id: string;
+ repository: string;
+ status: DashboardTaskStatus;
+ createdAt: string;
+ updatedAt: string;
+ events: DashboardTaskEvent[];
+ result?: DashboardTaskResult;
+}
+
+export interface DashboardOverview {
+ tasks: DashboardTask[];
+ active: number;
+ queued: number;
+ awaitingApproval: number;
+ totalTokens: number;
+ costUsd: number;
+}
diff --git a/apps/server/nuxt.config.ts b/apps/dashboard/nuxt.config.ts
similarity index 57%
rename from apps/server/nuxt.config.ts
rename to apps/dashboard/nuxt.config.ts
index 56a4c44..60814c1 100644
--- a/apps/server/nuxt.config.ts
+++ b/apps/dashboard/nuxt.config.ts
@@ -6,27 +6,28 @@ export default defineNuxtConfig({
future: {
compatibilityVersion: 5,
},
- modules: ['@unocss/nuxt'],
+ modules: [
+ '@unocss/nuxt',
+ [
+ '@nuxtjs/color-mode',
+ {
+ preference: 'system',
+ fallback: 'dark',
+ dataValue: 'theme',
+ storageKey: 'agent-zero-color-mode',
+ },
+ ],
+ ],
css: ['~/assets/css/main.css'],
app: {
head: {
htmlAttrs: { lang: 'en' },
- meta: [{ name: 'color-scheme', content: 'dark' }],
- title: 'Agent Zero · Control Plane',
- },
- },
- nitro: {
- storage: {
- 'agent-zero': {
- driver: 'fs',
- base: './.data/agent-zero',
- },
+ meta: [{ name: 'color-scheme', content: 'dark light' }],
+ title: 'Agent Zero · Dashboard',
},
},
routeRules: {
'/': { appLayout: 'default' },
- '/api/**': { cache: false },
- '/rpc/**': { cache: false },
},
typescript: {
strict: true,
diff --git a/apps/server/package.json b/apps/dashboard/package.json
similarity index 53%
rename from apps/server/package.json
rename to apps/dashboard/package.json
index f4c30cb..7a23afe 100644
--- a/apps/server/package.json
+++ b/apps/dashboard/package.json
@@ -1,30 +1,27 @@
{
- "name": "@agent-zero/server",
+ "name": "@agent-zero/dashboard",
"version": "0.3.0",
"type": "module",
"scripts": {
"build": "nuxt build",
"clean": "nuxt cleanup && tsc -b --clean",
"dev": "nuxt dev",
- "lint": "oxlint --config ../../.oxlintrc.json --type-aware --type-check src server app shared",
+ "lint": "oxlint --config ../../.oxlintrc.json --type-aware --type-check app test",
"start": "node .output/server/index.mjs",
- "test": "vitest run src --passWithNoTests",
- "typecheck": "nuxt prepare && vue-tsc -b --noEmit && tsc --project tsconfig.json --pretty false --noEmit"
+ "start:playwright:webserver": "nuxt preview --port 5678",
+ "test": "vitest run app --passWithNoTests",
+ "test:e2e": "playwright test",
+ "test:e2e:ui": "playwright test --ui",
+ "test:e2e:update": "playwright test --update-snapshots",
+ "typecheck": "nuxt prepare && vue-tsc -b --noEmit && tsc --project tsconfig.json --pretty false --noEmit && tsc --project tsconfig.e2e.json --pretty false --noEmit"
},
"dependencies": {
- "@agent-zero/agent": "workspace:*",
- "@agent-zero/config": "workspace:*",
- "@agent-zero/github": "workspace:*",
- "@agent-zero/models": "workspace:*",
- "@agent-zero/runner": "workspace:*",
- "@agent-zero/shared": "workspace:*",
- "@orpc/server": "2.0.0-beta.26",
- "h3": "^1.15.11",
- "nitropack": "^2.13.4",
- "nuxt": "^4.5.2",
- "zod": "^4.1.5"
+ "nuxt": "^4.5.2"
},
"devDependencies": {
+ "@nuxt/test-utils": "4.1.0",
+ "@nuxtjs/color-mode": "4.0.1",
+ "@playwright/test": "^1.62.0",
"@unocss/nuxt": "^66.7.5",
"@unocss/preset-wind4": "^66.7.5",
"oxlint": "^1.44.0",
diff --git a/apps/dashboard/playwright.config.ts b/apps/dashboard/playwright.config.ts
new file mode 100644
index 0000000..cefc70e
--- /dev/null
+++ b/apps/dashboard/playwright.config.ts
@@ -0,0 +1,38 @@
+import process from 'node:process';
+
+import type { ConfigOptions } from '@nuxt/test-utils/playwright';
+import { defineConfig, devices } from '@playwright/test';
+
+const baseURL = 'http://localhost:5678';
+
+export default defineConfig({
+ testDir: './test/e2e',
+ fullyParallel: true,
+ forbidOnly: Boolean(process.env.CI),
+ retries: process.env.CI ? 2 : 0,
+ reporter: process.env.CI
+ ? [['html'], ['junit', { outputFile: 'test-report.junit.xml' }]]
+ : 'html',
+ timeout: 120_000,
+ webServer: {
+ command: 'aube run start:playwright:webserver',
+ url: baseURL,
+ reuseExistingServer: !process.env.CI,
+ timeout: 60_000,
+ },
+ snapshotPathTemplate: '{snapshotDir}/{testFileDir}/{testFileName}-snapshots/{arg}{ext}',
+ use: {
+ baseURL,
+ trace: 'on-first-retry',
+ nuxt: {
+ rootDir: import.meta.dirname,
+ host: baseURL,
+ },
+ },
+ projects: [
+ {
+ name: 'chromium-headless-shell',
+ use: { ...devices['Desktop Chrome'] },
+ },
+ ],
+});
diff --git a/apps/dashboard/test/e2e/dashboard.spec.ts b/apps/dashboard/test/e2e/dashboard.spec.ts
new file mode 100644
index 0000000..2263ba2
--- /dev/null
+++ b/apps/dashboard/test/e2e/dashboard.spec.ts
@@ -0,0 +1,63 @@
+import { expect, test } from './test-utils.js';
+
+test.describe('Dashboard', () => {
+ test('renders the frontend dashboard without runtime or hydration errors', async ({
+ page,
+ goto,
+ hydrationErrors,
+ consoleErrors,
+ }) => {
+ const response = await goto('/', { waitUntil: 'networkidle' });
+
+ expect(response).not.toBeNull();
+ expect(response?.status()).toBe(200);
+ await expect(page.getByRole('heading', { name: 'Dashboard', level: 1 })).toBeVisible();
+ await expect(page.getByRole('heading', { name: 'No tasks recorded', level: 3 })).toBeVisible();
+ expect(hydrationErrors).toHaveLength(0);
+ expect(consoleErrors).toHaveLength(0);
+ });
+
+ test('refreshes local dashboard state without backend requests', async ({
+ page,
+ goto,
+ consoleErrors,
+ }) => {
+ const backendRequests: string[] = [];
+ page.on('request', (request) => {
+ const path = new URL(request.url()).pathname;
+ if (path.startsWith('/api/') || path.startsWith('/rpc/')) backendRequests.push(path);
+ });
+ await goto('/', { waitUntil: 'networkidle' });
+ const refresh = page.getByRole('button', { name: 'Refresh' });
+
+ await refresh.click();
+
+ await expect(refresh).toBeEnabled();
+ expect(backendRequests).toHaveLength(0);
+ expect(consoleErrors).toHaveLength(0);
+ });
+
+ test('switches between persistent light and dark themes', async ({
+ page,
+ goto,
+ hydrationErrors,
+ consoleErrors,
+ }) => {
+ await page.addInitScript({
+ content:
+ "if (!localStorage.getItem('agent-zero-color-mode')) localStorage.setItem('agent-zero-color-mode', 'dark')",
+ });
+ await goto('/', { waitUntil: 'networkidle' });
+
+ await expect(page.locator('html')).toHaveAttribute('data-theme', 'dark');
+ await page.getByRole('button', { name: 'Switch to light mode' }).click();
+ await expect(page.locator('html')).toHaveAttribute('data-theme', 'light');
+
+ await page.reload({ waitUntil: 'networkidle' });
+ await expect(page.locator('html')).toHaveAttribute('data-theme', 'light');
+ await page.getByRole('button', { name: 'Switch to dark mode' }).click();
+ await expect(page.locator('html')).toHaveAttribute('data-theme', 'dark');
+ expect(hydrationErrors).toHaveLength(0);
+ expect(consoleErrors).toHaveLength(0);
+ });
+});
diff --git a/apps/dashboard/test/e2e/test-utils.ts b/apps/dashboard/test/e2e/test-utils.ts
new file mode 100644
index 0000000..f4fdfc5
--- /dev/null
+++ b/apps/dashboard/test/e2e/test-utils.ts
@@ -0,0 +1,42 @@
+import { expect, test as base } from '@nuxt/test-utils/playwright';
+import type { ConsoleMessage } from '@playwright/test';
+
+const hydrationMismatchPatterns = [
+ 'Hydration completed but contains mismatches',
+ 'Hydration text content mismatch',
+ 'Hydration node mismatch',
+ 'Hydration children mismatch',
+ 'Hydration attribute mismatch',
+ 'Hydration class mismatch',
+ 'Hydration style mismatch',
+];
+
+function isHydrationMismatch(message: ConsoleMessage): boolean {
+ return hydrationMismatchPatterns.some((pattern) => message.text().includes(pattern));
+}
+
+function isApplicationConsoleError(message: ConsoleMessage): boolean {
+ return (
+ message.type() === 'error' ||
+ (message.type() === 'warning' && message.text().includes('[nuxt]'))
+ );
+}
+
+export const test = base.extend<{ hydrationErrors: string[]; consoleErrors: string[] }>({
+ hydrationErrors: async ({ page }, use) => {
+ const errors: string[] = [];
+ page.on('console', (message) => {
+ if (isHydrationMismatch(message)) errors.push(message.text());
+ });
+ await use(errors);
+ },
+ consoleErrors: async ({ page }, use) => {
+ const errors: string[] = [];
+ page.on('console', (message) => {
+ if (isApplicationConsoleError(message)) errors.push(message.text());
+ });
+ await use(errors);
+ },
+});
+
+export { expect };
diff --git a/apps/dashboard/tsconfig.e2e.json b/apps/dashboard/tsconfig.e2e.json
new file mode 100644
index 0000000..1cc1347
--- /dev/null
+++ b/apps/dashboard/tsconfig.e2e.json
@@ -0,0 +1,11 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "composite": false,
+ "declaration": false,
+ "declarationMap": false,
+ "noEmit": true,
+ "rootDir": "."
+ },
+ "include": ["playwright.config.ts", "test/**/*.ts"]
+}
diff --git a/apps/dashboard/tsconfig.json b/apps/dashboard/tsconfig.json
new file mode 100644
index 0000000..42ebc65
--- /dev/null
+++ b/apps/dashboard/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": { "rootDir": ".", "outDir": "dist" },
+ "include": ["app/**/*.ts", "uno.config.ts", "uno.theme.ts"]
+}
diff --git a/apps/server/uno.config.ts b/apps/dashboard/uno.config.ts
similarity index 100%
rename from apps/server/uno.config.ts
rename to apps/dashboard/uno.config.ts
diff --git a/apps/server/uno.theme.ts b/apps/dashboard/uno.theme.ts
similarity index 100%
rename from apps/server/uno.theme.ts
rename to apps/dashboard/uno.theme.ts
diff --git a/apps/server/app/assets/css/main.css b/apps/server/app/assets/css/main.css
deleted file mode 100644
index 21d40a1..0000000
--- a/apps/server/app/assets/css/main.css
+++ /dev/null
@@ -1,94 +0,0 @@
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-:root {
- color-scheme: dark;
- --az-canvas: #080c0e;
- --az-panel: #0d1215;
- --az-raised: #11181c;
- --az-line: #273137;
- --az-ink: #edf2ef;
- --az-muted: #94a0a7;
- --az-accent: #82e849;
- --az-warning: #f5bd38;
- --az-danger: #ff675f;
- --az-link: #57a7ff;
- --az-font-sans:
- Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
- font-family: var(--az-font-sans);
- background: var(--az-canvas);
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- text-rendering: optimizeLegibility;
- scrollbar-gutter: stable;
-}
-
-body {
- margin: 0;
- min-width: 320px;
- background:
- linear-gradient(rgb(130 232 73 / 0.018) 1px, transparent 1px),
- linear-gradient(90deg, rgb(130 232 73 / 0.018) 1px, transparent 1px), var(--az-canvas);
- background-size: 32px 32px;
- color: var(--az-ink);
- line-height: 1.5;
-}
-
-button,
-textarea {
- font: inherit;
-}
-
-button {
- cursor: pointer;
-}
-
-:focus-visible,
-:-moz-focusring {
- outline: 2px solid var(--az-accent) !important;
- outline-offset: 2px !important;
-}
-
-::selection {
- color: var(--az-canvas);
- background: var(--az-accent);
-}
-
-* {
- scrollbar-color: var(--az-line) var(--az-canvas);
-}
-
-::-webkit-scrollbar {
- width: 8px;
- height: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: var(--az-canvas);
-}
-
-::-webkit-scrollbar-thumb {
- background: var(--az-line);
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: var(--az-muted);
-}
-
-@media (prefers-contrast: more) {
- :root {
- --az-line: #aab3b8;
- --az-muted: #d7ddda;
- }
-}
-
-@media screen and (max-width: 767px) {
- input,
- select,
- textarea {
- font-size: 16px !important;
- }
-}
diff --git a/apps/server/server/api/dashboard.get.ts b/apps/server/server/api/dashboard.get.ts
deleted file mode 100644
index d178ddd..0000000
--- a/apps/server/server/api/dashboard.get.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineEventHandler } from 'h3';
-import { useStorage } from 'nitropack/runtime';
-
-import { PersistentTaskStore } from '../../src/control-plane.js';
-import { dashboardOverview } from '../../src/dashboard.js';
-
-export default defineEventHandler(async () => {
- const tasks = await new PersistentTaskStore(useStorage('agent-zero')).list();
- return dashboardOverview(tasks);
-});
diff --git a/apps/server/server/api/tasks/[id]/approval.post.ts b/apps/server/server/api/tasks/[id]/approval.post.ts
deleted file mode 100644
index 771968e..0000000
--- a/apps/server/server/api/tasks/[id]/approval.post.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { defineEventHandler, getRouterParam, readBody } from 'h3';
-import { useStorage } from 'nitropack/runtime';
-
-import { PersistentTaskStore } from '../../../../src/control-plane.js';
-import { approvalInput, decideApproval } from '../../../../src/router.js';
-
-export default defineEventHandler(async (event) => {
- const taskId = getRouterParam(event, 'id');
- const body: unknown = await readBody(event);
- const input = approvalInput.parse({
- ...(typeof body === 'object' && body !== null && !Array.isArray(body) ? body : {}),
- taskId,
- });
- return decideApproval(
- input.taskId,
- input.decision,
- input.actor,
- input.comment,
- new PersistentTaskStore(useStorage('agent-zero')),
- );
-});
diff --git a/apps/server/server/routes/rpc/[...].ts b/apps/server/server/routes/rpc/[...].ts
deleted file mode 100644
index 9e6a6f9..0000000
--- a/apps/server/server/routes/rpc/[...].ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { RPCHandler } from '@orpc/server/fetch';
-import { defineEventHandler, toWebRequest } from 'h3';
-import { useStorage } from 'nitropack/runtime';
-
-import { PersistentTaskStore } from '../../../src/control-plane.js';
-import { rpcRouter } from '../../../src/rpc.js';
-
-const handler = new RPCHandler(rpcRouter);
-
-export default defineEventHandler(async (event): Promise => {
- const store = new PersistentTaskStore(useStorage('agent-zero'));
- const { response } = await handler.handle(toWebRequest(event), {
- prefix: '/rpc',
- context: { store },
- });
- return response ?? new Response('Not found', { status: 404 });
-});
diff --git a/apps/server/shared/dashboard.ts b/apps/server/shared/dashboard.ts
deleted file mode 100644
index ca9a5c1..0000000
--- a/apps/server/shared/dashboard.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import type { TaskEvent, TaskResult } from '@agent-zero/shared';
-
-export type ControlPlaneTaskStatus = 'queued' | 'running' | 'completed' | 'needs-human' | 'failed';
-export type ApprovalDecision = 'approved' | 'rejected';
-
-export interface TaskApproval {
- decision: ApprovalDecision;
- actor: string;
- comment: string | null;
- decidedAt: string;
-}
-
-export interface DashboardTask {
- id: string;
- repository: string;
- status: ControlPlaneTaskStatus;
- createdAt: string;
- updatedAt: string;
- events: TaskEvent[];
- result?: TaskResult;
- approval?: TaskApproval;
-}
-
-export interface DashboardOverview {
- tasks: DashboardTask[];
- active: number;
- queued: number;
- awaitingApproval: number;
- totalTokens: number;
- costUsd: number;
-}
diff --git a/apps/server/src/control-plane.test.ts b/apps/server/src/control-plane.test.ts
deleted file mode 100644
index d94fac4..0000000
--- a/apps/server/src/control-plane.test.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-import { describe, expect, it } from 'vitest';
-
-import {
- MemoryTaskStore,
- PersistentTaskStore,
- TaskQueueQuotaError,
- TaskScheduler,
- type KeyValueStorage,
- type StoredTask,
-} from './control-plane.js';
-
-function record(id: string, summary = 'safe'): StoredTask {
- return {
- id,
- repository: 'acme/app',
- status: 'queued',
- createdAt: '2026-08-09T10:00:00.000Z',
- updatedAt: '2026-08-09T10:00:00.000Z',
- events: [],
- ...(summary === 'safe'
- ? {}
- : {
- approval: {
- decision: 'approved' as const,
- actor: 'operator',
- comment: summary,
- decidedAt: '2026-08-09T10:00:00.000Z',
- },
- }),
- };
-}
-
-class RecordingStorage implements KeyValueStorage {
- readonly values = new Map();
- async getItem(key: string): Promise {
- return this.values.get(key) ?? null;
- }
- async setItem(key: string, value: unknown): Promise {
- this.values.set(key, value);
- }
- async getKeys(base = ''): Promise {
- return [...this.values.keys()].filter((key) => key.startsWith(base));
- }
-}
-
-describe('task persistence', () => {
- it('round-trips structured history through a provider-neutral store', async () => {
- const storage = new RecordingStorage();
- const store = new PersistentTaskStore(storage);
- await store.save(record('az_1'));
- await expect(store.get('az_1')).resolves.toMatchObject({ id: 'az_1', status: 'queued' });
- await expect(store.list()).resolves.toHaveLength(1);
- });
-
- it('redacts credentials before persistence', async () => {
- const storage = new RecordingStorage();
- const store = new PersistentTaskStore(storage, ['provider-secret-value']);
- await store.save(record('az_1', 'token=provider-secret-value'));
- expect(JSON.stringify(storage.values.get('tasks:az_1'))).not.toContain('provider-secret-value');
- await expect(store.get('az_1')).resolves.toMatchObject({
- approval: { comment: 'token=[redacted]' },
- });
- });
-
- it('keeps in-memory records isolated from caller mutation', async () => {
- const store = new MemoryTaskStore();
- const task = record('az_1');
- await store.save(task);
- task.status = 'failed';
- await expect(store.get('az_1')).resolves.toMatchObject({ status: 'queued' });
- });
-});
-
-describe('TaskScheduler', () => {
- it('enforces global and repository concurrency while draining FIFO work', async () => {
- const scheduler = new TaskScheduler({
- maxConcurrent: 2,
- maxQueued: 3,
- maxConcurrentPerRepository: 1,
- });
- const releases: Array<() => void> = [];
- const work = (value: number) =>
- scheduler.schedule(
- 'acme/app',
- () => new Promise((resolve) => releases.push(() => resolve(value))),
- );
- const first = work(1);
- const second = work(2);
- expect(scheduler.snapshot()).toEqual({ active: 1, queued: 1, capacity: 2 });
- releases.shift()?.();
- await expect(first).resolves.toBe(1);
- await Promise.resolve();
- expect(scheduler.snapshot()).toMatchObject({ active: 1, queued: 0 });
- releases.shift()?.();
- await expect(second).resolves.toBe(2);
- });
-
- it('rejects work after the bounded queue is full', () => {
- const scheduler = new TaskScheduler({
- maxConcurrent: 1,
- maxQueued: 1,
- maxConcurrentPerRepository: 1,
- });
- void scheduler.schedule('one', () => new Promise(() => undefined));
- void scheduler.schedule('two', () => new Promise(() => undefined));
- expect(() => scheduler.schedule('three', async () => 3)).toThrow(TaskQueueQuotaError);
- });
-});
diff --git a/apps/server/src/control-plane.ts b/apps/server/src/control-plane.ts
deleted file mode 100644
index 4106067..0000000
--- a/apps/server/src/control-plane.ts
+++ /dev/null
@@ -1,202 +0,0 @@
-import {
- redactSecrets,
- secretValuesFromEnvironment,
- type EvidenceBundle,
-} from '@agent-zero/shared';
-
-import type { DashboardTask } from '../shared/dashboard.js';
-
-export type {
- ApprovalDecision,
- ControlPlaneTaskStatus,
- TaskApproval,
-} from '../shared/dashboard.js';
-
-/** Durable, deliberately narrow task history. Review input and checkout paths are never stored. */
-export interface StoredTask extends DashboardTask {
- evidence?: EvidenceBundle;
-}
-
-export interface TaskStore {
- get(id: string): Promise;
- list(): Promise;
- save(task: StoredTask): Promise;
- clear?(): Promise;
-}
-
-/** Minimal surface shared by Nitro storage, Redis/KV drivers, and deterministic test stores. */
-export interface KeyValueStorage {
- getItem(key: string): Promise;
- setItem(key: string, value: unknown): Promise;
- getKeys(base?: string): Promise;
- removeItem?(key: string): Promise;
-}
-
-const TASK_PREFIX = 'tasks:';
-
-/** Persists redacted records through Nitro's provider-neutral storage layer. */
-export class PersistentTaskStore implements TaskStore {
- constructor(
- private readonly storage: KeyValueStorage,
- private readonly secrets: readonly string[] = secretValuesFromEnvironment(),
- ) {}
-
- async get(id: string): Promise {
- const value = await this.storage.getItem(`${TASK_PREFIX}${id}`);
- return isStoredTask(value) ? value : undefined;
- }
-
- async list(): Promise {
- const keys = await this.storage.getKeys(TASK_PREFIX);
- const records = await Promise.all(keys.map((key) => this.storage.getItem(key)));
- return records
- .filter(isStoredTask)
- .toSorted((left, right) => right.createdAt.localeCompare(left.createdAt));
- }
-
- async save(task: StoredTask): Promise {
- await this.storage.setItem(`${TASK_PREFIX}${task.id}`, sanitizeTask(task, this.secrets));
- }
-}
-
-/** In-memory adapter used by embedded callers and tests; production Nitro routes use storage. */
-export class MemoryTaskStore implements TaskStore {
- readonly records = new Map();
-
- async get(id: string): Promise {
- const value = this.records.get(id);
- return value ? structuredClone(value) : undefined;
- }
-
- async list(): Promise {
- return Array.from(this.records.values(), (task) => structuredClone(task)).toSorted(
- (left, right) => right.createdAt.localeCompare(left.createdAt),
- );
- }
-
- async save(task: StoredTask): Promise {
- this.records.set(task.id, sanitizeTask(task, secretValuesFromEnvironment()));
- }
-
- async clear(): Promise {
- this.records.clear();
- }
-}
-
-export interface SchedulerOptions {
- maxConcurrent: number;
- maxQueued: number;
- maxConcurrentPerRepository: number;
-}
-
-export interface SchedulerSnapshot {
- active: number;
- queued: number;
- capacity: number;
-}
-
-export class TaskQueueQuotaError extends Error {
- constructor(message: string) {
- super(message);
- this.name = 'TaskQueueQuotaError';
- }
-}
-
-interface QueuedJob {
- repository: string;
- start: () => Promise;
-}
-
-/** Bounded FIFO scheduler with a separate per-repository fairness quota. */
-export class TaskScheduler {
- private active = 0;
- private readonly activeByRepository = new Map();
- private readonly queue: QueuedJob[] = [];
-
- constructor(private readonly options: SchedulerOptions) {
- assertPositiveInteger(options.maxConcurrent, 'maxConcurrent');
- assertPositiveInteger(options.maxQueued, 'maxQueued');
- assertPositiveInteger(options.maxConcurrentPerRepository, 'maxConcurrentPerRepository');
- }
-
- schedule(repository: string, run: () => Promise): Promise {
- if (this.queue.length >= this.options.maxQueued && this.active >= this.options.maxConcurrent)
- throw new TaskQueueQuotaError('Task queue capacity is exhausted');
- return new Promise((resolve, reject) => {
- this.queue.push({
- repository,
- start: async () => {
- try {
- resolve(await run());
- } catch (error) {
- reject(error);
- }
- },
- });
- this.drain();
- });
- }
-
- snapshot(): SchedulerSnapshot {
- return {
- active: this.active,
- queued: this.queue.length,
- capacity: this.options.maxConcurrent,
- };
- }
-
- private drain(): void {
- while (this.active < this.options.maxConcurrent) {
- const index = this.queue.findIndex(
- (job) =>
- (this.activeByRepository.get(job.repository) ?? 0) <
- this.options.maxConcurrentPerRepository,
- );
- if (index < 0) return;
- const [job] = this.queue.splice(index, 1);
- if (!job) return;
- this.active += 1;
- this.activeByRepository.set(
- job.repository,
- (this.activeByRepository.get(job.repository) ?? 0) + 1,
- );
- void job.start().finally(() => {
- this.active -= 1;
- const repositoryActive = (this.activeByRepository.get(job.repository) ?? 1) - 1;
- if (repositoryActive === 0) this.activeByRepository.delete(job.repository);
- else this.activeByRepository.set(job.repository, repositoryActive);
- this.drain();
- });
- }
- }
-}
-
-function sanitizeTask(task: StoredTask, secrets: readonly string[]): StoredTask {
- const serialized = JSON.stringify(task, (_key, value: unknown) =>
- typeof value === 'string' ? redactSecrets(value, secrets) : value,
- );
- const value: unknown = JSON.parse(serialized);
- if (!isStoredTask(value)) throw new Error('Refusing to persist an invalid task record');
- return value;
-}
-
-function isStoredTask(value: unknown): value is StoredTask {
- if (!isRecord(value)) return false;
- const task = value;
- return (
- typeof task.id === 'string' &&
- typeof task.repository === 'string' &&
- typeof task.status === 'string' &&
- typeof task.createdAt === 'string' &&
- typeof task.updatedAt === 'string' &&
- Array.isArray(task.events)
- );
-}
-
-function isRecord(value: unknown): value is Record {
- return typeof value === 'object' && value !== null && !Array.isArray(value);
-}
-
-function assertPositiveInteger(value: number, name: string): void {
- if (!Number.isInteger(value) || value < 1) throw new Error(`${name} must be a positive integer`);
-}
diff --git a/apps/server/src/dashboard.ts b/apps/server/src/dashboard.ts
deleted file mode 100644
index d3e5484..0000000
--- a/apps/server/src/dashboard.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import type { DashboardOverview } from '../shared/dashboard.js';
-import type { StoredTask } from './control-plane.js';
-
-export type { DashboardOverview } from '../shared/dashboard.js';
-
-export function dashboardOverview(tasks: StoredTask[]): DashboardOverview {
- return {
- tasks,
- active: tasks.filter((task) => task.status === 'running').length,
- queued: tasks.filter((task) => task.status === 'queued').length,
- awaitingApproval: tasks.filter(
- (task) => task.status === 'needs-human' && task.approval === undefined,
- ).length,
- totalTokens: tasks.reduce((total, task) => total + (task.result?.usage.totalTokens ?? 0), 0),
- costUsd: tasks.reduce((total, task) => total + (task.result?.usage.costUsd ?? 0), 0),
- };
-}
diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts
deleted file mode 100644
index 64f0e74..0000000
--- a/apps/server/src/index.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-export {
- createTask,
- decideApproval,
- getTask,
- getTaskEvidence,
- getStoredTask,
- githubTokenFromEnvironment,
- health,
- ingestWebhook,
- listTasks,
- publishEvidence,
- runTask,
- taskInput,
- tasks,
- type PublishOptions,
- type WebhookOptions,
- type WebhookOutcome,
- type WebhookRequest,
-} from './router.js';
-export {
- MemoryTaskStore,
- PersistentTaskStore,
- TaskQueueQuotaError,
- TaskScheduler,
- type ApprovalDecision,
- type ControlPlaneTaskStatus,
- type KeyValueStorage,
- type SchedulerOptions,
- type SchedulerSnapshot,
- type StoredTask,
- type TaskApproval,
- type TaskStore,
-} from './control-plane.js';
-export { rpcRouter, type RpcContext, type RpcRouter } from './rpc.js';
diff --git a/apps/server/src/router.test.ts b/apps/server/src/router.test.ts
deleted file mode 100644
index 9b775d3..0000000
--- a/apps/server/src/router.test.ts
+++ /dev/null
@@ -1,314 +0,0 @@
-import { createHmac } from 'node:crypto';
-import { mkdtemp, writeFile } from 'node:fs/promises';
-import { tmpdir } from 'node:os';
-import { join } from 'node:path';
-
-import { beforeEach, describe, expect, it } from 'vitest';
-
-import {
- decideApproval,
- getStoredTask,
- getTask,
- getTaskEvidence,
- health,
- ingestWebhook,
- listTasks,
- publishEvidence,
- runTask,
- taskInput,
- tasks,
-} from './router.js';
-
-const secret = 'webhook-secret-value';
-const MODE_ERROR = /mode/i;
-
-function sign(body: string): string {
- return `sha256=${createHmac('sha256', secret).update(body).digest('hex')}`;
-}
-
-function reviewPayload(overrides: Record = {}): string {
- return JSON.stringify({
- action: 'submitted',
- repository: { name: 'app', owner: { login: 'acme' } },
- pull_request: {
- number: 7,
- base: { sha: 'b'.repeat(40) },
- head: { sha: 'a'.repeat(40) },
- },
- review: {
- id: 1,
- body: 'load() can return null',
- state: 'changes_requested',
- user: { login: 'alice', type: 'User' },
- ...overrides,
- },
- });
-}
-
-let checkout: string;
-
-beforeEach(async () => {
- tasks.clear();
- checkout = await mkdtemp(join(tmpdir(), 'agent-zero-server-'));
- await writeFile(join(checkout, 'package.json'), JSON.stringify({ scripts: {} }), 'utf8');
-});
-
-describe('server task API', () => {
- it('exposes health metadata for Nitro handlers', () => {
- expect(health()).toMatchObject({ status: 'ok', service: 'agent-zero' });
- });
-
- it('starts with an empty task collection', async () => {
- await expect(listTasks()).resolves.toEqual({ tasks: [] });
- });
-
- it('keeps task input validation independent from HTTP transport', () => {
- expect(
- taskInput.parse({ repository: '.', feedback: 'Check error handling', mode: 'observe' }),
- ).toMatchObject({ repository: '.', mode: 'observe' });
- });
-
- it('rejects an unknown mode at the transport edge', () => {
- expect(() => taskInput.parse({ repository: '.', feedback: 'x', mode: 'yolo' })).toThrow(
- MODE_ERROR,
- );
- });
-
- it('records a human approval only for a task awaiting review', async () => {
- const timestamp = new Date(0).toISOString();
- tasks.set('az_approval', {
- id: 'az_approval',
- repository: 'acme/app',
- status: 'needs-human',
- createdAt: timestamp,
- updatedAt: timestamp,
- events: [],
- });
-
- await expect(
- decideApproval('az_approval', 'approved', 'release-manager', 'Reviewed evidence'),
- ).resolves.toMatchObject({
- status: 'needs-human',
- approval: {
- decision: 'approved',
- actor: 'release-manager',
- comment: 'Reviewed evidence',
- },
- });
- await expect(getStoredTask('az_approval')).resolves.toMatchObject({
- approval: { decision: 'approved' },
- });
- });
-});
-
-describe('runTask', () => {
- it('stores the result and its evidence together', async () => {
- const result = await runTask({
- repository: checkout,
- feedback: 'load() is wrong',
- mode: 'observe',
- });
- await expect(getTask(result.id)).resolves.toEqual(result);
- await expect(getTaskEvidence(result.id)).resolves.toContain('## Agent Zero');
- await expect(listTasks()).resolves.toMatchObject({ tasks: [expect.any(Object)] });
- });
-
- it('produces a read-only boundary for an observe run', async () => {
- const result = await runTask({
- repository: checkout,
- feedback: 'load() is wrong',
- mode: 'observe',
- });
- expect(result.runner.writable).toBe(false);
- expect(result.changedFiles).toEqual([]);
- });
-
- it('keeps the boundary read-only in fix mode while policy disables autofix', async () => {
- const result = await runTask({
- repository: checkout,
- feedback: 'load() is wrong',
- mode: 'fix',
- });
- expect(result.runner.writable).toBe(false);
- });
-
- it('reports an unverified conclusion when no model is configured', async () => {
- const result = await runTask({
- repository: checkout,
- feedback: 'load() is wrong',
- mode: 'observe',
- });
- expect(result.verified).toBe(false);
- expect(result.verdict).toBe('rejected');
- });
-});
-
-describe('ingestWebhook', () => {
- const options = () => ({ secret, checkoutPath: checkout });
-
- it('rejects a forged signature before parsing the payload', async () => {
- const body = reviewPayload();
- await expect(
- ingestWebhook(
- { event: 'pull_request_review', body, signature: 'sha256=deadbeef' },
- options(),
- ),
- ).resolves.toEqual({ status: 'rejected', reason: 'Invalid webhook signature' });
- expect(tasks.size).toBe(0);
- });
-
- it('rejects a body that is not JSON', async () => {
- const body = 'not json';
- const outcome = await ingestWebhook(
- { event: 'pull_request_review', body, signature: sign(body) },
- options(),
- );
- expect(outcome).toEqual({ status: 'rejected', reason: 'Webhook body is not valid JSON' });
- });
-
- it('ignores an event that carries no claim to validate', async () => {
- const body = reviewPayload({ state: 'approved' });
- const outcome = await ingestWebhook(
- { event: 'pull_request_review', body, signature: sign(body) },
- options(),
- );
- expect(outcome.status).toBe('ignored');
- expect(tasks.size).toBe(0);
- });
-
- it('ignores its own account so a run cannot answer itself', async () => {
- const body = reviewPayload({ user: { login: 'agent-zero[bot]' } });
- const outcome = await ingestWebhook(
- { event: 'pull_request_review', body, signature: sign(body) },
- { ...options(), ignoreAuthors: ['agent-zero[bot]'] },
- );
- expect(outcome.status).toBe('ignored');
- });
-
- it('runs an authenticated review in observe mode and never writes', async () => {
- const body = reviewPayload();
- const outcome = await ingestWebhook(
- { event: 'pull_request_review', body, signature: sign(body) },
- options(),
- );
- expect(outcome.status).toBe('accepted');
- if (outcome.status !== 'accepted') return;
- expect(outcome.pullRequest).toEqual({
- owner: 'acme',
- repo: 'app',
- number: 7,
- baseSha: 'b'.repeat(40),
- headSha: 'a'.repeat(40),
- });
- expect(outcome.result.runner.writable).toBe(false);
- expect(outcome.result.changedFiles).toEqual([]);
- expect(outcome.result.summary).toContain('github:acme/app#7');
- });
-
- it('ignores proactive pull-request events until repository policy enables them', async () => {
- const body = JSON.stringify({
- action: 'synchronize',
- repository: { name: 'app', owner: { login: 'acme' } },
- pull_request: {
- number: 7,
- base: { sha: 'b'.repeat(40) },
- head: { sha: 'a'.repeat(40) },
- },
- });
- await expect(
- ingestWebhook({ event: 'pull_request', body, signature: sign(body) }, options()),
- ).resolves.toEqual({
- status: 'ignored',
- reason: 'Proactive review is disabled by repository policy',
- });
- });
-
- it('runs an enabled proactive pull-request review in repository mode', async () => {
- await writeFile(
- join(checkout, '.agent-zero.yml'),
- 'version: 1\nproactive:\n enabled: true\nmode: observe\n',
- 'utf8',
- );
- const body = JSON.stringify({
- action: 'opened',
- repository: { name: 'app', owner: { login: 'acme' } },
- pull_request: {
- number: 7,
- base: { sha: 'b'.repeat(40) },
- head: { sha: 'a'.repeat(40) },
- },
- });
- const outcome = await ingestWebhook(
- { event: 'pull_request', body, signature: sign(body) },
- options(),
- );
- expect(outcome.status).toBe('accepted');
- if (outcome.status !== 'accepted') return;
- expect(outcome.result.runner.writable).toBe(false);
- await expect(getTaskEvidence(outcome.result.id)).resolves.toContain('proactive finding');
- });
-});
-
-type FetchArguments = Parameters;
-
-function readBody(body: NonNullable['body']): Record {
- if (typeof body !== 'string') return {};
- const parsed: unknown = JSON.parse(body);
- return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
- ? { ...parsed }
- : {};
-}
-
-/** Records what would have been sent to GitHub, so no test needs the network. */
-function recordingFetch(): {
- fetch: typeof globalThis.fetch;
- bodies: Record[];
-} {
- const bodies: Record[] = [];
- const fetch: typeof globalThis.fetch = async (_url, init) => {
- bodies.push(readBody(init?.body));
- return new Response(JSON.stringify({ id: 99 }), {
- status: 201,
- headers: { 'content-type': 'application/json' },
- });
- };
- return { fetch, bodies };
-}
-
-describe('publishEvidence', () => {
- const target = {
- owner: 'acme',
- repo: 'app',
- number: 7,
- baseSha: 'b'.repeat(40),
- headSha: 'a'.repeat(40),
- };
-
- it('skips publishing rather than faking a check without a token', async () => {
- const result = await runTask({ repository: checkout, feedback: 'x', mode: 'observe' });
- const { fetch, bodies } = recordingFetch();
- await expect(publishEvidence(target, result.id, { token: undefined, fetch })).resolves.toEqual({
- published: false,
- reason: 'GITHUB_TOKEN is not configured',
- });
- expect(bodies).toEqual([]);
- });
-
- it('reports an unknown task instead of publishing an empty report', async () => {
- const { fetch, bodies } = recordingFetch();
- await expect(
- publishEvidence(target, 'az_missing', { token: 'ghs_token_value', fetch }),
- ).resolves.toMatchObject({ published: false });
- expect(bodies).toEqual([]);
- });
-
- it('publishes the stored evidence without claiming an unverified run passed', async () => {
- const result = await runTask({ repository: checkout, feedback: 'x', mode: 'observe' });
- const { fetch, bodies } = recordingFetch();
- await expect(
- publishEvidence(target, result.id, { token: 'ghs_token_value', fetch }),
- ).resolves.toEqual({ published: true });
- expect(bodies[0]).toMatchObject({ head_sha: target.headSha, status: 'completed' });
- expect(bodies[0]?.conclusion).not.toBe('success');
- });
-});
diff --git a/apps/server/src/router.ts b/apps/server/src/router.ts
deleted file mode 100644
index c5a9c07..0000000
--- a/apps/server/src/router.ts
+++ /dev/null
@@ -1,315 +0,0 @@
-import { AgentZero } from '@agent-zero/agent';
-import { loadConfig, mayModifyRepository } from '@agent-zero/config';
-import {
- GitHubChecks,
- parseReviewEvent,
- reviewInputFromEvent,
- verifyWebhook,
-} from '@agent-zero/github';
-import { modelFromEnvironment } from '@agent-zero/models';
-import { createRunner, runnerOptionsFromPolicy, type RunnerPool } from '@agent-zero/runner';
-import {
- evidenceFromResult,
- now,
- redactSecrets,
- renderEvidenceMarkdown,
- secretValuesFromEnvironment,
- taskId,
- type PullRequestRef,
- type ReviewInput,
- type TaskResult,
-} from '@agent-zero/shared';
-import { z } from 'zod';
-
-import {
- MemoryTaskStore,
- TaskScheduler,
- type ApprovalDecision,
- type StoredTask,
- type TaskStore,
-} from './control-plane.js';
-
-const TRAILING_SLASH = /\/$/u;
-
-const defaultStore = new MemoryTaskStore();
-const defaultScheduler = new TaskScheduler({
- maxConcurrent: 4,
- maxQueued: 100,
- maxConcurrentPerRepository: 1,
-});
-
-/** Backwards-compatible inspection hook for embedded callers and tests. */
-export const tasks = defaultStore.records;
-
-export const taskInput = z
- .object({
- repository: z.string().min(1),
- feedback: z.string().min(1).optional(),
- trigger: z.enum(['feedback', 'proactive']).default('feedback'),
- mode: z.enum(['observe', 'suggest', 'fix', 'autonomous']),
- source: z.string().optional(),
- files: z.array(z.string()).optional(),
- })
- .superRefine((input, context) => {
- if (input.trigger !== 'proactive' && input.feedback === undefined)
- context.addIssue({ code: 'custom', path: ['feedback'], message: 'Feedback is required' });
- });
-
-export const approvalInput = z.object({
- taskId: z.string().min(1),
- decision: z.enum(['approved', 'rejected']),
- actor: z.string().min(1).max(100),
- comment: z.string().max(2_000).optional(),
-});
-
-export function health() {
- return { status: 'ok' as const, service: 'agent-zero', version: '0.3.0' };
-}
-
-export async function listTasks(store: TaskStore = defaultStore) {
- return { tasks: await store.list() };
-}
-
-export async function getStoredTask(
- id: string,
- store: TaskStore = defaultStore,
-): Promise {
- return store.get(id);
-}
-
-export async function getTask(
- id: string,
- store: TaskStore = defaultStore,
-): Promise {
- return (await store.get(id))?.result;
-}
-
-/** The rendered evidence report for a finished run. */
-export async function getTaskEvidence(
- id: string,
- store: TaskStore = defaultStore,
-): Promise {
- const task = await store.get(id);
- return task?.evidence ? renderEvidenceMarkdown(task.evidence) : undefined;
-}
-
-export async function createTask(
- input: z.infer,
- store: TaskStore = defaultStore,
- scheduler: TaskScheduler = defaultScheduler,
-): Promise {
- return runTask(
- {
- repository: input.repository,
- mode: input.mode,
- trigger: input.trigger,
- ...(input.feedback ? { feedback: input.feedback } : {}),
- ...(input.source ? { source: input.source } : {}),
- ...(input.files ? { files: input.files } : {}),
- },
- { store, scheduler },
- );
-}
-
-export interface RunTaskOptions {
- store?: TaskStore;
- scheduler?: TaskScheduler;
- /** Optional hosted execution pool; its leases still expose only the Runner boundary. */
- runnerPool?: RunnerPool;
-}
-
-/**
- * Queue and run one unit of work, persisting its structured lifecycle and evidence.
- *
- * This composition root resolves policy and constructs the only execution boundary. Neither the
- * transport, persistence adapter, scheduler, nor dashboard can execute repository commands.
- */
-export async function runTask(
- input: ReviewInput,
- options: RunTaskOptions = {},
-): Promise {
- const store = options.store ?? defaultStore;
- const scheduler = options.scheduler ?? defaultScheduler;
- const identifier = taskId();
- const timestamp = now();
- const record: StoredTask = {
- id: identifier,
- repository: repositoryLabel(input),
- status: 'queued',
- createdAt: timestamp,
- updatedAt: timestamp,
- events: [],
- };
- await store.save(record);
-
- try {
- return await scheduler.schedule(input.repository, async () => {
- record.status = 'running';
- record.updatedAt = now();
- await store.save(record);
-
- const config = await loadConfig(input.repository);
- let eventWrites = Promise.resolve();
- const writable = mayModifyRepository(config, input.mode);
- const lease = options.runnerPool
- ? await options.runnerPool.acquire({
- taskId: identifier,
- repository: input.repository,
- mode: input.mode,
- writable,
- network: config.permissions.network,
- leaseMs: config.agent.timeoutMs,
- })
- : undefined;
- const runner =
- lease?.runner ?? createRunner(input.repository, runnerOptionsFromPolicy(config, writable));
- const agent = new AgentZero({
- model: modelFromEnvironment(config.model),
- runner,
- config,
- taskIdentifier: identifier,
- onEvent: (event) => {
- record.events.push(event);
- record.updatedAt = event.timestamp;
- eventWrites = eventWrites.then(() => store.save(record));
- },
- });
- let result: TaskResult;
- try {
- result = await agent.run(input);
- } finally {
- if (lease) await options.runnerPool?.release(lease.id);
- }
- await eventWrites;
- record.status = result.state;
- record.updatedAt = now();
- record.result = result;
- record.evidence = evidenceFromResult(result, input);
- await store.save(record);
- return result;
- });
- } catch (error) {
- record.status = 'failed';
- record.updatedAt = now();
- record.events.push({
- state: 'failed',
- message: redactSecrets(error instanceof Error ? error.message : String(error)),
- timestamp: record.updatedAt,
- });
- await store.save(record);
- throw error;
- }
-}
-
-export async function decideApproval(
- taskIdentifier: string,
- decision: ApprovalDecision,
- actor: string,
- comment: string | undefined,
- store: TaskStore = defaultStore,
-): Promise {
- const record = await store.get(taskIdentifier);
- if (!record) throw new Error(`Unknown task: ${taskIdentifier}`);
- if (record.status !== 'needs-human')
- throw new Error('Only tasks awaiting human review can receive an approval decision');
- const timestamp = now();
- record.approval = {
- decision,
- actor: redactSecrets(actor, secretValuesFromEnvironment()),
- comment: comment ? redactSecrets(comment, secretValuesFromEnvironment()) : null,
- decidedAt: timestamp,
- };
- record.updatedAt = timestamp;
- await store.save(record);
- return record;
-}
-
-export interface WebhookRequest {
- event: string;
- body: string;
- signature: string | undefined;
-}
-
-export interface WebhookOptions {
- secret: string;
- checkoutPath: string;
- ignoreAuthors?: readonly string[];
- store?: TaskStore;
- scheduler?: TaskScheduler;
-}
-
-export type WebhookOutcome =
- | { status: 'rejected'; reason: string }
- | { status: 'ignored'; reason: string }
- | { status: 'accepted'; result: TaskResult; pullRequest: PullRequestRef };
-
-export async function ingestWebhook(
- request: WebhookRequest,
- options: WebhookOptions,
-): Promise {
- if (!verifyWebhook(request.body, request.signature, options.secret))
- return { status: 'rejected', reason: 'Invalid webhook signature' };
-
- let payload: unknown;
- try {
- payload = JSON.parse(request.body);
- } catch {
- return { status: 'rejected', reason: 'Webhook body is not valid JSON' };
- }
-
- const event = parseReviewEvent(
- request.event,
- payload,
- options.ignoreAuthors ? { ignoreAuthors: options.ignoreAuthors } : {},
- );
- if (!event) return { status: 'ignored', reason: 'No actionable review feedback in this event' };
-
- let mode: ReviewInput['mode'] = 'observe';
- if (event.trigger === 'proactive') {
- const config = await loadConfig(options.checkoutPath);
- if (!config.proactive.enabled)
- return { status: 'ignored', reason: 'Proactive review is disabled by repository policy' };
- mode = config.mode;
- }
-
- const runOptions: RunTaskOptions = {
- ...(options.store ? { store: options.store } : {}),
- ...(options.scheduler ? { scheduler: options.scheduler } : {}),
- };
- const result = await runTask(
- reviewInputFromEvent(event, { checkoutPath: options.checkoutPath, mode }),
- runOptions,
- );
- return { status: 'accepted', result, pullRequest: event.pullRequest };
-}
-
-export interface PublishOptions {
- token: string | undefined;
- fetch?: typeof globalThis.fetch;
- store?: TaskStore;
-}
-
-export function githubTokenFromEnvironment(): string | undefined {
- return process.env.GITHUB_TOKEN;
-}
-
-export async function publishEvidence(
- target: PullRequestRef,
- taskIdentifier: string,
- options: PublishOptions,
-): Promise<{ published: boolean; reason?: string }> {
- if (!options.token) return { published: false, reason: 'GITHUB_TOKEN is not configured' };
- const task = await (options.store ?? defaultStore).get(taskIdentifier);
- if (!task?.evidence) return { published: false, reason: `Unknown task: ${taskIdentifier}` };
- await new GitHubChecks({
- token: options.token,
- ...(options.fetch ? { fetch: options.fetch } : {}),
- }).publish(target, task.evidence);
- return { published: true };
-}
-
-function repositoryLabel(input: ReviewInput): string {
- if (input.pullRequest) return `${input.pullRequest.owner}/${input.pullRequest.repo}`;
- const normalized = input.repository.replaceAll('\\', '/').replace(TRAILING_SLASH, '');
- return redactSecrets(normalized.split('/').at(-1) || 'repository');
-}
diff --git a/apps/server/src/rpc.ts b/apps/server/src/rpc.ts
deleted file mode 100644
index 679de94..0000000
--- a/apps/server/src/rpc.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { os } from '@orpc/server';
-import { z } from 'zod';
-
-import type { TaskStore } from './control-plane.js';
-import {
- approvalInput,
- createTask,
- decideApproval,
- getStoredTask,
- health,
- listTasks,
- taskInput,
-} from './router.js';
-
-export interface RpcContext {
- store: TaskStore;
-}
-
-const procedure = os.$context();
-
-export const rpcRouter = {
- health: procedure.handler(() => health()),
- tasks: {
- list: procedure.handler(({ context }) => listTasks(context.store)),
- get: procedure
- .input(z.object({ id: z.string().min(1) }))
- .handler(({ input, context }) => getStoredTask(input.id, context.store)),
- create: procedure
- .input(taskInput)
- .handler(({ input, context }) => createTask(input, context.store)),
- },
- approvals: {
- decide: procedure
- .input(approvalInput)
- .handler(({ input, context }) =>
- decideApproval(input.taskId, input.decision, input.actor, input.comment, context.store),
- ),
- },
-};
-
-export type RpcRouter = typeof rpcRouter;
diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json
deleted file mode 100644
index 7aa810a..0000000
--- a/apps/server/tsconfig.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": { "rootDir": ".", "outDir": "dist" },
- "include": ["src/**/*.ts", "shared/**/*.ts"],
- "references": [
- { "path": "../../packages/agent" },
- { "path": "../../packages/config" },
- { "path": "../../packages/github" },
- { "path": "../../packages/models" },
- { "path": "../../packages/runner" },
- { "path": "../../packages/shared" }
- ]
-}
diff --git a/apps/server/tsdown.config.ts b/apps/server/tsdown.config.ts
deleted file mode 100644
index 42d4623..0000000
--- a/apps/server/tsdown.config.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from '../../scripts/tsdown.config.ts';
-
-export default defineAppConfig();
diff --git a/docs/architecture.md b/docs/architecture.md
index a8686b7..3cd3171 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -4,10 +4,12 @@ Agent Zero is organized as a dependency-directed monorepo. The core decides what
```text
GitHub adapter ─┐
-CLI adapter ────┼──> agent runtime ──> runner boundary ──> isolated checkout
-oRPC server ────┘ │
- ├──> model abstraction ──> provider
- └──> shared contracts
+CLI adapter ────┴──> agent runtime ──> runner boundary ──> isolated checkout
+ │
+ ├──> model abstraction ──> provider
+ └──> shared contracts
+
+Nuxt dashboard ───> frontend-only operational interface
```
## Dependency direction
@@ -15,13 +17,14 @@ oRPC server ────┘ │
- `shared` contains stable data contracts and must not import feature packages.
- `config`, `models`, `github`, and `runner` implement focused capabilities around shared contracts.
- `agent` composes policies and state transitions without knowing HTTP or terminal details.
-- `cli` and `apps/server` are entry-point adapters. They may depend on the runtime, but the runtime must not depend on them.
+- `cli` is an entry-point adapter. It may depend on the runtime, but the runtime must not depend on it.
+- `apps/dashboard` is a frontend-only Nuxt interface and does not import runtime packages.
If a change creates a reverse dependency, move the shared contract inward instead of importing an adapter into the runtime.
## Execution boundary
-Only `packages/runner` may execute commands or mutate a target repository at runtime. The boundary is responsible for validating working directories, arguments, timeouts, output limits, and execution mode. A server handler, GitHub adapter, model provider, or state transition must request runner work through typed contracts rather than invoking a shell directly.
+Only `packages/runner` may execute commands or mutate a target repository at runtime. The boundary is responsible for validating working directories, arguments, timeouts, output limits, and execution mode. A transport handler, GitHub adapter, model provider, or state transition must request runner work through typed contracts rather than invoking a shell directly.
`observe` is the default mode. It can inspect and report but cannot write. Enabling `fix` requires both an explicit mode and repository policy permission.
@@ -31,15 +34,13 @@ Git inspection runs in the trusting process because its argv is fixed by the run
`createRunner` and `runnerOptionsFromPolicy` are the only mapping from policy to a concrete boundary. `runnerOptionsFromPolicy` declares the policy fields it needs structurally, so the runner does not depend on the configuration package. Composition roots call both; nothing else constructs a runner.
-Hosted sandboxes follow the same rule. `RunnerPool` lives in `packages/runner`, accepts credential-free `SandboxRequest` values, enforces global/repository quotas and lease ceilings before provisioning, and returns only a `Runner`. Provider credentials are constructor state of a vendor adapter and never enter a request, lease snapshot, agent state, or log. The control plane may schedule and release a lease, but it cannot execute a command itself.
+Hosted sandboxes follow the same rule. `RunnerPool` lives in `packages/runner`, accepts credential-free `SandboxRequest` values, enforces global/repository quotas and lease ceilings before provisioning, and returns only a `Runner`. Provider credentials are constructor state of a vendor adapter and never enter a request, lease snapshot, agent state, or log. A composition root may schedule and release a lease, but it cannot execute a command itself.
Model transports follow the same adapter rule. `packages/models` owns the AI SDK integrations for OpenAI, Anthropic, Google, AI Gateway, and OpenAI-compatible endpoints behind one `ModelProvider` contract. Composition roots pass the validated provider policy; credentials come only from fixed provider-specific environment variables, and a custom endpoint can only come from the operator-owned `AGENT_ZERO_MODEL_BASE_URL` environment variable. The agent runtime sees neither SDK objects nor credentials, and all adapters share one structured-output, usage-accounting, timeout, and error-redaction path.
-## Control plane persistence
-
-`apps/server` is the Nitro composition root. Its oRPC procedures receive a `TaskStore` through request context; the production adapter writes to Nitro storage while tests use the same contract in memory. Durable records contain a repository label, structured lifecycle events, terminal evidence, aggregate usage, and approval decisions. They deliberately omit review input, checkout paths, credentials, and raw provider responses. A recursive string redaction pass runs before every write.
+## Dashboard boundary
-The bounded `TaskScheduler` separates admission from execution. It limits active tasks, queued tasks, and concurrency per repository, while the runner pool separately owns sandbox capacity and expiration. Persistence, HTTP handlers, and the dashboard have no shell or target-filesystem capability.
+`apps/dashboard` owns presentation only. It has no custom Nitro server routes, RPC contracts, persistence adapters, scheduler, runtime-package dependencies, shell capability, or target-filesystem capability. Any future live data source must be implemented as a separate adapter with an explicit contract rather than composed into the dashboard.
## State transitions
@@ -81,4 +82,4 @@ Validation lives in `packages/agent/src/validation.ts` and is independent of any
2. Add the capability to the narrowest package.
3. Keep external SDK types behind the relevant adapter.
4. Add deterministic unit tests, including failure and policy cases.
-5. Expose it through CLI or oRPC only after the runtime contract is stable.
+5. Expose it through the CLI or a dedicated transport adapter only after the runtime contract is stable.
diff --git a/package.json b/package.json
index 6f635fe..d8d05e0 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"skills:install": "skilld install --agent codex",
"skills:list": "skilld list",
"test": "turbo run test --concurrency=1",
+ "test:e2e": "turbo run test:e2e",
"test:watch": "vitest",
"typecheck": "turbo run typecheck",
"zero": "node --import tsx packages/cli/src/index.ts"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 53cc51e..58f23d5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -91,54 +91,33 @@ importers:
specifier: ^3.2.4
version: 3.2.7(@types/node@24.13.3)
- apps/server:
+ apps/dashboard:
dependencies:
- '@agent-zero/agent':
- specifier: workspace:*
- version: 0.3.0
- '@agent-zero/config':
- specifier: workspace:*
- version: 0.3.0
- '@agent-zero/github':
- specifier: workspace:*
- version: 0.3.0
- '@agent-zero/models':
- specifier: workspace:*
- version: 0.3.0
- '@agent-zero/runner':
- specifier: workspace:*
- version: 0.3.0
- '@agent-zero/shared':
- specifier: workspace:*
- version: 0.3.0
- '@orpc/server':
- specifier: 2.0.0-beta.26
- version: 2.0.0-beta.26(crossws@0.4.10(srvx@0.11.22))
'@types/node':
specifier: '>=18.12.0'
version: 24.13.3
'@unocss/webpack':
specifier: 66.7.5
version: 66.7.5(webpack@5.109.2)
- crossws:
- specifier: '>=0.3.4'
- version: 0.4.10(srvx@0.11.22)
- h3:
- specifier: ^1.15.11
- version: 1.15.11
- nitropack:
- specifier: ^2.13.4
- version: 2.13.4
nuxt:
specifier: ^4.5.2
version: 4.5.2(@types/node@24.13.3)(rolldown@1.2.3)
+ playwright-core:
+ specifier: ^1.43.1
+ version: 1.62.1
rolldown:
specifier: ~1.2.1
version: 1.2.3
- zod:
- specifier: ^4.1.5
- version: 4.4.3
devDependencies:
+ '@nuxt/test-utils':
+ specifier: 4.1.0
+ version: 4.1.0(@playwright/test@1.62.1)(playwright-core@1.62.1)
+ '@nuxtjs/color-mode':
+ specifier: 4.0.1
+ version: 4.0.1(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ '@playwright/test':
+ specifier: ^1.62.0
+ version: 1.62.1
'@unocss/nuxt':
specifier: ^66.7.5
version: 66.7.5(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
@@ -1537,6 +1516,11 @@ packages:
'@nuxt/devalue@2.0.2':
resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==}
+ '@nuxt/devtools-kit@2.7.0':
+ resolution: {integrity: sha512-MIJdah6CF6YOW2GhfKnb8Sivu6HpcQheqdjOlZqShBr+1DyjtKQbAKSCAyKPaoIzZP4QOo2SmTFV6aN8jBeEIQ==}
+ peerDependencies:
+ vite: '>=6.0'
+
'@nuxt/devtools-kit@3.4.1':
resolution: {integrity: sha512-6ltPm2yUW8GvDdf3VJna7+flLi+ej7xRfSr+S4ovevKt/CuPf9EqYOn1jW7Kw/U1MXt/71zkn+/O2vu3G6O9Hg==}
peerDependencies:
@@ -1595,6 +1579,45 @@ packages:
peerDependencies:
'@nuxt/kit': '>=3.0.0'
+ '@nuxt/test-utils@4.1.0':
+ resolution: {integrity: sha512-B0CipGKVVY5qbLMXJqYPYdalNzE9VFzybEAOqHGFHPDqv/8RFRe+/F3lJJigtLFroxaBDMMyrhLcmgKIXBv8og==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ peerDependencies:
+ '@cucumber/cucumber': '>=11.0.0'
+ '@jest/globals': '>=30.0.0'
+ '@playwright/test': ^1.43.1
+ '@testing-library/vue': ^8.0.1
+ '@vitest/ui': '*'
+ '@vue/test-utils': ^2.4.2
+ h3-next: '>=2.0.1-rc.22'
+ happy-dom: '>=20.0.11'
+ jsdom: '>=27.4.0'
+ playwright-core: ^1.43.1
+ vitest: ^4.0.2
+ peerDependenciesMeta:
+ '@cucumber/cucumber':
+ optional: true
+ '@jest/globals':
+ optional: true
+ '@playwright/test':
+ optional: true
+ '@testing-library/vue':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ '@vue/test-utils':
+ optional: true
+ h3-next:
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+ playwright-core:
+ optional: true
+ vitest:
+ optional: true
+
'@nuxt/vite-builder@4.5.2':
resolution: {integrity: sha512-fC8KUs5F1VpSEjTIjmx5pdflciMlp3FDCubx3AXElvRPLtBAPmyB69kmqVFjRnVQ8+vRHNyI7iBHUg9Se8srLA==}
engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0}
@@ -1615,6 +1638,9 @@ packages:
rollup-plugin-visualizer:
optional: true
+ '@nuxtjs/color-mode@4.0.1':
+ resolution: {integrity: sha512-eiA7hWXi5zNHaYKyJFCGF6i0wFZtuvR7KDXZ6jiSvwxjCpRFwphrw0MOSmNfArTSSsT1wpW+/2H92cejeVfUlg==}
+
'@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
@@ -1623,31 +1649,6 @@ packages:
resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==}
engines: {node: '>=14'}
- '@orpc/client@2.0.0-beta.26':
- resolution: {integrity: sha512-TT2+S4TP/EzU19mXqzqnd938tuaOss7prtXqlowY1MZh1wxsEW6t5b+RI310yHtgLM5u/ovku26BvOpl5Fb49Q==}
-
- '@orpc/contract@2.0.0-beta.26':
- resolution: {integrity: sha512-tTeJBN0s+weE67t6Xyjt7pCnSaytWrUase4VdyajjjtWba2wxqIwMHITyvSKohmLVwym6LYAoGLqXF4ORgwHYQ==}
-
- '@orpc/server@2.0.0-beta.26':
- resolution: {integrity: sha512-IBvwkJkCkPMxOLd2A2Js2baTXc4FE//W+wnXrMXkdNXarwjId9AJ+NJngxHitjepQKqc2fnqvWlMDvypS3WdQg==}
- peerDependencies:
- crossws: '>=0.3.4'
- fastify: '>=5.6.1'
- peerDependenciesMeta:
- crossws:
- optional: true
- fastify:
- optional: true
-
- '@orpc/shared@2.0.0-beta.26':
- resolution: {integrity: sha512-rbzPz6fSE+5WWn1uesSnekBIy4aJFx0ocGI3EcWVAu8l0ILLjdufof6A2E9RwvRSZeEefIE9D7iadW044YCBSw==}
- peerDependencies:
- '@opentelemetry/api': '>=1.9.0'
- peerDependenciesMeta:
- '@opentelemetry/api':
- optional: true
-
'@oxc-parser/binding-android-arm-eabi@0.131.0':
resolution: {integrity: sha512-t2xicr9pfzkSRYx5aPqZqlLaayIwJTqgQ81Jor31Xep2nGyL2Aq3d0K5wOfeR7VevaSdxaS9dzSQP9xDwn8fDg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -2394,6 +2395,11 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
+ '@playwright/test@1.62.1':
+ resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==}
+ engines: {node: '>=20'}
+ hasBin: true
+
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
@@ -2823,32 +2829,6 @@ packages:
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
- '@standardserver/aws-lambda@0.7.1':
- resolution: {integrity: sha512-fuwAx2M2O5Bnjk2JdFrtEQALmBwVtnn4jKApzFVmlIivWA7EGMj5kOzCNaJizxCQXlhPmC+doDHqf/H7FKMaNA==}
-
- '@standardserver/core@0.7.1':
- resolution: {integrity: sha512-ZMoFDR92p9HnaI6vXK1iNFKXyLK8/6r3D4EJUM+SqeyReUH3OEJO4CZKU8BfXyzAV1A6Nsa7y2dGqDOYqH5LlQ==}
-
- '@standardserver/fastify@0.7.1':
- resolution: {integrity: sha512-Oa+ttR0CyNkFjNczs2dO/WFFeZ4sAszVBKIOhKb1FFcDtD9VdqDgMBhbQ4sFR885fwpYckoYjFU6xXWWTueBlw==}
- peerDependencies:
- fastify: '>=5.6.1'
- peerDependenciesMeta:
- fastify:
- optional: true
-
- '@standardserver/fetch@0.7.1':
- resolution: {integrity: sha512-BeiAWESedv0woYpoBHCnq2Y3xLZZ3voFahdzpFd+HqLyenXIL4XX3z7/WgWNQnf+WsSQrK6HzBkDWCicCXVoKQ==}
-
- '@standardserver/node@0.7.1':
- resolution: {integrity: sha512-Ikc07cGBTJ8tJgPd1OanNKVNpijcbixB1iKk0GdL/b1vkYbriGgNW3oHvbApM7+XqeCeNHj5XawHk6q90mwEEA==}
-
- '@standardserver/peer@0.7.1':
- resolution: {integrity: sha512-ggqPbwz4X4GIziQgoyCTDHFw9nM9YuEvlSpO21pfoXLYF80ijtpN/iq4P0zKpb4kcXnBoSVDRUSnBJSZi0SJDg==}
-
- '@standardserver/shared@0.7.1':
- resolution: {integrity: sha512-tBDheI3Me1gQEKPU+XhcCZ6/njmkKgJhA5rhi1/m6GauGhHq87UuVslDNc8qB+T/xsxVch/qETFhssEWO9c6BA==}
-
'@tokenizer/inflate@0.4.1':
resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==}
engines: {node: '>=18'}
@@ -3788,10 +3768,6 @@ packages:
cookie-es@3.1.1:
resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==}
- cookie@2.0.1:
- resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==}
- engines: {node: '>=22'}
-
core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
@@ -4188,6 +4164,10 @@ packages:
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ fake-indexeddb@6.2.5:
+ resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==}
+ engines: {node: '>=18'}
+
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -4283,6 +4263,11 @@ packages:
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+ fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -5332,6 +5317,16 @@ packages:
platform@1.3.6:
resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
+ playwright-core@1.62.1:
+ resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==}
+ engines: {node: '>=20'}
+ hasBin: true
+
+ playwright@1.62.1:
+ resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==}
+ engines: {node: '>=20'}
+ hasBin: true
+
postcss-calc@10.1.1:
resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==}
engines: {node: ^18.12 || ^20.9 || >=22.0}
@@ -5557,10 +5552,6 @@ packages:
resolution: {integrity: sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA==}
engines: {node: '>=16.0.0'}
- radash@12.1.1:
- resolution: {integrity: sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==}
- engines: {node: '>=14.18.0'}
-
radix3@1.1.2:
resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
@@ -6697,6 +6688,9 @@ packages:
yaml:
optional: true
+ vitest-environment-nuxt@2.0.0:
+ resolution: {integrity: sha512-zEGFRiCAaRR3fHnqISHKMNTRvCzkQEI1XyFeqNgR2IBD0oYkfZ1rUHwi7C+h3Cns3KPykfB0av1B3MtLEbChDw==}
+
vitest@3.2.7:
resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -8122,6 +8116,14 @@ snapshots:
'@nuxt/devalue@2.0.2': {}
+ '@nuxt/devtools-kit@2.7.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))':
+ dependencies:
+ '@nuxt/kit': 3.21.11
+ execa: 8.0.1
+ vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0)
+ transitivePeerDependencies:
+ - magicast
+
'@nuxt/devtools-kit@3.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))':
dependencies:
'@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
@@ -8359,6 +8361,46 @@ snapshots:
rc9: 3.0.1
std-env: 4.2.0
+ '@nuxt/test-utils@4.1.0(@playwright/test@1.62.1)(playwright-core@1.62.1)':
+ dependencies:
+ '@clack/prompts': 1.7.0
+ '@nuxt/devtools-kit': 2.7.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))
+ '@nuxt/kit': 3.21.11
+ '@playwright/test': 1.62.1
+ c12: 3.3.4
+ consola: 3.4.2
+ defu: 6.1.7
+ destr: 2.0.5
+ estree-walker: 3.0.3
+ exsolve: 1.1.1
+ fake-indexeddb: 6.2.5
+ get-port-please: 3.2.0
+ h3: 1.15.11
+ local-pkg: 1.2.1
+ magic-string: 1.1.0
+ node-fetch-native: 1.6.7
+ node-mock-http: 1.0.5
+ nypm: 0.6.9
+ ofetch: 1.5.1
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ playwright-core: 1.62.1
+ radix3: 1.1.2
+ scule: 1.3.0
+ std-env: 4.2.0
+ tinyexec: 1.3.0
+ ufo: 1.6.4
+ unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2)
+ vitest-environment-nuxt: 2.0.0(@playwright/test@1.62.1)(playwright-core@1.62.1)
+ vue: 3.5.41
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - magicast
+ - typescript
+ - unloader
+
'@nuxt/vite-builder@4.5.2(nuxt@4.5.2(@types/node@24.13.3)(rolldown@1.2.3))(rolldown@1.2.3)(vue@3.5.41)':
dependencies:
'@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
@@ -8412,49 +8454,20 @@ snapshots:
- typescript
- yaml
- '@opentelemetry/api@1.9.0': {}
-
- '@opentelemetry/semantic-conventions@1.43.0': {}
-
- '@orpc/client@2.0.0-beta.26':
+ '@nuxtjs/color-mode@4.0.1(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))':
dependencies:
- '@orpc/shared': 2.0.0-beta.26
- '@standardserver/core': 0.7.1
- '@standardserver/fetch': 0.7.1
- '@standardserver/peer': 0.7.1
+ '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(tsx@4.23.11)(yaml@2.9.0))(webpack@5.109.2))
+ exsolve: 1.1.1
+ pathe: 2.0.3
+ pkg-types: 2.3.1
+ semver: 7.8.5
transitivePeerDependencies:
- - '@opentelemetry/api'
+ - magicast
+ - oxc-parser
- '@orpc/contract@2.0.0-beta.26':
- dependencies:
- '@orpc/client': 2.0.0-beta.26
- '@orpc/shared': 2.0.0-beta.26
- '@standard-schema/spec': 1.1.0
- transitivePeerDependencies:
- - '@opentelemetry/api'
-
- '@orpc/server@2.0.0-beta.26(crossws@0.4.10(srvx@0.11.22))':
- dependencies:
- '@orpc/client': 2.0.0-beta.26
- '@orpc/contract': 2.0.0-beta.26
- '@orpc/shared': 2.0.0-beta.26
- '@standardserver/aws-lambda': 0.7.1
- '@standardserver/core': 0.7.1
- '@standardserver/fastify': 0.7.1
- '@standardserver/fetch': 0.7.1
- '@standardserver/node': 0.7.1
- '@standardserver/peer': 0.7.1
- cookie: 2.0.1
- crossws: 0.4.10(srvx@0.11.22)
- transitivePeerDependencies:
- - '@opentelemetry/api'
- - fastify
+ '@opentelemetry/api@1.9.0': {}
- '@orpc/shared@2.0.0-beta.26':
- dependencies:
- '@standardserver/shared': 0.7.1
- radash: 12.1.1
- type-fest: 5.8.0
+ '@opentelemetry/semantic-conventions@1.43.0': {}
'@oxc-parser/binding-android-arm-eabi@0.131.0':
optional: true
@@ -8850,6 +8863,10 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
+ '@playwright/test@1.62.1':
+ dependencies:
+ playwright: 1.62.1
+
'@polka/url@1.0.0-next.29': {}
'@poppinss/colors@4.1.6':
@@ -9160,40 +9177,6 @@ snapshots:
'@standard-schema/spec@1.1.0': {}
- '@standardserver/aws-lambda@0.7.1':
- dependencies:
- '@standardserver/core': 0.7.1
- '@standardserver/fetch': 0.7.1
- '@standardserver/node': 0.7.1
- '@standardserver/shared': 0.7.1
-
- '@standardserver/core@0.7.1':
- dependencies:
- '@standardserver/shared': 0.7.1
-
- '@standardserver/fastify@0.7.1':
- dependencies:
- '@standardserver/core': 0.7.1
- '@standardserver/node': 0.7.1
-
- '@standardserver/fetch@0.7.1':
- dependencies:
- '@standardserver/core': 0.7.1
- '@standardserver/shared': 0.7.1
-
- '@standardserver/node@0.7.1':
- dependencies:
- '@standardserver/core': 0.7.1
- '@standardserver/fetch': 0.7.1
- '@standardserver/shared': 0.7.1
-
- '@standardserver/peer@0.7.1':
- dependencies:
- '@standardserver/core': 0.7.1
- '@standardserver/shared': 0.7.1
-
- '@standardserver/shared@0.7.1': {}
-
'@tokenizer/inflate@0.4.1':
dependencies:
debug: 4.4.3
@@ -10251,8 +10234,6 @@ snapshots:
cookie-es@3.1.1: {}
- cookie@2.0.1: {}
-
core-util-is@1.0.3: {}
cosmiconfig-typescript-loader@6.3.0(@types/node@24.13.3)(cosmiconfig@9.0.2)(typescript@6.0.3-bridge.12.tsgo.7.0.2):
@@ -10605,6 +10586,8 @@ snapshots:
extend@3.0.2: {}
+ fake-indexeddb@6.2.5: {}
+
fast-deep-equal@3.1.3: {}
fast-fifo@1.3.2: {}
@@ -10705,6 +10688,9 @@ snapshots:
fs-constants@1.0.0:
optional: true
+ fsevents@2.3.2:
+ optional: true
+
fsevents@2.3.3:
optional: true
@@ -12018,6 +12004,14 @@ snapshots:
platform@1.3.6: {}
+ playwright-core@1.62.1: {}
+
+ playwright@1.62.1:
+ dependencies:
+ playwright-core: 1.62.1
+ optionalDependencies:
+ fsevents: 2.3.2
+
postcss-calc@10.1.1(postcss@8.5.26):
dependencies:
postcss: 8.5.26
@@ -12257,8 +12251,6 @@ snapshots:
'@jitl/quickjs-wasmfile-release-sync': 0.32.0
quickjs-emscripten-core: 0.32.0
- radash@12.1.1: {}
-
radix3@1.1.2: {}
range-parser@1.3.0: {}
@@ -13328,6 +13320,26 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
+ vitest-environment-nuxt@2.0.0(@playwright/test@1.62.1)(playwright-core@1.62.1):
+ dependencies:
+ '@nuxt/test-utils': 4.1.0(@playwright/test@1.62.1)(playwright-core@1.62.1)
+ transitivePeerDependencies:
+ - '@cucumber/cucumber'
+ - '@farmfe/core'
+ - '@jest/globals'
+ - '@rspack/core'
+ - '@testing-library/vue'
+ - '@vitest/ui'
+ - '@vue/test-utils'
+ - bun-types-no-globals
+ - h3-next
+ - happy-dom
+ - jsdom
+ - magicast
+ - typescript
+ - unloader
+ - vitest
+
vitest@3.2.7(@types/node@24.13.3):
dependencies:
'@types/chai': 5.2.3
diff --git a/tsconfig.json b/tsconfig.json
index 0e39534..b811c9b 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -8,6 +8,6 @@
{ "path": "packages/github" },
{ "path": "packages/agent" },
{ "path": "packages/cli" },
- { "path": "apps/server" }
+ { "path": "apps/dashboard" }
]
}
diff --git a/turbo.json b/turbo.json
index 84ce202..3085530 100644
--- a/turbo.json
+++ b/turbo.json
@@ -25,6 +25,11 @@
"dependsOn": ["^build"],
"outputs": []
},
+ "test:e2e": {
+ "dependsOn": ["build"],
+ "cache": false,
+ "outputs": []
+ },
"dev": {
"dependsOn": ["^build"],
"cache": false,
From 5f66d33b2e74ab31c6c891ef8e74c2f9c67c1f76 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 22:03:36 +0000
Subject: [PATCH 03/11] ci: verify injected version against package.json
instead of a hardcoded value
Co-authored-by: Codesmith
---
.github/workflows/ci.yaml | 2 +-
.github/workflows/release.yaml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index fb59e10..a1877b7 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -87,4 +87,4 @@ jobs:
run: aube run build
- name: 📦 Verify package version
- run: node --input-type=module --eval "import('./packages/shared/dist/index.mjs').then(({ version }) => { if (version !== '0.1.0') process.exit(1) })"
+ run: node --input-type=module --eval "Promise.all([import('./packages/shared/dist/index.mjs'), import('./packages/shared/package.json', { with: { type: 'json' } })]).then(([built, pkg]) => { if (built.version !== pkg.default.version) { console.error('Injected version', built.version, 'does not match package.json version', pkg.default.version); process.exit(1) } })"
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 63d6569..9106de8 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -32,7 +32,7 @@ jobs:
run: aube run build
- name: Verify injected version
- run: node --input-type=module --eval "import('./packages/shared/dist/index.mjs').then(({ version }) => { if (version !== '0.1.0') process.exit(1) })"
+ run: node --input-type=module --eval "Promise.all([import('./packages/shared/dist/index.mjs'), import('./packages/shared/package.json', { with: { type: 'json' } })]).then(([built, pkg]) => { if (built.version !== pkg.default.version) { console.error('Injected version', built.version, 'does not match package.json version', pkg.default.version); process.exit(1) } })"
# Publishing remains intentionally absent until the @agent-zero package
# scope and npm trusted publishing policy are configured.
From b55f4445f624baf6c88c309d052ad76842b95681 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 22:05:21 +0000
Subject: [PATCH 04/11] ci: use block scalars for the version verification
steps
Co-authored-by: Codesmith
---
.github/workflows/ci.yaml | 3 ++-
.github/workflows/release.yaml | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index a1877b7..9d1a895 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -87,4 +87,5 @@ jobs:
run: aube run build
- name: 📦 Verify package version
- run: node --input-type=module --eval "Promise.all([import('./packages/shared/dist/index.mjs'), import('./packages/shared/package.json', { with: { type: 'json' } })]).then(([built, pkg]) => { if (built.version !== pkg.default.version) { console.error('Injected version', built.version, 'does not match package.json version', pkg.default.version); process.exit(1) } })"
+ run: |
+ node --input-type=module --eval "Promise.all([import('./packages/shared/dist/index.mjs'), import('./packages/shared/package.json', { with: { type: 'json' } })]).then(([built, pkg]) => { if (built.version !== pkg.default.version) { console.error('Injected version', built.version, 'does not match package.json version', pkg.default.version); process.exit(1) } })"
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 9106de8..b6c70ca 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -32,7 +32,8 @@ jobs:
run: aube run build
- name: Verify injected version
- run: node --input-type=module --eval "Promise.all([import('./packages/shared/dist/index.mjs'), import('./packages/shared/package.json', { with: { type: 'json' } })]).then(([built, pkg]) => { if (built.version !== pkg.default.version) { console.error('Injected version', built.version, 'does not match package.json version', pkg.default.version); process.exit(1) } })"
+ run: |
+ node --input-type=module --eval "Promise.all([import('./packages/shared/dist/index.mjs'), import('./packages/shared/package.json', { with: { type: 'json' } })]).then(([built, pkg]) => { if (built.version !== pkg.default.version) { console.error('Injected version', built.version, 'does not match package.json version', pkg.default.version); process.exit(1) } })"
# Publishing remains intentionally absent until the @agent-zero package
# scope and npm trusted publishing policy are configured.
From ab7986bf990c67b2c4eb95af3fc409d7dfc5f324 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 22:10:25 +0000
Subject: [PATCH 05/11] chore(knip): teach knip the Nuxt 4 app directory layout
Co-authored-by: Codesmith
---
knip.jsonc | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/knip.jsonc b/knip.jsonc
index d470337..67fcc53 100644
--- a/knip.jsonc
+++ b/knip.jsonc
@@ -9,4 +9,25 @@
"@commitlint/cli",
"nano-staged",
],
+ "workspaces": {
+ "apps/dashboard": {
+ // Nuxt 4 keeps application code in app/, which knip's Nuxt plugin does
+ // not scan, and Nuxt auto-imports components, composables, and utils.
+ "entry": [
+ "app/app.vue",
+ "app/error.vue",
+ "app/pages/**/*.vue",
+ "app/layouts/**/*.vue",
+ "app/components/**/*.vue",
+ "app/composables/**/*.ts",
+ "app/middleware/**/*.ts",
+ "app/plugins/**/*.ts",
+ "app/utils/**/*.ts",
+ ],
+ // Nuxt resolves ~ to the app/ source directory.
+ "paths": {
+ "~/*": ["app/*"],
+ },
+ },
+ },
}
From a9b9ab0b02d0867ff3b696d56d6a3979376c7a68 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 22:19:25 +0000
Subject: [PATCH 06/11] fix(runner): validate lease durations, reserve quota
capacity, and retry failed stops
Co-authored-by: Codesmith
---
packages/runner/src/sandbox.test.ts | 91 +++++++++++++++++++++++++++++
packages/runner/src/sandbox.ts | 75 ++++++++++++++++--------
2 files changed, 143 insertions(+), 23 deletions(-)
diff --git a/packages/runner/src/sandbox.test.ts b/packages/runner/src/sandbox.test.ts
index 30b5350..fc345fc 100644
--- a/packages/runner/src/sandbox.test.ts
+++ b/packages/runner/src/sandbox.test.ts
@@ -72,6 +72,97 @@ describe('RunnerPool', () => {
).rejects.toThrow('exceeds');
});
+ it('rejects non-finite and non-positive lease durations before provisioning', async () => {
+ let provisioned = 0;
+ const adapter = provider();
+ const original = adapter.provision.bind(adapter);
+ adapter.provision = async (sandboxRequest) => {
+ provisioned += 1;
+ return original(sandboxRequest);
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ for (const leaseMs of [Number.NaN, 0, -1, Number.POSITIVE_INFINITY]) {
+ await expect(pool.acquire({ ...request, leaseMs })).rejects.toBeInstanceOf(
+ RunnerPoolQuotaError,
+ );
+ }
+ expect(provisioned).toBe(0);
+ expect(pool.snapshot().active).toBe(0);
+ });
+
+ it('reserves capacity before provisioning so overlapping acquires cannot bypass quotas', async () => {
+ let releaseProvision: () => void = () => undefined;
+ const gate = new Promise((resolve) => {
+ releaseProvision = resolve;
+ });
+ const adapter = provider();
+ adapter.provision = async (sandboxRequest) => {
+ await gate;
+ return { externalId: `remote-${sandboxRequest.taskId}`, runner };
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ const first = pool.acquire(request);
+ const second = pool.acquire({ ...request, taskId: 'task-2' });
+ await expect(second).rejects.toBeInstanceOf(RunnerPoolQuotaError);
+ releaseProvision();
+ await expect(first).resolves.toMatchObject({ taskId: 'task-1' });
+ expect(pool.snapshot().active).toBe(1);
+ });
+
+ it('releases reserved capacity when provisioning fails', async () => {
+ const adapter = provider();
+ adapter.provision = async () => {
+ throw new Error('provision failed');
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ await expect(pool.acquire(request)).rejects.toThrow('provision failed');
+ adapter.provision = async (sandboxRequest) => ({
+ externalId: `remote-${sandboxRequest.taskId}`,
+ runner,
+ });
+ await expect(pool.acquire({ ...request, taskId: 'task-2' })).resolves.toMatchObject({
+ taskId: 'task-2',
+ });
+ });
+
+ it('keeps leases retryable when the provider stop fails', async () => {
+ let current = 1_000;
+ let failStops = true;
+ const adapter = provider();
+ adapter.stop = async (id) => {
+ if (failStops) throw new Error('stop failed');
+ adapter.stopped.push(id);
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ now: () => current,
+ });
+ const lease = await pool.acquire(request);
+ await expect(pool.release(lease.id)).rejects.toThrow('stop failed');
+ expect(pool.snapshot().active).toBe(1);
+ current = 3_000;
+ await expect(pool.sweepExpired()).resolves.toBe(0);
+ expect(pool.snapshot().active).toBe(1);
+ failStops = false;
+ await expect(pool.release(lease.id)).resolves.toBe(true);
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ });
+
it('stops expired sandboxes deterministically', async () => {
let current = 1_000;
const adapter = provider();
diff --git a/packages/runner/src/sandbox.ts b/packages/runner/src/sandbox.ts
index ac64433..9163f1b 100644
--- a/packages/runner/src/sandbox.ts
+++ b/packages/runner/src/sandbox.ts
@@ -68,6 +68,9 @@ export class RunnerPoolQuotaError extends Error {
*/
export class RunnerPool {
private readonly leases = new Map();
+ private readonly stopping = new Map>();
+ private pendingTotal = 0;
+ private readonly pendingByRepository = new Map();
private readonly now: () => number;
constructor(
@@ -81,37 +84,63 @@ export class RunnerPool {
}
async acquire(request: SandboxRequest): Promise {
- if (this.leases.size >= this.options.maxActive)
+ if (!Number.isFinite(request.leaseMs) || request.leaseMs <= 0)
+ throw new RunnerPoolQuotaError('Requested lease duration must be a positive number');
+ if (request.leaseMs > this.options.maxLeaseMs)
+ throw new RunnerPoolQuotaError('Requested lease exceeds the configured maximum');
+ if (this.leases.size + this.pendingTotal >= this.options.maxActive)
throw new RunnerPoolQuotaError('Runner pool capacity is exhausted');
- const repositoryActive = [...this.leases.values()].filter(
- (lease) => lease.repository === request.repository,
- ).length;
+ const repositoryActive =
+ [...this.leases.values()].filter((lease) => lease.repository === request.repository).length +
+ (this.pendingByRepository.get(request.repository) ?? 0);
if (repositoryActive >= this.options.maxActivePerRepository)
throw new RunnerPoolQuotaError('Repository runner quota is exhausted');
- if (request.leaseMs > this.options.maxLeaseMs)
- throw new RunnerPoolQuotaError('Requested lease exceeds the configured maximum');
- const started = this.now();
- const provisioned = await this.provider.provision(Object.freeze({ ...request }));
- const lease: SandboxLease = {
- id: `lease_${randomUUID()}`,
- taskId: request.taskId,
- repository: request.repository,
- provider: this.provider.kind,
- externalId: provisioned.externalId,
- acquiredAt: new Date(started).toISOString(),
- expiresAt: new Date(started + request.leaseMs).toISOString(),
- runner: provisioned.runner,
- };
- this.leases.set(lease.id, lease);
- return lease;
+ // Reserve capacity before awaiting provisioning so overlapping acquires cannot bypass quotas.
+ this.pendingTotal += 1;
+ this.pendingByRepository.set(
+ request.repository,
+ (this.pendingByRepository.get(request.repository) ?? 0) + 1,
+ );
+ try {
+ const started = this.now();
+ const provisioned = await this.provider.provision(Object.freeze({ ...request }));
+ const lease: SandboxLease = {
+ id: `lease_${randomUUID()}`,
+ taskId: request.taskId,
+ repository: request.repository,
+ provider: this.provider.kind,
+ externalId: provisioned.externalId,
+ acquiredAt: new Date(started).toISOString(),
+ expiresAt: new Date(started + request.leaseMs).toISOString(),
+ runner: provisioned.runner,
+ };
+ this.leases.set(lease.id, lease);
+ return lease;
+ } finally {
+ this.pendingTotal -= 1;
+ const remaining = (this.pendingByRepository.get(request.repository) ?? 1) - 1;
+ if (remaining > 0) this.pendingByRepository.set(request.repository, remaining);
+ else this.pendingByRepository.delete(request.repository);
+ }
}
async release(id: string): Promise {
const lease = this.leases.get(id);
if (!lease) return false;
+ // Keep the lease tracked until the provider stop succeeds so a failed stop can be retried,
+ // while sharing one in-flight stop between concurrent release and sweep calls.
+ let stop = this.stopping.get(id);
+ if (!stop) {
+ stop = this.provider.stop(lease.externalId);
+ this.stopping.set(id, stop);
+ }
+ try {
+ await stop;
+ } finally {
+ this.stopping.delete(id);
+ }
this.leases.delete(id);
- await this.provider.stop(lease.externalId);
return true;
}
@@ -119,8 +148,8 @@ export class RunnerPool {
const expired = [...this.leases.values()].filter(
(lease) => Date.parse(lease.expiresAt) <= this.now(),
);
- await Promise.all(expired.map((lease) => this.release(lease.id)));
- return expired.length;
+ const results = await Promise.allSettled(expired.map((lease) => this.release(lease.id)));
+ return results.filter((result) => result.status === 'fulfilled' && result.value).length;
}
snapshot(): RunnerPoolSnapshot {
From 71326d46df2bcca8bf7bbea58c30135957933e75 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 22:21:26 +0000
Subject: [PATCH 07/11] fix(runner): satisfy consistent-function-scoping in
pool race test
Co-authored-by: Codesmith
---
packages/runner/src/sandbox.test.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/runner/src/sandbox.test.ts b/packages/runner/src/sandbox.test.ts
index fc345fc..9ee6a59 100644
--- a/packages/runner/src/sandbox.test.ts
+++ b/packages/runner/src/sandbox.test.ts
@@ -95,7 +95,7 @@ describe('RunnerPool', () => {
});
it('reserves capacity before provisioning so overlapping acquires cannot bypass quotas', async () => {
- let releaseProvision: () => void = () => undefined;
+ let releaseProvision!: () => void;
const gate = new Promise((resolve) => {
releaseProvision = resolve;
});
From a45814500bdbd78497c950b263da015a8c41bf43 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 22:29:05 +0000
Subject: [PATCH 08/11] fix(runner): start the lease clock after provisioning
succeeds
Co-authored-by: Codesmith
---
packages/runner/src/sandbox.test.ts | 22 ++++++++++++++++++++++
packages/runner/src/sandbox.ts | 4 +++-
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/packages/runner/src/sandbox.test.ts b/packages/runner/src/sandbox.test.ts
index 9ee6a59..58cbb78 100644
--- a/packages/runner/src/sandbox.test.ts
+++ b/packages/runner/src/sandbox.test.ts
@@ -117,6 +117,28 @@ describe('RunnerPool', () => {
expect(pool.snapshot().active).toBe(1);
});
+ it('starts the lease clock after provisioning so slow provisioning cannot expire the lease', async () => {
+ let current = 1_000;
+ const adapter = provider();
+ adapter.provision = async (sandboxRequest) => {
+ // Simulate provisioning that consumes more than the requested lease interval.
+ current += 2_000;
+ return { externalId: `remote-${sandboxRequest.taskId}`, runner };
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ now: () => current,
+ });
+ const lease = await pool.acquire(request);
+ expect(Date.parse(lease.acquiredAt)).toBe(3_000);
+ expect(Date.parse(lease.expiresAt)).toBe(4_000);
+ await expect(pool.sweepExpired()).resolves.toBe(0);
+ expect(adapter.stopped).toEqual([]);
+ expect(pool.snapshot().active).toBe(1);
+ });
+
it('releases reserved capacity when provisioning fails', async () => {
const adapter = provider();
adapter.provision = async () => {
diff --git a/packages/runner/src/sandbox.ts b/packages/runner/src/sandbox.ts
index 9163f1b..d3ce7b4 100644
--- a/packages/runner/src/sandbox.ts
+++ b/packages/runner/src/sandbox.ts
@@ -103,8 +103,10 @@ export class RunnerPool {
(this.pendingByRepository.get(request.repository) ?? 0) + 1,
);
try {
- const started = this.now();
const provisioned = await this.provider.provision(Object.freeze({ ...request }));
+ // Start the lease clock only after provisioning succeeds so slow provisioning cannot
+ // consume the usable lease interval and hand back an already-expired lease.
+ const started = this.now();
const lease: SandboxLease = {
id: `lease_${randomUUID()}`,
taskId: request.taskId,
From 535ec19130df8fddad16a3e811da8d6c0e71e850 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 22:43:29 +0000
Subject: [PATCH 09/11] fix(runner): enforce lease expiry with pool-owned
disposable timers
---
packages/runner/src/sandbox.test.ts | 79 ++++++++++++++++++++++++++++-
packages/runner/src/sandbox.ts | 42 +++++++++++++++
2 files changed, 120 insertions(+), 1 deletion(-)
diff --git a/packages/runner/src/sandbox.test.ts b/packages/runner/src/sandbox.test.ts
index 58cbb78..8b93f29 100644
--- a/packages/runner/src/sandbox.test.ts
+++ b/packages/runner/src/sandbox.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from 'vitest';
+import { afterEach, describe, expect, it, vi } from 'vitest';
import type { Runner } from './boundary.js';
import { RunnerPool, RunnerPoolQuotaError, type SandboxProvider } from './sandbox.js';
@@ -185,6 +185,83 @@ describe('RunnerPool', () => {
expect(pool.snapshot().active).toBe(0);
});
+ describe('automatic expiry enforcement', () => {
+ afterEach(() => {
+ vi.useRealTimers();
+ });
+
+ it('stops a runner at its lease deadline without an external sweep', async () => {
+ vi.useFakeTimers();
+ const adapter = provider();
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ await pool.acquire(request);
+ expect(pool.snapshot().active).toBe(1);
+ await vi.advanceTimersByTimeAsync(1_000);
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ });
+
+ it('retries an automatic expiry stop that failed', async () => {
+ vi.useFakeTimers();
+ let failStops = true;
+ const adapter = provider();
+ adapter.stop = async (id) => {
+ if (failStops) throw new Error('stop failed');
+ adapter.stopped.push(id);
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ expiryRetryMs: 500,
+ });
+ await pool.acquire(request);
+ await vi.advanceTimersByTimeAsync(1_000);
+ expect(pool.snapshot().active).toBe(1);
+ failStops = false;
+ await vi.advanceTimersByTimeAsync(500);
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ });
+
+ it('does not fire an expiry timer for a lease released early', async () => {
+ vi.useFakeTimers();
+ const adapter = provider();
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ const lease = await pool.acquire(request);
+ await expect(pool.release(lease.id)).resolves.toBe(true);
+ await vi.advanceTimersByTimeAsync(1_000);
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(vi.getTimerCount()).toBe(0);
+ });
+
+ it('dispose clears timers, stops remaining leases, and rejects new acquires', async () => {
+ vi.useFakeTimers();
+ const adapter = provider();
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ await pool.acquire(request);
+ await pool.dispose();
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ expect(vi.getTimerCount()).toBe(0);
+ await expect(pool.acquire({ ...request, taskId: 'task-2' })).rejects.toBeInstanceOf(
+ RunnerPoolQuotaError,
+ );
+ });
+ });
+
it('stops expired sandboxes deterministically', async () => {
let current = 1_000;
const adapter = provider();
diff --git a/packages/runner/src/sandbox.ts b/packages/runner/src/sandbox.ts
index d3ce7b4..691497a 100644
--- a/packages/runner/src/sandbox.ts
+++ b/packages/runner/src/sandbox.ts
@@ -42,6 +42,8 @@ export interface RunnerPoolOptions {
maxActive: number;
maxActivePerRepository: number;
maxLeaseMs: number;
+ /** Delay before retrying an automatic expiry stop that failed. Defaults to 30 seconds. */
+ expiryRetryMs?: number;
now?: () => number;
}
@@ -69,9 +71,12 @@ export class RunnerPoolQuotaError extends Error {
export class RunnerPool {
private readonly leases = new Map();
private readonly stopping = new Map>();
+ private readonly expiryTimers = new Map>();
private pendingTotal = 0;
private readonly pendingByRepository = new Map();
private readonly now: () => number;
+ private readonly expiryRetryMs: number;
+ private disposed = false;
constructor(
private readonly provider: SandboxProvider,
@@ -80,10 +85,14 @@ export class RunnerPool {
assertPositiveInteger(options.maxActive, 'maxActive');
assertPositiveInteger(options.maxActivePerRepository, 'maxActivePerRepository');
assertPositiveInteger(options.maxLeaseMs, 'maxLeaseMs');
+ if (options.expiryRetryMs !== undefined)
+ assertPositiveInteger(options.expiryRetryMs, 'expiryRetryMs');
+ this.expiryRetryMs = options.expiryRetryMs ?? 30_000;
this.now = options.now ?? Date.now;
}
async acquire(request: SandboxRequest): Promise {
+ if (this.disposed) throw new RunnerPoolQuotaError('Runner pool has been disposed');
if (!Number.isFinite(request.leaseMs) || request.leaseMs <= 0)
throw new RunnerPoolQuotaError('Requested lease duration must be a positive number');
if (request.leaseMs > this.options.maxLeaseMs)
@@ -118,6 +127,9 @@ export class RunnerPool {
runner: provisioned.runner,
};
this.leases.set(lease.id, lease);
+ // The pool owns expiry enforcement: a runner must stop at its lease deadline even when no
+ // external caller ever sweeps.
+ this.scheduleExpiry(lease.id, request.leaseMs);
return lease;
} finally {
this.pendingTotal -= 1;
@@ -143,9 +155,18 @@ export class RunnerPool {
this.stopping.delete(id);
}
this.leases.delete(id);
+ this.clearExpiry(id);
return true;
}
+ /** Clears every expiry timer and stops all remaining leases. The pool cannot be reused. */
+ async dispose(): Promise {
+ this.disposed = true;
+ for (const id of this.expiryTimers.keys()) this.clearExpiry(id);
+ await Promise.allSettled(Array.from(this.leases.keys(), (id) => this.release(id)));
+ }
+
+ /** Manual backstop for the pool-owned expiry timers, e.g. after a process restart. */
async sweepExpired(): Promise {
const expired = [...this.leases.values()].filter(
(lease) => Date.parse(lease.expiresAt) <= this.now(),
@@ -173,6 +194,27 @@ export class RunnerPool {
})),
};
}
+
+ private scheduleExpiry(id: string, delayMs: number): void {
+ this.clearExpiry(id);
+ const timer = setTimeout(() => {
+ this.expiryTimers.delete(id);
+ this.release(id).catch(() => {
+ // The provider stop failed; the lease stays tracked, so retry on a bounded interval.
+ if (!this.disposed && this.leases.has(id)) this.scheduleExpiry(id, this.expiryRetryMs);
+ });
+ }, delayMs);
+ // Never keep the host process alive solely to enforce an expiry.
+ timer.unref();
+ this.expiryTimers.set(id, timer);
+ }
+
+ private clearExpiry(id: string): void {
+ const timer = this.expiryTimers.get(id);
+ if (timer === undefined) return;
+ clearTimeout(timer);
+ this.expiryTimers.delete(id);
+ }
}
function assertPositiveInteger(value: number, name: string): void {
From 82be46d315388f1de7b7dddf5f660202809c9fc7 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 22:53:42 +0000
Subject: [PATCH 10/11] fix(runner): keep runner revocation reliable across
disposal and process exit
---
packages/runner/src/sandbox.test.ts | 45 +++++++++++++++++++++++++++++
packages/runner/src/sandbox.ts | 33 ++++++++++++++++++---
2 files changed, 74 insertions(+), 4 deletions(-)
diff --git a/packages/runner/src/sandbox.test.ts b/packages/runner/src/sandbox.test.ts
index 8b93f29..068192d 100644
--- a/packages/runner/src/sandbox.test.ts
+++ b/packages/runner/src/sandbox.test.ts
@@ -243,6 +243,51 @@ describe('RunnerPool', () => {
expect(vi.getTimerCount()).toBe(0);
});
+ it('dispose surfaces failed stops and a retried dispose stops the lease', async () => {
+ vi.useFakeTimers();
+ let failStops = true;
+ const adapter = provider();
+ adapter.stop = async (id) => {
+ if (failStops) throw new Error('stop failed');
+ adapter.stopped.push(id);
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ await pool.acquire(request);
+ await expect(pool.dispose()).rejects.toBeInstanceOf(AggregateError);
+ expect(pool.snapshot().active).toBe(1);
+ failStops = false;
+ await expect(pool.dispose()).resolves.toBeUndefined();
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ });
+
+ it('stops a runner whose provisioning resolves after dispose', async () => {
+ let releaseProvision!: () => void;
+ const gate = new Promise((resolve) => {
+ releaseProvision = resolve;
+ });
+ const adapter = provider();
+ adapter.provision = async (sandboxRequest) => {
+ await gate;
+ return { externalId: `remote-${sandboxRequest.taskId}`, runner };
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ });
+ const pending = pool.acquire(request);
+ await pool.dispose();
+ releaseProvision();
+ await expect(pending).rejects.toBeInstanceOf(RunnerPoolQuotaError);
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ });
+
it('dispose clears timers, stops remaining leases, and rejects new acquires', async () => {
vi.useFakeTimers();
const adapter = provider();
diff --git a/packages/runner/src/sandbox.ts b/packages/runner/src/sandbox.ts
index 691497a..ed8b0cb 100644
--- a/packages/runner/src/sandbox.ts
+++ b/packages/runner/src/sandbox.ts
@@ -127,6 +127,16 @@ export class RunnerPool {
runner: provisioned.runner,
};
this.leases.set(lease.id, lease);
+ if (this.disposed) {
+ // The pool was disposed while provisioning; the runner must stop instead of escaping
+ // shutdown. A failed stop keeps the lease tracked so a retried dispose() can stop it.
+ try {
+ await this.release(lease.id);
+ } catch {
+ // Intentionally swallowed: the disposal error below is the actionable signal.
+ }
+ throw new RunnerPoolQuotaError('Runner pool was disposed during provisioning');
+ }
// The pool owns expiry enforcement: a runner must stop at its lease deadline even when no
// external caller ever sweeps.
this.scheduleExpiry(lease.id, request.leaseMs);
@@ -159,11 +169,25 @@ export class RunnerPool {
return true;
}
- /** Clears every expiry timer and stops all remaining leases. The pool cannot be reused. */
+ /**
+ * Clears every expiry timer and stops all remaining leases. The pool rejects new acquires
+ * afterwards. When a provider stop fails, the lease stays tracked and this method throws an
+ * `AggregateError`; calling `dispose()` again retries the remaining stops.
+ */
async dispose(): Promise {
this.disposed = true;
for (const id of this.expiryTimers.keys()) this.clearExpiry(id);
- await Promise.allSettled(Array.from(this.leases.keys(), (id) => this.release(id)));
+ const results = await Promise.allSettled(
+ Array.from(this.leases.keys(), (id) => this.release(id)),
+ );
+ const failures = results.flatMap((result) =>
+ result.status === 'rejected' ? [result.reason as unknown] : [],
+ );
+ if (failures.length > 0)
+ throw new AggregateError(
+ failures,
+ 'Runner pool disposal failed to stop every lease; call dispose() again to retry',
+ );
}
/** Manual backstop for the pool-owned expiry timers, e.g. after a process restart. */
@@ -204,8 +228,9 @@ export class RunnerPool {
if (!this.disposed && this.leases.has(id)) this.scheduleExpiry(id, this.expiryRetryMs);
});
}, delayMs);
- // Never keep the host process alive solely to enforce an expiry.
- timer.unref();
+ // The timer stays referenced on purpose: lease state is process-local, so letting the process
+ // exit before the deadline would leave the remote sandbox running with no cleanup path.
+ // Callers that want to exit early must release the lease or dispose the pool.
this.expiryTimers.set(id, timer);
}
From 204b1a3e38d31554bd8600704cbb62cbd1ad6b52 Mon Sep 17 00:00:00 2001
From: RedStar071
Date: Sun, 9 Aug 2026 23:04:52 +0000
Subject: [PATCH 11/11] fix(runner): surface and retry failed stops after
disposal races
---
packages/runner/src/sandbox.test.ts | 63 +++++++++++++++++++++++++++++
packages/runner/src/sandbox.ts | 49 +++++++++++++++++-----
2 files changed, 101 insertions(+), 11 deletions(-)
diff --git a/packages/runner/src/sandbox.test.ts b/packages/runner/src/sandbox.test.ts
index 068192d..fb37359 100644
--- a/packages/runner/src/sandbox.test.ts
+++ b/packages/runner/src/sandbox.test.ts
@@ -288,6 +288,69 @@ describe('RunnerPool', () => {
expect(pool.snapshot().active).toBe(0);
});
+ it('surfaces a failed stop after disposal during provisioning and retries it internally', async () => {
+ vi.useFakeTimers();
+ let releaseProvision!: () => void;
+ const gate = new Promise((resolve) => {
+ releaseProvision = resolve;
+ });
+ let failStops = true;
+ const adapter = provider();
+ adapter.provision = async (sandboxRequest) => {
+ await gate;
+ return { externalId: `remote-${sandboxRequest.taskId}`, runner };
+ };
+ adapter.stop = async (id) => {
+ if (failStops) throw new Error('stop failed');
+ adapter.stopped.push(id);
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ expiryRetryMs: 500,
+ });
+ const pending = pool.acquire(request);
+ await pool.dispose();
+ releaseProvision();
+ // The cleanup failure is surfaced instead of being swallowed behind a quota error.
+ await expect(pending).rejects.toBeInstanceOf(AggregateError);
+ expect(pool.snapshot().active).toBe(1);
+ // The retry loop keeps running after disposal, across repeated failures.
+ await vi.advanceTimersByTimeAsync(500);
+ expect(pool.snapshot().active).toBe(1);
+ failStops = false;
+ await vi.advanceTimersByTimeAsync(500);
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ expect(vi.getTimerCount()).toBe(0);
+ });
+
+ it('re-arms the internal stop retry when dispose fails to stop a lease', async () => {
+ vi.useFakeTimers();
+ let failStops = true;
+ const adapter = provider();
+ adapter.stop = async (id) => {
+ if (failStops) throw new Error('stop failed');
+ adapter.stopped.push(id);
+ };
+ const pool = new RunnerPool(adapter, {
+ maxActive: 1,
+ maxActivePerRepository: 1,
+ maxLeaseMs: 1_000,
+ expiryRetryMs: 500,
+ });
+ await pool.acquire(request);
+ await expect(pool.dispose()).rejects.toBeInstanceOf(AggregateError);
+ expect(pool.snapshot().active).toBe(1);
+ failStops = false;
+ // No second dispose() call: the pool's own retry timer stops the leaked runner.
+ await vi.advanceTimersByTimeAsync(500);
+ expect(adapter.stopped).toEqual(['remote-task-1']);
+ expect(pool.snapshot().active).toBe(0);
+ expect(vi.getTimerCount()).toBe(0);
+ });
+
it('dispose clears timers, stops remaining leases, and rejects new acquires', async () => {
vi.useFakeTimers();
const adapter = provider();
diff --git a/packages/runner/src/sandbox.ts b/packages/runner/src/sandbox.ts
index ed8b0cb..4ca3e85 100644
--- a/packages/runner/src/sandbox.ts
+++ b/packages/runner/src/sandbox.ts
@@ -129,11 +129,21 @@ export class RunnerPool {
this.leases.set(lease.id, lease);
if (this.disposed) {
// The pool was disposed while provisioning; the runner must stop instead of escaping
- // shutdown. A failed stop keeps the lease tracked so a retried dispose() can stop it.
+ // shutdown. A failed stop keeps the lease tracked, arms the internal stop retry, and
+ // surfaces the failure so the caller knows a live sandbox remains.
+ let stopFailure: { error: unknown } | undefined;
try {
await this.release(lease.id);
- } catch {
- // Intentionally swallowed: the disposal error below is the actionable signal.
+ } catch (error) {
+ stopFailure = { error };
+ }
+ if (stopFailure) {
+ this.scheduleStopRetry(lease.id);
+ throw new AggregateError(
+ [stopFailure.error],
+ 'Runner pool was disposed during provisioning and stopping the runner failed; the pool retries the stop and dispose() can also retry',
+ { cause: stopFailure.error },
+ );
}
throw new RunnerPoolQuotaError('Runner pool was disposed during provisioning');
}
@@ -171,17 +181,24 @@ export class RunnerPool {
/**
* Clears every expiry timer and stops all remaining leases. The pool rejects new acquires
- * afterwards. When a provider stop fails, the lease stays tracked and this method throws an
- * `AggregateError`; calling `dispose()` again retries the remaining stops.
+ * afterwards. When a provider stop fails, the lease stays tracked, an internal stop retry is
+ * armed, and this method throws an `AggregateError`; calling `dispose()` again also retries
+ * the remaining stops.
*/
async dispose(): Promise {
this.disposed = true;
for (const id of this.expiryTimers.keys()) this.clearExpiry(id);
- const results = await Promise.allSettled(
- Array.from(this.leases.keys(), (id) => this.release(id)),
- );
- const failures = results.flatMap((result) =>
- result.status === 'rejected' ? [result.reason as unknown] : [],
+ const failures: unknown[] = [];
+ await Promise.all(
+ Array.from(this.leases.keys(), async (id) => {
+ try {
+ await this.release(id);
+ } catch (error) {
+ // Keep an automatic cleanup path alive even when the caller never retries dispose().
+ this.scheduleStopRetry(id);
+ failures.push(error);
+ }
+ }),
);
if (failures.length > 0)
throw new AggregateError(
@@ -225,7 +242,7 @@ export class RunnerPool {
this.expiryTimers.delete(id);
this.release(id).catch(() => {
// The provider stop failed; the lease stays tracked, so retry on a bounded interval.
- if (!this.disposed && this.leases.has(id)) this.scheduleExpiry(id, this.expiryRetryMs);
+ this.scheduleStopRetry(id);
});
}, delayMs);
// The timer stays referenced on purpose: lease state is process-local, so letting the process
@@ -234,6 +251,16 @@ export class RunnerPool {
this.expiryTimers.set(id, timer);
}
+ /**
+ * Retries a failed provider stop on a bounded interval. This deliberately keeps running after
+ * the pool is disposed: a tracked lease still owns a live remote sandbox, so the retry loop is
+ * the only automatic cleanup path left once no expiry timer or dispose() call is pending.
+ */
+ private scheduleStopRetry(id: string): void {
+ if (!this.leases.has(id)) return;
+ this.scheduleExpiry(id, this.expiryRetryMs);
+ }
+
private clearExpiry(id: string): void {
const timer = this.expiryTimers.get(id);
if (timer === undefined) return;