From 9de9dcc368f18deb8f9384cbb1559c5a9633732d Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Tue, 1 Sep 2026 10:50:40 +0100 Subject: [PATCH 1/4] feat(sdk): map failures to a structured evlog error catalog Classifiable failures (GitHub API by status, Connect, OIDC, missing token) now carry a stable code plus why/fix fields so models recover instead of hallucinating causes. An expired VERCEL_OIDC_TOKEN throws before any request with the exact expiry time, and eve tool failures return { error: { code, message, why, fix } }. --- .changeset/evlog-error-catalog.md | 11 + .../docs/2.frameworks/1.eve-extension.md | 2 +- .../content/docs/4.guide/5.vercel-connect.md | 2 + apps/docs/content/docs/4.guide/7.errors.md | 75 +++ apps/docs/content/docs/5.api/2.reference.md | 12 + apps/docs/skills/github-tools-agents/SKILL.md | 2 + .../references/eve-extension.md | 2 +- .../extension/tools/github.ts | 3 +- packages/github-tools/README.md | 8 + packages/github-tools/package.json | 1 + packages/github-tools/src/client.ts | 4 +- .../github-tools/src/connect/token.test.ts | 91 +++- packages/github-tools/src/connect/token.ts | 72 ++- packages/github-tools/src/core/errors.test.ts | 84 ++++ packages/github-tools/src/core/errors.ts | 135 ++++++ .../github-tools/src/core/rate-limit.test.ts | 15 - packages/github-tools/src/core/rate-limit.ts | 18 - packages/github-tools/src/core/token.ts | 8 +- packages/github-tools/src/eve-runtime.ts | 1 + packages/github-tools/src/eve/steps.test.ts | 26 ++ packages/github-tools/src/eve/steps.ts | 5 + packages/github-tools/src/index.ts | 1 + pnpm-lock.yaml | 440 +++++++++++------- pnpm-workspace.yaml | 2 + 24 files changed, 812 insertions(+), 208 deletions(-) create mode 100644 .changeset/evlog-error-catalog.md create mode 100644 apps/docs/content/docs/4.guide/7.errors.md create mode 100644 packages/github-tools/src/core/errors.test.ts create mode 100644 packages/github-tools/src/core/errors.ts create mode 100644 packages/github-tools/src/eve/steps.test.ts diff --git a/.changeset/evlog-error-catalog.md b/.changeset/evlog-error-catalog.md new file mode 100644 index 0000000..2d0570f --- /dev/null +++ b/.changeset/evlog-error-catalog.md @@ -0,0 +1,11 @@ +--- +"@github-tools/sdk": minor +"@github-tools/eve-extension": minor +--- + +Structured error catalog (evlog): classifiable failures now carry a stable `code`, a `why` (technical cause), and a `fix` (actionable remedy) instead of a bare message. + +- GitHub API errors are mapped by status: `UNAUTHORIZED` (401), `FORBIDDEN` (403), `RATE_LIMITED` (403/429, with reset info), `NOT_FOUND` (404 — explicitly states GitHub masks no-access private resources as 404), `VALIDATION_FAILED` (422). Unmapped statuses pass through; the original Octokit error stays as `cause`. +- An expired `VERCEL_OIDC_TOKEN` now throws `OIDC_TOKEN_EXPIRED` with the exact expiry time before any Connect request, instead of surfacing as an opaque 403. `@vercel/connect` failures map to `CONNECT_NOT_AUTHORIZED`, `CONNECT_USER_NOT_CONNECTED`, and `CONNECT_INSTALLATION_REQUIRED`. +- In the eve extension, failing tools return `{ error: { code, message, why, fix } }` to the model; unclassified failures keep the plain message string. +- The catalog is exported as `githubToolsErrors`; use evlog's `parseError` to read the structure from thrown errors in AI SDK apps. diff --git a/apps/docs/content/docs/2.frameworks/1.eve-extension.md b/apps/docs/content/docs/2.frameworks/1.eve-extension.md index cf65203..e4c9429 100644 --- a/apps/docs/content/docs/2.frameworks/1.eve-extension.md +++ b/apps/docs/content/docs/2.frameworks/1.eve-extension.md @@ -212,7 +212,7 @@ The extension registers each tool with an **authored inline** `execute`, `toMode Object-shaped execute results include `rateLimit` (`remaining`, `limit`, `reset`, `resource`). `toModelOutput` strips it so the model never sees the remaining count; `toolResultFrom` and channels still do. See [Rate-limit metadata](/api/reference#rate-limit-metadata). -If execute fails (token mint, GitHub 403/429, …), the tool returns `{ error }` instead of throwing so the model always receives a `tool_result`. A thrown error in eve's tool-loop can leave a `tool_use` unpaired and kill the turn. +If execute fails (token mint, GitHub 403/429, …), the tool returns `{ error }` instead of throwing so the model always receives a `tool_result`. A thrown error in eve's tool-loop can leave a `tool_use` unpaired and kill the turn. For failures the SDK can classify, `error` is a structured `{ code, message, why, fix }` object from the [error catalog](/guide/errors) — e.g. a 404 explains that GitHub also masks no-access private repos as 404, so the model does not hallucinate a cause. Unclassified failures keep the plain message string. ## Durable approval, done right diff --git a/apps/docs/content/docs/4.guide/5.vercel-connect.md b/apps/docs/content/docs/4.guide/5.vercel-connect.md index e1c1a16..aa0e466 100644 --- a/apps/docs/content/docs/4.guide/5.vercel-connect.md +++ b/apps/docs/content/docs/4.guide/5.vercel-connect.md @@ -99,6 +99,8 @@ export default connectGithubTools('github/my-connector', { When `VERCEL_OIDC_TOKEN` is set (`vercel env pull` for local eve/workflow), `connectGithubToken` passes it to `getToken` as `vercelToken`. That uses the pulled token instead of `@vercel/oidc` walking the filesystem for `.vercel` — which fails inside workflow snapshots that have no project root. +Pinning disables refresh, so the SDK checks the token's `exp` claim before every mint and throws [`OIDC_TOKEN_EXPIRED`](/guide/errors) with the exact expiry time when it is stale — instead of an opaque Connect 403 the model would misread as missing GitHub permissions. Run `vercel env pull` again to refresh it. + There is no dedicated starter for this path; new agents should use the [eve extension](#eve-extension) above. ## Token provider only diff --git a/apps/docs/content/docs/4.guide/7.errors.md b/apps/docs/content/docs/4.guide/7.errors.md new file mode 100644 index 0000000..7d8eb47 --- /dev/null +++ b/apps/docs/content/docs/4.guide/7.errors.md @@ -0,0 +1,75 @@ +--- +title: Errors +description: Structured, agent-readable errors — every failure carries a stable code, the technical cause, and an actionable fix. +navigation: + icon: i-lucide-shield-alert +--- + +Raw API failures make models hallucinate. GitHub answers 404 for private repositories the token cannot see, and an expired Vercel OIDC token surfaces as a bare "Not authorized" — both read as "the repo is private" or "permissions are missing" to a model, which then confidently reports the wrong cause. + +The SDK maps every failure it can classify to a structured error from an [evlog](https://evlog.dev) catalog. Each error carries: + +- `code` — stable, machine-readable identifier (`github_tools.NOT_FOUND`) +- `message` — what happened, with the GitHub or Connect detail embedded +- `why` — the technical cause, including the non-obvious ones +- `fix` — the actionable remedy + +## Error codes + +### Authentication and Vercel Connect + +| Code | When | +| --- | --- | +| `TOKEN_REQUIRED` | No token string, provider, or `GITHUB_TOKEN` env var was available | +| `OIDC_TOKEN_EXPIRED` | `VERCEL_OIDC_TOKEN` is past its `exp` claim — thrown before any request is made, with the exact expiry time. Run `vercel env pull` locally | +| `CONNECT_NOT_AUTHORIZED` | Connect rejected the calling process's identity (403). The request never reached GitHub — this is not a GitHub permission problem | +| `CONNECT_USER_NOT_CONNECTED` | A `{ type: 'user' }` subject was requested but that user has no active GitHub connection | +| `CONNECT_INSTALLATION_REQUIRED` | The connector's GitHub App is not installed on the target account | +| `SUBJECT_CONTEXT_REQUIRED` | A `connect.subject` resolver ran outside a tool execution (no eve context) | + +### GitHub API + +| Code | Status | When | +| --- | --- | --- | +| `UNAUTHORIZED` | 401 | Token invalid, expired, or revoked | +| `FORBIDDEN` | 403 | Missing scope, SAML enforcement, or a user-token-only API (gists, notifications) called with an installation token | +| `RATE_LIMITED` | 403/429 | Rate limit exhausted — the message includes remaining/limit and the reset timestamp | +| `NOT_FOUND` | 404 | The resource does not exist **or the token cannot see it** — GitHub returns 404 instead of 403 for private resources | +| `VALIDATION_FAILED` | 422 | Well-formed input that GitHub refused, with GitHub's message embedded | + +Statuses without a catalog entry (5xx, redirects) pass through unchanged. The original Octokit `RequestError` stays reachable as `cause`; request coordinates live in `internal` and are never serialized toward the model. + +## What the model sees + +In the [eve extension](/frameworks/eve-extension), a failing tool returns the structure instead of a flat string: + +```json +{ + "error": { + "code": "github_tools.NOT_FOUND", + "message": "GitHub resource not found (404): Not Found", + "why": "Either the resource does not exist, or the token cannot see it — GitHub deliberately returns 404 instead of 403 for private resources the token has no access to.", + "fix": "Check the owner/repo/number input first. If it is correct, the token lacks access: grant the repository to the PAT or App installation, or use a Connect subject that has access." + } +} +``` + +`link` and `internal` are stripped — only what helps the model recover crosses the wire. + +## AI SDK consumers + +With `generateText`/`streamText`, tool execution errors are thrown and the framework forwards `error.message` to the model. The catalog messages are written to be self-sufficient for that path. If you need the full structure (error boundaries, logging, custom `onError`), use evlog's `parseError`: + +```ts +import { parseError } from 'evlog' + +try { + await generateText({ model, tools, prompt }) +} +catch (error) { + const { code, message, why, fix } = parseError(error) + // code autocompletes against the github_tools catalog +} +``` + +The catalog itself is exported as `githubToolsErrors` from `@github-tools/sdk` for consumers who want to match on specific factories or reuse the codes. diff --git a/apps/docs/content/docs/5.api/2.reference.md b/apps/docs/content/docs/5.api/2.reference.md index 9be374c..bd802fe 100644 --- a/apps/docs/content/docs/5.api/2.reference.md +++ b/apps/docs/content/docs/5.api/2.reference.md @@ -432,6 +432,18 @@ const octokit = createOctokit(await resolveGithubToken()) const { data } = await octokit.repos.get({ owner: 'HugoRCD', repo: 'github-tools' }) ``` +## `githubToolsErrors` + +The [evlog](https://evlog.dev) error catalog behind every classifiable SDK failure (`github_tools.*` codes with `why`/`fix` fields). Exported from `@github-tools/sdk` and `@github-tools/sdk/eve-runtime` for consumers who want to match on specific codes or throw catalog errors from custom tools. See the [errors guide](/guide/errors) for the full code list and the model-facing shape. + +```ts [error-handling.ts] +import { githubToolsErrors } from '@github-tools/sdk' +import { parseError } from 'evlog' + +const { code, why, fix } = parseError(error) +if (code === 'github_tools.RATE_LIMITED') { /* back off */ } +``` + ## External references - [AI SDK tool definitions](https://ai-sdk.dev/docs/ai-sdk-core/tools-and-tool-calling) diff --git a/apps/docs/skills/github-tools-agents/SKILL.md b/apps/docs/skills/github-tools-agents/SKILL.md index 95ff796..c6a8749 100644 --- a/apps/docs/skills/github-tools-agents/SKILL.md +++ b/apps/docs/skills/github-tools-agents/SKILL.md @@ -127,6 +127,8 @@ Array presets merge: `preset: ['code-review', 'issue-triage']`. Start with the s Pass `context: { owner, repo, pullNumber?, issueNumber?, ref? }` to `createGithubTools` / `createGithubAgent` / `createDurableGithubAgent` to default those fields on tool inputs and inject them into the agent system prompt. Prefer composite tools (`getPullRequestContext`, `getIssueContext`, `getReleaseContext`, `getCiFailureContext`) for multi-part reads — call follow-up reads in the same step when possible. Diff patches are omitted by default — set `includePatch: true` (optionally with `filenames`) when you need specific diffs. Bodies are truncated by default (`detail: 'summary'`). `getIssueContext` returns `labelNames` (strings) rather than full label objects. Prefer `getFileContent` with `startLine`/`endLine` or `maxLines` for large files. `getWorkflowJobLogs` returns the last 200 log lines with timestamps stripped — raise `maxLines` (up to 2000) only when needed. `listPullRequestReviewThreads` returns unresolved threads only by default with truncated comment bodies. REST list tools return `{ items, hasMore, page, nextPage }` (or add those fields next to `checkRuns` / `runs`); when `hasMore`, call with `nextPage` or raise `maxPages` — never the same page. Filter `listCommits` with `path` / `author` / `since` / `until`. Prefer a `path` prefix on `getRepositoryTree` over `recursive: true`. Object-shaped execute results include `rateLimit` (`remaining` / `limit` / `reset` / `resource`); it is stripped from the model-facing output. On 403/429 the error text includes remaining/reset. +Classifiable failures are structured evlog catalog errors (`githubToolsErrors`, codes prefixed `github_tools.`) with `why`/`fix` fields: 401 `UNAUTHORIZED`, 403 `FORBIDDEN`, 403/429 `RATE_LIMITED`, 404 `NOT_FOUND` (also thrown when the token cannot see a private resource — GitHub masks no-access as 404), 422 `VALIDATION_FAILED`, plus auth/Connect codes (`TOKEN_REQUIRED`, `OIDC_TOKEN_EXPIRED`, `CONNECT_USER_NOT_CONNECTED`, …). In eve, tool failures return `{ error: { code, message, why, fix } }`; with `generateText`/`streamText` the message alone is forwarded and is self-sufficient — use evlog's `parseError` for the full structure. + ## Write safety - Default: writes go through **approval** (AI SDK tool approval flow) unless `requireApproval: false` or per-tool overrides. diff --git a/apps/docs/skills/github-tools-agents/references/eve-extension.md b/apps/docs/skills/github-tools-agents/references/eve-extension.md index 7d61886..87fac1f 100644 --- a/apps/docs/skills/github-tools-agents/references/eve-extension.md +++ b/apps/docs/skills/github-tools-agents/references/eve-extension.md @@ -55,7 +55,7 @@ export default githubExtension({ }) ``` -`execute`, `toModelOutput`, and `approval` are direct `defineTool` properties whose callbacks only close over the tool name (a spread or `resolveEveApproval(...)` call is not stamped). `toModelOutput` also strips `rateLimit` from the model-facing payload. Author `overrides.toModelOutput` inline in the agent — a library function will not get a durable descriptor on eve 0.44+, and the resolver then drops every `github__*` tool. Execute failures return `{ error }` so the model still receives a `tool_result`. Requires `eve` `>=0.44`. +`execute`, `toModelOutput`, and `approval` are direct `defineTool` properties whose callbacks only close over the tool name (a spread or `resolveEveApproval(...)` call is not stamped). `toModelOutput` also strips `rateLimit` from the model-facing payload. Author `overrides.toModelOutput` inline in the agent — a library function will not get a durable descriptor on eve 0.44+, and the resolver then drops every `github__*` tool. Execute failures return `{ error }` so the model still receives a `tool_result` — a structured `{ code, message, why, fix }` object for catalog errors (e.g. `github_tools.NOT_FOUND` explains GitHub masks no-access private repos as 404), a plain string otherwise. Requires `eve` `>=0.44`. ## Approval diff --git a/packages/github-tools-eve-extension/extension/tools/github.ts b/packages/github-tools-eve-extension/extension/tools/github.ts index a87cb4b..46830b2 100644 --- a/packages/github-tools-eve-extension/extension/tools/github.ts +++ b/packages/github-tools-eve-extension/extension/tools/github.ts @@ -2,6 +2,7 @@ import { connectGithubToken } from '@github-tools/sdk/connect' import { executeGithubEveTool, formatGithubEveToolOutput, + githubToolsErrors, GITHUB_WRITE_TOOLS, isEveApprovalDisabled, listEveToolDescriptors, @@ -97,7 +98,7 @@ function writeToolName(name: GithubToolName): GithubWriteToolName | undefined { function requireToolContext(ctx: ToolContext | undefined): ToolContext { if (!ctx) { - throw new Error('connect.subject resolver needs the tool execution context — it is only available while a tool call executes') + throw githubToolsErrors.SUBJECT_CONTEXT_REQUIRED() } return ctx } diff --git a/packages/github-tools/README.md b/packages/github-tools/README.md index 09df04a..7c86852 100644 --- a/packages/github-tools/README.md +++ b/packages/github-tools/README.md @@ -198,6 +198,14 @@ result.rateLimit?.remaining `resource` is `core`, `search`, or `graphql`. On HTTP 403/429 the thrown error message also includes remaining/reset. +## Errors + +Classifiable failures become structured [evlog](https://evlog.dev) catalog errors with a stable `code`, a `why` (technical cause), and a `fix` (actionable remedy) — written so a model recovers instead of hallucinating. The two causes models get wrong most often are spelled out: GitHub answers 404 for private resources the token cannot see (`NOT_FOUND`), and an expired `VERCEL_OIDC_TOKEN` is caught before any request with the exact expiry time (`OIDC_TOKEN_EXPIRED`) instead of surfacing as an opaque Connect 403. + +Codes: `TOKEN_REQUIRED`, `OIDC_TOKEN_EXPIRED`, `CONNECT_NOT_AUTHORIZED`, `CONNECT_USER_NOT_CONNECTED`, `CONNECT_INSTALLATION_REQUIRED`, `SUBJECT_CONTEXT_REQUIRED`, `UNAUTHORIZED` (401), `FORBIDDEN` (403), `RATE_LIMITED` (403/429), `NOT_FOUND` (404), `VALIDATION_FAILED` (422). Unmapped statuses pass through unchanged; the original Octokit error stays reachable as `cause`. + +In the eve extension, a failing tool returns `{ error: { code, message, why, fix } }` to the model. With `generateText`/`streamText`, the framework forwards `error.message` (self-sufficient by design); use evlog's `parseError(error)` when you need the full structure. The catalog is exported as `githubToolsErrors`. See the [errors guide](https://github-tools.com/guide/errors). + ## Commit Attribution Control how commits are attributed when using `createOrUpdateFile` or `mergePullRequest`: diff --git a/packages/github-tools/package.json b/packages/github-tools/package.json index 732ab8a..db87dec 100644 --- a/packages/github-tools/package.json +++ b/packages/github-tools/package.json @@ -67,6 +67,7 @@ ], "license": "MIT", "dependencies": { + "evlog": "^2.27.1", "octokit": "^5.0.5" }, "peerDependencies": { diff --git a/packages/github-tools/src/client.ts b/packages/github-tools/src/client.ts index 2b8833c..f359bd5 100644 --- a/packages/github-tools/src/client.ts +++ b/packages/github-tools/src/client.ts @@ -1,6 +1,6 @@ import { Octokit } from 'octokit' +import { toGithubToolsError } from './core/errors' import { - enrichGithubRateLimitError, finishGithubResult, parseGithubRateLimit, recordGithubRateLimit, @@ -32,7 +32,7 @@ export function createOctokit(token: string): Octokit { octokit.hook.error('request', (error) => { const rateLimit = parseGithubRateLimit(errorResponseHeaders(error)) if (rateLimit) recordGithubRateLimit(octokit, errorResponseHeaders(error)) - throw enrichGithubRateLimitError(error, rateLimit) + throw toGithubToolsError(error, rateLimit) }) return octokit diff --git a/packages/github-tools/src/connect/token.test.ts b/packages/github-tools/src/connect/token.test.ts index cc91e0b..539ed1d 100644 --- a/packages/github-tools/src/connect/token.test.ts +++ b/packages/github-tools/src/connect/token.test.ts @@ -1,15 +1,38 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -const { getToken } = vi.hoisted(() => ({ - getToken: vi.fn(async () => 'ghs_connect_token'), -})) +const { getToken, ConnectError, UserAuthorizationRequiredError, ConnectorInstallationRequiredError } = vi.hoisted(() => { + class ConnectError extends Error { + readonly status?: number + constructor(message: string, options?: { status?: number }) { + super(message) + this.status = options?.status + } + } + class UserAuthorizationRequiredError extends ConnectError {} + class ConnectorInstallationRequiredError extends ConnectError {} + return { + getToken: vi.fn(async () => 'ghs_connect_token'), + ConnectError, + UserAuthorizationRequiredError, + ConnectorInstallationRequiredError, + } +}) vi.mock('@vercel/connect', () => ({ getToken, + ConnectError, + UserAuthorizationRequiredError, + ConnectorInstallationRequiredError, })) import { connectGithubToken } from './token' +function fakeJwt(expiresAt: Date): string { + const encode = (value: object) => Buffer.from(JSON.stringify(value)).toString('base64url') + const exp = Math.floor(expiresAt.getTime() / 1000) + return `${encode({ alg: 'none' })}.${encode({ exp })}.signature` +} + function resolveConnectToken( connector: Parameters[0], options?: Parameters[1], @@ -189,6 +212,68 @@ describe('connectGithubToken', () => { ) }) + it('throws OIDC_TOKEN_EXPIRED for an expired VERCEL_OIDC_TOKEN without calling Connect', async () => { + const expiredAt = new Date('2026-01-01T00:00:00.000Z') + vi.stubEnv('VERCEL_OIDC_TOKEN', fakeJwt(expiredAt)) + const resolve = resolveConnectToken('github/my-connector', { preset: 'repo-explorer' }) + + await expect(resolve()).rejects.toMatchObject({ + code: 'github_tools.OIDC_TOKEN_EXPIRED', + message: expect.stringContaining('2026-01-01T00:00:00.000Z'), + fix: expect.stringContaining('vercel env pull'), + }) + expect(getToken).not.toHaveBeenCalled() + vi.unstubAllEnvs() + }) + + it('passes a still-valid VERCEL_OIDC_TOKEN through unchanged', async () => { + const token = fakeJwt(new Date(Date.now() + 3_600_000)) + vi.stubEnv('VERCEL_OIDC_TOKEN', token) + const resolve = resolveConnectToken('github/my-connector', { preset: 'repo-explorer' }) + + await resolve() + expect(getToken).toHaveBeenCalledWith( + 'github/my-connector', + expect.anything(), + { vercelToken: token }, + ) + vi.unstubAllEnvs() + }) + + it('maps UserAuthorizationRequiredError to CONNECT_USER_NOT_CONNECTED with the subject id', async () => { + getToken.mockRejectedValueOnce(new UserAuthorizationRequiredError('authorization required')) + const resolve = resolveConnectToken('github/my-connector', { + preset: 'issue-triage', + params: { subject: { type: 'user', id: 'user_123' } }, + }) + + await expect(resolve()).rejects.toMatchObject({ + code: 'github_tools.CONNECT_USER_NOT_CONNECTED', + message: expect.stringContaining('user_123'), + fix: expect.stringContaining('connect their GitHub account'), + }) + }) + + it('maps ConnectorInstallationRequiredError to CONNECT_INSTALLATION_REQUIRED', async () => { + getToken.mockRejectedValueOnce(new ConnectorInstallationRequiredError('installation required')) + const resolve = resolveConnectToken('github/my-connector', { preset: 'issue-triage' }) + + await expect(resolve()).rejects.toMatchObject({ + code: 'github_tools.CONNECT_INSTALLATION_REQUIRED', + message: expect.stringContaining('installation required'), + }) + }) + + it('maps a Connect 403 to CONNECT_NOT_AUTHORIZED and names the process identity', async () => { + getToken.mockRejectedValueOnce(new ConnectError('Not authorized', { status: 403 })) + const resolve = resolveConnectToken('github/my-connector', { preset: 'issue-triage' }) + + await expect(resolve()).rejects.toMatchObject({ + code: 'github_tools.CONNECT_NOT_AUTHORIZED', + why: expect.stringContaining('never reached GitHub'), + }) + }) + it('re-resolves a function connector on every call', async () => { let env = 'preview' const connectorFn = vi.fn(() => `github/${env}-connector`) diff --git a/packages/github-tools/src/connect/token.ts b/packages/github-tools/src/connect/token.ts index 938ba91..f4b7a3c 100644 --- a/packages/github-tools/src/connect/token.ts +++ b/packages/github-tools/src/connect/token.ts @@ -1,4 +1,12 @@ -import { getToken, type ConnectOptions } from '@vercel/connect' +import { + ConnectError, + ConnectorInstallationRequiredError, + getToken, + UserAuthorizationRequiredError, + type ConnectOptions, + type ConnectTokenParams, +} from '@vercel/connect' +import { githubToolsErrors } from '../core/errors' import type { GithubTokenInput } from '../core/token' import { resolveGithubConnector, type GithubConnectorInput } from './connector' import { resolveGithubConnectTokenParams } from './params' @@ -20,20 +28,72 @@ export function connectGithubToken( const { connectOptions } = options const tokenParams = resolveGithubConnectTokenParams(options) - return async () => getToken( - await resolveGithubConnector(connector), - tokenParams, - resolveConnectOptions(connectOptions), - ) + return async () => { + try { + return await getToken( + await resolveGithubConnector(connector), + tokenParams, + resolveConnectOptions(connectOptions), + ) + } + catch (error) { + throw toConnectCatalogError(error, tokenParams) + } + } +} + +/** + * Map @vercel/connect failures to catalog errors so models get the actual + * cause (process identity, missing user connection, missing installation) + * instead of a bare "Not authorized" they misread as GitHub permissions. + */ +function toConnectCatalogError(error: unknown, tokenParams: ConnectTokenParams): unknown { + if (error instanceof UserAuthorizationRequiredError) { + const subjectId = tokenParams.subject.type === 'user' ? tokenParams.subject.id : tokenParams.subject.type + return githubToolsErrors.CONNECT_USER_NOT_CONNECTED({ subjectId, cause: error }) + } + if (error instanceof ConnectorInstallationRequiredError) { + return githubToolsErrors.CONNECT_INSTALLATION_REQUIRED({ detail: error.message, cause: error }) + } + if (error instanceof ConnectError && error.status === 403) { + return githubToolsErrors.CONNECT_NOT_AUTHORIZED({ detail: error.message, cause: error }) + } + return error +} + +/** + * Best-effort JWT `exp` claim, in epoch seconds. Returns undefined for + * malformed tokens — Connect then rejects them with its own error. + */ +function oidcTokenExpiry(token: string): number | undefined { + const payload = token.split('.')[1] + if (!payload) return undefined + try { + const claims: unknown = JSON.parse(Buffer.from(payload, 'base64url').toString()) + if (claims == null || typeof claims !== 'object' || !('exp' in claims)) return undefined + return typeof claims.exp === 'number' ? claims.exp : undefined + } + catch { + return undefined + } } /** * Prefer an explicit `vercelToken`, then `VERCEL_OIDC_TOKEN` from the environment. * Passing the env token into `getToken` skips `@vercel/oidc`'s project-root walk, * which fails inside eve/workflow snapshots that have no `.vercel` directory. + * + * Pinning also disables refresh, so an expired token fails loudly here instead + * of surfacing as an opaque Connect 403 the model misreads as GitHub permissions. */ function resolveConnectOptions(connectOptions?: ConnectOptions): ConnectOptions | undefined { const vercelToken = connectOptions?.vercelToken ?? process.env.VERCEL_OIDC_TOKEN + if (vercelToken) { + const exp = oidcTokenExpiry(vercelToken) + if (exp !== undefined && exp * 1000 <= Date.now()) { + throw githubToolsErrors.OIDC_TOKEN_EXPIRED({ expiredAt: new Date(exp * 1000).toISOString() }) + } + } if (!vercelToken && !connectOptions) return undefined return { ...vercelToken ? { vercelToken } : {}, diff --git a/packages/github-tools/src/core/errors.test.ts b/packages/github-tools/src/core/errors.test.ts new file mode 100644 index 0000000..519a773 --- /dev/null +++ b/packages/github-tools/src/core/errors.test.ts @@ -0,0 +1,84 @@ +import { describe, expect, it } from 'vitest' +import { EvlogError, githubToolsErrors, toGithubToolsError, toModelErrorPayload } from './errors' + +function requestError(status: number, message: string) { + return Object.assign(new Error(message), { + status, + request: { method: 'GET', url: 'https://api.github.com/repos/o/r' }, + }) +} + +const rateLimit = { remaining: 0, limit: 5000, reset: 1774800000, resource: 'core' } + +describe('toGithubToolsError', () => { + it('maps 401 to UNAUTHORIZED with the original error as cause', () => { + const original = requestError(401, 'Bad credentials') + const mapped = toGithubToolsError(original, undefined) + + expect(EvlogError.isEvlogError(mapped)).toBe(true) + const error = mapped as EvlogError + expect(error.code).toBe('github_tools.UNAUTHORIZED') + expect(error.message).toContain('Bad credentials') + expect(error.cause).toBe(original) + expect(error.internal).toMatchObject({ status: 401, url: 'https://api.github.com/repos/o/r' }) + }) + + it('maps 404 to NOT_FOUND and names the hidden-access cause', () => { + const mapped = toGithubToolsError(requestError(404, 'Not Found'), undefined) as EvlogError + expect(mapped.code).toBe('github_tools.NOT_FOUND') + expect(mapped.why).toContain('404 instead of 403') + }) + + it('maps 422 to VALIDATION_FAILED with the GitHub message embedded', () => { + const mapped = toGithubToolsError(requestError(422, 'Reference already exists'), undefined) as EvlogError + expect(mapped.code).toBe('github_tools.VALIDATION_FAILED') + expect(mapped.message).toContain('Reference already exists') + }) + + it('maps an exhausted 403 to RATE_LIMITED with the reset suffix', () => { + const mapped = toGithubToolsError(requestError(403, 'API rate limit exceeded'), rateLimit) as EvlogError + expect(mapped.code).toBe('github_tools.RATE_LIMITED') + expect(mapped.message).toContain('GitHub rate limit core: 0/5000 remaining, resets at 1774800000') + }) + + it('maps 429 to RATE_LIMITED even without headers', () => { + const mapped = toGithubToolsError(requestError(429, 'Too many requests'), undefined) as EvlogError + expect(mapped.code).toBe('github_tools.RATE_LIMITED') + }) + + it('maps a non-rate-limit 403 to FORBIDDEN', () => { + const mapped = toGithubToolsError( + requestError(403, 'Resource not accessible by integration'), + { ...rateLimit, remaining: 4800 }, + ) as EvlogError + expect(mapped.code).toBe('github_tools.FORBIDDEN') + expect(mapped.why).toContain('installation token') + }) + + it('passes unmapped statuses through unchanged', () => { + const original = requestError(502, 'Server error') + expect(toGithubToolsError(original, undefined)).toBe(original) + }) + + it('passes non-error values through unchanged', () => { + expect(toGithubToolsError('boom', undefined)).toBe('boom') + }) +}) + +describe('toModelErrorPayload', () => { + it('projects code, message, why, and fix but never internal or link', () => { + const error = githubToolsErrors.NOT_FOUND({ + detail: 'Not Found', + internal: { status: 404 }, + }) + const payload = toModelErrorPayload(error) + + expect(payload.code).toBe('github_tools.NOT_FOUND') + expect(payload.message).toContain('Not Found') + expect(payload.why).toBeDefined() + expect(payload.fix).toBeDefined() + expect(payload).not.toHaveProperty('internal') + expect(payload).not.toHaveProperty('link') + expect(payload).not.toHaveProperty('status') + }) +}) diff --git a/packages/github-tools/src/core/errors.ts b/packages/github-tools/src/core/errors.ts new file mode 100644 index 0000000..2f50c85 --- /dev/null +++ b/packages/github-tools/src/core/errors.ts @@ -0,0 +1,135 @@ +import { defineErrorCatalog, EvlogError } from 'evlog' +import { formatRateLimitSuffix, type GithubRateLimit } from './rate-limit' + +/** + * Structured error catalog for every failure the SDK can surface to a model + * or a consumer. Each entry carries `why` (technical cause) and `fix` + * (actionable remedy) so agents can recover instead of guessing — a bare + * "Not authorized" reads as "the repo is private" to a model; the catalog + * version names the real cause. + */ +export const githubToolsErrors = defineErrorCatalog('github_tools', { + TOKEN_REQUIRED: { + status: 401, + message: 'GitHub token is required. Pass it as `token` or set the GITHUB_TOKEN environment variable.', + why: 'No token string, async token provider, or GITHUB_TOKEN environment variable was available when the tool resolved its GitHub credentials.', + fix: 'Pass `token` (a PAT string or async provider) when creating the tools, set GITHUB_TOKEN, or configure a Vercel Connect `connector`.', + }, + OIDC_TOKEN_EXPIRED: { + status: 401, + message: ({ expiredAt }: { expiredAt: string }) => + `VERCEL_OIDC_TOKEN expired at ${expiredAt}; Vercel Connect would reject it, so no GitHub request was made.`, + why: 'The SDK pins the VERCEL_OIDC_TOKEN environment token when it is set (skipping @vercel/oidc\'s project-root walk, which fails inside eve/workflow snapshots), so an expired env token is never refreshed automatically.', + fix: 'Locally: run `vercel env pull` to refresh .env.local. On Vercel: deployments inject a fresh token — check nothing overrides VERCEL_OIDC_TOKEN with a stale value.', + }, + CONNECT_NOT_AUTHORIZED: { + status: 403, + message: ({ detail }: { detail: string }) => + `Vercel Connect refused to mint a GitHub token: ${detail}`, + why: 'Connect rejected the identity of the calling process (the Vercel OIDC token), not the GitHub permissions — the request never reached GitHub.', + fix: 'Refresh the OIDC token (`vercel env pull` locally) and check the connector is linked to the Vercel project this code runs in.', + }, + CONNECT_USER_NOT_CONNECTED: { + status: 401, + message: ({ subjectId }: { subjectId: string }) => + `No active GitHub connection for user "${subjectId}".`, + why: 'The Connect token was requested with a user subject, but that user has not connected their GitHub account to this connector (or revoked the authorization).', + fix: 'Have the user connect their GitHub account (e.g. from the integrations panel), then retry.', + }, + CONNECT_INSTALLATION_REQUIRED: { + status: 401, + message: ({ detail }: { detail: string }) => + `The Connect connector has no usable GitHub App installation: ${detail}`, + why: 'The connector exists but its GitHub App is not installed on the target org or user account.', + fix: 'Install the connector\'s GitHub App on the org or account the agent needs, from the Vercel Connect dashboard.', + }, + SUBJECT_CONTEXT_REQUIRED: { + status: 500, + message: 'connect.subject resolver needs the tool execution context — it is only available while a tool call executes.', + why: 'The per-caller subject resolver was invoked without an eve ToolContext, which only exists during tool execution.', + fix: 'Keep `connect.subject` resolution on the tool execute path; use a static subject when no execution context is available.', + }, + UNAUTHORIZED: { + status: 401, + message: ({ detail }: { detail: string }) => `GitHub rejected the credentials (401): ${detail}`, + why: 'The GitHub token is invalid, expired, or revoked.', + fix: 'Rotate the credential: regenerate the PAT or re-mint the installation token, then update the token source.', + }, + FORBIDDEN: { + status: 403, + message: ({ detail }: { detail: string }) => `GitHub refused the request (403): ${detail}`, + why: 'The token authenticated but lacks permission: a missing scope on this resource, SAML SSO enforcement, or an API that only accepts user access tokens (gists, notifications) called with an installation token.', + fix: 'Grant the missing permission on the PAT or GitHub App installation; authorize the token for SAML if the org enforces it; use a user access token for gist and notification tools.', + }, + RATE_LIMITED: { + status: 429, + message: ({ detail }: { detail: string }) => `GitHub rate limit exhausted: ${detail}`, + why: 'The token used up its GitHub API rate limit for this resource.', + fix: 'Stop calling this tool and retry after the reset timestamp in the message; batch reads or narrow the query to spend fewer requests.', + }, + NOT_FOUND: { + status: 404, + message: ({ detail }: { detail: string }) => `GitHub resource not found (404): ${detail}`, + why: 'Either the resource does not exist, or the token cannot see it — GitHub deliberately returns 404 instead of 403 for private resources the token has no access to.', + fix: 'Check the owner/repo/number input first. If it is correct, the token lacks access: grant the repository to the PAT or App installation, or use a Connect subject that has access.', + }, + VALIDATION_FAILED: { + status: 422, + message: ({ detail }: { detail: string }) => `GitHub rejected the request as invalid (422): ${detail}`, + why: 'The input was well-formed but GitHub refused it — a duplicate resource, an immutable state transition, or an unresolvable ref.', + fix: 'The embedded GitHub message names the offending field or state; adjust the input and retry.', + }, +}) + +declare module 'evlog' { + interface RegisteredErrorCatalogs { + github_tools: typeof githubToolsErrors + } +} + +function errorStatus(error: unknown): number | undefined { + if (error == null || typeof error !== 'object' || !('status' in error)) return undefined + const status = (error as { status?: unknown }).status + return typeof status === 'number' ? status : undefined +} + +function requestTarget(error: Error): Record { + const request = (error as { request?: { method?: string, url?: string } }).request + return request?.url ? { method: request.method, url: request.url } : {} +} + +/** + * Map an Octokit request error to a catalog error by HTTP status. Statuses + * without a dedicated entry (5xx, 301, …) pass through unchanged. The original + * error stays reachable as `cause`; request coordinates land in `internal` + * (never serialized toward the model). + */ +export function toGithubToolsError(error: unknown, rateLimit: GithubRateLimit | undefined): unknown { + const status = errorStatus(error) + if (status === undefined || !(error instanceof Error)) return error + + const detail = error.message + const overrides = { cause: error, internal: { status, ...requestTarget(error) } } + + if (status === 401) return githubToolsErrors.UNAUTHORIZED({ detail, ...overrides }) + if (status === 404) return githubToolsErrors.NOT_FOUND({ detail, ...overrides }) + if (status === 422) return githubToolsErrors.VALIDATION_FAILED({ detail, ...overrides }) + if (status === 429 || (status === 403 && rateLimit?.remaining === 0)) { + const suffix = rateLimit ? ` (${formatRateLimitSuffix(rateLimit)})` : '' + return githubToolsErrors.RATE_LIMITED({ detail: `${detail}${suffix}`, ...overrides }) + } + if (status === 403) return githubToolsErrors.FORBIDDEN({ detail, ...overrides }) + return error +} + +/** `{ code, message, why, fix }` projection of an EvlogError for model-facing payloads. */ +export function toModelErrorPayload(error: EvlogError): Record { + return { + ...(error.code ? { code: error.code } : {}), + message: error.message, + ...(error.why ? { why: error.why } : {}), + ...(error.fix ? { fix: error.fix } : {}), + } +} + +export { EvlogError } diff --git a/packages/github-tools/src/core/rate-limit.test.ts b/packages/github-tools/src/core/rate-limit.test.ts index 8ba802c..98f8592 100644 --- a/packages/github-tools/src/core/rate-limit.test.ts +++ b/packages/github-tools/src/core/rate-limit.test.ts @@ -1,6 +1,5 @@ import { describe, expect, it } from 'vitest' import { - enrichGithubRateLimitError, finishGithubResult, parseGithubRateLimit, recordGithubRateLimit, @@ -69,20 +68,6 @@ describe('finishGithubResult', () => { }) }) -describe('enrichGithubRateLimitError', () => { - it('appends remaining/reset on 403 errors', () => { - const error = Object.assign(new Error('API rate limit exceeded'), { status: 403 }) - const parsed = parseGithubRateLimit({ - ...headers, - 'x-ratelimit-remaining': '0', - 'x-ratelimit-resource': 'search', - }) - expect(() => { - throw enrichGithubRateLimitError(error, parsed) - }).toThrow('GitHub rate limit search: 0/5000 remaining, resets at 1774800000') - }) -}) - describe('withComposedRateLimit', () => { it('lifts a nested rateLimit onto the composed object and strips children', () => { expect(withComposedRateLimit({ diff --git a/packages/github-tools/src/core/rate-limit.ts b/packages/github-tools/src/core/rate-limit.ts index b4fa8ad..8a69226 100644 --- a/packages/github-tools/src/core/rate-limit.ts +++ b/packages/github-tools/src/core/rate-limit.ts @@ -101,26 +101,8 @@ export function withComposedRateLimit>(result: return attachRateLimit(stripRateLimitDeep(result), pickRateLimitDeep(result)) } -function errorStatus(error: unknown): number | undefined { - if (error == null || typeof error !== 'object' || !('status' in error)) return undefined - const status = (error as { status?: unknown }).status - return typeof status === 'number' ? status : undefined -} - export function formatRateLimitSuffix(rateLimit: GithubRateLimit): string { const resource = rateLimit.resource ? ` ${rateLimit.resource}` : '' const retry = rateLimit.retryAfter != null ? `, retry after ${rateLimit.retryAfter}s` : '' return `GitHub rate limit${resource}: ${rateLimit.remaining}/${rateLimit.limit} remaining, resets at ${rateLimit.reset}${retry}` } - -export function enrichGithubRateLimitError(error: unknown, rateLimit: GithubRateLimit | undefined): unknown { - const status = errorStatus(error) - if (!rateLimit || (status !== 403 && status !== 429) || !(error instanceof Error)) { - return error - } - const suffix = formatRateLimitSuffix(rateLimit) - if (!error.message.includes(suffix)) { - error.message = `${error.message} (${suffix})` - } - return error -} diff --git a/packages/github-tools/src/core/token.ts b/packages/github-tools/src/core/token.ts index 78f7d9a..3580ecd 100644 --- a/packages/github-tools/src/core/token.ts +++ b/packages/github-tools/src/core/token.ts @@ -1,8 +1,8 @@ +import { githubToolsErrors } from './errors' + export type GithubTokenInput = string | (() => Promise) export type GithubTokenResolver = () => Promise -const TOKEN_REQUIRED_ERROR = 'GitHub token is required. Pass it as `token` or set the GITHUB_TOKEN environment variable.' - /** * Normalizes a token string, async token provider, or `process.env.GITHUB_TOKEN` * into a `() => Promise` resolver. @@ -15,7 +15,7 @@ export function createGithubTokenResolver(token?: GithubTokenInput): GithubToken return async () => { const resolvedToken = await token() if (!resolvedToken) { - throw new Error(TOKEN_REQUIRED_ERROR) + throw githubToolsErrors.TOKEN_REQUIRED() } return resolvedToken } @@ -23,7 +23,7 @@ export function createGithubTokenResolver(token?: GithubTokenInput): GithubToken const resolvedToken = token || process.env.GITHUB_TOKEN if (!resolvedToken) { - throw new Error(TOKEN_REQUIRED_ERROR) + throw githubToolsErrors.TOKEN_REQUIRED() } return async () => resolvedToken } diff --git a/packages/github-tools/src/eve-runtime.ts b/packages/github-tools/src/eve-runtime.ts index 8936678..3e1b760 100644 --- a/packages/github-tools/src/eve-runtime.ts +++ b/packages/github-tools/src/eve-runtime.ts @@ -17,6 +17,7 @@ export { } from './eve/build' export { mapEveApprovalValue, resolveEveApproval, resolveEveToolApproval, isEveApprovalDisabled } from './eve/approval' export { resolveGithubToken } from './core/token' +export { githubToolsErrors } from './core/errors' export type { EveApprovalConfig, EveApprovalValue, diff --git a/packages/github-tools/src/eve/steps.test.ts b/packages/github-tools/src/eve/steps.test.ts new file mode 100644 index 0000000..41f4684 --- /dev/null +++ b/packages/github-tools/src/eve/steps.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, it } from 'vitest' +import type { GithubToolName } from './registry' +import { runGithubToolStep } from './steps' + +describe('runGithubToolStep error payloads', () => { + it('returns the structured { code, message, why, fix } payload for catalog errors', async () => { + const result = await runGithubToolStep('getRepository', { owner: 'o', repo: 'r' }, { + token: async () => '', + }) + + expect(result).toMatchObject({ + error: { + code: 'github_tools.TOKEN_REQUIRED', + message: expect.stringContaining('GitHub token is required'), + why: expect.any(String), + fix: expect.any(String), + }, + }) + }) + + it('keeps the plain message string for non-catalog errors', async () => { + const result = await runGithubToolStep('nonexistentTool' as GithubToolName, {}, { token: 'ghp_x' }) + + expect(result).toEqual({ error: 'Unknown GitHub tool: nonexistentTool' }) + }) +}) diff --git a/packages/github-tools/src/eve/steps.ts b/packages/github-tools/src/eve/steps.ts index 69f06b0..00badbe 100644 --- a/packages/github-tools/src/eve/steps.ts +++ b/packages/github-tools/src/eve/steps.ts @@ -1,3 +1,4 @@ +import { EvlogError, toModelErrorPayload } from '../core/errors' import { resolveGithubToken } from '../core/token' import { createToolRegistry, type GithubToolName, type ToolBuildContext } from './registry' @@ -26,6 +27,10 @@ export async function runGithubToolStep( } catch (error) { // Eve's tool-loop logs thrown execute errors but does not always append a // tool_result. Returning a payload keeps the Anthropic tool_use/tool_result pairing intact. + // Catalog errors keep their { code, why, fix } structure so the model can recover. + if (EvlogError.isEvlogError(error)) { + return { error: toModelErrorPayload(error) } + } return { error: error instanceof Error ? error.message : String(error) } } } diff --git a/packages/github-tools/src/index.ts b/packages/github-tools/src/index.ts index 2a27419..6717fb5 100644 --- a/packages/github-tools/src/index.ts +++ b/packages/github-tools/src/index.ts @@ -254,6 +254,7 @@ export { listCheckRuns, getCombinedStatus } from './tools/checks' export { listReleases, getLatestRelease, getRelease, createRelease, updateRelease, deleteRelease } from './tools/releases' export { getPullRequestContext, getIssueContext, getReleaseContext, getCiFailureContext } from './tools/bundles' export type { GithubRateLimit } from './core/rate-limit' +export { githubToolsErrors } from './core/errors' export type { CommitIdentity, CommitToolOptions, GithubTool, Octokit, ToolOptions, ToolOverrides } from './types' export type { GithubTokenInput } from './core/token' export { resolveGithubToken } from './core/token' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 629345e..1d505f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,16 +51,16 @@ importers: version: 0.17.4 '@nuxt/fonts': specifier: ^0.14.0 - version: 0.14.0(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(esbuild@0.28.1)(ioredis@5.11.1)(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 0.14.0(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(esbuild@0.28.1)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) '@nuxt/ui': specifier: ^4.10.0 - version: 4.10.0(4bad439c7fbe17971c438a32f8c5922c) + version: 4.10.0(ecd0ef0df55382a3ba458109e6ba85c1) '@nuxthub/core': specifier: ^0.10.8 - version: 0.10.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(ioredis@5.11.1)(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vue-tsc@3.3.9(typescript@6.0.3)) + version: 0.10.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vue-tsc@3.3.9(typescript@6.0.3)) '@nuxtjs/mdc': specifier: ^0.22.2 - version: 0.22.2(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + version: 0.22.2(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@vercel/blob': specifier: ^2.6.1 version: 2.6.1 @@ -124,7 +124,7 @@ importers: devDependencies: '@nuxt/eslint': specifier: ^1.16.0 - version: 1.16.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(eslint@10.8.0(jiti@2.7.0))(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(srvx@0.12.7)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 1.16.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(eslint@10.8.0(jiti@2.7.0))(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(srvx@0.12.7)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) '@types/node': specifier: ^26.1.2 version: 26.1.2 @@ -250,6 +250,9 @@ importers: '@workflow/ai': specifier: ^4.1.2 version: 4.1.2(@opentelemetry/api@1.9.0)(ai@7.0.70(zod@4.4.3))(workflow@4.5.0(@nestjs/common@11.1.18(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.18(@nestjs/common@11.1.18(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2))(@opentelemetry/api@1.9.0)(@swc/cli@0.8.1(@swc/core@1.15.3(@swc/helpers@0.5.23))(chokidar@5.0.0))(@swc/core@1.15.3(@swc/helpers@0.5.23))(@swc/helpers@0.5.23)(magicast@0.5.4)(typescript@6.0.3)) + evlog: + specifier: ^2.27.1 + version: 2.27.1(a55e5edf6fb1cd3c0754537981e07318) octokit: specifier: ^5.0.5 version: 5.0.5 @@ -274,7 +277,7 @@ importers: version: 26.1.2 '@vercel/connect': specifier: ^0.6.1 - version: 0.6.1(@ai-sdk/mcp@2.0.40(zod@4.4.3))(ai@7.0.70(zod@4.4.3))(eve@0.46.1(@opentelemetry/api@1.9.0)(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + version: 0.6.1(@ai-sdk/mcp@2.0.40(zod@4.4.3))(ai@7.0.70(zod@4.4.3))(eve@0.46.1(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(better-sqlite3@12.11.1)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) ai: specifier: ^7.0.58 version: 7.0.70(zod@4.4.3) @@ -283,7 +286,7 @@ importers: version: 10.8.0(jiti@2.7.0) eve: specifier: ^0.46.1 - version: 0.46.1(@opentelemetry/api@1.9.0)(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 0.46.1(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(better-sqlite3@12.11.1)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) tsdown: specifier: ^0.22.14 version: 0.22.14(@volar/typescript@2.4.28)(tsx@4.21.0)(typescript@6.0.3)(unrun@0.2.39)(vue-tsc@3.3.9(typescript@6.0.3)) @@ -14449,10 +14452,10 @@ snapshots: - magicast - supports-color - '@nuxt/content@3.16.0(@libsql/client@0.17.4)(@oxc-project/types@0.143.0)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(esbuild@0.28.1)(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(valibot@1.4.2(typescript@6.0.3))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': + '@nuxt/content@3.16.0(@libsql/client@0.17.4)(@oxc-project/types@0.143.0)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(esbuild@0.28.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(valibot@1.4.2(typescript@6.0.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@nuxt/kit': 4.5.2(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) - '@nuxtjs/mdc': 0.23.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxtjs/mdc': 0.23.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@shikijs/langs': 4.4.3 '@sqlite.org/sqlite-wasm': 3.53.0-build1 '@standard-schema/spec': 1.1.0 @@ -14479,7 +14482,7 @@ snapshots: micromatch: 4.0.8 minimark: 0.2.0 minimatch: 10.2.6 - nuxt-component-meta: 0.18.0(@oxc-project/types@0.143.0)(magicast@0.5.4)(rolldown@1.2.2) + nuxt-component-meta: 0.18.0(@oxc-project/types@0.143.0)(magicast@0.5.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)) nypm: 0.6.9 ohash: 2.0.12 pathe: 2.0.3 @@ -14492,11 +14495,11 @@ snapshots: std-env: 4.2.0 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.1(magic-string@1.1.0)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + unctx: 3.0.1(magic-string@0.30.21)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) unified: 11.0.5 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.1.0 - unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) zod: 3.25.76 zod-to-json-schema: 3.25.2(zod@3.25.76) optionalDependencies: @@ -14521,11 +14524,12 @@ snapshots: - utf-8-validate - vite - webpack + optional: true - '@nuxt/content@3.16.0(@libsql/client@0.17.4)(@oxc-project/types@0.143.0)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(esbuild@0.28.1)(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(valibot@1.4.2(typescript@6.0.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': + '@nuxt/content@3.16.0(@libsql/client@0.17.4)(@oxc-project/types@0.143.0)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(esbuild@0.28.1)(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(valibot@1.4.2(typescript@6.0.3))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@nuxt/kit': 4.5.2(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) - '@nuxtjs/mdc': 0.23.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxtjs/mdc': 0.23.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@shikijs/langs': 4.4.3 '@sqlite.org/sqlite-wasm': 3.53.0-build1 '@standard-schema/spec': 1.1.0 @@ -14552,7 +14556,7 @@ snapshots: micromatch: 4.0.8 minimark: 0.2.0 minimatch: 10.2.6 - nuxt-component-meta: 0.18.0(@oxc-project/types@0.143.0)(magicast@0.5.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)) + nuxt-component-meta: 0.18.0(@oxc-project/types@0.143.0)(magicast@0.5.4)(rolldown@1.2.2) nypm: 0.6.9 ohash: 2.0.12 pathe: 2.0.3 @@ -14565,11 +14569,11 @@ snapshots: std-env: 4.2.0 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.1(magic-string@1.2.3)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + unctx: 3.0.1(magic-string@1.1.0)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) unified: 11.0.5 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.1.0 - unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) zod: 3.25.76 zod-to-json-schema: 3.25.2(zod@3.25.76) optionalDependencies: @@ -14594,13 +14598,12 @@ snapshots: - utf-8-validate - vite - webpack - optional: true '@nuxt/devalue@2.0.2': {} '@nuxt/devtools-kit@3.4.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) execa: 8.0.1 vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: @@ -14646,18 +14649,6 @@ snapshots: - rolldown - unplugin - '@nuxt/devtools-kit@3.4.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': - dependencies: - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) - execa: 8.0.1 - vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0) - transitivePeerDependencies: - - magic-string - - magicast - - oxc-parser - - rolldown - - unplugin - '@nuxt/devtools-kit@3.4.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) @@ -14887,13 +14878,13 @@ snapshots: - supports-color - typescript - '@nuxt/eslint@1.16.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(eslint@10.8.0(jiti@2.7.0))(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(srvx@0.11.22)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': + '@nuxt/eslint@1.16.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(eslint@10.8.0(jiti@2.7.0))(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(srvx@0.12.7)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@eslint/config-inspector': 3.1.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(eslint@10.8.0(jiti@2.7.0))(srvx@0.11.22)(typescript@6.0.3) - '@nuxt/devtools-kit': 3.4.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + '@eslint/config-inspector': 3.1.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(eslint@10.8.0(jiti@2.7.0))(srvx@0.12.7)(typescript@6.0.3) + '@nuxt/devtools-kit': 3.4.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) '@nuxt/eslint-config': 1.16.0(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) '@nuxt/eslint-plugin': 1.16.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) - '@nuxt/kit': 4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) chokidar: 5.0.0 eslint: 10.8.0(jiti@2.7.0) eslint-flat-config-utils: 3.2.0 @@ -14902,7 +14893,7 @@ snapshots: get-port-please: 3.2.0 mlly: 1.8.2 pathe: 2.0.3 - unimport: 6.4.0(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unimport: 6.4.0(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - '@farmfe/core' - '@modelcontextprotocol/sdk' @@ -14926,13 +14917,13 @@ snapshots: - vite - webpack - '@nuxt/eslint@1.16.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(eslint@10.8.0(jiti@2.7.0))(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(srvx@0.12.7)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': + '@nuxt/eslint@1.16.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(eslint@10.8.0(jiti@2.7.0))(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(srvx@0.11.22)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@eslint/config-inspector': 3.1.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(eslint@10.8.0(jiti@2.7.0))(srvx@0.12.7)(typescript@6.0.3) - '@nuxt/devtools-kit': 3.4.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + '@eslint/config-inspector': 3.1.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(eslint@10.8.0(jiti@2.7.0))(srvx@0.11.22)(typescript@6.0.3) + '@nuxt/devtools-kit': 3.4.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) '@nuxt/eslint-config': 1.16.0(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) '@nuxt/eslint-plugin': 1.16.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) chokidar: 5.0.0 eslint: 10.8.0(jiti@2.7.0) eslint-flat-config-utils: 3.2.0 @@ -14941,7 +14932,7 @@ snapshots: get-port-please: 3.2.0 mlly: 1.8.2 pathe: 2.0.3 - unimport: 6.4.0(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unimport: 6.4.0(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - '@farmfe/core' - '@modelcontextprotocol/sdk' @@ -15118,57 +15109,7 @@ snapshots: '@nuxt/fonts@0.14.0(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(esbuild@0.28.1)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@nuxt/devtools-kit': 3.4.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) - consola: 3.4.2 - defu: 6.1.7 - fontless: 0.2.1(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(ioredis@5.11.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - h3: 1.15.11 - magic-regexp: 0.10.0 - ofetch: 1.5.1 - pathe: 2.0.3 - sirv: 3.0.2 - tinyglobby: 0.2.17 - ufo: 1.6.4 - unifont: 0.7.4 - unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - unstorage: 1.17.5(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(ioredis@5.11.1) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@farmfe/core' - - '@netlify/blobs' - - '@planetscale/database' - - '@rspack/core' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bun-types-no-globals - - db0 - - esbuild - - idb-keyval - - ioredis - - magic-string - - magicast - - oxc-parser - - rolldown - - rollup - - unloader - - uploadthing - - vite - - webpack - - '@nuxt/fonts@0.14.0(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(esbuild@0.28.1)(ioredis@5.11.1)(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))': - dependencies: - '@nuxt/devtools-kit': 3.4.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) consola: 3.4.2 defu: 6.1.7 fontless: 0.2.1(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(ioredis@5.11.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) @@ -15222,7 +15163,7 @@ snapshots: '@iconify/utils': 3.1.4 '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) '@nuxt/devtools-kit': 3.4.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) consola: 3.4.2 local-pkg: 1.2.1 mlly: 1.8.2 @@ -15388,7 +15329,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.4) consola: 3.4.2 @@ -15408,7 +15349,7 @@ snapshots: scule: 1.3.0 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(magic-string@0.30.21)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@0.30.21)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) untyped: 2.0.0 verkit: 0.2.0 transitivePeerDependencies: @@ -15418,7 +15359,7 @@ snapshots: - rolldown - unplugin - '@nuxt/kit@4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.4) consola: 3.4.2 @@ -15438,7 +15379,7 @@ snapshots: scule: 1.3.0 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(magic-string@1.1.0)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@0.30.21)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) untyped: 2.0.0 verkit: 0.2.0 transitivePeerDependencies: @@ -15448,7 +15389,7 @@ snapshots: - rolldown - unplugin - '@nuxt/kit@4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxt/kit@4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.4) consola: 3.4.2 @@ -15468,7 +15409,7 @@ snapshots: scule: 1.3.0 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(magic-string@1.1.0)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@1.1.0)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) untyped: 2.0.0 verkit: 0.2.0 transitivePeerDependencies: @@ -15478,7 +15419,7 @@ snapshots: - rolldown - unplugin - '@nuxt/kit@4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxt/kit@4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.4) consola: 3.4.2 @@ -15498,7 +15439,7 @@ snapshots: scule: 1.3.0 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(magic-string@0.30.21)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@1.1.0)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) untyped: 2.0.0 verkit: 0.2.0 transitivePeerDependencies: @@ -15629,6 +15570,37 @@ snapshots: - rolldown - unplugin + '@nuxt/kit@4.5.2(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + dependencies: + c12: 3.3.4(magicast@0.5.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.12 + pathe: 2.0.3 + pkg-types: 2.3.1 + rc9: 3.0.1 + scule: 1.3.0 + tinyglobby: 0.2.17 + ufo: 1.6.4 + unctx: 3.0.1(magic-string@0.30.21)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + untyped: 2.0.0 + verkit: 0.3.2 + transitivePeerDependencies: + - magic-string + - magicast + - oxc-parser + - rolldown + - unplugin + optional: true + '@nuxt/kit@4.5.2(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.4) @@ -15659,7 +15631,7 @@ snapshots: - rolldown - unplugin - '@nuxt/kit@4.5.2(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxt/kit@4.5.2(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.4) consola: 3.4.2 @@ -15679,7 +15651,7 @@ snapshots: scule: 1.3.0 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.1(magic-string@1.2.3)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + unctx: 3.0.1(magic-string@1.2.3)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) untyped: 2.0.0 verkit: 0.3.2 transitivePeerDependencies: @@ -15916,7 +15888,7 @@ snapshots: '@nuxt/telemetry@2.8.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))': dependencies: - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) citty: 0.2.2 consola: 3.4.2 ofetch: 2.0.0-alpha.3 @@ -15932,18 +15904,18 @@ snapshots: rc9: 3.0.1 std-env: 4.2.0 - '@nuxt/ui@4.10.0(4bad439c7fbe17971c438a32f8c5922c)': + '@nuxt/ui@4.10.0(cc1d3d9f247bf296615cb6a981ca7093)': dependencies: '@floating-ui/dom': 1.8.0 '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) - '@nuxt/fonts': 0.14.0(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(esbuild@0.28.1)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - '@nuxt/icon': 2.4.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/fonts': 0.14.0(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.3.4(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0)))(esbuild@0.28.1)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + '@nuxt/icon': 2.4.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@nuxt/schema': 4.5.1 - '@nuxtjs/color-mode': 4.0.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxtjs/color-mode': 4.0.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.3.3 - '@tailwindcss/vite': 4.3.3(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + '@tailwindcss/vite': 4.3.3(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/vue-table': 8.21.3(vue@3.5.40(typescript@6.0.3)) '@tanstack/vue-virtual': 3.13.35(vue@3.5.40(typescript@6.0.3)) '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) @@ -15993,18 +15965,17 @@ snapshots: tinyglobby: 0.2.17 typescript: 6.0.3 ufo: 1.6.4 - unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - unplugin-auto-import: 21.1.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(@vueuse/core@14.4.0(vue@3.5.40(typescript@6.0.3)))(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - unplugin-vue-components: 32.1.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unplugin-auto-import: 21.1.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(@vueuse/core@14.4.0(vue@3.5.40(typescript@6.0.3)))(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unplugin-vue-components: 32.1.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) vaul-vue: 0.4.1(reka-ui@2.10.1(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) vue-component-type-helpers: 3.3.9 optionalDependencies: '@internationalized/date': 3.12.3 '@internationalized/number': 3.6.7 - '@nuxt/content': 3.16.0(@libsql/client@0.17.4)(@oxc-project/types@0.143.0)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(esbuild@0.28.1)(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(valibot@1.4.2(typescript@6.0.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - ai: 7.0.70(zod@4.4.3) + '@nuxt/content': 3.16.0(@libsql/client@0.17.4)(@oxc-project/types@0.143.0)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(esbuild@0.28.1)(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(valibot@1.4.2(typescript@6.0.3))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + ai: 7.0.84(zod@4.4.3) valibot: 1.4.2(typescript@6.0.3) - vue-router: 5.3.0(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) zod: 4.4.3 transitivePeerDependencies: - '@azure/app-configuration' @@ -16054,18 +16025,18 @@ snapshots: - vue - webpack - '@nuxt/ui@4.10.0(cc1d3d9f247bf296615cb6a981ca7093)': + '@nuxt/ui@4.10.0(ecd0ef0df55382a3ba458109e6ba85c1)': dependencies: '@floating-ui/dom': 1.8.0 '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) - '@nuxt/fonts': 0.14.0(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.3.4(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0)))(esbuild@0.28.1)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - '@nuxt/icon': 2.4.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/fonts': 0.14.0(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(esbuild@0.28.1)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + '@nuxt/icon': 2.4.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@nuxt/schema': 4.5.1 - '@nuxtjs/color-mode': 4.0.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxtjs/color-mode': 4.0.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.3.3 - '@tailwindcss/vite': 4.3.3(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + '@tailwindcss/vite': 4.3.3(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/vue-table': 8.21.3(vue@3.5.40(typescript@6.0.3)) '@tanstack/vue-virtual': 3.13.35(vue@3.5.40(typescript@6.0.3)) '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) @@ -16115,17 +16086,18 @@ snapshots: tinyglobby: 0.2.17 typescript: 6.0.3 ufo: 1.6.4 - unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - unplugin-auto-import: 21.1.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(@vueuse/core@14.4.0(vue@3.5.40(typescript@6.0.3)))(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - unplugin-vue-components: 32.1.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unplugin-auto-import: 21.1.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(@vueuse/core@14.4.0(vue@3.5.40(typescript@6.0.3)))(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unplugin-vue-components: 32.1.0(@nuxt/kit@4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) vaul-vue: 0.4.1(reka-ui@2.10.1(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) vue-component-type-helpers: 3.3.9 optionalDependencies: '@internationalized/date': 3.12.3 '@internationalized/number': 3.6.7 - '@nuxt/content': 3.16.0(@libsql/client@0.17.4)(@oxc-project/types@0.143.0)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(esbuild@0.28.1)(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(valibot@1.4.2(typescript@6.0.3))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - ai: 7.0.84(zod@4.4.3) + '@nuxt/content': 3.16.0(@libsql/client@0.17.4)(@oxc-project/types@0.143.0)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(esbuild@0.28.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(valibot@1.4.2(typescript@6.0.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + ai: 7.0.70(zod@4.4.3) valibot: 1.4.2(typescript@6.0.3) + vue-router: 5.3.0(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) zod: 4.4.3 transitivePeerDependencies: - '@azure/app-configuration' @@ -16425,10 +16397,10 @@ snapshots: - vue-tsc - yaml - '@nuxthub/core@0.10.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(ioredis@5.11.1)(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vue-tsc@3.3.9(typescript@6.0.3))': + '@nuxthub/core@0.10.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.4.0)(ioredis@5.11.1)(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vue-tsc@3.3.9(typescript@6.0.3))': dependencies: '@cloudflare/workers-types': 4.20260702.1 - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@uploadthing/mime-types': 0.3.6 c12: 3.3.4(magicast@0.5.4) chokidar: 5.0.0 @@ -16494,7 +16466,7 @@ snapshots: '@nuxtjs/color-mode@4.0.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) exsolve: 1.1.1 pathe: 2.0.3 pkg-types: 2.3.1 @@ -16627,9 +16599,9 @@ snapshots: - supports-color - unplugin - '@nuxtjs/mdc@0.22.2(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxtjs/mdc@0.22.2(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@shikijs/core': 4.4.1 '@shikijs/engine-javascript': 4.4.1 '@shikijs/langs': 4.4.1 @@ -16681,9 +16653,9 @@ snapshots: - supports-color - unplugin - '@nuxtjs/mdc@0.22.2(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxtjs/mdc@0.22.2(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@shikijs/core': 4.4.1 '@shikijs/engine-javascript': 4.4.1 '@shikijs/langs': 4.4.1 @@ -16735,9 +16707,9 @@ snapshots: - supports-color - unplugin - '@nuxtjs/mdc@0.23.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxtjs/mdc@0.23.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.5.2(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.2(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@shikijs/core': 4.4.3 '@shikijs/engine-javascript': 4.4.3 '@shikijs/langs': 4.4.3 @@ -16788,10 +16760,11 @@ snapshots: - rolldown - supports-color - unplugin + optional: true - '@nuxtjs/mdc@0.23.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@nuxtjs/mdc@0.23.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.5.2(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@shikijs/core': 4.4.3 '@shikijs/engine-javascript': 4.4.3 '@shikijs/langs': 4.4.3 @@ -16842,7 +16815,6 @@ snapshots: - rolldown - supports-color - unplugin - optional: true '@nuxtjs/robots@6.2.0(@nuxt/schema@4.5.2)(magic-string@1.1.0)(magicast@0.5.4)(nuxt@4.5.1(25a97e79706aa3e2a18b2751f0d9f067))(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)': dependencies: @@ -19229,13 +19201,13 @@ snapshots: dependencies: execa: 5.1.1 - '@vercel/connect@0.6.1(@ai-sdk/mcp@2.0.40(zod@4.4.3))(ai@7.0.70(zod@4.4.3))(eve@0.46.1(@opentelemetry/api@1.9.0)(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': + '@vercel/connect@0.6.1(@ai-sdk/mcp@2.0.40(zod@4.4.3))(ai@7.0.70(zod@4.4.3))(eve@0.46.1(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(better-sqlite3@12.11.1)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: '@vercel/oidc': 3.8.2 optionalDependencies: '@ai-sdk/mcp': 2.0.40(zod@4.4.3) ai: 7.0.70(zod@4.4.3) - eve: 0.46.1(@opentelemetry/api@1.9.0)(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + eve: 0.46.1(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(better-sqlite3@12.11.1)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) '@vercel/connect@0.6.1(@ai-sdk/mcp@2.0.40(zod@4.4.3))(ai@7.0.70(zod@4.4.3))(eve@0.46.1(@opentelemetry/api@1.9.0)(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: @@ -22363,10 +22335,10 @@ snapshots: - zephyr-agent optional: true - eve@0.46.1(@opentelemetry/api@1.9.0)(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)): + eve@0.46.1(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(better-sqlite3@12.11.1)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: ai: 7.0.70(zod@4.4.3) - nitro: 3.0.260610-beta(@vercel/queue@0.3.1)(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + nitro: 3.0.260610-beta(@libsql/client@0.17.4)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(@vercel/queue@0.3.1)(better-sqlite3@12.11.1)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) undici: 8.9.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -22536,6 +22508,18 @@ snapshots: ofetch: 2.0.0-alpha.3 vite: 8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0) + evlog@2.27.1(a55e5edf6fb1cd3c0754537981e07318): + optionalDependencies: + '@nuxt/kit': 4.5.2(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + ai: 7.0.70(zod@4.4.3) + eve: 0.46.1(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(@vercel/queue@0.3.1)(ai@7.0.70(zod@4.4.3))(better-sqlite3@12.11.1)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + express: 5.2.1 + h3: 1.15.11 + hono: 4.13.5 + nitropack: 2.13.4(@libsql/client@0.17.4)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(oxc-parser@0.143.0)(rolldown@1.2.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + ofetch: 1.5.1 + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0) + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -23839,6 +23823,28 @@ snapshots: linkifyjs@4.3.3: {} + 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.21) + 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 + transitivePeerDependencies: + - srvx + optional: true + listhen@1.10.1(srvx@0.11.21): dependencies: '@parcel/watcher-wasm': 2.6.0 @@ -24540,7 +24546,7 @@ snapshots: - uploadthing - wrangler - nitro@3.0.260610-beta(@vercel/queue@0.3.1)(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)): + nitro@3.0.260610-beta(@libsql/client@0.17.4)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(@vercel/queue@0.3.1)(better-sqlite3@12.11.1)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(giget@3.3.1)(jiti@2.7.0)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: consola: 3.4.2 crossws: 0.4.9(srvx@0.11.21) @@ -24555,7 +24561,7 @@ snapshots: rolldown: 1.1.4 srvx: 0.11.21 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(ofetch@2.0.0-alpha.3) + unstorage: 2.0.0-alpha.7(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(chokidar@5.0.0)(db0@0.3.4(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0)))(ioredis@5.11.1)(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3) optionalDependencies: '@vercel/queue': 0.3.1 dotenv: 17.4.2 @@ -24610,7 +24616,7 @@ snapshots: rolldown: 1.1.4 srvx: 0.11.21 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(ofetch@2.0.0-alpha.3) + unstorage: 2.0.0-alpha.7(db0@0.3.4)(ofetch@2.0.0-alpha.3) optionalDependencies: '@vercel/queue': 0.3.1 dotenv: 17.4.2 @@ -24665,7 +24671,7 @@ snapshots: rolldown: 1.1.4 srvx: 0.11.21 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(ofetch@2.0.0-alpha.3) + unstorage: 2.0.0-alpha.7(db0@0.3.4)(ofetch@2.0.0-alpha.3) optionalDependencies: '@vercel/queue': 0.3.1 dotenv: 17.4.2 @@ -25042,6 +25048,119 @@ snapshots: - vite - webpack + nitropack@2.13.4(@libsql/client@0.17.4)(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0))(oxc-parser@0.143.0)(rolldown@1.2.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)): + 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 + cookie-es: 2.0.1 + croner: 10.0.1 + crossws: 0.3.5 + db0: 0.3.4(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0)) + 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.2 + 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.2)(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(esbuild@0.28.1)(oxc-parser@0.143.0)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unplugin-utils: 0.3.2 + unstorage: 1.17.5(@vercel/blob@2.6.1)(@vercel/functions@3.7.7(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(db0@0.3.4(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0)))(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 + - rolldown + - sqlite3 + - srvx + - supports-color + - unloader + - uploadthing + - vite + - webpack + optional: true + node-abi@3.94.0: dependencies: semver: 7.8.5 @@ -27847,6 +27966,14 @@ snapshots: rolldown: 1.2.2 unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + unctx@3.0.1(magic-string@0.30.21)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))): + optionalDependencies: + magic-string: 0.30.21 + oxc-parser: 0.143.0 + rolldown: 1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + optional: true + unctx@3.0.1(magic-string@1.1.0)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))): optionalDependencies: magic-string: 1.1.0 @@ -27854,12 +27981,12 @@ snapshots: rolldown: 1.2.2 unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) - unctx@3.0.1(magic-string@1.2.3)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))): + unctx@3.0.1(magic-string@1.2.3)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))): optionalDependencies: magic-string: 1.2.3 oxc-parser: 0.143.0 - rolldown: 1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) - unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) + rolldown: 1.2.2 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) optional: true unctx@3.0.1(magic-string@1.2.3)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))): @@ -28106,7 +28233,7 @@ snapshots: unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) unplugin-utils: 0.3.2 optionalDependencies: - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) '@vueuse/core': 14.4.0(vue@3.5.40(typescript@6.0.3)) transitivePeerDependencies: - '@farmfe/core' @@ -28184,7 +28311,7 @@ snapshots: unplugin-utils: 0.3.2 vue: 3.5.40(typescript@6.0.3) optionalDependencies: - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -28379,9 +28506,8 @@ snapshots: lru-cache: 11.5.2 ofetch: 2.0.0-alpha.3 - unstorage@2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(ofetch@2.0.0-alpha.3): + unstorage@2.0.0-alpha.7(db0@0.3.4)(ofetch@2.0.0-alpha.3): optionalDependencies: - chokidar: 5.0.0 db0: 0.3.4(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260702.1)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.0)(better-sqlite3@12.11.1)(pg@8.22.0)) ofetch: 2.0.0-alpha.3 @@ -28568,7 +28694,7 @@ snapshots: vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0) vite-dev-rpc: 2.0.0(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)) optionalDependencies: - '@nuxt/kit': 4.5.1(magic-string@1.2.3)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) + '@nuxt/kit': 4.5.1(magic-string@0.30.21)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.0.0-beta.57(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3))(rollup@4.62.4)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))) vite-plugin-inspect@11.4.1(@nuxt/kit@4.5.1(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.2)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.62.4)(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0))))(vite@8.2.0(@types/node@26.4.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index eaaf9d8..04f367d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -32,6 +32,8 @@ minimumReleaseAgeExclude: - 'ai' - 'eve' - 'create-eve' + # HugoRCD + - 'evlog' overrides: '@ai-sdk/vue>ai': 7.0.70 From 995a06b9ff7eea2df5093fc800e4a69cabc5cbee Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Tue, 1 Sep 2026 10:53:22 +0100 Subject: [PATCH 2/4] feat(sdk): add documentation links to every error catalog entry --- apps/docs/content/docs/4.guide/7.errors.md | 1 + packages/github-tools/src/core/errors.ts | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/apps/docs/content/docs/4.guide/7.errors.md b/apps/docs/content/docs/4.guide/7.errors.md index 7d8eb47..e01b2aa 100644 --- a/apps/docs/content/docs/4.guide/7.errors.md +++ b/apps/docs/content/docs/4.guide/7.errors.md @@ -13,6 +13,7 @@ The SDK maps every failure it can classify to a structured error from an [evlog] - `message` — what happened, with the GitHub or Connect detail embedded - `why` — the technical cause, including the non-obvious ones - `fix` — the actionable remedy +- `link` — the relevant documentation page (this site for auth/Connect setup, GitHub's REST troubleshooting docs for API errors) ## Error codes diff --git a/packages/github-tools/src/core/errors.ts b/packages/github-tools/src/core/errors.ts index 2f50c85..642b1eb 100644 --- a/packages/github-tools/src/core/errors.ts +++ b/packages/github-tools/src/core/errors.ts @@ -14,6 +14,7 @@ export const githubToolsErrors = defineErrorCatalog('github_tools', { message: 'GitHub token is required. Pass it as `token` or set the GITHUB_TOKEN environment variable.', why: 'No token string, async token provider, or GITHUB_TOKEN environment variable was available when the tool resolved its GitHub credentials.', fix: 'Pass `token` (a PAT string or async provider) when creating the tools, set GITHUB_TOKEN, or configure a Vercel Connect `connector`.', + link: 'https://github-tools.com/guide/tokens-and-auth', }, OIDC_TOKEN_EXPIRED: { status: 401, @@ -21,6 +22,7 @@ export const githubToolsErrors = defineErrorCatalog('github_tools', { `VERCEL_OIDC_TOKEN expired at ${expiredAt}; Vercel Connect would reject it, so no GitHub request was made.`, why: 'The SDK pins the VERCEL_OIDC_TOKEN environment token when it is set (skipping @vercel/oidc\'s project-root walk, which fails inside eve/workflow snapshots), so an expired env token is never refreshed automatically.', fix: 'Locally: run `vercel env pull` to refresh .env.local. On Vercel: deployments inject a fresh token — check nothing overrides VERCEL_OIDC_TOKEN with a stale value.', + link: 'https://github-tools.com/guide/vercel-connect#eve-agent', }, CONNECT_NOT_AUTHORIZED: { status: 403, @@ -28,6 +30,7 @@ export const githubToolsErrors = defineErrorCatalog('github_tools', { `Vercel Connect refused to mint a GitHub token: ${detail}`, why: 'Connect rejected the identity of the calling process (the Vercel OIDC token), not the GitHub permissions — the request never reached GitHub.', fix: 'Refresh the OIDC token (`vercel env pull` locally) and check the connector is linked to the Vercel project this code runs in.', + link: 'https://github-tools.com/guide/vercel-connect#setup-checklist', }, CONNECT_USER_NOT_CONNECTED: { status: 401, @@ -35,6 +38,7 @@ export const githubToolsErrors = defineErrorCatalog('github_tools', { `No active GitHub connection for user "${subjectId}".`, why: 'The Connect token was requested with a user subject, but that user has not connected their GitHub account to this connector (or revoked the authorization).', fix: 'Have the user connect their GitHub account (e.g. from the integrations panel), then retry.', + link: 'https://github-tools.com/guide/vercel-connect#per-user-tokens', }, CONNECT_INSTALLATION_REQUIRED: { status: 401, @@ -42,42 +46,49 @@ export const githubToolsErrors = defineErrorCatalog('github_tools', { `The Connect connector has no usable GitHub App installation: ${detail}`, why: 'The connector exists but its GitHub App is not installed on the target org or user account.', fix: 'Install the connector\'s GitHub App on the org or account the agent needs, from the Vercel Connect dashboard.', + link: 'https://github-tools.com/guide/vercel-connect#create-a-github-connector', }, SUBJECT_CONTEXT_REQUIRED: { status: 500, message: 'connect.subject resolver needs the tool execution context — it is only available while a tool call executes.', why: 'The per-caller subject resolver was invoked without an eve ToolContext, which only exists during tool execution.', fix: 'Keep `connect.subject` resolution on the tool execute path; use a static subject when no execution context is available.', + link: 'https://github-tools.com/frameworks/eve-extension#per-user-tokens', }, UNAUTHORIZED: { status: 401, message: ({ detail }: { detail: string }) => `GitHub rejected the credentials (401): ${detail}`, why: 'The GitHub token is invalid, expired, or revoked.', fix: 'Rotate the credential: regenerate the PAT or re-mint the installation token, then update the token source.', + link: 'https://docs.github.com/en/rest/using-the-rest-api/troubleshooting-the-rest-api', }, FORBIDDEN: { status: 403, message: ({ detail }: { detail: string }) => `GitHub refused the request (403): ${detail}`, why: 'The token authenticated but lacks permission: a missing scope on this resource, SAML SSO enforcement, or an API that only accepts user access tokens (gists, notifications) called with an installation token.', fix: 'Grant the missing permission on the PAT or GitHub App installation; authorize the token for SAML if the org enforces it; use a user access token for gist and notification tools.', + link: 'https://github-tools.com/guide/tokens-and-auth#map-permissions-to-presets', }, RATE_LIMITED: { status: 429, message: ({ detail }: { detail: string }) => `GitHub rate limit exhausted: ${detail}`, why: 'The token used up its GitHub API rate limit for this resource.', fix: 'Stop calling this tool and retry after the reset timestamp in the message; batch reads or narrow the query to spend fewer requests.', + link: 'https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api', }, NOT_FOUND: { status: 404, message: ({ detail }: { detail: string }) => `GitHub resource not found (404): ${detail}`, why: 'Either the resource does not exist, or the token cannot see it — GitHub deliberately returns 404 instead of 403 for private resources the token has no access to.', fix: 'Check the owner/repo/number input first. If it is correct, the token lacks access: grant the repository to the PAT or App installation, or use a Connect subject that has access.', + link: 'https://docs.github.com/en/rest/using-the-rest-api/troubleshooting-the-rest-api#404-not-found-for-an-existing-resource', }, VALIDATION_FAILED: { status: 422, message: ({ detail }: { detail: string }) => `GitHub rejected the request as invalid (422): ${detail}`, why: 'The input was well-formed but GitHub refused it — a duplicate resource, an immutable state transition, or an unresolvable ref.', fix: 'The embedded GitHub message names the offending field or state; adjust the input and retry.', + link: 'https://docs.github.com/en/rest/using-the-rest-api/troubleshooting-the-rest-api#validation-failed', }, }) From 0b73270aa2c40070aeda45dcb33f4230be52d8f7 Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Tue, 1 Sep 2026 11:01:54 +0100 Subject: [PATCH 3/4] feat(sdk): include catalog error links in the model-facing payload The docs URL helps the model fetch the troubleshooting page when why/fix are not enough. Align the Errors guide page with other guides (header links, footer). --- .changeset/evlog-error-catalog.md | 2 +- apps/docs/app/app.config.ts | 2 ++ .../docs/2.frameworks/1.eve-extension.md | 2 +- apps/docs/content/docs/4.guide/7.errors.md | 23 +++++++++++++++++-- apps/docs/skills/github-tools-agents/SKILL.md | 2 +- .../references/eve-extension.md | 2 +- packages/github-tools/README.md | 2 +- packages/github-tools/src/core/errors.test.ts | 4 ++-- packages/github-tools/src/core/errors.ts | 3 ++- packages/github-tools/src/eve/steps.test.ts | 3 ++- packages/github-tools/src/eve/steps.ts | 2 +- 11 files changed, 35 insertions(+), 12 deletions(-) diff --git a/.changeset/evlog-error-catalog.md b/.changeset/evlog-error-catalog.md index 2d0570f..55ed42f 100644 --- a/.changeset/evlog-error-catalog.md +++ b/.changeset/evlog-error-catalog.md @@ -7,5 +7,5 @@ Structured error catalog (evlog): classifiable failures now carry a stable `code - GitHub API errors are mapped by status: `UNAUTHORIZED` (401), `FORBIDDEN` (403), `RATE_LIMITED` (403/429, with reset info), `NOT_FOUND` (404 — explicitly states GitHub masks no-access private resources as 404), `VALIDATION_FAILED` (422). Unmapped statuses pass through; the original Octokit error stays as `cause`. - An expired `VERCEL_OIDC_TOKEN` now throws `OIDC_TOKEN_EXPIRED` with the exact expiry time before any Connect request, instead of surfacing as an opaque 403. `@vercel/connect` failures map to `CONNECT_NOT_AUTHORIZED`, `CONNECT_USER_NOT_CONNECTED`, and `CONNECT_INSTALLATION_REQUIRED`. -- In the eve extension, failing tools return `{ error: { code, message, why, fix } }` to the model; unclassified failures keep the plain message string. +- In the eve extension, failing tools return `{ error: { code, message, why, fix, link } }` to the model; unclassified failures keep the plain message string. - The catalog is exported as `githubToolsErrors`; use evlog's `parseError` to read the structure from thrown errors in AI SDK apps. diff --git a/apps/docs/app/app.config.ts b/apps/docs/app/app.config.ts index 9c9b6dd..b504bd9 100644 --- a/apps/docs/app/app.config.ts +++ b/apps/docs/app/app.config.ts @@ -267,6 +267,8 @@ export default defineAppConfig({ { label: 'Commit Attribution', to: '/guide/commit-attribution' }, { label: 'Tokens & Auth', to: '/guide/tokens-and-auth' }, { label: 'Vercel Connect', to: '/guide/vercel-connect' }, + { label: 'Working Context', to: '/guide/working-context' }, + { label: 'Errors', to: '/guide/errors' }, ], }, { diff --git a/apps/docs/content/docs/2.frameworks/1.eve-extension.md b/apps/docs/content/docs/2.frameworks/1.eve-extension.md index e4c9429..02f321d 100644 --- a/apps/docs/content/docs/2.frameworks/1.eve-extension.md +++ b/apps/docs/content/docs/2.frameworks/1.eve-extension.md @@ -212,7 +212,7 @@ The extension registers each tool with an **authored inline** `execute`, `toMode Object-shaped execute results include `rateLimit` (`remaining`, `limit`, `reset`, `resource`). `toModelOutput` strips it so the model never sees the remaining count; `toolResultFrom` and channels still do. See [Rate-limit metadata](/api/reference#rate-limit-metadata). -If execute fails (token mint, GitHub 403/429, …), the tool returns `{ error }` instead of throwing so the model always receives a `tool_result`. A thrown error in eve's tool-loop can leave a `tool_use` unpaired and kill the turn. For failures the SDK can classify, `error` is a structured `{ code, message, why, fix }` object from the [error catalog](/guide/errors) — e.g. a 404 explains that GitHub also masks no-access private repos as 404, so the model does not hallucinate a cause. Unclassified failures keep the plain message string. +If execute fails (token mint, GitHub 403/429, …), the tool returns `{ error }` instead of throwing so the model always receives a `tool_result`. A thrown error in eve's tool-loop can leave a `tool_use` unpaired and kill the turn. For failures the SDK can classify, `error` is a structured `{ code, message, why, fix, link }` object from the [error catalog](/guide/errors) — e.g. a 404 explains that GitHub also masks no-access private repos as 404, so the model does not hallucinate a cause. Unclassified failures keep the plain message string. ## Durable approval, done right diff --git a/apps/docs/content/docs/4.guide/7.errors.md b/apps/docs/content/docs/4.guide/7.errors.md index e01b2aa..7e9063a 100644 --- a/apps/docs/content/docs/4.guide/7.errors.md +++ b/apps/docs/content/docs/4.guide/7.errors.md @@ -2,7 +2,25 @@ title: Errors description: Structured, agent-readable errors — every failure carries a stable code, the technical cause, and an actionable fix. navigation: + title: Errors icon: i-lucide-shield-alert +path: /guide/errors +links: + - label: Tokens & Auth + icon: i-lucide-key-round + to: /guide/tokens-and-auth + color: neutral + variant: subtle + - label: Vercel Connect + icon: i-lucide-unplug + to: /guide/vercel-connect + color: neutral + variant: subtle + - label: API reference + icon: i-lucide-braces + to: /api/reference + color: neutral + variant: subtle --- Raw API failures make models hallucinate. GitHub answers 404 for private repositories the token cannot see, and an expired Vercel OIDC token surfaces as a bare "Not authorized" — both read as "the repo is private" or "permissions are missing" to a model, which then confidently reports the wrong cause. @@ -50,12 +68,13 @@ In the [eve extension](/frameworks/eve-extension), a failing tool returns the st "code": "github_tools.NOT_FOUND", "message": "GitHub resource not found (404): Not Found", "why": "Either the resource does not exist, or the token cannot see it — GitHub deliberately returns 404 instead of 403 for private resources the token has no access to.", - "fix": "Check the owner/repo/number input first. If it is correct, the token lacks access: grant the repository to the PAT or App installation, or use a Connect subject that has access." + "fix": "Check the owner/repo/number input first. If it is correct, the token lacks access: grant the repository to the PAT or App installation, or use a Connect subject that has access.", + "link": "https://docs.github.com/en/rest/using-the-rest-api/troubleshooting-the-rest-api#404-not-found-for-an-existing-resource" } } ``` -`link` and `internal` are stripped — only what helps the model recover crosses the wire. +`internal` stays off the wire (request URL, raw status). `link` is included so the model can fetch the docs page when `why`/`fix` are not enough. ## AI SDK consumers diff --git a/apps/docs/skills/github-tools-agents/SKILL.md b/apps/docs/skills/github-tools-agents/SKILL.md index c6a8749..f8c5ff1 100644 --- a/apps/docs/skills/github-tools-agents/SKILL.md +++ b/apps/docs/skills/github-tools-agents/SKILL.md @@ -127,7 +127,7 @@ Array presets merge: `preset: ['code-review', 'issue-triage']`. Start with the s Pass `context: { owner, repo, pullNumber?, issueNumber?, ref? }` to `createGithubTools` / `createGithubAgent` / `createDurableGithubAgent` to default those fields on tool inputs and inject them into the agent system prompt. Prefer composite tools (`getPullRequestContext`, `getIssueContext`, `getReleaseContext`, `getCiFailureContext`) for multi-part reads — call follow-up reads in the same step when possible. Diff patches are omitted by default — set `includePatch: true` (optionally with `filenames`) when you need specific diffs. Bodies are truncated by default (`detail: 'summary'`). `getIssueContext` returns `labelNames` (strings) rather than full label objects. Prefer `getFileContent` with `startLine`/`endLine` or `maxLines` for large files. `getWorkflowJobLogs` returns the last 200 log lines with timestamps stripped — raise `maxLines` (up to 2000) only when needed. `listPullRequestReviewThreads` returns unresolved threads only by default with truncated comment bodies. REST list tools return `{ items, hasMore, page, nextPage }` (or add those fields next to `checkRuns` / `runs`); when `hasMore`, call with `nextPage` or raise `maxPages` — never the same page. Filter `listCommits` with `path` / `author` / `since` / `until`. Prefer a `path` prefix on `getRepositoryTree` over `recursive: true`. Object-shaped execute results include `rateLimit` (`remaining` / `limit` / `reset` / `resource`); it is stripped from the model-facing output. On 403/429 the error text includes remaining/reset. -Classifiable failures are structured evlog catalog errors (`githubToolsErrors`, codes prefixed `github_tools.`) with `why`/`fix` fields: 401 `UNAUTHORIZED`, 403 `FORBIDDEN`, 403/429 `RATE_LIMITED`, 404 `NOT_FOUND` (also thrown when the token cannot see a private resource — GitHub masks no-access as 404), 422 `VALIDATION_FAILED`, plus auth/Connect codes (`TOKEN_REQUIRED`, `OIDC_TOKEN_EXPIRED`, `CONNECT_USER_NOT_CONNECTED`, …). In eve, tool failures return `{ error: { code, message, why, fix } }`; with `generateText`/`streamText` the message alone is forwarded and is self-sufficient — use evlog's `parseError` for the full structure. +Classifiable failures are structured evlog catalog errors (`githubToolsErrors`, codes prefixed `github_tools.`) with `why`/`fix` fields: 401 `UNAUTHORIZED`, 403 `FORBIDDEN`, 403/429 `RATE_LIMITED`, 404 `NOT_FOUND` (also thrown when the token cannot see a private resource — GitHub masks no-access as 404), 422 `VALIDATION_FAILED`, plus auth/Connect codes (`TOKEN_REQUIRED`, `OIDC_TOKEN_EXPIRED`, `CONNECT_USER_NOT_CONNECTED`, …). In eve, tool failures return `{ error: { code, message, why, fix, link } }`; with `generateText`/`streamText` the message alone is forwarded and is self-sufficient — use evlog's `parseError` for the full structure. ## Write safety diff --git a/apps/docs/skills/github-tools-agents/references/eve-extension.md b/apps/docs/skills/github-tools-agents/references/eve-extension.md index 87fac1f..095024b 100644 --- a/apps/docs/skills/github-tools-agents/references/eve-extension.md +++ b/apps/docs/skills/github-tools-agents/references/eve-extension.md @@ -55,7 +55,7 @@ export default githubExtension({ }) ``` -`execute`, `toModelOutput`, and `approval` are direct `defineTool` properties whose callbacks only close over the tool name (a spread or `resolveEveApproval(...)` call is not stamped). `toModelOutput` also strips `rateLimit` from the model-facing payload. Author `overrides.toModelOutput` inline in the agent — a library function will not get a durable descriptor on eve 0.44+, and the resolver then drops every `github__*` tool. Execute failures return `{ error }` so the model still receives a `tool_result` — a structured `{ code, message, why, fix }` object for catalog errors (e.g. `github_tools.NOT_FOUND` explains GitHub masks no-access private repos as 404), a plain string otherwise. Requires `eve` `>=0.44`. +`execute`, `toModelOutput`, and `approval` are direct `defineTool` properties whose callbacks only close over the tool name (a spread or `resolveEveApproval(...)` call is not stamped). `toModelOutput` also strips `rateLimit` from the model-facing payload. Author `overrides.toModelOutput` inline in the agent — a library function will not get a durable descriptor on eve 0.44+, and the resolver then drops every `github__*` tool. Execute failures return `{ error }` so the model still receives a `tool_result` — a structured `{ code, message, why, fix, link }` object for catalog errors (e.g. `github_tools.NOT_FOUND` explains GitHub masks no-access private repos as 404), a plain string otherwise. Requires `eve` `>=0.44`. ## Approval diff --git a/packages/github-tools/README.md b/packages/github-tools/README.md index 7c86852..8b4c9a7 100644 --- a/packages/github-tools/README.md +++ b/packages/github-tools/README.md @@ -204,7 +204,7 @@ Classifiable failures become structured [evlog](https://evlog.dev) catalog error Codes: `TOKEN_REQUIRED`, `OIDC_TOKEN_EXPIRED`, `CONNECT_NOT_AUTHORIZED`, `CONNECT_USER_NOT_CONNECTED`, `CONNECT_INSTALLATION_REQUIRED`, `SUBJECT_CONTEXT_REQUIRED`, `UNAUTHORIZED` (401), `FORBIDDEN` (403), `RATE_LIMITED` (403/429), `NOT_FOUND` (404), `VALIDATION_FAILED` (422). Unmapped statuses pass through unchanged; the original Octokit error stays reachable as `cause`. -In the eve extension, a failing tool returns `{ error: { code, message, why, fix } }` to the model. With `generateText`/`streamText`, the framework forwards `error.message` (self-sufficient by design); use evlog's `parseError(error)` when you need the full structure. The catalog is exported as `githubToolsErrors`. See the [errors guide](https://github-tools.com/guide/errors). +In the eve extension, a failing tool returns `{ error: { code, message, why, fix, link } }` to the model. With `generateText`/`streamText`, the framework forwards `error.message` (self-sufficient by design); use evlog's `parseError(error)` when you need the full structure. The catalog is exported as `githubToolsErrors`. See the [errors guide](https://github-tools.com/guide/errors). ## Commit Attribution diff --git a/packages/github-tools/src/core/errors.test.ts b/packages/github-tools/src/core/errors.test.ts index 519a773..599ed08 100644 --- a/packages/github-tools/src/core/errors.test.ts +++ b/packages/github-tools/src/core/errors.test.ts @@ -66,7 +66,7 @@ describe('toGithubToolsError', () => { }) describe('toModelErrorPayload', () => { - it('projects code, message, why, and fix but never internal or link', () => { + it('projects code, message, why, fix, and link but never internal', () => { const error = githubToolsErrors.NOT_FOUND({ detail: 'Not Found', internal: { status: 404 }, @@ -77,8 +77,8 @@ describe('toModelErrorPayload', () => { expect(payload.message).toContain('Not Found') expect(payload.why).toBeDefined() expect(payload.fix).toBeDefined() + expect(payload.link).toContain('404-not-found-for-an-existing-resource') expect(payload).not.toHaveProperty('internal') - expect(payload).not.toHaveProperty('link') expect(payload).not.toHaveProperty('status') }) }) diff --git a/packages/github-tools/src/core/errors.ts b/packages/github-tools/src/core/errors.ts index 642b1eb..a6a7106 100644 --- a/packages/github-tools/src/core/errors.ts +++ b/packages/github-tools/src/core/errors.ts @@ -133,13 +133,14 @@ export function toGithubToolsError(error: unknown, rateLimit: GithubRateLimit | return error } -/** `{ code, message, why, fix }` projection of an EvlogError for model-facing payloads. */ +/** `{ code, message, why, fix, link }` projection of an EvlogError for model-facing payloads. `internal` stays off the wire. */ export function toModelErrorPayload(error: EvlogError): Record { return { ...(error.code ? { code: error.code } : {}), message: error.message, ...(error.why ? { why: error.why } : {}), ...(error.fix ? { fix: error.fix } : {}), + ...(error.link ? { link: error.link } : {}), } } diff --git a/packages/github-tools/src/eve/steps.test.ts b/packages/github-tools/src/eve/steps.test.ts index 41f4684..f2e9a6e 100644 --- a/packages/github-tools/src/eve/steps.test.ts +++ b/packages/github-tools/src/eve/steps.test.ts @@ -3,7 +3,7 @@ import type { GithubToolName } from './registry' import { runGithubToolStep } from './steps' describe('runGithubToolStep error payloads', () => { - it('returns the structured { code, message, why, fix } payload for catalog errors', async () => { + it('returns the structured { code, message, why, fix, link } payload for catalog errors', async () => { const result = await runGithubToolStep('getRepository', { owner: 'o', repo: 'r' }, { token: async () => '', }) @@ -14,6 +14,7 @@ describe('runGithubToolStep error payloads', () => { message: expect.stringContaining('GitHub token is required'), why: expect.any(String), fix: expect.any(String), + link: expect.stringContaining('tokens-and-auth'), }, }) }) diff --git a/packages/github-tools/src/eve/steps.ts b/packages/github-tools/src/eve/steps.ts index 00badbe..78a9576 100644 --- a/packages/github-tools/src/eve/steps.ts +++ b/packages/github-tools/src/eve/steps.ts @@ -27,7 +27,7 @@ export async function runGithubToolStep( } catch (error) { // Eve's tool-loop logs thrown execute errors but does not always append a // tool_result. Returning a payload keeps the Anthropic tool_use/tool_result pairing intact. - // Catalog errors keep their { code, why, fix } structure so the model can recover. + // Catalog errors keep their { code, why, fix, link } structure so the model can recover. if (EvlogError.isEvlogError(error)) { return { error: toModelErrorPayload(error) } } From ed30eca5c9248acb0cd4aea1808d8bf032ffb4a0 Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Tue, 1 Sep 2026 11:05:31 +0100 Subject: [PATCH 4/4] remove icon --- apps/docs/content/docs/4.guide/7.errors.md | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/docs/content/docs/4.guide/7.errors.md b/apps/docs/content/docs/4.guide/7.errors.md index 7e9063a..a974f1c 100644 --- a/apps/docs/content/docs/4.guide/7.errors.md +++ b/apps/docs/content/docs/4.guide/7.errors.md @@ -3,7 +3,6 @@ title: Errors description: Structured, agent-readable errors — every failure carries a stable code, the technical cause, and an actionable fix. navigation: title: Errors - icon: i-lucide-shield-alert path: /guide/errors links: - label: Tokens & Auth