diff --git a/.changeset/warm-pans-learn.md b/.changeset/warm-pans-learn.md new file mode 100644 index 00000000..da6c8e5e --- /dev/null +++ b/.changeset/warm-pans-learn.md @@ -0,0 +1,12 @@ +--- +"@tailor-platform/app-shell": minor +--- + +Add a low-level AI Gateway client and a simple text-only chat hook for AppShell. + +```tsx +import { createAIGatewayClient, useAIChat } from "@tailor-platform/app-shell"; + +const aiClient = createAIGatewayClient({ gatewayUri, authClient }); +const { messages, sendMessage, stop } = useAIChat({ client: aiClient, model: "gpt-5-mini" }); +``` diff --git a/.github/workflows/ci-e2e.yaml b/.github/workflows/ci-e2e.yaml index 95dc4143..8cd083da 100644 --- a/.github/workflows/ci-e2e.yaml +++ b/.github/workflows/ci-e2e.yaml @@ -44,5 +44,6 @@ jobs: env: VITE_TAILOR_APP_URL: ${{ secrets.E2E_TAILOR_APP_URL }} VITE_TAILOR_CLIENT_ID: ${{ secrets.E2E_TAILOR_CLIENT_ID }} + VITE_TAILOR_AI_GATEWAY_URL: ${{ secrets.E2E_TAILOR_AI_GATEWAY_URL }} E2E_USER_EMAIL: ${{ secrets.E2E_USER_EMAIL }} E2E_USER_PASSWORD: ${{ secrets.E2E_USER_PASSWORD }} diff --git a/docs/api/create-ai-gateway-client.md b/docs/api/create-ai-gateway-client.md new file mode 100644 index 00000000..3374ff24 --- /dev/null +++ b/docs/api/create-ai-gateway-client.md @@ -0,0 +1,116 @@ +--- +title: createAIGatewayClient +description: Create a low-level AI Gateway client that reuses AppShell authentication +--- + +# createAIGatewayClient + +Creates a small AI Gateway transport client for text-only chat completions. + +## Signature + +```typescript +function createAIGatewayClient(config: { + gatewayUri: string; + authClient: AuthClient; +}): AIGatewayClient; +``` + +## Parameters + +### `gatewayUri` + +- **Type:** `string` +- **Required:** Yes +- **Description:** Base URL of the AI Gateway + +### `authClient` + +- **Type:** `AuthClient` +- **Required:** Yes +- **Description:** Auth client used for authenticated requests via `authClient.fetch(...)` + +## Return Value + +```typescript +interface AIGatewayClient { + streamChatCompletion(request: AIGatewayChatRequest): AsyncIterable; +} +``` + +The iterable yields completion events: + +- `text-delta` — append `event.text` to build the assistant response +- `done` — terminal event with an optional `finishReason` + +## Related Types + +```typescript +type AIGatewayChatMessage = + | { + role: "system" | "user"; + content: string; + } + | { + role: "assistant"; + content?: string; + }; + +interface AIGatewayChatRequest { + model: string; + messages: AIGatewayChatMessage[]; + stream?: boolean; + signal?: AbortSignal; +} + +type AIChatCompletionEvent = + | { + type: "text-delta"; + text: string; + } + | { + type: "done"; + finishReason?: string; + }; +``` + +## Usage + +```typescript +import { createAuthClient, createAIGatewayClient } from "@tailor-platform/app-shell"; + +const authClient = createAuthClient({ + clientId: "your-client-id", + appUri: "https://xyz.erp.dev", +}); + +const aiClient = createAIGatewayClient({ + gatewayUri: "https://your-ai-gateway.example.com", + authClient, +}); + +let text = ""; +for await (const event of aiClient.streamChatCompletion({ + model: "gpt-5-mini", + messages: [{ role: "user", content: "Hello" }], +})) { + if (event.type === "text-delta") { + text += event.text; + } +} + +console.log(text); +``` + +## Notes + +- `stream` defaults to `true` +- Pass `stream: false` when the endpoint returns a single JSON response instead of SSE +- `stream: false` still yields the same event shape: zero or one `text-delta`, then `done` +- The low-level API is intentionally narrow: text deltas plus completion metadata +- `request.signal` is passed through so callers can abort in-flight work + +## Related + +- [Authentication Concept](../concepts/authentication.md) +- [useAIChat](./use-ai-chat.md) diff --git a/docs/api/use-ai-chat.md b/docs/api/use-ai-chat.md new file mode 100644 index 00000000..46069b72 --- /dev/null +++ b/docs/api/use-ai-chat.md @@ -0,0 +1,109 @@ +--- +title: useAIChat +description: Simple text-only chat hook for AI Gateway +--- + +# useAIChat + +React hook for simple text-only chat on top of `createAIGatewayClient`. + +## Signature + +```typescript +const useAIChat: (config: { client: AIGatewayClient; model: string; stream?: boolean }) => { + messages: AIChatMessage[]; + status: "ready" | "submitted" | "streaming" | "error"; + error?: Error; + sendMessage: (message: string) => Promise; + stop: () => void; +}; +``` + +## Return Value + +### `messages` + +```typescript +interface AIChatMessage { + id: string; + role: "user" | "assistant"; + content: string; +} +``` + +### `status` + +- **Type:** `"ready" | "submitted" | "streaming" | "error"` +- **Description:** Current request state + +### `error` + +- **Type:** `Error | undefined` +- **Description:** Last request error, if any + +### `sendMessage()` + +- **Type:** `(message: string) => Promise` +- **Description:** Appends a user message and streams the assistant response +- **Returns:** `true` when the request completes successfully, `false` when the call is ignored, stopped, or fails + +### `stop()` + +- **Type:** `() => void` +- **Description:** Aborts the current request if one is in progress + +## Usage + +```tsx +import { createAuthClient, createAIGatewayClient, useAIChat } from "@tailor-platform/app-shell"; + +const authClient = createAuthClient({ + clientId: "your-client-id", + appUri: "https://xyz.erp.dev", +}); + +const aiClient = createAIGatewayClient({ + gatewayUri: "https://your-ai-gateway.example.com", + authClient, +}); + +export function ChatScreen() { + const { messages, sendMessage, status, stop, error } = useAIChat({ + client: aiClient, + model: "gpt-5-mini", + }); + + return ( +
+ {messages.map((message) => ( +
+ {message.role}: {message.content} +
+ ))} + + + + {error ?
{error.message}
: null} +
+ ); +} +``` + +## Notes + +- `stream` defaults to `true` +- Pass `stream: false` when the endpoint returns a single JSON response instead of SSE +- The hook is intentionally text-only +- System prompts and custom history shaping should use the low-level client directly +- `stop()` keeps any already-streamed assistant text and ignores late chunks from the stopped request + +## Related + +- [createAIGatewayClient](./create-ai-gateway-client.md) diff --git a/docs/concepts/authentication.md b/docs/concepts/authentication.md index b3757c5e..c1ce3a71 100644 --- a/docs/concepts/authentication.md +++ b/docs/concepts/authentication.md @@ -154,6 +154,46 @@ function App() { } ``` +### Using `createAIGatewayClient` with AI Gateway + +`createAIGatewayClient` reuses the same authenticated fetch path as the rest of AppShell. Requests go through `authClient.fetch`, so DPoP proof generation and token refresh stay in the auth layer. + +```tsx +import { createAuthClient, createAIGatewayClient, useAIChat } from "@tailor-platform/app-shell"; + +const authClient = createAuthClient({ + clientId: "your-client-id", + appUri: "https://xyz.erp.dev", +}); + +const aiClient = createAIGatewayClient({ + gatewayUri: "https://your-ai-gateway.example.com", + authClient, +}); + +function ChatScreen() { + const { messages, sendMessage, status, stop } = useAIChat({ + client: aiClient, + model: "gpt-5-mini", + }); + + return ( +
+ {messages.map((message) => ( +
+ {message.role}: {message.content} +
+ ))} + + + +
+ ); +} +``` + ### `AuthClientConfig` | Property | Type | Required | Description | diff --git a/e2e/.env.example b/e2e/.env.example index 7bf43fcd..bdf854db 100644 --- a/e2e/.env.example +++ b/e2e/.env.example @@ -2,6 +2,8 @@ VITE_TAILOR_APP_URL= # OAuth2 public client ID VITE_TAILOR_CLIENT_ID= +# AI Gateway URL (e.g., https://) +VITE_TAILOR_AI_GATEWAY_URL= # E2E test user credentials E2E_USER_EMAIL=e2e-test@example.com diff --git a/e2e/README.md b/e2e/README.md index 71e4e1a0..5b8e4510 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -1,6 +1,6 @@ -# E2E Tests for AuthProvider +# E2E Tests for AuthProvider and AI Gateway -Playwright-based E2E tests that verify the AuthProvider OAuth authentication flow against a real Tailor Platform workspace. +Playwright-based E2E tests that verify the AuthProvider OAuth authentication flow and a minimal AI Gateway smoke check against a real Tailor Platform workspace. ## Setup @@ -11,7 +11,7 @@ cd e2e/backend TAILOR_PLATFORM_WORKSPACE_ID= pnpm deploy ``` -After deploy, retrieve the app URL and client ID using `tailor-sdk`: +After deploy, retrieve the app URL, client ID, and AI Gateway URL using `tailor-sdk`: ```bash # Get the app URL @@ -21,6 +21,10 @@ npx tailor-sdk show --workspace-id --json # Get the OAuth2 client ID npx tailor-sdk oauth2client list --workspace-id --json # → [{"clientId": "tpoc_...", ...}] + +# Get the AI Gateway domain +npx tailor-sdk workspace app list --workspace-id --json +# → find the entry named "e2e-ai-gateway" and use https:// ``` ### 2. Create a test user @@ -50,7 +54,7 @@ mutation CreateUserProfile { cp e2e/.env.example e2e/.env ``` -Fill in `VITE_TAILOR_APP_URL` and `VITE_TAILOR_CLIENT_ID` (retrieved above). The test user credentials are pre-filled. +Fill in `VITE_TAILOR_APP_URL`, `VITE_TAILOR_CLIENT_ID`, and `VITE_TAILOR_AI_GATEWAY_URL` (retrieved above). The test user credentials are pre-filled. ### 4. Install dependencies & browsers @@ -74,12 +78,13 @@ cd e2e && pnpm dev ## Test Scenarios -| Test | Description | -| ------------------- | ---------------------------------------------------------------- | -| Auth guard display | Verifies unauthenticated users see the login UI | -| Login flow | Full OAuth redirect → IDP login → callback → authenticated state | -| Logout | Verifies logout returns to auth guard | -| Session persistence | Confirms page reload maintains authentication | +| Test | Description | +| ------------------- | ------------------------------------------------------------------- | +| Auth guard display | Verifies unauthenticated users see the login UI | +| Login flow | Full OAuth redirect → IDP login → callback → authenticated state | +| Logout | Verifies logout returns to auth guard | +| Session persistence | Confirms page reload maintains authentication | +| AI Gateway smoke | Sends `PING` and checks the OpenAI-compatible reply contains `PONG` | ## Architecture diff --git a/e2e/app/src/App.tsx b/e2e/app/src/App.tsx index ef27dc92..e34c6fca 100644 --- a/e2e/app/src/App.tsx +++ b/e2e/app/src/App.tsx @@ -1,10 +1,31 @@ -import { AuthProvider, createAuthClient, useAuth } from "@tailor-platform/app-shell"; +import { + type AIGatewayClient, + AuthProvider, + createAIGatewayClient, + createAuthClient, + useAIChat, + useAuth, +} from "@tailor-platform/app-shell"; const authClient = createAuthClient({ appUri: import.meta.env.VITE_TAILOR_APP_URL, clientId: import.meta.env.VITE_TAILOR_CLIENT_ID, }); +const aiGatewayUrl = import.meta.env.VITE_TAILOR_AI_GATEWAY_URL; +const aiClient = aiGatewayUrl + ? createAIGatewayClient({ + gatewayUri: aiGatewayUrl, + authClient, + }) + : null; + +const unavailableAIClient = { + streamChatCompletion(): AsyncIterable { + throw new Error("AI Gateway not configured"); + }, +} satisfies AIGatewayClient; + const AuthGuard = () => { const { login } = useAuth(); @@ -27,6 +48,20 @@ const AuthGuard = () => { const AuthenticatedContent = () => { const { logout, isAuthenticated } = useAuth(); + const { messages, status, error, sendMessage } = useAIChat({ + client: aiClient ?? unavailableAIClient, + model: "gpt-4o-mini", + }); + const aiResponse = + [...messages].reverse().find((message) => message.role === "assistant")?.content ?? ""; + + const runAISmoke = async () => { + if (!aiClient) { + return; + } + + await sendMessage("Reply with exactly PONG. Do not add any other text. PING"); + }; return (
@@ -41,6 +76,19 @@ const AuthenticatedContent = () => { > Log out + +

{status}

+
{aiResponse}
+ {error ?
{error.message}
: null}
); }; diff --git a/e2e/backend/tailor.config.ts b/e2e/backend/tailor.config.ts index a4e65730..8eecde6c 100644 --- a/e2e/backend/tailor.config.ts +++ b/e2e/backend/tailor.config.ts @@ -1,4 +1,4 @@ -import { defineAuth, defineConfig, defineIdp } from "@tailor-platform/sdk"; +import { defineAIGateway, defineAuth, defineConfig, defineIdp } from "@tailor-platform/sdk"; import { user } from "./src/tailordb/user"; const oauth2Config = { @@ -32,7 +32,14 @@ const auth = defineAuth("e2e-auth", { idProvider: idp.provider(idp.name, idp.clients[0]), }); +const aiGateway = defineAIGateway("e2e-ai-gateway", { + authNamespace: auth.name, + cors: [oauth2Config.redirectURIs[0]], +}); + export default defineConfig({ + // SDK-managed app id — do not edit, except when copying this config to a separate app. + id: "c1f3a27c-3771-4ca9-99ae-fb38b435bbbc", name: "app-shell-e2e", cors: [oauth2Config.redirectURIs[0]], @@ -42,4 +49,5 @@ export default defineConfig({ auth, idp: [idp], + aiGateways: [aiGateway], }); diff --git a/e2e/backend/tailor.d.ts b/e2e/backend/tailor.d.ts index 9b407322..df0b0107 100644 --- a/e2e/backend/tailor.d.ts +++ b/e2e/backend/tailor.d.ts @@ -1,6 +1,6 @@ // This file is auto-generated by @tailor-platform/sdk // Do not edit this file manually -// Regenerated automatically when running 'tailor-sdk apply' or 'tailor-sdk generate' +// Regenerated automatically when running 'tailor-sdk deploy' or 'tailor-sdk generate' declare module "@tailor-platform/sdk" { interface AttributeMap { diff --git a/e2e/package.json b/e2e/package.json index 5ef4a268..2d972924 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -6,12 +6,14 @@ "test:e2e": "playwright test", "test:e2e:ui": "playwright test --ui", "dev": "vite --config app/vite.config.ts", + "lint": "oxlint app/src app/vite.config.ts backend/tailor.config.ts tests playwright.config.ts", + "type-check": "tsc --project tsconfig.json --noEmit", "deploy:backend": "cd backend && tailor-sdk apply --workspace-id $TAILOR_PLATFORM_WORKSPACE_ID --yes" }, "devDependencies": { "@playwright/test": "1.51.1", "@tailor-platform/app-shell": "workspace:*", - "@tailor-platform/sdk": "^1.45.1", + "@tailor-platform/sdk": "^1.66.0", "@tailwindcss/vite": "^4.3.0", "@types/node": "catalog:", "@types/react": "catalog:", diff --git a/e2e/tests/auth.spec.ts b/e2e/tests/auth.spec.ts index ca59c13a..2aed732f 100644 --- a/e2e/tests/auth.spec.ts +++ b/e2e/tests/auth.spec.ts @@ -114,4 +114,40 @@ test.describe("AuthProvider", () => { }); await expect(page.getByTestId("auth-status")).toHaveText("Logged in"); }); + + test("authenticated user can reach AI Gateway with an OpenAI smoke prompt", async ({ page }) => { + const email = process.env.E2E_USER_EMAIL; + const password = process.env.E2E_USER_PASSWORD; + const aiGatewayUrl = process.env.VITE_TAILOR_AI_GATEWAY_URL; + + if (!email || !password) { + test.skip(true, "E2E_USER_EMAIL and E2E_USER_PASSWORD must be set"); + return; + } + + if (!aiGatewayUrl) { + test.skip(true, "VITE_TAILOR_AI_GATEWAY_URL must be set"); + return; + } + + await page.goto("/"); + await page.getByTestId("login-button").click(); + + await page.waitForURL(/idp\.erp\.dev\/.*\/signin/); + await page.getByLabel(/email/i).fill(email); + await page.locator("#password").fill(password); + await page.getByRole("button", { name: /sign in|log in|submit/i }).click(); + + await page.waitForURL("http://localhost:3100/**"); + await expect(page.getByTestId("authenticated-content")).toBeVisible({ + timeout: 10000, + }); + + await page.getByTestId("ai-smoke-button").click(); + + await expect(page.getByTestId("ai-smoke-response")).toContainText(/pong/i, { + timeout: 30000, + }); + await expect(page.getByTestId("ai-smoke-status")).toHaveText("ready"); + }); }); diff --git a/packages/core/src/ai/client.test.ts b/packages/core/src/ai/client.test.ts new file mode 100644 index 00000000..3915c856 --- /dev/null +++ b/packages/core/src/ai/client.test.ts @@ -0,0 +1,227 @@ +import { describe, expect, it, vi } from "vitest"; +import type { AuthClient } from "@tailor-platform/auth-public-client"; +import { + createAIGatewayClient, + type AIGatewayChatRequest, + type AIGatewayClient, + type AIChatCompletionEvent, +} from "./client"; + +function createMockAuthClient(response: Response | Promise) { + return { + fetch: vi.fn().mockResolvedValue(response), + } as unknown as AuthClient; +} + +function createRequest(overrides?: Partial): AIGatewayChatRequest { + return { + model: "gpt-5-mini", + messages: [{ role: "user", content: "Hello" }], + ...overrides, + }; +} + +function createSSEStream(chunks: string[]): ReadableStream { + const encoder = new TextEncoder(); + + return new ReadableStream({ + start(controller) { + for (const chunk of chunks) { + controller.enqueue(encoder.encode(chunk)); + } + controller.close(); + }, + }); +} + +async function collectEvents(client: AIGatewayClient, request: AIGatewayChatRequest) { + const events: AIChatCompletionEvent[] = []; + + for await (const event of client.streamChatCompletion(request)) { + events.push(event); + } + + return events; +} + +describe("createAIGatewayClient", () => { + it("streams OpenAI-compatible events through authClient.fetch", async () => { + const authClient = createMockAuthClient( + new Response( + createSSEStream([ + 'data: {"choices":[{"delta":{"content":"Hel', + 'lo"}}]}\n\n', + 'data: {"choices":[{"delta":{"content":" world"}}]}\n\n', + 'data: {"choices":[{"finish_reason":"stop"}]}\n\n', + "data: [DONE]\n\n", + ]), + { + status: 200, + headers: { "Content-Type": "text/event-stream" }, + }, + ), + ); + const signal = new AbortController().signal; + const client = createAIGatewayClient({ + gatewayUri: "https://gateway.example.com", + authClient, + }); + + const events = await collectEvents(client, createRequest({ signal })); + + expect(events).toEqual([ + { type: "text-delta", text: "Hello" }, + { type: "text-delta", text: " world" }, + { type: "done", finishReason: "stop" }, + ]); + expect(authClient.fetch).toHaveBeenCalledWith( + "https://gateway.example.com/v1/chat/completions", + expect.objectContaining({ + method: "POST", + signal, + headers: expect.objectContaining({ Accept: "text/event-stream" }), + }), + ); + + expect( + JSON.parse((authClient.fetch as ReturnType).mock.calls[0][1].body), + ).toEqual({ + model: "gpt-5-mini", + messages: [{ role: "user", content: "Hello" }], + stream: true, + }); + }); + + it("routes gemini models to json responses by default", async () => { + const authClient = createMockAuthClient( + new Response( + JSON.stringify({ + choices: [ + { + message: { + content: [{ type: "text", text: "Grounded answer" }], + }, + finish_reason: "stop", + }, + ], + }), + { + status: 200, + headers: { "Content-Type": "application/json" }, + }, + ), + ); + const client = createAIGatewayClient({ + gatewayUri: "https://gateway.example.com/base/", + authClient, + }); + + const events = await collectEvents(client, createRequest({ model: "gemini-2.5-flash" })); + + expect(events).toEqual([ + { type: "text-delta", text: "Grounded answer" }, + { type: "done", finishReason: "stop" }, + ]); + expect(authClient.fetch).toHaveBeenCalledWith( + "https://gateway.example.com/base/v1/chat/completions", + expect.objectContaining({ + headers: expect.objectContaining({ Accept: "application/json" }), + }), + ); + + expect( + JSON.parse((authClient.fetch as ReturnType).mock.calls[0][1].body), + ).toEqual({ + model: "gemini-2.5-flash", + messages: [{ role: "user", content: "Hello" }], + stream: false, + }); + }); + + it("respects explicit stream overrides for gemini models", async () => { + const authClient = createMockAuthClient( + new Response( + createSSEStream([ + 'data: {"choices":[{"delta":{"content":"Streamed"}}]}\n\n', + 'data: {"choices":[{"finish_reason":"stop"}]}\n\n', + "data: [DONE]\n\n", + ]), + { + status: 200, + headers: { "Content-Type": "text/event-stream" }, + }, + ), + ); + const client = createAIGatewayClient({ + gatewayUri: "https://gateway.example.com", + authClient, + }); + + const events = await collectEvents( + client, + createRequest({ model: "gemini-2.5-flash", stream: true }), + ); + + expect(events).toEqual([ + { type: "text-delta", text: "Streamed" }, + { type: "done", finishReason: "stop" }, + ]); + expect(authClient.fetch).toHaveBeenCalledWith( + "https://gateway.example.com/v1/chat/completions", + expect.objectContaining({ + headers: expect.objectContaining({ Accept: "text/event-stream" }), + }), + ); + + expect( + JSON.parse((authClient.fetch as ReturnType).mock.calls[0][1].body), + ).toEqual({ + model: "gemini-2.5-flash", + messages: [{ role: "user", content: "Hello" }], + stream: true, + }); + }); + + it("emits done even when json responses do not include assistant text", async () => { + const authClient = createMockAuthClient( + new Response( + JSON.stringify({ choices: [{ message: { content: [] }, finish_reason: "tool_calls" }] }), + { status: 200 }, + ), + ); + const client = createAIGatewayClient({ + gatewayUri: "https://gateway.example.com", + authClient, + }); + + await expect( + collectEvents(client, createRequest({ model: "gemini-2.5-flash", stream: false })), + ).resolves.toEqual([{ type: "done", finishReason: "tool_calls" }]); + }); + + it("throws on non-ok responses", async () => { + const authClient = createMockAuthClient( + new Response("nope", { status: 401, statusText: "Nope" }), + ); + const client = createAIGatewayClient({ + gatewayUri: "https://gateway.example.com", + authClient, + }); + + await expect(collectEvents(client, createRequest())).rejects.toThrow( + "AI Gateway streaming request failed (401 Nope): nope", + ); + }); + + it("throws when a streaming response body is missing", async () => { + const authClient = createMockAuthClient(new Response(null, { status: 200 })); + const client = createAIGatewayClient({ + gatewayUri: "https://gateway.example.com", + authClient, + }); + + await expect(collectEvents(client, createRequest())).rejects.toThrow( + "AI Gateway streaming response did not include a body.", + ); + }); +}); diff --git a/packages/core/src/ai/client.ts b/packages/core/src/ai/client.ts new file mode 100644 index 00000000..e002710b --- /dev/null +++ b/packages/core/src/ai/client.ts @@ -0,0 +1,326 @@ +import type { AuthClient } from "@tailor-platform/auth-public-client"; + +export type AIGatewayChatMessage = + | { + role: "system" | "user"; + content: string; + } + | { + role: "assistant"; + content?: string; + }; + +export interface AIGatewayChatRequest { + model: string; + messages: AIGatewayChatMessage[]; + stream?: boolean; + signal?: AbortSignal; +} + +export type AIChatCompletionEvent = + | { + type: "text-delta"; + text: string; + } + | { + type: "done"; + finishReason?: string; + }; + +export interface AIGatewayClient { + /** + * Honor request.signal when possible so callers can stop work early. + */ + streamChatCompletion(request: AIGatewayChatRequest): AsyncIterable; +} + +interface OpenAIStreamChunk { + choices?: Array<{ + delta?: { + content?: unknown; + }; + finish_reason?: unknown; + }>; +} + +interface OpenAIFinalResponse { + choices?: Array<{ + message?: { + content?: unknown; + }; + finish_reason?: unknown; + }>; +} + +export function createAIGatewayClient(config: { + gatewayUri: string; + authClient: AuthClient; +}): AIGatewayClient { + const endpoint = new URL("v1/chat/completions", withTrailingSlash(config.gatewayUri)).toString(); + + return { + async *streamChatCompletion(request) { + if (shouldUseJSONRoute(request)) { + yield* streamJSONResponse({ + endpoint, + authClient: config.authClient, + request, + }); + return; + } + + yield* streamOpenAICompatibleResponse({ + endpoint, + authClient: config.authClient, + request, + }); + }, + }; +} + +function shouldUseJSONRoute(request: AIGatewayChatRequest): boolean { + if (request.stream != null) { + return request.stream === false; + } + + return request.model.startsWith("gemini-"); +} + +async function* streamOpenAICompatibleResponse(input: { + endpoint: string; + authClient: AuthClient; + request: AIGatewayChatRequest; +}): AsyncGenerator { + const response = await input.authClient.fetch(input.endpoint, { + method: "POST", + headers: { + Accept: "text/event-stream", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + model: input.request.model, + messages: input.request.messages, + stream: true, + }), + signal: input.request.signal, + }); + + await assertOK(response, "AI Gateway streaming request"); + + if (!response.body) { + throw new Error("AI Gateway streaming response did not include a body."); + } + + let finishReason: string | undefined; + + for await (const event of iterateSSEDataEvents(response.body, input.request.signal)) { + if (event === "[DONE]") { + yield createDoneEvent(finishReason); + return; + } + + const payload = parseJSON(event, "AI Gateway SSE event"); + const choice = payload.choices?.[0]; + const delta = extractText(choice?.delta?.content); + finishReason = extractFinishReason(choice?.finish_reason) ?? finishReason; + + if (delta) { + yield { type: "text-delta", text: delta }; + } + } + + yield createDoneEvent(finishReason); +} + +async function* streamJSONResponse(input: { + endpoint: string; + authClient: AuthClient; + request: AIGatewayChatRequest; +}): AsyncGenerator { + const response = await input.authClient.fetch(input.endpoint, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + model: input.request.model, + messages: input.request.messages, + stream: false, + }), + signal: input.request.signal, + }); + + await assertOK(response, "AI Gateway JSON request"); + + const payload = parseJSON(await response.text(), "AI Gateway JSON response"); + const choice = payload.choices?.[0]; + const text = extractText(choice?.message?.content); + + if (text) { + yield { type: "text-delta", text }; + } + + yield createDoneEvent(extractFinishReason(choice?.finish_reason)); +} + +async function assertOK(response: Response, context: string): Promise { + if (response.ok) { + return; + } + + let body = ""; + + try { + body = (await response.text()).trim(); + } catch { + // Ignore body read failures and fall back to status-only message. + } + + if (body.length > 300) { + body = `${body.slice(0, 300)}…`; + } + + const status = `${response.status}${response.statusText ? ` ${response.statusText}` : ""}`; + throw new Error( + body ? `${context} failed (${status}): ${body}` : `${context} failed (${status}).`, + ); +} + +async function* iterateSSEDataEvents( + stream: ReadableStream, + signal?: AbortSignal, +): AsyncGenerator { + const reader = stream.getReader(); + const decoder = new TextDecoder(); + let buffer = ""; + let dataLines: string[] = []; + + const flushLine = (line: string): string | null => { + if (line === "") { + if (dataLines.length === 0) { + return null; + } + + const event = dataLines.join("\n"); + dataLines = []; + return event; + } + + if (line.startsWith(":")) { + return null; + } + + if (!line.startsWith("data:")) { + return null; + } + + dataLines.push(line.slice(5).replace(/^ /, "")); + return null; + }; + + try { + while (true) { + if (signal?.aborted) { + throw createAbortError(); + } + + const { value, done } = await reader.read(); + if (done) { + break; + } + + buffer += decoder.decode(value, { stream: true }); + + let newlineIndex = buffer.indexOf("\n"); + while (newlineIndex !== -1) { + let line = buffer.slice(0, newlineIndex); + buffer = buffer.slice(newlineIndex + 1); + + if (line.endsWith("\r")) { + line = line.slice(0, -1); + } + + const event = flushLine(line); + if (event !== null) { + yield event; + } + + newlineIndex = buffer.indexOf("\n"); + } + } + + buffer += decoder.decode(); + + if (buffer.length > 0) { + const event = flushLine(buffer.endsWith("\r") ? buffer.slice(0, -1) : buffer); + if (event !== null) { + yield event; + } + } + + if (dataLines.length > 0) { + yield dataLines.join("\n"); + } + } finally { + reader.releaseLock(); + } +} + +function withTrailingSlash(value: string): string { + return value.endsWith("/") ? value : `${value}/`; +} + +function extractText(content: unknown): string { + if (typeof content === "string") { + return content; + } + + if (!Array.isArray(content)) { + return ""; + } + + return content + .map((part) => { + if (typeof part === "string") { + return part; + } + + if (part && typeof part === "object" && "text" in part) { + const text = part.text; + return typeof text === "string" ? text : ""; + } + + return ""; + }) + .join(""); +} + +function extractFinishReason(value: unknown): string | undefined { + return typeof value === "string" ? value : undefined; +} + +function createDoneEvent(finishReason?: string): AIChatCompletionEvent { + return finishReason ? { type: "done", finishReason } : { type: "done" }; +} + +function parseJSON(value: string, context: string): T { + try { + return JSON.parse(value) as T; + } catch (error) { + throw new Error( + `${context} was not valid JSON: ${error instanceof Error ? error.message : String(error)}`, + { cause: error }, + ); + } +} + +function createAbortError(): Error { + if (typeof DOMException !== "undefined") { + return new DOMException("The operation was aborted.", "AbortError"); + } + + const error = new Error("The operation was aborted."); + error.name = "AbortError"; + return error; +} diff --git a/packages/core/src/ai/use-ai-chat.test.tsx b/packages/core/src/ai/use-ai-chat.test.tsx new file mode 100644 index 00000000..54c96f22 --- /dev/null +++ b/packages/core/src/ai/use-ai-chat.test.tsx @@ -0,0 +1,294 @@ +import { act, renderHook, waitFor } from "@testing-library/react"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { useAIChat } from "./use-ai-chat"; +import type { AIGatewayClient } from "./client"; + +function createAbortError(): Error { + if (typeof DOMException !== "undefined") { + return new DOMException("The operation was aborted.", "AbortError"); + } + + const error = new Error("The operation was aborted."); + error.name = "AbortError"; + return error; +} + +beforeEach(() => { + let id = 0; + vi.stubGlobal("crypto", { + randomUUID: () => `id-${++id}`, + }); +}); + +describe("useAIChat", () => { + it("returns the initial ready state", () => { + const client = { + streamChatCompletion: vi.fn(async function* () { + yield { type: "done" } as const; + }), + } satisfies AIGatewayClient; + + const { result } = renderHook(() => useAIChat({ client, model: "gpt-5-mini" })); + + expect(result.current.messages).toEqual([]); + expect(result.current.status).toBe("ready"); + expect(result.current.error).toBeUndefined(); + }); + + it("appends user and assistant messages while streaming", async () => { + let releaseSecondChunk!: () => void; + const secondChunkGate = new Promise((resolve) => { + releaseSecondChunk = resolve; + }); + + const client = { + streamChatCompletion: vi.fn(async function* ({ signal }) { + expect(signal).toBeInstanceOf(AbortSignal); + yield { type: "text-delta", text: "Hello" } as const; + await secondChunkGate; + yield { type: "text-delta", text: " world" } as const; + yield { type: "done" } as const; + }), + } satisfies AIGatewayClient; + + const { result } = renderHook(() => useAIChat({ client, model: "gpt-5-mini" })); + + let sendPromise: Promise | undefined; + await act(async () => { + sendPromise = result.current.sendMessage("Hi"); + }); + + await waitFor(() => { + expect(result.current.status).toBe("streaming"); + expect(result.current.messages).toEqual([ + { id: "id-1", role: "user", content: "Hi" }, + { id: "id-2", role: "assistant", content: "Hello" }, + ]); + }); + + expect(client.streamChatCompletion).toHaveBeenCalledWith({ + model: "gpt-5-mini", + messages: [{ role: "user", content: "Hi" }], + signal: expect.any(AbortSignal), + }); + + releaseSecondChunk(); + await act(async () => { + await expect(sendPromise).resolves.toBe(true); + }); + + await waitFor(() => { + expect(result.current.status).toBe("ready"); + expect(result.current.messages).toEqual([ + { id: "id-1", role: "user", content: "Hi" }, + { id: "id-2", role: "assistant", content: "Hello world" }, + ]); + }); + }); + + it("keeps partial assistant text when stopped", async () => { + let releaseSecondChunk!: () => void; + const secondChunkGate = new Promise((resolve) => { + releaseSecondChunk = resolve; + }); + + const client = { + streamChatCompletion: vi.fn(async function* ({ signal }) { + yield { type: "text-delta", text: "Partial" } as const; + await secondChunkGate; + if (signal?.aborted) { + throw createAbortError(); + } + yield { type: "text-delta", text: " later" } as const; + yield { type: "done" } as const; + }), + } satisfies AIGatewayClient; + + const { result } = renderHook(() => useAIChat({ client, model: "gpt-5-mini" })); + + let sendPromise: Promise | undefined; + await act(async () => { + sendPromise = result.current.sendMessage("Hi"); + }); + + await waitFor(() => { + expect(result.current.status).toBe("streaming"); + expect(result.current.messages[1]?.content).toBe("Partial"); + }); + + act(() => { + result.current.stop(); + }); + releaseSecondChunk(); + + await act(async () => { + await expect(sendPromise).resolves.toBe(false); + }); + + await waitFor(() => { + expect(result.current.status).toBe("ready"); + expect(result.current.error).toBeUndefined(); + expect(result.current.messages).toEqual([ + { id: "id-1", role: "user", content: "Hi" }, + { id: "id-2", role: "assistant", content: "Partial" }, + ]); + }); + }); + + it("ignores stale chunks after stop and allows the next send", async () => { + let releaseStoppedRequest!: () => void; + const stoppedRequestGate = new Promise((resolve) => { + releaseStoppedRequest = resolve; + }); + + const client = { + streamChatCompletion: vi.fn(async function* ({ messages }) { + const text = messages.at(-1)?.content; + + if (text === "First") { + yield { type: "text-delta", text: "Partial" } as const; + await stoppedRequestGate; + yield { type: "text-delta", text: " stale" } as const; + yield { type: "done" } as const; + return; + } + + yield { type: "text-delta", text: "Fresh" } as const; + yield { type: "done" } as const; + }), + } satisfies AIGatewayClient; + + const { result } = renderHook(() => useAIChat({ client, model: "gpt-5-mini" })); + + let firstSendPromise: Promise | undefined; + await act(async () => { + firstSendPromise = result.current.sendMessage("First"); + }); + + await waitFor(() => { + expect(result.current.status).toBe("streaming"); + expect(result.current.messages).toEqual([ + { id: "id-1", role: "user", content: "First" }, + { id: "id-2", role: "assistant", content: "Partial" }, + ]); + }); + + act(() => { + result.current.stop(); + }); + + await waitFor(() => { + expect(result.current.status).toBe("ready"); + }); + + await act(async () => { + await expect(result.current.sendMessage("Second")).resolves.toBe(true); + }); + + await waitFor(() => { + expect(result.current.messages).toEqual([ + { id: "id-1", role: "user", content: "First" }, + { id: "id-2", role: "assistant", content: "Partial" }, + { id: "id-3", role: "user", content: "Second" }, + { id: "id-4", role: "assistant", content: "Fresh" }, + ]); + }); + + releaseStoppedRequest(); + await act(async () => { + await expect(firstSendPromise).resolves.toBe(false); + }); + + await waitFor(() => { + expect(result.current.messages).toEqual([ + { id: "id-1", role: "user", content: "First" }, + { id: "id-2", role: "assistant", content: "Partial" }, + { id: "id-3", role: "user", content: "Second" }, + { id: "id-4", role: "assistant", content: "Fresh" }, + ]); + }); + }); + + it("sets error state and recovers on the next successful send", async () => { + let shouldFail = true; + const client = { + streamChatCompletion: vi.fn(async function* () { + if (shouldFail) { + throw new Error("boom"); + } + yield { type: "text-delta", text: "Recovered" } as const; + yield { type: "done" } as const; + }), + } satisfies AIGatewayClient; + + const { result } = renderHook(() => useAIChat({ client, model: "gpt-5-mini" })); + + await act(async () => { + await expect(result.current.sendMessage("Hi")).resolves.toBe(false); + }); + + await waitFor(() => { + expect(result.current.status).toBe("error"); + expect(result.current.error?.message).toBe("boom"); + expect(result.current.messages).toEqual([{ id: "id-1", role: "user", content: "Hi" }]); + }); + + shouldFail = false; + + await act(async () => { + await expect(result.current.sendMessage("Retry")).resolves.toBe(true); + }); + + await waitFor(() => { + expect(result.current.status).toBe("ready"); + expect(result.current.error).toBeUndefined(); + expect(result.current.messages).toEqual([ + { id: "id-1", role: "user", content: "Hi" }, + { id: "id-2", role: "user", content: "Retry" }, + { id: "id-3", role: "assistant", content: "Recovered" }, + ]); + }); + }); + + it("ignores blank and concurrent sends", async () => { + let releaseRequest!: () => void; + const requestGate = new Promise((resolve) => { + releaseRequest = resolve; + }); + + const client = { + streamChatCompletion: vi.fn(async function* () { + await requestGate; + yield { type: "text-delta", text: "Done" } as const; + yield { type: "done" } as const; + }), + } satisfies AIGatewayClient; + + const { result } = renderHook(() => useAIChat({ client, model: "gpt-5-mini" })); + + await act(async () => { + await expect(result.current.sendMessage(" ")).resolves.toBe(false); + }); + + expect(client.streamChatCompletion).not.toHaveBeenCalled(); + + await act(async () => { + void result.current.sendMessage("First"); + }); + + await act(async () => { + await expect(result.current.sendMessage("Second")).resolves.toBe(false); + }); + + expect(client.streamChatCompletion).toHaveBeenCalledTimes(1); + + releaseRequest(); + await waitFor(() => { + expect(result.current.status).toBe("ready"); + expect(result.current.messages).toEqual([ + { id: "id-1", role: "user", content: "First" }, + { id: "id-2", role: "assistant", content: "Done" }, + ]); + }); + }); +}); diff --git a/packages/core/src/ai/use-ai-chat.ts b/packages/core/src/ai/use-ai-chat.ts new file mode 100644 index 00000000..6a091fba --- /dev/null +++ b/packages/core/src/ai/use-ai-chat.ts @@ -0,0 +1,184 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import type { AIGatewayChatMessage, AIGatewayClient } from "./client"; + +export interface AIChatMessage { + id: string; + role: "user" | "assistant"; + content: string; +} + +export type AIChatStatus = "ready" | "submitted" | "streaming" | "error"; + +export function useAIChat(config: { client: AIGatewayClient; model: string; stream?: boolean }): { + messages: AIChatMessage[]; + status: AIChatStatus; + error?: Error; + /** + * Returns true when the message is sent and the stream finishes successfully. + * Returns false when the call is ignored, aborted, or the request fails. + */ + sendMessage: (message: string) => Promise; + stop: () => void; +} { + const [messages, setMessages] = useState([]); + const [status, setStatus] = useState("ready"); + const [error, setError] = useState(undefined); + const messagesRef = useRef([]); + const activeRequestRef = useRef(null); + const abortControllerRef = useRef(null); + + const updateMessages = useCallback((updater: (previous: AIChatMessage[]) => AIChatMessage[]) => { + setMessages((previous) => { + const next = updater(previous); + messagesRef.current = next; + return next; + }); + }, []); + + const stop = useCallback(() => { + const controller = abortControllerRef.current; + + if (!controller) { + return; + } + + activeRequestRef.current = null; + abortControllerRef.current = null; + controller.abort(); + setStatus("ready"); + }, []); + + useEffect(() => { + return () => { + activeRequestRef.current = null; + abortControllerRef.current?.abort(); + abortControllerRef.current = null; + }; + }, []); + + const sendMessage = useCallback( + async (message: string) => { + if (activeRequestRef.current) { + return false; + } + + const text = message.trim(); + if (!text) { + return false; + } + + const userMessage: AIChatMessage = { + id: crypto.randomUUID(), + role: "user", + content: text, + }; + + const nextMessages = [...messagesRef.current, userMessage]; + messagesRef.current = nextMessages; + setMessages(nextMessages); + setError(undefined); + setStatus("submitted"); + + const controller = new AbortController(); + const requestId = Symbol(); + activeRequestRef.current = requestId; + abortControllerRef.current = controller; + let assistantMessageId: string | null = null; + const isActive = () => activeRequestRef.current === requestId; + + try { + for await (const event of config.client.streamChatCompletion({ + model: config.model, + messages: nextMessages.map(toGatewayMessage), + ...(config.stream !== undefined ? { stream: config.stream } : {}), + signal: controller.signal, + })) { + if (!isActive()) { + return false; + } + + if (event.type !== "text-delta" || !event.text) { + continue; + } + + setStatus("streaming"); + + if (!assistantMessageId) { + assistantMessageId = crypto.randomUUID(); + updateMessages((previous) => [ + ...previous, + { + id: assistantMessageId!, + role: "assistant", + content: event.text, + }, + ]); + continue; + } + + updateMessages((previous) => + previous.map((entry) => + entry.id === assistantMessageId + ? { ...entry, content: `${entry.content}${event.text}` } + : entry, + ), + ); + } + + if (!isActive()) { + return false; + } + + setStatus("ready"); + return true; + } catch (caughtError) { + if (!isActive()) { + return false; + } + + if (isAbortError(caughtError)) { + setStatus("ready"); + return false; + } + + setError(toError(caughtError)); + setStatus("error"); + return false; + } finally { + if (activeRequestRef.current === requestId) { + activeRequestRef.current = null; + } + + if (abortControllerRef.current === controller) { + abortControllerRef.current = null; + } + } + }, + [config.client, config.model, config.stream, updateMessages], + ); + + return { + messages, + status, + error, + sendMessage, + stop, + }; +} + +function toGatewayMessage(message: AIChatMessage): AIGatewayChatMessage { + return { + role: message.role, + content: message.content, + }; +} + +function isAbortError(error: unknown): boolean { + return error instanceof DOMException + ? error.name === "AbortError" + : error instanceof Error && error.name === "AbortError"; +} + +function toError(error: unknown): Error { + return error instanceof Error ? error : new Error(String(error)); +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6a0767fd..4b11d3f4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -38,6 +38,14 @@ export { type EnhancedAuthClient, type AuthClientConfig, } from "./contexts/auth-context"; +export { + createAIGatewayClient, + type AIGatewayClient, + type AIGatewayChatMessage, + type AIGatewayChatRequest, + type AIChatCompletionEvent, +} from "./ai/client"; +export { useAIChat, type AIChatMessage, type AIChatStatus } from "./ai/use-ai-chat"; // Re-export auth-public-client types for advanced use cases export type { AuthClient } from "@tailor-platform/auth-public-client"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a0a9987..c0366fc7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,11 +106,11 @@ importers: specifier: workspace:* version: link:../packages/core '@tailor-platform/sdk': - specifier: ^1.45.1 - version: 1.45.1(@types/node@25.9.1)(@types/react@19.2.13)(typescript@5.9.3)(valibot@1.1.0(typescript@5.9.3)) + specifier: ^1.66.0 + version: 1.69.0(@types/node@25.9.1)(typescript@5.9.3)(valibot@1.1.0(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))) '@tailwindcss/vite': specifier: ^4.3.0 - version: 4.3.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 4.3.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) '@types/node': specifier: 'catalog:' version: 25.9.1 @@ -122,7 +122,7 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 5.2.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -140,7 +140,7 @@ importers: version: 5.9.3 vite: specifier: 'catalog:' - version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) examples/nextjs-app: dependencies: @@ -214,7 +214,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.3.0 - version: 4.3.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 4.3.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) '@types/react': specifier: 'catalog:' version: 19.2.13 @@ -223,19 +223,19 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 5.2.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) typescript: specifier: ~5.9.3 version: 5.9.3 vite: specifier: 'catalog:' - version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) packages/core: dependencies: '@base-ui/react': specifier: ^1.5.0 - version: 1.5.0(@types/react@19.2.13)(date-fns@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 1.5.0(@types/react@19.2.13)(date-fns@4.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@fontsource-variable/inter': specifier: ^5.0.0 version: 5.2.8 @@ -302,7 +302,7 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 5.2.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) happy-dom: specifier: ^20.9.0 version: 20.9.0 @@ -326,19 +326,19 @@ importers: version: 5.9.3 vite: specifier: 'catalog:' - version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) vite-plugin-dts: specifier: ^4.5.0 - version: 4.5.4(@types/node@25.9.1)(rollup@4.60.0)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 4.5.4(@types/node@25.9.1)(rollup@4.60.0)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) vite-plugin-externalize-deps: specifier: ^0.10.0 - version: 0.10.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 0.10.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 6.1.1(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) packages/sdk-plugin: devDependencies: @@ -347,19 +347,19 @@ importers: version: link:../core '@tailor-platform/sdk': specifier: ^1.45.1 - version: 1.45.1(@types/node@25.9.1)(typescript@5.9.3)(valibot@1.1.0(typescript@5.9.3)) + version: 1.45.1(@types/node@25.9.1)(@types/react@19.2.13)(typescript@5.9.3)(valibot@1.1.0(typescript@5.9.3)) oxlint: specifier: 'catalog:' version: 1.64.0 tsdown: specifier: 'catalog:' - version: 0.22.0(tsx@4.21.0)(typescript@5.9.3) + version: 0.22.0(tsx@4.22.4)(typescript@5.9.3) typescript: specifier: ^5 version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) packages/vite-plugin: dependencies: @@ -372,16 +372,16 @@ importers: version: 25.9.1 tsdown: specifier: 'catalog:' - version: 0.22.0(tsx@4.21.0)(typescript@5.9.3) + version: 0.22.0(tsx@4.22.4)(typescript@5.9.3) typescript: specifier: ^5 version: 5.9.3 vite: specifier: 'catalog:' - version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + version: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) packages: @@ -393,6 +393,14 @@ packages: graphql: optional: true + '@0no-co/graphql.web@1.3.2': + resolution: {integrity: sha512-Q1+pRlLhE31GOY/2c9BAEnFTNxO7Awtc6fhhEDlxyCBQ2N0IhD32cPVvPChrK9mwBNSgRdW/sF1kd2e0ojHj1Q==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + '@alcalzone/ansi-tokenize@0.1.3': resolution: {integrity: sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==} engines: {node: '>=14.13.1'} @@ -561,9 +569,24 @@ packages: '@types/react': optional: true + '@bufbuild/cel-spec@0.4.0': + resolution: {integrity: sha512-dUS6f2fNt6KEumsYGE7YFxERZE5ZuyME1hQmGjtO8tkZhR6ow6/ne3v4Gik9cfdb9lSLK3AJ+vDxCdGWmDbWvA==} + peerDependencies: + '@bufbuild/protobuf': ^2.6.2 + + '@bufbuild/cel@0.4.0': + resolution: {integrity: sha512-CdW/JgiTJCYXqnwuaJRo7NcoYhR37AaF58MMiog0/t8nudn86ZyLXYaA1f2yGhm2U17h8pKGZNksTHVSTcpmAw==} + peerDependencies: + '@bufbuild/protobuf': ^2.6.2 + '@bufbuild/protobuf@2.12.0': resolution: {integrity: sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==} + '@bufbuild/protovalidate@1.2.0': + resolution: {integrity: sha512-tD08DwGrHIV88khLz1Kdz9DYUwEo1TsoepaIg7/B/zd//AymaTx67kvCS1jlkcG/+vgQaSOl6f0HCE3sL8vI7w==} + peerDependencies: + '@bufbuild/protobuf': ^2.8.0 + '@changesets/apply-release-plan@7.1.1': resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} @@ -626,11 +649,23 @@ packages: '@bufbuild/protobuf': ^2.7.0 '@connectrpc/connect': 2.1.1 + '@connectrpc/connect-node@2.1.2': + resolution: {integrity: sha512-+i/aAOpsI8sIx1mbYp6d99zvxaUSF6t/jP9Ux9maAmjsZPgmIQ3JuIeYi0zJIP9zlCnBlJjkpPosshCgdRuThQ==} + engines: {node: '>=20'} + peerDependencies: + '@bufbuild/protobuf': ^2.7.0 + '@connectrpc/connect': 2.1.2 + '@connectrpc/connect@2.1.1': resolution: {integrity: sha512-JzhkaTvM73m2K1URT6tv53k2RwngSmCXLZJgK580qNQOXRzZRR/BCMfZw3h+90JpnG6XksP5bYT+cz0rpUzUWQ==} peerDependencies: '@bufbuild/protobuf': ^2.7.0 + '@connectrpc/connect@2.1.2': + resolution: {integrity: sha512-MXkBijtcX09R10Eb6sFeIetc6w6746eio6xtfuyVOH7oQAacT1X0GzMIQFux6Qy8cq3W/T5qX5Bei8YbFtmRGA==} + peerDependencies: + '@bufbuild/protobuf': ^2.7.0 + '@dependents/detective-less@5.0.3': resolution: {integrity: sha512-v6oD9Ukp+N7V4n6p5I/+mM5fIohSfkrDSGlFm5w/pYmchvbk+sMIHsLxrFJ5Lnujewj1BzWL0K84d88lwZAMQA==} engines: {node: '>=18'} @@ -638,174 +673,339 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.27.7': resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.27.7': resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.27.7': resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.27.7': resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.27.7': resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.27.7': resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.7': resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.27.7': resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.27.7': resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.27.7': resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.27.7': resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.27.7': resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.27.7': resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.27.7': resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.27.7': resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.27.7': resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.7': resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.7': resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.7': resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.7': resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.7': resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.27.7': resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.27.7': resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.27.7': resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.27.7': resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -990,6 +1190,10 @@ packages: resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/checkbox@4.3.2': resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} engines: {node: '>=18'} @@ -1008,6 +1212,15 @@ packages: '@types/node': optional: true + '@inquirer/checkbox@5.2.1': + resolution: {integrity: sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/confirm@5.1.21': resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} engines: {node: '>=18'} @@ -1026,6 +1239,15 @@ packages: '@types/node': optional: true + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/core@10.3.2': resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} engines: {node: '>=18'} @@ -1044,6 +1266,15 @@ packages: '@types/node': optional: true + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/editor@4.2.23': resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} engines: {node: '>=18'} @@ -1062,6 +1293,15 @@ packages: '@types/node': optional: true + '@inquirer/editor@5.2.2': + resolution: {integrity: sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/expand@4.0.23': resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} engines: {node: '>=18'} @@ -1080,6 +1320,15 @@ packages: '@types/node': optional: true + '@inquirer/expand@5.1.1': + resolution: {integrity: sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -1098,6 +1347,15 @@ packages: '@types/node': optional: true + '@inquirer/external-editor@3.0.3': + resolution: {integrity: sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/figures@1.0.15': resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} engines: {node: '>=18'} @@ -1106,6 +1364,10 @@ packages: resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/input@4.3.1': resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} engines: {node: '>=18'} @@ -1124,6 +1386,15 @@ packages: '@types/node': optional: true + '@inquirer/input@5.1.2': + resolution: {integrity: sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/number@3.0.23': resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} engines: {node: '>=18'} @@ -1142,6 +1413,15 @@ packages: '@types/node': optional: true + '@inquirer/number@4.1.1': + resolution: {integrity: sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/password@4.0.23': resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} engines: {node: '>=18'} @@ -1160,6 +1440,15 @@ packages: '@types/node': optional: true + '@inquirer/password@5.1.1': + resolution: {integrity: sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/prompts@7.10.1': resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} engines: {node: '>=18'} @@ -1178,6 +1467,15 @@ packages: '@types/node': optional: true + '@inquirer/prompts@8.5.2': + resolution: {integrity: sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/rawlist@4.1.11': resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} engines: {node: '>=18'} @@ -1196,6 +1494,15 @@ packages: '@types/node': optional: true + '@inquirer/rawlist@5.3.1': + resolution: {integrity: sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/search@3.2.2': resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} engines: {node: '>=18'} @@ -1214,6 +1521,15 @@ packages: '@types/node': optional: true + '@inquirer/search@4.2.1': + resolution: {integrity: sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/select@4.4.2': resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} engines: {node: '>=18'} @@ -1232,6 +1548,15 @@ packages: '@types/node': optional: true + '@inquirer/select@5.2.1': + resolution: {integrity: sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/type@3.0.10': resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} engines: {node: '>=18'} @@ -1250,6 +1575,15 @@ packages: '@types/node': optional: true + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -1307,24 +1641,48 @@ packages: cpu: [arm64] os: [darwin] + '@napi-rs/keyring-darwin-arm64@1.3.0': + resolution: {integrity: sha512-pl76hJvdYUBn6I24bXiOBMA9nbDapo3I5B+f3OorjDU4dUMSypXeKbOVehJe8fhgTiH24flMyTS3aAIy43xegQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@napi-rs/keyring-darwin-x64@1.2.0': resolution: {integrity: sha512-dBHjtKRCj4ByfnfqIKIJLo3wueQNJhLRyuxtX/rR4K/XtcS7VLlRD01XXizjpre54vpmObj63w+ZpHG+mGM8uA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@napi-rs/keyring-darwin-x64@1.3.0': + resolution: {integrity: sha512-YcJtEV5LA3cvA4z3BurgxH5IhTsW1JfIvcAAcqcecwk06Si9F9NqkxbZVIfDwQ8oRHgaBmT3zZJnLAotCrVahw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@napi-rs/keyring-freebsd-x64@1.2.0': resolution: {integrity: sha512-DPZFr11pNJSnaoh0dzSUNF+T6ORhy3CkzUT3uGixbA71cAOPJ24iG8e8QrLOkuC/StWrAku3gBnth2XMWOcR3Q==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] + '@napi-rs/keyring-freebsd-x64@1.3.0': + resolution: {integrity: sha512-vlLf31TGhfRAaxLDBhg8b89ss0HHD/lyNmL5F3UjSaz5CUXElsJmKYq9fqA/B+cZKUEUcLHHGhF0I/CqcFdaVw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + '@napi-rs/keyring-linux-arm-gnueabihf@1.2.0': resolution: {integrity: sha512-8xv6DyEMlvRdqJzp4F39RLUmmTQsLcGYYv/3eIfZNZN1O5257tHxTrFYqAsny659rJJK2EKeSa7PhrSibQqRWQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] + '@napi-rs/keyring-linux-arm-gnueabihf@1.3.0': + resolution: {integrity: sha512-KiWdMMu/Inz/bHHIAGrnF7r54FZDYXuHO6UFF/rhIrshUsxbMG1Rl9lEymNtqqsVo927G0VYcb02FzWQ3iBQRQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + '@napi-rs/keyring-linux-arm64-gnu@1.2.0': resolution: {integrity: sha512-Pu2V6Py+PBt7inryEecirl+t+ti8bhZphjP+W68iVaXHUxLdWmkgL9KI1VkbRHbx5k8K5Tew9OP218YfmVguIA==} engines: {node: '>= 10'} @@ -1332,6 +1690,13 @@ packages: os: [linux] libc: [glibc] + '@napi-rs/keyring-linux-arm64-gnu@1.3.0': + resolution: {integrity: sha512-eyKGpY40lm9Jvs1aD294XRH4y7+TlJM0YVAryZeXA6TX0mb4gMkxVXwSQv7MCwgah7raeUd0dKUb4BPAYIgcMg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@napi-rs/keyring-linux-arm64-musl@1.2.0': resolution: {integrity: sha512-8TDymrpC4P1a9iDEaegT7RnrkmrJN5eNZh3Im3UEV5PPYGtrb82CRxsuFohthCWQW81O483u1bu+25+XA4nKUw==} engines: {node: '>= 10'} @@ -1339,6 +1704,13 @@ packages: os: [linux] libc: [musl] + '@napi-rs/keyring-linux-arm64-musl@1.3.0': + resolution: {integrity: sha512-iIK6JWHXAJqDrEyLY3TmswwloVyt2vj+04TZnew+uSJ9gnDO8EwRbp3/iw3LpWaXiDO7VomGO6y8I0Id8uBZSw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@napi-rs/keyring-linux-riscv64-gnu@1.2.0': resolution: {integrity: sha512-awsB5XI1MYL7fwfjMDGmKOWvNgJEO7mM7iVEMS0fO39f0kVJnOSjlu7RHcXAF0LOx+0VfF3oxbWqJmZbvRCRHw==} engines: {node: '>= 10'} @@ -1346,6 +1718,13 @@ packages: os: [linux] libc: [glibc] + '@napi-rs/keyring-linux-riscv64-gnu@1.3.0': + resolution: {integrity: sha512-/PGqrwn6EwgtK6vccASSXJRfOSP4vN1F4ASsIQ+7MdrK6hNvAJ1FZPrIuD5gGGdxezo3F++To2Wq7DbuGIeuNQ==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@napi-rs/keyring-linux-x64-gnu@1.2.0': resolution: {integrity: sha512-8E+7z4tbxSJXxIBqA+vfB1CGajpCDRyTyqXkBig5NtASrv4YXcntSo96Iah2QDR5zD3dSTsmbqJudcj9rKKuHQ==} engines: {node: '>= 10'} @@ -1353,6 +1732,13 @@ packages: os: [linux] libc: [glibc] + '@napi-rs/keyring-linux-x64-gnu@1.3.0': + resolution: {integrity: sha512-2PDK1WKWTu9lBGq9VvNEkSlQD3O7YwVpmnyN2M3cy4v7NJ/8gDMd9GXv3G+FVXN13uhp4gnnPBS+ScefmEeD2A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@napi-rs/keyring-linux-x64-musl@1.2.0': resolution: {integrity: sha512-8RZ8yVEnmWr/3BxKgBSzmgntI7lNEsY7xouNfOsQkuVAiCNmxzJwETspzK3PQ2FHtDxgz5vHQDEBVGMyM4hUHA==} engines: {node: '>= 10'} @@ -1360,34 +1746,69 @@ packages: os: [linux] libc: [musl] + '@napi-rs/keyring-linux-x64-musl@1.3.0': + resolution: {integrity: sha512-oJ2HkX8YUo46QBkn0pG+HuIKQNqr523q6vBobCn+P95s4C4K6/kLBqHY/1bg5J4ap31DzsznhnFKcfBNBsjCnw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + '@napi-rs/keyring-win32-arm64-msvc@1.2.0': resolution: {integrity: sha512-AoqaDZpQ6KPE19VBLpxyORcp+yWmHI9Xs9Oo0PJ4mfHma4nFSLVdhAubJCxdlNptHe5va7ghGCHj3L9Akiv4cQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@napi-rs/keyring-win32-arm64-msvc@1.3.0': + resolution: {integrity: sha512-tOd3c/uAaeoE4ycVlmAdSvygz0Zt3zdca6Y7gokBeIbaRDWpjDIUOpU3MvML59XAaqyuKGsVVu0F/DZb1lHPmw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@napi-rs/keyring-win32-ia32-msvc@1.2.0': resolution: {integrity: sha512-EYL+EEI6bCsYi3LfwcQdnX3P/R76ENKNn+3PmpGheBsUFLuh0gQuP7aMVHM4rTw6UVe+L3vCLZSptq/oeacz0A==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] + '@napi-rs/keyring-win32-ia32-msvc@1.3.0': + resolution: {integrity: sha512-sPSqeAFZMGqP1R++M2JTza7GQJJ/TpCo6JU6Vcd4jnebvOaEDs9b7eipakU1PJdSvhpC2yXMCNRk9gXfrhuwHQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + '@napi-rs/keyring-win32-x64-msvc@1.2.0': resolution: {integrity: sha512-xFlx/TsmqmCwNU9v+AVnEJgoEAlBYgzFF5Ihz1rMpPAt4qQWWkMd4sCyM1gMJ1A/GnRqRegDiQpwaxGUHFtFbA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@napi-rs/keyring-win32-x64-msvc@1.3.0': + resolution: {integrity: sha512-4DnCWXwDc0HRKwyRlG5y0VhKZW2tNRQfKKfyj6IX/KWfDNyq9hn4n+GL1auyDcOO/v8PwnhmYo2+rOOqCkvvOg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@napi-rs/keyring@1.2.0': resolution: {integrity: sha512-d0d4Oyxm+v980PEq1ZH2PmS6cvpMIRc17eYpiU47KgW+lzxklMu6+HOEOPmxrpnF/XQZ0+Q78I2mgMhbIIo/dg==} engines: {node: '>= 10'} + '@napi-rs/keyring@1.3.0': + resolution: {integrity: sha512-WrOw/bcXm0f9qHkumlT1QlArXSTWqaY9sunsDpOk+yCCorCKMxvWT/a3xko4EYHVdeZoh00yI2TydXn6eyICDA==} + engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@next/env@16.2.6': resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} @@ -1459,6 +1880,10 @@ packages: resolution: {integrity: sha512-xrFlqhdhUyO8wSRn6DjE0145/HPWSJ5Nm0C7vWua6TdL/FSEAZvEyvdsa9CRXuxo9ebb7j/NEPhEcO62IJ0qUA==} engines: {node: '>=8.0.0'} + '@opentelemetry/api-logs@0.219.0': + resolution: {integrity: sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==} + engines: {node: '>=8.0.0'} + '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} @@ -1469,106 +1894,212 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/context-async-hooks@2.8.0': + resolution: {integrity: sha512-/3FIraneMcng67SUJCxvyInk/oxzwsxyadufk0wwfOBLf5wqtAGX4MoQASwSbndBPeARzBryUM9Azr5kHIdWLw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@2.7.0': resolution: {integrity: sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@2.8.0': + resolution: {integrity: sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/exporter-trace-otlp-proto@0.215.0': resolution: {integrity: sha512-+QclHuJmlp/I3Z2fNn+j1dAajMjJqJ4Sgo8ajwiK6Tzmg5SNwBGmBX66AZvTLe/3/bc3L7bo90m9gsaJBrzEsA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/exporter-trace-otlp-proto@0.219.0': + resolution: {integrity: sha512-lF/LUBfhOFmxJa+SQsLN7ziV4MHa2pyKgOM6JNehSOfU+npjM4gwm9oIKEJrzrWcexMcqydiyoFy0XCb1Ql3wQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-exporter-base@0.215.0': resolution: {integrity: sha512-lHrfbmeLSmesGSkkHiqDwOzfaEMSWXdc7q6UoLfbW8byONCb+bE/zkAr0kapN4US1baT/2nbpNT7Cn9XoB96Vg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-exporter-base@0.219.0': + resolution: {integrity: sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-transformer@0.215.0': resolution: {integrity: sha512-cWwBvaV+vkXHkSoTYR8hGw+AW03UlgTr6xtrUKOMeum3T+8vffYXIfXu6KY5MLu8O9QtoBKqaKWw9I5xoOepng==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-transformer@0.219.0': + resolution: {integrity: sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/resources@2.7.0': resolution: {integrity: sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/resources@2.8.0': + resolution: {integrity: sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-logs@0.215.0': resolution: {integrity: sha512-y3ucOmphzc4vgBTyIGchs+N/1rkACmoka8QalT2z1LBNM232Z17zMYayHcMl+dgMoOadZ0b72UZv7mDtqy1cFA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' + '@opentelemetry/sdk-logs@0.219.0': + resolution: {integrity: sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + '@opentelemetry/sdk-metrics@2.7.0': resolution: {integrity: sha512-Vd7h95av/LYRsAVN7wbprvvJnHkq7swMXAo7Uad0Uxf9jl6NSReLa0JNivrcc5BVIx/vl2t+cgdVQQbnVhsR9w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.9.0 <1.10.0' + '@opentelemetry/sdk-metrics@2.8.0': + resolution: {integrity: sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + '@opentelemetry/sdk-trace-base@2.7.0': resolution: {integrity: sha512-Yg9zEXJB50DLVLpsKPk7NmNqlPlS+OvqhJGh0A8oawIOTPOwlm4eXs9BMJV7L79lvEwI+dWtAj+YjTyddV336A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-base@2.8.0': + resolution: {integrity: sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-node@2.7.0': resolution: {integrity: sha512-RrFHOXw0IYp/OThew6QORdybnnLitUAUMCJKcQNBYS0hDkCYarO2vTkVxfrGxCIqd5XHSMvbCpBd/T8ZMw8oSg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-trace-node@2.8.0': + resolution: {integrity: sha512-nZt9OGufioAc3AfoLTqA9bsAeaMJAictYDdI2VcNQ+PmT+3rfKjAZDZvgPfd8VPX0O5Bw1hdQF6kDK8VSpZiWg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/semantic-conventions@1.40.0': resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.41.1': + resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} + engines: {node: '>=14'} + '@oxc-parser/binding-android-arm-eabi@0.127.0': resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] + '@oxc-parser/binding-android-arm-eabi@0.137.0': + resolution: {integrity: sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@oxc-parser/binding-android-arm64@0.127.0': resolution: {integrity: sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@oxc-parser/binding-android-arm64@0.137.0': + resolution: {integrity: sha512-WhALNzfy3x/RfC6bsqX+csavuUY0yHHE7XfgPE5M542uhoBZUUoGTPG+nkMbGoG4+gcfss5s7urMyn5QBHu0sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@oxc-parser/binding-darwin-arm64@0.127.0': resolution: {integrity: sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@oxc-parser/binding-darwin-arm64@0.137.0': + resolution: {integrity: sha512-bFPr5hgmNMOMoyPTGtdsK4Ug21RovIPojRMgDDhSp1LtCnc/DkLwGONKjgRjszg677RlGnkYSviQ8hHaUPOVYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@oxc-parser/binding-darwin-x64@0.127.0': resolution: {integrity: sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@oxc-parser/binding-darwin-x64@0.137.0': + resolution: {integrity: sha512-CL5dMm1asqXIDZHg14FLxj3Mc36w8PI7xCWh1uA4is6z8g2XrIILoTcQYOxDbwzuk34RDPX5IAGUxZr6LA9KAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@oxc-parser/binding-freebsd-x64@0.127.0': resolution: {integrity: sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@oxc-parser/binding-freebsd-x64@0.137.0': + resolution: {integrity: sha512-79h8rYGnSlKPGWo7mHr2ixO6ea7aW8B0CT965SZ8SLbNnCOH5aOYBTeVXUY6eMvEaiLyWr8Skuiugr5pDYgLGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': resolution: {integrity: sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm-gnueabihf@0.137.0': + resolution: {integrity: sha512-ASgmlSimhGyr0lksgVIo6hibz1obnDq4qJbiMX/AzltfgPnanRrzG1Q+23g8ljOHOjv6dsznkUuCYL3gg0sY1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': resolution: {integrity: sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.137.0': + resolution: {integrity: sha512-AU2J9aa22Sx32wRGnDjybOU9TQXXQUud5sdUi+ZB0XxwM8aToWLweV+yA0wlQm0yIUVqljquqoHCYEq9II8gJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': resolution: {integrity: sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1576,6 +2107,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-arm64-gnu@0.137.0': + resolution: {integrity: sha512-GdEtiG89yMr7XkUGxifgodXEEm2f+xW2f9CpDjlgAnBOwhTmrpQMvhOGobLVKUyzf/qHBXW16smk5zbF3nZU6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-arm64-musl@0.127.0': resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1583,6 +2121,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-arm64-musl@0.137.0': + resolution: {integrity: sha512-EGJ+Bs8iXx8KBH8DQ5BLoEm5lnHaYjlh4/8j8vFhrr/6z4tqONy5BZDzLpKmmNWlN6Hlc5r8YOuBVHqZ9vRFEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1590,6 +2135,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-ppc64-gnu@0.137.0': + resolution: {integrity: sha512-vzFUQENy/fnbSe5DZWovq6tIBc1uhuMztanSW6rz1e9WdQE4gHwYuD7ZII6JnrJifd1R3RSoqiZbgRFlVL2tYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1597,6 +2149,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.137.0': + resolution: {integrity: sha512-SfVI14HBQs9gtLcUD5hTt5hsNbdrqSUNg9S8muN+LhVQ5nf1WwH3hAoK6B9NKgdYgWAQSXFXGiiBedQ4r/BKuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1604,6 +2163,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-riscv64-musl@0.137.0': + resolution: {integrity: sha512-e7Ppy4FCIFNQxT/ikSeIWFoQ0l+N9vgtRBtLcyZXeolTzApyVoPqEXsYPrcdM/9i0Bwk8knvYd37vaEMxHyi6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1611,6 +2177,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-s390x-gnu@0.137.0': + resolution: {integrity: sha512-Bho5qFwdhqsIFR7gipYEUlqvi3SRrY8sugxXig380MIaakBB1PyU9+7dBiBVScfImTNWhijUxdBwqrprGdq5WA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.127.0': resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1618,6 +2191,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.137.0': + resolution: {integrity: sha512-36mGWtg7PyFzjJwGDkH6/F4o2nIDEoKXLPr/X/lwqklkomQwJJt1I5GJVmGhovUEmgPK5WAeAZMqlFCehwiy9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-x64-musl@0.127.0': resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1625,41 +2205,80 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-x64-musl@0.137.0': + resolution: {integrity: sha512-/Jqx6+N7A44n2BdvUr7pXhVr2vFjs6WGH3unZRczwrfiH0H1zY0QwKQMG/dtRiTlKGDKGukznPT8lx84/oEsZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-openharmony-arm64@0.127.0': resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@oxc-parser/binding-openharmony-arm64@0.137.0': + resolution: {integrity: sha512-9Uj0qHNNl+OgT1UTGwF7ixIXU6T1u2SbMidmgPy/h1h/fl2gRS6YpAxxY1gwHofcWjoTwkoMFd8xs5Vuj6GOFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@oxc-parser/binding-wasm32-wasi@0.127.0': resolution: {integrity: sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@oxc-parser/binding-wasm32-wasi@0.137.0': + resolution: {integrity: sha512-gW2vfkytNGgMVADiuzdvOfw0mWG9za20F/1fCJsif5aBMAvWJTSbpIXbIe0XkOe0VENk+PadpQ7cZgUy2sUJcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': resolution: {integrity: sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@oxc-parser/binding-win32-arm64-msvc@0.137.0': + resolution: {integrity: sha512-x+pFANF0yL5uK/6T7lu6SlR5qid6sp//eZXKLq5iNsIE+EQg6EaS8/wsW7E91nXXjpnPhSoMOHXShSVhGRdn8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': resolution: {integrity: sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.137.0': + resolution: {integrity: sha512-sQUqym80PFi6McRsIqfJrSu2JrSClEZIXXD+/FjAFoULEKzOPsldIdFBG96xdX8aVMzCNQ9792FPx3MfkEIrFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.127.0': resolution: {integrity: sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.137.0': + resolution: {integrity: sha512-2AsevxlvNN4WKxpEn3RtqD5zbqMaXF+T7JXblsP4gVuY+vC9dXS4ED/PwfRCliFqoeisYS3Iro4DHzxr0TEvVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxc-project/types@0.127.0': resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} '@oxc-project/types@0.132.0': resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} + '@oxc-project/types@0.137.0': + resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} + '@oxfmt/binding-android-arm-eabi@0.47.0': resolution: {integrity: sha512-KrMQRdMi/upr81qT4ijK6X6BNp6jqpMY7FwILQnwIy9QLc3qpnhUx5rsCLGzn4ewsCQ0CNAspN2ogmP1GXLyLw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1971,6 +2590,12 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.1.2': + resolution: {integrity: sha512-2cZ+7xRS+DBcuJBJKnfzsbleumJhBqSlJVpuzHC0nTqfd3QQ7Vx2/x5YR/D7cBamKSeWplwo82Fn9lqYUDEMfA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1983,6 +2608,12 @@ packages: cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.1.2': + resolution: {integrity: sha512-RkPMJnygxsgOYdkfqgpwY0/Fzm8d0VQe6HGU2/B00Xa9eqdLbrII+DOKAodbJAn3ZL1AJxGHkZRPYazgGY6Ljw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.17': resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1995,6 +2626,12 @@ packages: cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.1.2': + resolution: {integrity: sha512-Uiczh6vFhwyfd7WNe7Q7mCA4KxAiLdz7jPE/WGizfRpIieoyFuNVMmM8HqZ9HwudTkY6/AeMQwlNJ9NJijguWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2007,6 +2644,12 @@ packages: cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.1.2': + resolution: {integrity: sha512-+TpdtTRgHiJFjCVFbw311SuLk3KfytPOQQn+VlAEv+gBxYPtL7E6JS9e/tk+8CwxhIZvemJKo4rTKgfWNsKkkA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2019,6 +2662,12 @@ packages: cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.1.2': + resolution: {integrity: sha512-4lv1/tkmi7ueIVHnyreaOeUpiZP26BH9rRy6hoYfR9310A2B9nUEVRDvBx69vx64Nr3eTPPRkyciqJJs+j9Jmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2033,6 +2682,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.1.2': + resolution: {integrity: sha512-gBSUVO0eaWgw1JMjK3gB8BMlX2Mk148s2lTiVT3e9vjVxbl7UDfMWWY8CfIaaqiXuM9fVTMxIpUz6CAo/B6Vlw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2047,6 +2703,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.1.2': + resolution: {integrity: sha512-LjQP/iZLBu8o8PjIfk4x3At0/mT6h282pvz8Z5LAyhGbu/kDezyO7ea62rF5uoqmgnIYqbN/MqJ3Si3Aymi7xQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2054,8 +2717,15 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.0.2': - resolution: {integrity: sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==} + '@rolldown/binding-linux-ppc64-gnu@1.0.2': + resolution: {integrity: sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-ppc64-gnu@1.1.2': + resolution: {integrity: sha512-X/7bVLWelEsbyWDUSXt7zVsTniLLPIY2n1rH58qr78l9i7MNbbxBWD8gI2vRfBWf4NUXJCUuQnfZDsp32LqsfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] @@ -2075,6 +2745,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.1.2': + resolution: {integrity: sha512-gb6dYKW/1KDorGXyy48glEBJs/sxVSC5pcVrox/pFGV4mvwSFeg2sK5L2tRkVsVlh7kueqOgg4GEcuipJcGuKg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2089,6 +2766,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.1.2': + resolution: {integrity: sha512-JY4w85pU3iAiJVMh5nuk4/Mh9GjMsupe8MrIN53rwxAZW64GKrWeJBuN6SxQg9QTU5uB1cxyhDzW8jqRn1EABw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2103,6 +2787,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.1.2': + resolution: {integrity: sha512-xvpA7o5KCYLB0Rwscmuylb1/zHHSUx4g4xilm4prC5jP76pEUlzBmMbgpbh7bVDbId4NcfT96gN5i6mE6UDaiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2115,6 +2806,12 @@ packages: cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.1.2': + resolution: {integrity: sha512-p/ts6KBLjuk49Bp21XH77poQGt02iNz7ChgHep7tudPOaLinR/De/RHdxF8w8Yj4r/bF/bqXwH6PZrB2sA+Nvw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2125,6 +2822,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.1.2': + resolution: {integrity: sha512-VMu/wmrZ9hJzYlRhbw7jK5PODlugyKZ5mOdX78+lS8OvuFkWNQdz1pFLrI2p3P0pjXOmUZ7B48o5VnMH9QOGtg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2137,6 +2839,12 @@ packages: cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.1.2': + resolution: {integrity: sha512-xtUJqs8qEkuSviS0n1tsohaPuz3a1SPhZywOji4Oo+sgrJs8daEDMZ0QtqL0OS7dx8PoVpg2J/ZZycPY5I2+Zg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2149,6 +2857,12 @@ packages: cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.1.2': + resolution: {integrity: sha512-85YiLQqjUKgSO/Zjnf9e0XIn5Ymrh1fLDWBeAkZqpuBR/3R8TpfoHXuyblqyQrftSSgWO9qpcHN8mkyKsLraoA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-rc.17': resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} @@ -2445,6 +3159,19 @@ packages: resolution: {integrity: sha512-XRzhSGAa46tdeR8TIfFBXUMHIxU5tMO/vueB+ocVaeC0wjktj+PfXsE1bOD99kP0+ox0Jm8eTpnNwDlSxfGJGg==} hasBin: true + '@tailor-platform/sdk@1.69.0': + resolution: {integrity: sha512-1v3Yu7QnECKEbwDLXXymlHU8G3MUsweRJJtjzfZNsquGC9kK62njmsk47BQ2iyUOv/7Bwd9KSG0/qv9NX3h3QQ==} + engines: {bun: '>=1.2.0', node: '>=22'} + hasBin: true + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vitest: '>=4' + peerDependenciesMeta: + vite: + optional: true + vitest: + optional: true + '@tailwindcss/node@4.3.0': resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} @@ -2579,6 +3306,9 @@ packages: '@toiroakr/read-multiline@0.3.2': resolution: {integrity: sha512-6mU+J4l2v0SwHNkhppQ4ZK0w5nQiTFm/PjY8ILVyKnYOSgILVDz9aM7v6MJyF5v662h8y7Nc2/V40GeD8Wg9fA==} + '@toiroakr/read-multiline@0.4.1': + resolution: {integrity: sha512-uuNmzOCjn9nYgIGJe1Ztr3VXxQN5wlspFaCWtcW5qr5KZ3UluHiBvxfjKNplmP4zV25kFl1QkkaQEOoHOrjp8g==} + '@ts-graphviz/adapter@2.0.6': resolution: {integrity: sha512-kJ10lIMSWMJkLkkCG5gt927SnGZcBuG0s0HHswGzcHTgvtUe7yk5/3zTEr0bafzsodsOq5Gi6FhQeV775nC35Q==} engines: {node: '>=18'} @@ -2631,6 +3361,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -2722,6 +3455,9 @@ packages: '@urql/core@6.0.1': resolution: {integrity: sha512-FZDiQk6jxbj5hixf2rEPv0jI+IZz0EqqGW8mJBEug68/zHTtT+f34guZDmyjJZyiWbj0vL165LoMr/TkeDHaug==} + '@urql/core@6.0.2': + resolution: {integrity: sha512-9Z4/o97iJujIHKIXcT6jTz147nEb2myZGUKRZ7caHomnKNmm6vd3kpIrkaCuoWJDWrF21eVbNhHWhrBP7gItYw==} + '@vitejs/plugin-react@5.2.0': resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3164,6 +3900,9 @@ packages: date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -3346,11 +4085,19 @@ packages: es-toolkit@1.46.0: resolution: {integrity: sha512-IToJ6ct9OLl5zz6WsC/1vZEwfSZ7Myil+ygl5Tf30Xjn9AEkzNB4kqp2G7VUJKF1DtTx/ra5M5KLlXvzOg51BA==} + es-toolkit@1.48.1: + resolution: {integrity: sha512-wfnXlwd5I75eXRtdD2vuEs50xHHESECDsGD7yiQnfFVNoa5522NwXEbmgo98LfiukSQHs+mBM7/YG3qKJB9/mQ==} + esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3526,6 +4273,10 @@ packages: resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} engines: {node: '>=18'} + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + engines: {node: '>=18'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -3549,6 +4300,10 @@ packages: resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + graphql@17.0.1: + resolution: {integrity: sha512-8eWbg5Zcv/8o20nzEjHUGPTj20MLFJjc5kagbIPxbaeGxvFwpitJhemEC/k17n5+UD4M/9ea5rTuce78mELujQ==} + engines: {node: ^22.0.0 || ^24.0.0 || ^25.0.0 || >=26.0.0} + gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} @@ -3821,6 +4576,10 @@ packages: resolution: {integrity: sha512-3i5pmOiZvMDj00qhrIVbH0AnioVTx22DMP7Vn5At4yJO46iy+FM8Y/g61ltenLVSo3fiO8h8Q3QOFgf/gQ72ww==} engines: {node: '>=20.0.0'} + kysely@0.29.2: + resolution: {integrity: sha512-s6WVJyEZrbm6jhBpiKHsGHyePMrVQKJ85wZCFCr9W4QHv6WTjWIrdvTmO9hDEA3bNK0xkrE2DqrHsXMLWuZpQg==} + engines: {node: '>=22.0.0'} + lefthook-darwin-arm64@2.1.6: resolution: {integrity: sha512-hyB7eeiX78BS66f70byTJacDLC/xV1vgMv9n+idFUsrM7J3Udd/ag9Ag5NP3t0eN0EqQqAtrNnt35EH01lxnRQ==} cpu: [arm64] @@ -4209,6 +4968,10 @@ packages: resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.137.0: + resolution: {integrity: sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg==} + engines: {node: ^20.19.0 || >=22.12.0} + oxfmt@0.47.0: resolution: {integrity: sha512-OFbkbzxKCpooQEnRmpTDnuwTX8KHXzZTQ4Df/hz85fpS67Pl+lxPEFvUtin56HIIS0B1k4X8oIzTXRZPufA2CA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4320,6 +5083,9 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + playwright-core@1.51.1: resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} engines: {node: '>=18'} @@ -4347,6 +5113,20 @@ packages: '@inquirer/prompts': optional: true + politty@0.9.2: + resolution: {integrity: sha512-qO4yxKtYSf8Rhwn3NqW6VRce8BGRODs9zifmK1LmAf7T+Xd0rHH2GaDwZBcjej4CgnGPO90loQaSbeU0kZOeUA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@clack/prompts': ^0.10.0 || ^0.11.0 || ^1.0.0 + '@inquirer/prompts': ^8.3.2 + zod: ^4.2.1 + peerDependenciesMeta: + '@clack/prompts': + optional: true + '@inquirer/prompts': + optional: true + postcss-values-parser@6.0.2: resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} engines: {node: '>=10'} @@ -4598,6 +5378,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.1.2: + resolution: {integrity: sha512-x0CrQQqCXWGeI8dTvFfN/Dnv3yMKT9hv5jFjlOreKAx9wqLq9wz7VvLLHyaAXC90/CpggTu9SisSbsJJTPSjNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.60.0: resolution: {integrity: sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4660,6 +5445,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + serve-handler@6.1.7: resolution: {integrity: sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==} @@ -4965,6 +5755,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + engines: {node: '>=18.0.0'} + hasBin: true + turbo@2.9.14: resolution: {integrity: sha512-BQqXRr4UoWI3UPFrtznCLykYHxwxWh53iCB57x092jPMjIlW1wnm3N895g5irpiXmnxUhREBB0n6+y8BHhs4nw==} hasBin: true @@ -4988,6 +5783,10 @@ packages: resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} engines: {node: '>=20'} + type-fest@5.7.0: + resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} + engines: {node: '>=20'} + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} @@ -5010,6 +5809,10 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@8.5.0: + resolution: {integrity: sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==} + engines: {node: '>=22.19.0'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -5223,6 +6026,11 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} @@ -5244,12 +6052,23 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + snapshots: '@0no-co/graphql.web@1.2.0(graphql@16.13.2)': optionalDependencies: graphql: 16.13.2 + '@0no-co/graphql.web@1.2.0(graphql@17.0.1)': + optionalDependencies: + graphql: 17.0.1 + + '@0no-co/graphql.web@1.3.2(graphql@17.0.1)': + optionalDependencies: + graphql: 17.0.1 + '@alcalzone/ansi-tokenize@0.1.3': dependencies: ansi-styles: 6.2.3 @@ -5407,7 +6226,7 @@ snapshots: '@badgateway/oauth2-client@3.3.1': {} - '@base-ui/react@1.5.0(@types/react@19.2.13)(date-fns@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@base-ui/react@1.5.0(@types/react@19.2.13)(date-fns@4.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@babel/runtime': 7.29.2 '@base-ui/utils': 0.2.9(@types/react@19.2.13)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -5418,7 +6237,7 @@ snapshots: use-sync-external-store: 1.6.0(react@19.2.6) optionalDependencies: '@types/react': 19.2.13 - date-fns: 4.1.0 + date-fns: 4.4.0 '@base-ui/utils@0.2.9(@types/react@19.2.13)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: @@ -5431,8 +6250,22 @@ snapshots: optionalDependencies: '@types/react': 19.2.13 + '@bufbuild/cel-spec@0.4.0(@bufbuild/protobuf@2.12.0)': + dependencies: + '@bufbuild/protobuf': 2.12.0 + + '@bufbuild/cel@0.4.0(@bufbuild/protobuf@2.12.0)': + dependencies: + '@bufbuild/cel-spec': 0.4.0(@bufbuild/protobuf@2.12.0) + '@bufbuild/protobuf': 2.12.0 + '@bufbuild/protobuf@2.12.0': {} + '@bufbuild/protovalidate@1.2.0(@bufbuild/protobuf@2.12.0)': + dependencies: + '@bufbuild/cel': 0.4.0(@bufbuild/protobuf@2.12.0) + '@bufbuild/protobuf': 2.12.0 + '@changesets/apply-release-plan@7.1.1': dependencies: '@changesets/config': 3.1.4 @@ -5581,10 +6414,19 @@ snapshots: '@bufbuild/protobuf': 2.12.0 '@connectrpc/connect': 2.1.1(@bufbuild/protobuf@2.12.0) + '@connectrpc/connect-node@2.1.2(@bufbuild/protobuf@2.12.0)(@connectrpc/connect@2.1.2(@bufbuild/protobuf@2.12.0))': + dependencies: + '@bufbuild/protobuf': 2.12.0 + '@connectrpc/connect': 2.1.2(@bufbuild/protobuf@2.12.0) + '@connectrpc/connect@2.1.1(@bufbuild/protobuf@2.12.0)': dependencies: '@bufbuild/protobuf': 2.12.0 + '@connectrpc/connect@2.1.2(@bufbuild/protobuf@2.12.0)': + dependencies: + '@bufbuild/protobuf': 2.12.0 + '@dependents/detective-less@5.0.3': dependencies: gonzales-pe: 4.3.0 @@ -5596,6 +6438,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -5607,6 +6455,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 @@ -5617,84 +6470,167 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.7': optional: true + '@esbuild/aix-ppc64@0.28.1': + optional: true + '@esbuild/android-arm64@0.27.7': optional: true + '@esbuild/android-arm64@0.28.1': + optional: true + '@esbuild/android-arm@0.27.7': optional: true + '@esbuild/android-arm@0.28.1': + optional: true + '@esbuild/android-x64@0.27.7': optional: true + '@esbuild/android-x64@0.28.1': + optional: true + '@esbuild/darwin-arm64@0.27.7': optional: true + '@esbuild/darwin-arm64@0.28.1': + optional: true + '@esbuild/darwin-x64@0.27.7': optional: true + '@esbuild/darwin-x64@0.28.1': + optional: true + '@esbuild/freebsd-arm64@0.27.7': optional: true + '@esbuild/freebsd-arm64@0.28.1': + optional: true + '@esbuild/freebsd-x64@0.27.7': optional: true + '@esbuild/freebsd-x64@0.28.1': + optional: true + '@esbuild/linux-arm64@0.27.7': optional: true + '@esbuild/linux-arm64@0.28.1': + optional: true + '@esbuild/linux-arm@0.27.7': optional: true + '@esbuild/linux-arm@0.28.1': + optional: true + '@esbuild/linux-ia32@0.27.7': optional: true + '@esbuild/linux-ia32@0.28.1': + optional: true + '@esbuild/linux-loong64@0.27.7': optional: true + '@esbuild/linux-loong64@0.28.1': + optional: true + '@esbuild/linux-mips64el@0.27.7': optional: true + '@esbuild/linux-mips64el@0.28.1': + optional: true + '@esbuild/linux-ppc64@0.27.7': optional: true + '@esbuild/linux-ppc64@0.28.1': + optional: true + '@esbuild/linux-riscv64@0.27.7': optional: true + '@esbuild/linux-riscv64@0.28.1': + optional: true + '@esbuild/linux-s390x@0.27.7': optional: true + '@esbuild/linux-s390x@0.28.1': + optional: true + '@esbuild/linux-x64@0.27.7': optional: true + '@esbuild/linux-x64@0.28.1': + optional: true + '@esbuild/netbsd-arm64@0.27.7': optional: true + '@esbuild/netbsd-arm64@0.28.1': + optional: true + '@esbuild/netbsd-x64@0.27.7': optional: true + '@esbuild/netbsd-x64@0.28.1': + optional: true + '@esbuild/openbsd-arm64@0.27.7': optional: true + '@esbuild/openbsd-arm64@0.28.1': + optional: true + '@esbuild/openbsd-x64@0.27.7': optional: true + '@esbuild/openbsd-x64@0.28.1': + optional: true + '@esbuild/openharmony-arm64@0.27.7': optional: true + '@esbuild/openharmony-arm64@0.28.1': + optional: true + '@esbuild/sunos-x64@0.27.7': optional: true + '@esbuild/sunos-x64@0.28.1': + optional: true + '@esbuild/win32-arm64@0.27.7': optional: true + '@esbuild/win32-arm64@0.28.1': + optional: true + '@esbuild/win32-ia32@0.27.7': optional: true + '@esbuild/win32-ia32@0.28.1': + optional: true + '@esbuild/win32-x64@0.27.7': optional: true + '@esbuild/win32-x64@0.28.1': + optional: true + '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -5820,6 +6756,8 @@ snapshots: '@inquirer/ansi@2.0.5': {} + '@inquirer/ansi@2.0.7': {} + '@inquirer/checkbox@4.3.2(@types/node@25.9.1)': dependencies: '@inquirer/ansi': 1.0.2 @@ -5839,6 +6777,15 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/checkbox@5.2.1(@types/node@25.9.1)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/confirm@5.1.21(@types/node@25.9.1)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.9.1) @@ -5853,6 +6800,13 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/confirm@6.1.1(@types/node@25.9.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/core@10.3.2(@types/node@25.9.1)': dependencies: '@inquirer/ansi': 1.0.2 @@ -5878,6 +6832,18 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/core@11.2.1(@types/node@25.9.1)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.0 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/editor@4.2.23(@types/node@25.9.1)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.9.1) @@ -5894,6 +6860,14 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/editor@5.2.2(@types/node@25.9.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/external-editor': 3.0.3(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/expand@4.0.23(@types/node@25.9.1)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.9.1) @@ -5909,6 +6883,13 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/expand@5.1.1(@types/node@25.9.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/external-editor@1.0.3(@types/node@25.9.1)': dependencies: chardet: 2.1.1 @@ -5923,10 +6904,19 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/external-editor@3.0.3(@types/node@25.9.1)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/figures@1.0.15': {} '@inquirer/figures@2.0.5': {} + '@inquirer/figures@2.0.7': {} + '@inquirer/input@4.3.1(@types/node@25.9.1)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.9.1) @@ -5941,6 +6931,13 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/input@5.1.2(@types/node@25.9.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/number@3.0.23(@types/node@25.9.1)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.9.1) @@ -5955,6 +6952,13 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/number@4.1.1(@types/node@25.9.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/password@4.0.23(@types/node@25.9.1)': dependencies: '@inquirer/ansi': 1.0.2 @@ -5971,6 +6975,14 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/password@5.1.1(@types/node@25.9.1)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/prompts@7.10.1(@types/node@25.9.1)': dependencies: '@inquirer/checkbox': 4.3.2(@types/node@25.9.1) @@ -6001,6 +7013,21 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/prompts@8.5.2(@types/node@25.9.1)': + dependencies: + '@inquirer/checkbox': 5.2.1(@types/node@25.9.1) + '@inquirer/confirm': 6.1.1(@types/node@25.9.1) + '@inquirer/editor': 5.2.2(@types/node@25.9.1) + '@inquirer/expand': 5.1.1(@types/node@25.9.1) + '@inquirer/input': 5.1.2(@types/node@25.9.1) + '@inquirer/number': 4.1.1(@types/node@25.9.1) + '@inquirer/password': 5.1.1(@types/node@25.9.1) + '@inquirer/rawlist': 5.3.1(@types/node@25.9.1) + '@inquirer/search': 4.2.1(@types/node@25.9.1) + '@inquirer/select': 5.2.1(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/rawlist@4.1.11(@types/node@25.9.1)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.9.1) @@ -6016,6 +7043,13 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/rawlist@5.3.1(@types/node@25.9.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/search@3.2.2(@types/node@25.9.1)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.9.1) @@ -6033,6 +7067,14 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/search@4.2.1(@types/node@25.9.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/select@4.4.2(@types/node@25.9.1)': dependencies: '@inquirer/ansi': 1.0.2 @@ -6052,6 +7094,15 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/select@5.2.1(@types/node@25.9.1)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + '@inquirer/type@3.0.10(@types/node@25.9.1)': optionalDependencies: '@types/node': 25.9.1 @@ -6060,6 +7111,10 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 + '@inquirer/type@4.0.7(@types/node@25.9.1)': + optionalDependencies: + '@types/node': 25.9.1 + '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -6094,30 +7149,7 @@ snapshots: commander: 13.1.0 glob: 11.1.0 ink: 6.0.1(@types/react@19.2.13)(react@19.1.1) - ink-gradient: 3.0.0(ink@6.0.1(@types/react@19.2.13)(react@19.2.6)) - inquirer: 12.6.3(@types/node@25.9.1) - neverthrow: 8.2.0 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - valibot: 1.1.0(typescript@5.9.3) - yoctocolors: 2.1.2 - transitivePeerDependencies: - - '@swc/helpers' - - '@types/node' - - '@types/react' - - bufferutil - - react-devtools-core - - typescript - - utf-8-validate - - '@liam-hq/cli@0.7.24(@types/node@25.9.1)(typescript@5.9.3)': - dependencies: - '@prisma/internals': 6.8.2(typescript@5.9.3) - '@swc/core': 1.12.11 - commander: 13.1.0 - glob: 11.1.0 - ink: 6.0.1(react@19.1.1) - ink-gradient: 3.0.0(ink@6.0.1(react@19.1.1)) + ink-gradient: 3.0.0(ink@6.0.1(@types/react@19.2.13)(react@19.1.1)) inquirer: 12.6.3(@types/node@25.9.1) neverthrow: 8.2.0 react: 19.1.1 @@ -6188,39 +7220,75 @@ snapshots: '@napi-rs/keyring-darwin-arm64@1.2.0': optional: true - '@napi-rs/keyring-darwin-x64@1.2.0': + '@napi-rs/keyring-darwin-arm64@1.3.0': + optional: true + + '@napi-rs/keyring-darwin-x64@1.2.0': + optional: true + + '@napi-rs/keyring-darwin-x64@1.3.0': optional: true '@napi-rs/keyring-freebsd-x64@1.2.0': optional: true + '@napi-rs/keyring-freebsd-x64@1.3.0': + optional: true + '@napi-rs/keyring-linux-arm-gnueabihf@1.2.0': optional: true + '@napi-rs/keyring-linux-arm-gnueabihf@1.3.0': + optional: true + '@napi-rs/keyring-linux-arm64-gnu@1.2.0': optional: true + '@napi-rs/keyring-linux-arm64-gnu@1.3.0': + optional: true + '@napi-rs/keyring-linux-arm64-musl@1.2.0': optional: true + '@napi-rs/keyring-linux-arm64-musl@1.3.0': + optional: true + '@napi-rs/keyring-linux-riscv64-gnu@1.2.0': optional: true + '@napi-rs/keyring-linux-riscv64-gnu@1.3.0': + optional: true + '@napi-rs/keyring-linux-x64-gnu@1.2.0': optional: true + '@napi-rs/keyring-linux-x64-gnu@1.3.0': + optional: true + '@napi-rs/keyring-linux-x64-musl@1.2.0': optional: true + '@napi-rs/keyring-linux-x64-musl@1.3.0': + optional: true + '@napi-rs/keyring-win32-arm64-msvc@1.2.0': optional: true + '@napi-rs/keyring-win32-arm64-msvc@1.3.0': + optional: true + '@napi-rs/keyring-win32-ia32-msvc@1.2.0': optional: true + '@napi-rs/keyring-win32-ia32-msvc@1.3.0': + optional: true + '@napi-rs/keyring-win32-x64-msvc@1.2.0': optional: true + '@napi-rs/keyring-win32-x64-msvc@1.3.0': + optional: true + '@napi-rs/keyring@1.2.0': optionalDependencies: '@napi-rs/keyring-darwin-arm64': 1.2.0 @@ -6236,6 +7304,21 @@ snapshots: '@napi-rs/keyring-win32-ia32-msvc': 1.2.0 '@napi-rs/keyring-win32-x64-msvc': 1.2.0 + '@napi-rs/keyring@1.3.0': + optionalDependencies: + '@napi-rs/keyring-darwin-arm64': 1.3.0 + '@napi-rs/keyring-darwin-x64': 1.3.0 + '@napi-rs/keyring-freebsd-x64': 1.3.0 + '@napi-rs/keyring-linux-arm-gnueabihf': 1.3.0 + '@napi-rs/keyring-linux-arm64-gnu': 1.3.0 + '@napi-rs/keyring-linux-arm64-musl': 1.3.0 + '@napi-rs/keyring-linux-riscv64-gnu': 1.3.0 + '@napi-rs/keyring-linux-x64-gnu': 1.3.0 + '@napi-rs/keyring-linux-x64-musl': 1.3.0 + '@napi-rs/keyring-win32-arm64-msvc': 1.3.0 + '@napi-rs/keyring-win32-ia32-msvc': 1.3.0 + '@napi-rs/keyring-win32-x64-msvc': 1.3.0 + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -6250,6 +7333,13 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + '@next/env@16.2.6': {} '@next/swc-darwin-arm64@16.2.6': @@ -6292,17 +7382,30 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs@0.219.0': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api@1.9.1': {} '@opentelemetry/context-async-hooks@2.7.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core@2.7.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/exporter-trace-otlp-proto@0.215.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 @@ -6312,12 +7415,27 @@ snapshots: '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base@0.215.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) '@opentelemetry/otlp-transformer': 0.215.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer@0.215.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 @@ -6329,12 +7447,28 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) protobufjs: 8.0.3 + '@opentelemetry/otlp-transformer@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources@2.7.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/resources@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/sdk-logs@0.215.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 @@ -6343,12 +7477,26 @@ snapshots: '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/sdk-logs@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/sdk-metrics@2.7.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 @@ -6356,6 +7504,13 @@ snapshots: '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/sdk-trace-node@2.7.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 @@ -6363,56 +7518,113 @@ snapshots: '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions@1.40.0': {} + '@opentelemetry/semantic-conventions@1.41.1': {} + '@oxc-parser/binding-android-arm-eabi@0.127.0': optional: true + '@oxc-parser/binding-android-arm-eabi@0.137.0': + optional: true + '@oxc-parser/binding-android-arm64@0.127.0': optional: true + '@oxc-parser/binding-android-arm64@0.137.0': + optional: true + '@oxc-parser/binding-darwin-arm64@0.127.0': optional: true + '@oxc-parser/binding-darwin-arm64@0.137.0': + optional: true + '@oxc-parser/binding-darwin-x64@0.127.0': optional: true + '@oxc-parser/binding-darwin-x64@0.137.0': + optional: true + '@oxc-parser/binding-freebsd-x64@0.127.0': optional: true + '@oxc-parser/binding-freebsd-x64@0.137.0': + optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.137.0': + optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.137.0': + optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.137.0': + optional: true + '@oxc-parser/binding-linux-arm64-musl@0.127.0': optional: true + '@oxc-parser/binding-linux-arm64-musl@0.137.0': + optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.137.0': + optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.137.0': + optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.137.0': + optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.137.0': + optional: true + '@oxc-parser/binding-linux-x64-gnu@0.127.0': optional: true + '@oxc-parser/binding-linux-x64-gnu@0.137.0': + optional: true + '@oxc-parser/binding-linux-x64-musl@0.127.0': optional: true + '@oxc-parser/binding-linux-x64-musl@0.137.0': + optional: true + '@oxc-parser/binding-openharmony-arm64@0.127.0': optional: true + '@oxc-parser/binding-openharmony-arm64@0.137.0': + optional: true + '@oxc-parser/binding-wasm32-wasi@0.127.0': dependencies: '@emnapi/core': 1.9.2 @@ -6420,19 +7632,37 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true + '@oxc-parser/binding-wasm32-wasi@0.137.0': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.137.0': + optional: true + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': optional: true + '@oxc-parser/binding-win32-ia32-msvc@0.137.0': + optional: true + '@oxc-parser/binding-win32-x64-msvc@0.127.0': optional: true + '@oxc-parser/binding-win32-x64-msvc@0.137.0': + optional: true + '@oxc-project/types@0.127.0': {} '@oxc-project/types@0.132.0': {} + '@oxc-project/types@0.137.0': {} + '@oxfmt/binding-android-arm-eabi@0.47.0': optional: true @@ -6628,72 +7858,108 @@ snapshots: '@rolldown/binding-android-arm64@1.0.2': optional: true + '@rolldown/binding-android-arm64@1.1.2': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': optional: true '@rolldown/binding-darwin-arm64@1.0.2': optional: true + '@rolldown/binding-darwin-arm64@1.1.2': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.17': optional: true '@rolldown/binding-darwin-x64@1.0.2': optional: true + '@rolldown/binding-darwin-x64@1.1.2': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': optional: true '@rolldown/binding-freebsd-x64@1.0.2': optional: true + '@rolldown/binding-freebsd-x64@1.1.2': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.2': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.1.2': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-arm64-gnu@1.1.2': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': optional: true '@rolldown/binding-linux-arm64-musl@1.0.2': optional: true + '@rolldown/binding-linux-arm64-musl@1.1.2': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': optional: true '@rolldown/binding-linux-ppc64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.1.2': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': optional: true '@rolldown/binding-linux-s390x-gnu@1.0.2': optional: true + '@rolldown/binding-linux-s390x-gnu@1.1.2': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true '@rolldown/binding-linux-x64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-x64-gnu@1.1.2': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true '@rolldown/binding-linux-x64-musl@1.0.2': optional: true + '@rolldown/binding-linux-x64-musl@1.1.2': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true '@rolldown/binding-openharmony-arm64@1.0.2': optional: true + '@rolldown/binding-openharmony-arm64@1.1.2': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': dependencies: '@emnapi/core': 1.10.0 @@ -6708,18 +7974,31 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true + '@rolldown/binding-wasm32-wasi@1.1.2': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': optional: true '@rolldown/binding-win32-arm64-msvc@1.0.2': optional: true + '@rolldown/binding-win32-arm64-msvc@1.1.2': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': optional: true '@rolldown/binding-win32-x64-msvc@1.0.2': optional: true + '@rolldown/binding-win32-x64-msvc@1.1.2': + optional: true + '@rolldown/pluginutils@1.0.0-rc.17': {} '@rolldown/pluginutils@1.0.0-rc.3': {} @@ -6919,6 +8198,10 @@ snapshots: dependencies: kysely: 0.28.16 + '@tailor-platform/function-kysely-tailordb@0.1.3(kysely@0.29.2)': + dependencies: + kysely: 0.29.2 + '@tailor-platform/function-types@0.8.5': {} '@tailor-platform/sdk@1.45.1(@types/node@25.9.1)(@types/react@19.2.13)(typescript@5.9.3)(valibot@1.1.0(typescript@5.9.3))': @@ -6988,71 +8271,67 @@ snapshots: - utf-8-validate - valibot - '@tailor-platform/sdk@1.45.1(@types/node@25.9.1)(typescript@5.9.3)(valibot@1.1.0(typescript@5.9.3))': + '@tailor-platform/sdk@1.69.0(@types/node@25.9.1)(typescript@5.9.3)(valibot@1.1.0(typescript@5.9.3))(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)))': dependencies: - '@0no-co/graphql.web': 1.2.0(graphql@16.13.2) + '@0no-co/graphql.web': 1.3.2(graphql@17.0.1) '@badgateway/oauth2-client': 3.3.1 '@bufbuild/protobuf': 2.12.0 - '@connectrpc/connect': 2.1.1(@bufbuild/protobuf@2.12.0) - '@connectrpc/connect-node': 2.1.1(@bufbuild/protobuf@2.12.0)(@connectrpc/connect@2.1.1(@bufbuild/protobuf@2.12.0)) - '@inquirer/core': 11.1.9(@types/node@25.9.1) - '@inquirer/prompts': 8.4.2(@types/node@25.9.1) + '@bufbuild/protovalidate': 1.2.0(@bufbuild/protobuf@2.12.0) + '@connectrpc/connect': 2.1.2(@bufbuild/protobuf@2.12.0) + '@connectrpc/connect-node': 2.1.2(@bufbuild/protobuf@2.12.0)(@connectrpc/connect@2.1.2(@bufbuild/protobuf@2.12.0)) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/prompts': 8.5.2(@types/node@25.9.1) '@jridgewell/trace-mapping': 0.3.31 - '@liam-hq/cli': 0.7.24(@types/node@25.9.1)(typescript@5.9.3) - '@napi-rs/keyring': 1.2.0 + '@napi-rs/keyring': 1.3.0 '@opentelemetry/api': 1.9.1 - '@opentelemetry/exporter-trace-otlp-proto': 0.215.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.7.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-node': 2.7.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - '@oxc-project/types': 0.127.0 + '@opentelemetry/exporter-trace-otlp-proto': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + '@oxc-project/types': 0.137.0 '@standard-schema/spec': 1.1.0 - '@tailor-platform/function-kysely-tailordb': 0.1.3(kysely@0.28.16) - '@tailor-platform/function-types': 0.8.5 + '@tailor-platform/function-kysely-tailordb': 0.1.3(kysely@0.29.2) '@toiroakr/lines-db': 0.9.2(valibot@1.1.0(typescript@5.9.3)) - '@toiroakr/read-multiline': 0.3.2 - '@urql/core': 6.0.1(graphql@16.13.2) + '@toiroakr/read-multiline': 0.4.1 + '@urql/core': 6.0.2(graphql@17.0.1) chalk: 5.6.2 chokidar: 5.0.0 confbox: 0.2.4 - date-fns: 4.1.0 - es-toolkit: 1.46.0 + date-fns: 4.4.0 + es-toolkit: 1.48.1 find-up-simple: 1.0.1 - globals: 17.5.0 - graphql: 16.13.2 + globals: 17.6.0 + graphql: 17.0.1 inflection: 3.0.2 - kysely: 0.28.16 + kysely: 0.29.2 madge: 8.0.0(typescript@5.9.3) mime-types: 3.0.2 open: 11.0.0 - ora: 9.4.0 - oxc-parser: 0.127.0 + oxc-parser: 0.137.0 p-limit: 7.3.0 pathe: 2.0.3 pgsql-ast-parser: 12.0.2 - pkg-types: 2.3.0 - politty: 0.4.15(@inquirer/prompts@8.4.2(@types/node@25.9.1))(zod@4.3.6) - rolldown: 1.0.0-rc.17 - semver: 7.7.4 - serve: 14.2.6 + pkg-types: 2.3.1 + politty: 0.9.2(@inquirer/prompts@8.5.2(@types/node@25.9.1))(zod@4.4.3) + rolldown: 1.1.2 + semver: 7.8.5 sql-highlight: 6.1.0 std-env: 4.1.0 table: 6.9.0 ts-cron-validator: 1.1.5 - tsx: 4.21.0 - type-fest: 5.6.0 + tsx: 4.22.4 + type-fest: 5.7.0 + undici: 8.5.0 xdg-basedir: 5.1.0 - zod: 4.3.6 + zod: 4.4.3 + optionalDependencies: + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) transitivePeerDependencies: - '@clack/prompts' - - '@swc/helpers' - '@types/node' - - '@types/react' - - bufferutil - - react-devtools-core - supports-color - typescript - - utf-8-validate - valibot '@tailwindcss/node@4.3.0': @@ -7124,12 +8403,12 @@ snapshots: postcss: 8.5.14 tailwindcss: 4.3.0 - '@tailwindcss/vite@4.3.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0))': + '@tailwindcss/vite@4.3.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.0 '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) '@testing-library/dom@10.4.1': dependencies: @@ -7166,6 +8445,8 @@ snapshots: '@toiroakr/read-multiline@0.3.2': {} + '@toiroakr/read-multiline@0.4.1': {} + '@ts-graphviz/adapter@2.0.6': dependencies: '@ts-graphviz/common': 2.1.5 @@ -7210,6 +8491,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/argparse@1.0.38': {} '@types/aria-query@5.0.4': {} @@ -7320,7 +8606,14 @@ snapshots: transitivePeerDependencies: - graphql - '@vitejs/plugin-react@5.2.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0))': + '@urql/core@6.0.2(graphql@17.0.1)': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@17.0.1) + wonka: 6.3.6 + transitivePeerDependencies: + - graphql + + '@vitejs/plugin-react@5.2.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -7328,7 +8621,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -7341,13 +8634,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.7(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0))': + '@vitest/mocker@4.1.7(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) '@vitest/pretty-format@4.1.7': dependencies: @@ -7761,6 +9054,8 @@ snapshots: date-fns@4.1.0: {} + date-fns@4.4.0: {} + de-indent@1.0.2: {} debug@2.6.9: @@ -7909,6 +9204,8 @@ snapshots: es-toolkit@1.46.0: {} + es-toolkit@1.48.1: {} + esbuild@0.27.7: optionalDependencies: '@esbuild/aix-ppc64': 0.27.7 @@ -7938,6 +9235,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + escalade@3.2.0: {} escape-string-regexp@2.0.0: {} @@ -8114,6 +9440,8 @@ snapshots: globals@17.5.0: {} + globals@17.6.0: {} + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -8138,6 +9466,8 @@ snapshots: graphql@16.13.2: {} + graphql@17.0.1: {} + gray-matter@4.0.3: dependencies: js-yaml: 3.14.2 @@ -8191,7 +9521,7 @@ snapshots: ini@1.3.8: {} - ink-gradient@3.0.0(ink@6.0.1(@types/react@19.2.13)(react@19.2.6)): + ink-gradient@3.0.0(ink@6.0.1(@types/react@19.2.13)(react@19.1.1)): dependencies: '@types/gradient-string': 1.1.6 gradient-string: 2.0.2 @@ -8199,14 +9529,6 @@ snapshots: prop-types: 15.8.1 strip-ansi: 7.2.0 - ink-gradient@3.0.0(ink@6.0.1(react@19.1.1)): - dependencies: - '@types/gradient-string': 1.1.6 - gradient-string: 2.0.2 - ink: 6.0.1(react@19.1.1) - prop-types: 15.8.1 - strip-ansi: 7.2.0 - ink@6.0.1(@types/react@19.2.13)(react@19.1.1): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 @@ -8240,37 +9562,6 @@ snapshots: - bufferutil - utf-8-validate - ink@6.0.1(react@19.1.1): - dependencies: - '@alcalzone/ansi-tokenize': 0.1.3 - ansi-escapes: 7.3.0 - ansi-styles: 6.2.3 - auto-bind: 5.0.1 - chalk: 5.6.2 - cli-boxes: 3.0.0 - cli-cursor: 4.0.0 - cli-truncate: 4.0.0 - code-excerpt: 4.0.0 - es-toolkit: 1.46.0 - indent-string: 5.0.0 - is-in-ci: 1.0.0 - patch-console: 2.0.0 - react: 19.1.1 - react-reconciler: 0.32.0(react@19.1.1) - scheduler: 0.23.2 - signal-exit: 3.0.7 - slice-ansi: 7.1.2 - stack-utils: 2.0.6 - string-width: 7.2.0 - type-fest: 4.41.0 - widest-line: 5.0.0 - wrap-ansi: 9.0.2 - ws: 8.21.0 - yoga-layout: 3.2.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - inquirer@12.6.3(@types/node@25.9.1): dependencies: '@inquirer/core': 10.3.2(@types/node@25.9.1) @@ -8406,6 +9697,8 @@ snapshots: kysely@0.28.16: {} + kysely@0.29.2: {} + lefthook-darwin-arm64@2.1.6: optional: true @@ -8786,6 +10079,31 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 '@oxc-parser/binding-win32-x64-msvc': 0.127.0 + oxc-parser@0.137.0: + dependencies: + '@oxc-project/types': 0.137.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.137.0 + '@oxc-parser/binding-android-arm64': 0.137.0 + '@oxc-parser/binding-darwin-arm64': 0.137.0 + '@oxc-parser/binding-darwin-x64': 0.137.0 + '@oxc-parser/binding-freebsd-x64': 0.137.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.137.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.137.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.137.0 + '@oxc-parser/binding-linux-arm64-musl': 0.137.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.137.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.137.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.137.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.137.0 + '@oxc-parser/binding-linux-x64-gnu': 0.137.0 + '@oxc-parser/binding-linux-x64-musl': 0.137.0 + '@oxc-parser/binding-openharmony-arm64': 0.137.0 + '@oxc-parser/binding-wasm32-wasi': 0.137.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.137.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.137.0 + '@oxc-parser/binding-win32-x64-msvc': 0.137.0 + oxfmt@0.47.0: dependencies: tinypool: 2.1.0 @@ -8910,6 +10228,12 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + playwright-core@1.51.1: {} playwright@1.51.1: @@ -8927,6 +10251,13 @@ snapshots: optionalDependencies: '@inquirer/prompts': 8.4.2(@types/node@25.9.1) + politty@0.9.2(@inquirer/prompts@8.5.2(@types/node@25.9.1))(zod@4.4.3): + dependencies: + yaml: 2.9.0 + zod: 4.4.3 + optionalDependencies: + '@inquirer/prompts': 8.5.2(@types/node@25.9.1) + postcss-values-parser@6.0.2(postcss@8.5.14): dependencies: color-name: 1.1.4 @@ -9209,6 +10540,27 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.2 '@rolldown/binding-win32-x64-msvc': 1.0.2 + rolldown@1.1.2: + dependencies: + '@oxc-project/types': 0.137.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.2 + '@rolldown/binding-darwin-arm64': 1.1.2 + '@rolldown/binding-darwin-x64': 1.1.2 + '@rolldown/binding-freebsd-x64': 1.1.2 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.2 + '@rolldown/binding-linux-arm64-gnu': 1.1.2 + '@rolldown/binding-linux-arm64-musl': 1.1.2 + '@rolldown/binding-linux-ppc64-gnu': 1.1.2 + '@rolldown/binding-linux-s390x-gnu': 1.1.2 + '@rolldown/binding-linux-x64-gnu': 1.1.2 + '@rolldown/binding-linux-x64-musl': 1.1.2 + '@rolldown/binding-openharmony-arm64': 1.1.2 + '@rolldown/binding-wasm32-wasi': 1.1.2 + '@rolldown/binding-win32-arm64-msvc': 1.1.2 + '@rolldown/binding-win32-x64-msvc': 1.1.2 + rollup@4.60.0: dependencies: '@types/estree': 1.0.8 @@ -9284,6 +10636,8 @@ snapshots: semver@7.8.0: {} + semver@7.8.5: {} + serve-handler@6.1.7: dependencies: bytes: 3.0.0 @@ -9552,7 +10906,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdown@0.22.0(tsx@4.21.0)(typescript@5.9.3): + tsdown@0.22.0(tsx@4.22.4)(typescript@5.9.3): dependencies: ansis: 4.2.0 cac: 7.0.0 @@ -9570,7 +10924,7 @@ snapshots: tree-kill: 1.2.2 unconfig-core: 7.5.0 optionalDependencies: - tsx: 4.21.0 + tsx: 4.22.4 typescript: 5.9.3 transitivePeerDependencies: - '@ts-macro/tsc' @@ -9587,6 +10941,12 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsx@4.22.4: + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 + turbo@2.9.14: optionalDependencies: '@turbo/darwin-64': 2.9.14 @@ -9608,6 +10968,10 @@ snapshots: dependencies: tagged-tag: 1.0.0 + type-fest@5.7.0: + dependencies: + tagged-tag: 1.0.0 + typescript@5.8.2: {} typescript@5.9.3: {} @@ -9623,6 +10987,8 @@ snapshots: undici-types@7.24.6: {} + undici@8.5.0: {} + universalify@0.1.2: {} universalify@2.0.1: {} @@ -9654,7 +11020,7 @@ snapshots: vary@1.1.2: {} - vite-plugin-dts@4.5.4(@types/node@25.9.1)(rollup@4.60.0)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)): + vite-plugin-dts@4.5.4(@types/node@25.9.1)(rollup@4.60.0)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: '@microsoft/api-extractor': 7.55.2(@types/node@25.9.1) '@rollup/pluginutils': 5.3.0(rollup@4.60.0) @@ -9667,27 +11033,27 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.10.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)): + vite-plugin-externalize-deps@0.10.0(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0): + vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -9700,12 +11066,13 @@ snapshots: fsevents: 2.3.3 jiti: 2.7.0 lightningcss: 1.32.0 - tsx: 4.21.0 + tsx: 4.22.4 + yaml: 2.9.0 - vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(happy-dom@20.9.0)(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)) + '@vitest/mocker': 4.1.7(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -9722,7 +11089,7 @@ snapshots: tinyexec: 1.2.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 @@ -9791,6 +11158,8 @@ snapshots: yallist@4.0.0: {} + yaml@2.9.0: {} + yocto-queue@1.2.2: {} yoctocolors-cjs@2.1.3: {} @@ -9802,3 +11171,5 @@ snapshots: zod@3.25.76: {} zod@4.3.6: {} + + zod@4.4.3: {}